Guest User

Untitled

a guest
Jan 27th, 2016
639
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function make_event_emitter(e) {
  2.     function t(e) {
  3.         return e._listeners || (e._listeners = {})
  4.     }
  5.     _.assign(e, {
  6.         on: function(e, r) {
  7.             var n = t(this),
  8.                 o = n[e];
  9.             o || (o = n[e] = []), o.push(r)
  10.         },
  11.         off: function(e, r) {
  12.             var n = t(this),
  13.                 o = n[e];
  14.             o && (n[e] = _.without(o, r))
  15.         },
  16.         emit: function(e) {
  17.             var r = t(this),
  18.                 n = r[e];
  19.             if (n) {
  20.                 var o = Array.prototype.slice.call(arguments, 1);
  21.                 n.forEach(function(e) {
  22.                     e.apply(null, o)
  23.                 })
  24.             }
  25.         }
  26.     })
  27. }(function() {
  28.     function e(e, t, r) {
  29.         for (var n = (r || 0) - 1, o = e ? e.length : 0; ++n < o;)
  30.             if (e[n] === t) return n;
  31.         return -1
  32.     }
  33.  
  34.     function t(t, r) {
  35.         var n = typeof r;
  36.         if (t = t.cache, "boolean" == n || null == r) return t[r] ? 0 : -1;
  37.         "number" != n && "string" != n && (n = "object");
  38.         var o = "number" == n ? r : d + r;
  39.         return t = (t = t[n]) && t[o], "object" == n ? t && e(t, r) > -1 ? 0 : -1 : t ? 0 : -1
  40.     }
  41.  
  42.     function r(e) {
  43.         var t = this.cache,
  44.             r = typeof e;
  45.         if ("boolean" == r || null == e) t[e] = !0;
  46.         else {
  47.             "number" != r && "string" != r && (r = "object");
  48.             var n = "number" == r ? e : d + e,
  49.                 o = t[r] || (t[r] = {});
  50.             "object" == r ? (o[n] || (o[n] = [])).push(e) : o[n] = !0
  51.         }
  52.     }
  53.  
  54.     function n(e) {
  55.         return e.charCodeAt(0)
  56.     }
  57.  
  58.     function o(e, t) {
  59.         for (var r = e.criteria, n = t.criteria, o = -1, a = r.length; ++o < a;) {
  60.             var i = r[o],
  61.                 u = n[o];
  62.             if (i !== u) {
  63.                 if (i > u || "undefined" == typeof i) return 1;
  64.                 if (u > i || "undefined" == typeof u) return -1
  65.             }
  66.         }
  67.         return e.index - t.index
  68.     }
  69.  
  70.     function a(e) {
  71.         var t = -1,
  72.             n = e.length,
  73.             o = e[0],
  74.             a = e[n / 2 | 0],
  75.             i = e[n - 1];
  76.         if (o && "object" == typeof o && a && "object" == typeof a && i && "object" == typeof i) return !1;
  77.         var u = c();
  78.         u["false"] = u["null"] = u["true"] = u.undefined = !1;
  79.         var l = c();
  80.         for (l.array = e, l.cache = u, l.push = r; ++t < n;) l.push(e[t]);
  81.         return l
  82.     }
  83.  
  84.     function i(e) {
  85.         return "\\" + H[e]
  86.     }
  87.  
  88.     function u() {
  89.         return g.pop() || []
  90.     }
  91.  
  92.     function c() {
  93.         return h.pop() || {
  94.             array: null,
  95.             cache: null,
  96.             criteria: null,
  97.             "false": !1,
  98.             index: 0,
  99.             "null": !1,
  100.             number: null,
  101.             object: null,
  102.             push: null,
  103.             string: null,
  104.             "true": !1,
  105.             undefined: !1,
  106.             value: null
  107.         }
  108.     }
  109.  
  110.     function l(e) {
  111.         e.length = 0, g.length < b && g.push(e)
  112.     }
  113.  
  114.     function s(e) {
  115.         var t = e.cache;
  116.         t && s(t), e.array = e.cache = e.criteria = e.object = e.number = e.string = e.value = null, h.length < b && h.push(e)
  117.     }
  118.  
  119.     function f(e, t, r) {
  120.         t || (t = 0), "undefined" == typeof r && (r = e ? e.length : 0);
  121.         for (var n = -1, o = r - t || 0, a = Array(0 > o ? 0 : o); ++n < o;) a[n] = e[t + n];
  122.         return a
  123.     }
  124.  
  125.     function v(r) {
  126.         function g(e) {
  127.             return e && "object" == typeof e && !Qr(e) && kr.call(e, "__wrapped__") ? e : new h(e)
  128.         }
  129.  
  130.         function h(e, t) {
  131.             this.__chain__ = !!t, this.__wrapped__ = e
  132.         }
  133.  
  134.         function b(e) {
  135.             function t() {
  136.                 if (n) {
  137.                     var e = f(n);
  138.                     Gr.apply(e, arguments)
  139.                 }
  140.                 if (this instanceof t) {
  141.                     var a = Y(r.prototype),
  142.                         i = r.apply(a, e || arguments);
  143.                     return De(i) ? i : a
  144.                 }
  145.                 return r.apply(o, e || arguments)
  146.             }
  147.             var r = e[0],
  148.                 n = e[2],
  149.                 o = e[4];
  150.             return Kr(t, e), t
  151.         }
  152.  
  153.         function H(e, t, r, n, o) {
  154.             if (r) {
  155.                 var a = r(e);
  156.                 if ("undefined" != typeof a) return a
  157.             }
  158.             var i = De(e);
  159.             if (!i) return e;
  160.             var c = Mr.call(e);
  161.             if (!q[c]) return e;
  162.             var s = $r[c];
  163.             switch (c) {
  164.                 case U:
  165.                 case N:
  166.                     return new s(+e);
  167.                 case W:
  168.                 case j:
  169.                     return new s(e);
  170.                 case C:
  171.                     return a = s(e.source, A.exec(e)), a.lastIndex = e.lastIndex, a
  172.             }
  173.             var v = Qr(e);
  174.             if (t) {
  175.                 var p = !n;
  176.                 n || (n = u()), o || (o = u());
  177.                 for (var g = n.length; g--;)
  178.                     if (n[g] == e) return o[g];
  179.                 a = v ? s(e.length) : {}
  180.             } else a = v ? f(e) : on({}, e);
  181.             return v && (kr.call(e, "index") && (a.index = e.index), kr.call(e, "input") && (a.input = e.input)), t ? (n.push(e), o.push(a), (v ? Ke : cn)(e, function(e, i) {
  182.                 a[i] = H(e, t, r, n, o)
  183.             }), p && (l(n), l(o)), a) : a
  184.         }
  185.  
  186.         function Y(e, t) {
  187.             return De(e) ? Wr(e) : {}
  188.         }
  189.  
  190.         function K(e, t, r) {
  191.             if ("function" != typeof e) return Qt;
  192.             if ("undefined" == typeof t || !("prototype" in e)) return e;
  193.             var n = e.__bindData__;
  194.             if ("undefined" == typeof n && (Yr.funcNames && (n = !e.name), n = n || !Yr.funcDecomp, !n)) {
  195.                 var o = Sr.call(e);
  196.                 Yr.funcNames || (n = !M.test(o)), n || (n = D.test(o), Kr(e, n))
  197.             }
  198.             if (n === !1 || n !== !0 && 1 & n[1]) return e;
  199.             switch (r) {
  200.                 case 1:
  201.                     return function(r) {
  202.                         return e.call(t, r)
  203.                     };
  204.                 case 2:
  205.                     return function(r, n) {
  206.                         return e.call(t, r, n)
  207.                     };
  208.                 case 3:
  209.                     return function(r, n, o) {
  210.                         return e.call(t, r, n, o)
  211.                     };
  212.                 case 4:
  213.                     return function(r, n, o, a) {
  214.                         return e.call(t, r, n, o, a)
  215.                     }
  216.             }
  217.             return Gt(e, t)
  218.         }
  219.  
  220.         function Q(e) {
  221.             function t() {
  222.                 var e = c ? i : this;
  223.                 if (o) {
  224.                     var g = f(o);
  225.                     Gr.apply(g, arguments)
  226.                 }
  227.                 if ((a || s) && (g || (g = f(arguments)), a && Gr.apply(g, a), s && g.length < u)) return n |= 16, Q([r, v ? n : -4 & n, g, null, i, u]);
  228.                 if (g || (g = arguments), l && (r = e[p]), this instanceof t) {
  229.                     e = Y(r.prototype);
  230.                     var h = r.apply(e, g);
  231.                     return De(h) ? h : e
  232.                 }
  233.                 return r.apply(e, g)
  234.             }
  235.             var r = e[0],
  236.                 n = e[1],
  237.                 o = e[2],
  238.                 a = e[3],
  239.                 i = e[4],
  240.                 u = e[5],
  241.                 c = 1 & n,
  242.                 l = 2 & n,
  243.                 s = 4 & n,
  244.                 v = 8 & n,
  245.                 p = r;
  246.             return Kr(t, e), t
  247.         }
  248.  
  249.         function Z(r, n) {
  250.             var o = -1,
  251.                 i = ce(),
  252.                 u = r ? r.length : 0,
  253.                 c = u >= _ && i === e,
  254.                 l = [];
  255.             if (c) {
  256.                 var f = a(n);
  257.                 f ? (i = t, n = f) : c = !1
  258.             }
  259.             for (; ++o < u;) {
  260.                 var v = r[o];
  261.                 i(n, v) < 0 && l.push(v)
  262.             }
  263.             return c && s(n), l
  264.         }
  265.  
  266.         function ee(e, t, r, n) {
  267.             for (var o = (n || 0) - 1, a = e ? e.length : 0, i = []; ++o < a;) {
  268.                 var u = e[o];
  269.                 if (u && "object" == typeof u && "number" == typeof u.length && (Qr(u) || ve(u))) {
  270.                     t || (u = ee(u, t, r));
  271.                     var c = -1,
  272.                         l = u.length,
  273.                         s = i.length;
  274.                     for (i.length += l; ++c < l;) i[s++] = u[c]
  275.                 } else r || i.push(u)
  276.             }
  277.             return i
  278.         }
  279.  
  280.         function te(e, t, r, n, o, a) {
  281.             if (r) {
  282.                 var i = r(e, t);
  283.                 if ("undefined" != typeof i) return !!i
  284.             }
  285.             if (e === t) return 0 !== e || 1 / e == 1 / t;
  286.             var c = typeof e,
  287.                 s = typeof t;
  288.             if (!(e !== e || e && z[c] || t && z[s])) return !1;
  289.             if (null == e || null == t) return e === t;
  290.             var f = Mr.call(e),
  291.                 v = Mr.call(t);
  292.             if (f == G && (f = O), v == G && (v = O), f != v) return !1;
  293.             switch (f) {
  294.                 case U:
  295.                 case N:
  296.                     return +e == +t;
  297.                 case W:
  298.                     return e != +e ? t != +t : 0 == e ? 1 / e == 1 / t : e == +t;
  299.                 case C:
  300.                 case j:
  301.                     return e == Tr(t)
  302.             }
  303.             var p = f == I;
  304.             if (!p) {
  305.                 var g = kr.call(e, "__wrapped__"),
  306.                     h = kr.call(t, "__wrapped__");
  307.                 if (g || h) return te(g ? e.__wrapped__ : e, h ? t.__wrapped__ : t, r, n, o, a);
  308.                 if (f != O) return !1;
  309.                 var m = e.constructor,
  310.                     d = t.constructor;
  311.                 if (m != d && !(Le(m) && m instanceof m && Le(d) && d instanceof d) && "constructor" in e && "constructor" in t) return !1
  312.             }
  313.             var _ = !o;
  314.             o || (o = u()), a || (a = u());
  315.             for (var b = o.length; b--;)
  316.                 if (o[b] == e) return a[b] == t;
  317.             var y = 0;
  318.             if (i = !0, o.push(e), a.push(t), p) {
  319.                 if (b = e.length, y = t.length, i = y == b, i || n)
  320.                     for (; y--;) {
  321.                         var T = b,
  322.                             w = t[y];
  323.                         if (n)
  324.                             for (; T-- && !(i = te(e[T], w, r, n, o, a)););
  325.                         else if (!(i = te(e[y], w, r, n, o, a))) break
  326.                     }
  327.             } else un(t, function(t, u, c) {
  328.                 return kr.call(c, u) ? (y++, i = kr.call(e, u) && te(e[u], t, r, n, o, a)) : void 0
  329.             }), i && !n && un(e, function(e, t, r) {
  330.                 return kr.call(r, t) ? i = --y > -1 : void 0
  331.             });
  332.             return o.pop(), a.pop(), _ && (l(o), l(a)), i
  333.         }
  334.  
  335.         function re(e, t, r, n, o) {
  336.             (Qr(t) ? Ke : cn)(t, function(t, a) {
  337.                 var i, u, c = t,
  338.                     l = e[a];
  339.                 if (t && ((u = Qr(t)) || ln(t))) {
  340.                     for (var s = n.length; s--;)
  341.                         if (i = n[s] == t) {
  342.                             l = o[s];
  343.                             break
  344.                         }
  345.                     if (!i) {
  346.                         var f;
  347.                         r && (c = r(l, t), (f = "undefined" != typeof c) && (l = c)), f || (l = u ? Qr(l) ? l : [] : ln(l) ? l : {}), n.push(t), o.push(l), f || re(l, t, r, n, o)
  348.                     }
  349.                 } else r && (c = r(l, t), "undefined" == typeof c && (c = t)), "undefined" != typeof c && (l = c);
  350.                 e[a] = l
  351.             })
  352.         }
  353.  
  354.         function ne(e, t) {
  355.             return e + Dr(Hr() * (t - e + 1))
  356.         }
  357.  
  358.         function oe(r, n, o) {
  359.             var i = -1,
  360.                 c = ce(),
  361.                 f = r ? r.length : 0,
  362.                 v = [],
  363.                 p = !n && f >= _ && c === e,
  364.                 g = o || p ? u() : v;
  365.             if (p) {
  366.                 var h = a(g);
  367.                 c = t, g = h
  368.             }
  369.             for (; ++i < f;) {
  370.                 var m = r[i],
  371.                     d = o ? o(m, i, r) : m;
  372.                 (n ? !i || g[g.length - 1] !== d : c(g, d) < 0) && ((o || p) && g.push(d), v.push(m))
  373.             }
  374.             return p ? (l(g.array), s(g)) : o && l(g), v
  375.         }
  376.  
  377.         function ae(e) {
  378.             return function(t, r, n) {
  379.                 var o = {};
  380.                 r = g.createCallback(r, n, 3);
  381.                 var a = -1,
  382.                     i = t ? t.length : 0;
  383.                 if ("number" == typeof i)
  384.                     for (; ++a < i;) {
  385.                         var u = t[a];
  386.                         e(o, u, r(u, a, t), t)
  387.                     } else cn(t, function(t, n, a) {
  388.                         e(o, t, r(t, n, a), a)
  389.                     });
  390.                 return o
  391.             }
  392.         }
  393.  
  394.         function ie(e, t, r, n, o, a) {
  395.             var i = 1 & t,
  396.                 u = 2 & t,
  397.                 c = 4 & t,
  398.                 l = 16 & t,
  399.                 s = 32 & t;
  400.             if (!u && !Le(e)) throw new wr;
  401.             l && !r.length && (t &= -17, l = r = !1), s && !n.length && (t &= -33, s = n = !1);
  402.             var v = e && e.__bindData__;
  403.             if (v && v !== !0) return v = f(v), v[2] && (v[2] = f(v[2])), v[3] && (v[3] = f(v[3])), !i || 1 & v[1] || (v[4] = o), !i && 1 & v[1] && (t |= 8), !c || 4 & v[1] || (v[5] = a), l && Gr.apply(v[2] || (v[2] = []), r), s && Nr.apply(v[3] || (v[3] = []), n), v[1] |= t, ie.apply(null, v);
  404.             var p = 1 == t || 17 === t ? b : Q;
  405.             return p([e, t, r, n, o, a])
  406.         }
  407.  
  408.         function ue(e) {
  409.             return en[e]
  410.         }
  411.  
  412.         function ce() {
  413.             var t = (t = g.indexOf) === dt ? e : t;
  414.             return t
  415.         }
  416.  
  417.         function le(e) {
  418.             return "function" == typeof e && Rr.test(e)
  419.         }
  420.  
  421.         function se(e) {
  422.             var t, r;
  423.             return e && Mr.call(e) == O && (t = e.constructor, !Le(t) || t instanceof t) ? (un(e, function(e, t) {
  424.                 r = t
  425.             }), "undefined" == typeof r || kr.call(e, r)) : !1
  426.         }
  427.  
  428.         function fe(e) {
  429.             return tn[e]
  430.         }
  431.  
  432.         function ve(e) {
  433.             return e && "object" == typeof e && "number" == typeof e.length && Mr.call(e) == G || !1
  434.         }
  435.  
  436.         function pe(e, t, r, n) {
  437.             return "boolean" != typeof t && null != t && (n = r, r = t, t = !1), H(e, t, "function" == typeof r && K(r, n, 1))
  438.         }
  439.  
  440.         function ge(e, t, r) {
  441.             return H(e, !0, "function" == typeof t && K(t, r, 1))
  442.         }
  443.  
  444.         function he(e, t) {
  445.             var r = Y(e);
  446.             return t ? on(r, t) : r
  447.         }
  448.  
  449.         function me(e, t, r) {
  450.             var n;
  451.             return t = g.createCallback(t, r, 3), cn(e, function(e, r, o) {
  452.                 return t(e, r, o) ? (n = r, !1) : void 0
  453.             }), n
  454.         }
  455.  
  456.         function de(e, t, r) {
  457.             var n;
  458.             return t = g.createCallback(t, r, 3), be(e, function(e, r, o) {
  459.                 return t(e, r, o) ? (n = r, !1) : void 0
  460.             }), n
  461.         }
  462.  
  463.         function _e(e, t, r) {
  464.             var n = [];
  465.             un(e, function(e, t) {
  466.                 n.push(t, e)
  467.             });
  468.             var o = n.length;
  469.             for (t = K(t, r, 3); o-- && t(n[o--], n[o], e) !== !1;);
  470.             return e
  471.         }
  472.  
  473.         function be(e, t, r) {
  474.             var n = Jr(e),
  475.                 o = n.length;
  476.             for (t = K(t, r, 3); o--;) {
  477.                 var a = n[o];
  478.                 if (t(e[a], a, e) === !1) break
  479.             }
  480.             return e
  481.         }
  482.  
  483.         function ye(e) {
  484.             var t = [];
  485.             return un(e, function(e, r) {
  486.                 Le(e) && t.push(r)
  487.             }), t.sort()
  488.         }
  489.  
  490.         function Te(e, t) {
  491.             return e ? kr.call(e, t) : !1
  492.         }
  493.  
  494.         function we(e) {
  495.             for (var t = -1, r = Jr(e), n = r.length, o = {}; ++t < n;) {
  496.                 var a = r[t];
  497.                 o[e[a]] = a
  498.             }
  499.             return o
  500.         }
  501.  
  502.         function Ee(e) {
  503.             return e === !0 || e === !1 || e && "object" == typeof e && Mr.call(e) == U || !1
  504.         }
  505.  
  506.         function xe(e) {
  507.             return e && "object" == typeof e && Mr.call(e) == N || !1
  508.         }
  509.  
  510.         function Ae(e) {
  511.             return e && 1 === e.nodeType || !1
  512.         }
  513.  
  514.         function Me(e) {
  515.             var t = !0;
  516.             if (!e) return t;
  517.             var r = Mr.call(e),
  518.                 n = e.length;
  519.             return r == I || r == j || r == G || r == O && "number" == typeof n && Le(e.splice) ? !n : (cn(e, function() {
  520.                 return t = !1
  521.             }), t)
  522.         }
  523.  
  524.         function Re(e, t, r, n) {
  525.             return te(e, t, "function" == typeof r && K(r, n, 2))
  526.         }
  527.  
  528.         function Pe(e) {
  529.             return Cr(e) && !jr(parseFloat(e))
  530.         }
  531.  
  532.         function Le(e) {
  533.             return "function" == typeof e
  534.         }
  535.  
  536.         function De(e) {
  537.             return !(!e || !z[typeof e])
  538.         }
  539.  
  540.         function Se(e) {
  541.             return ke(e) && e != +e
  542.         }
  543.  
  544.         function Fe(e) {
  545.             return null === e
  546.         }
  547.  
  548.         function ke(e) {
  549.             return "number" == typeof e || e && "object" == typeof e && Mr.call(e) == W || !1
  550.         }
  551.  
  552.         function Ge(e) {
  553.             return e && "object" == typeof e && Mr.call(e) == C || !1
  554.         }
  555.  
  556.         function Ie(e) {
  557.             return "string" == typeof e || e && "object" == typeof e && Mr.call(e) == j || !1
  558.         }
  559.  
  560.         function Ue(e) {
  561.             return "undefined" == typeof e
  562.         }
  563.  
  564.         function Ne(e, t, r) {
  565.             var n = {};
  566.             return t = g.createCallback(t, r, 3), cn(e, function(e, r, o) {
  567.                 n[r] = t(e, r, o)
  568.             }), n
  569.         }
  570.  
  571.         function Be(e) {
  572.             var t = arguments,
  573.                 r = 2;
  574.             if (!De(e)) return e;
  575.             if ("number" != typeof t[2] && (r = t.length), r > 3 && "function" == typeof t[r - 2]) var n = K(t[--r - 1], t[r--], 2);
  576.             else r > 2 && "function" == typeof t[r - 1] && (n = t[--r]);
  577.             for (var o = f(arguments, 1, r), a = -1, i = u(), c = u(); ++a < r;) re(e, o[a], n, i, c);
  578.             return l(i), l(c), e
  579.         }
  580.  
  581.         function We(e, t, r) {
  582.             var n = {};
  583.             if ("function" != typeof t) {
  584.                 var o = [];
  585.                 un(e, function(e, t) {
  586.                     o.push(t)
  587.                 }), o = Z(o, ee(arguments, !0, !1, 1));
  588.                 for (var a = -1, i = o.length; ++a < i;) {
  589.                     var u = o[a];
  590.                     n[u] = e[u]
  591.                 }
  592.             } else t = g.createCallback(t, r, 3), un(e, function(e, r, o) {
  593.                 t(e, r, o) || (n[r] = e)
  594.             });
  595.             return n
  596.         }
  597.  
  598.         function Oe(e) {
  599.             for (var t = -1, r = Jr(e), n = r.length, o = pr(n); ++t < n;) {
  600.                 var a = r[t];
  601.                 o[t] = [a, e[a]]
  602.             }
  603.             return o
  604.         }
  605.  
  606.         function Ce(e, t, r) {
  607.             var n = {};
  608.             if ("function" != typeof t)
  609.                 for (var o = -1, a = ee(arguments, !0, !1, 1), i = De(e) ? a.length : 0; ++o < i;) {
  610.                     var u = a[o];
  611.                     u in e && (n[u] = e[u])
  612.                 } else t = g.createCallback(t, r, 3), un(e, function(e, r, o) {
  613.                     t(e, r, o) && (n[r] = e)
  614.                 });
  615.             return n
  616.         }
  617.  
  618.         function je(e, t, r, n) {
  619.             var o = Qr(e);
  620.             if (null == r)
  621.                 if (o) r = [];
  622.                 else {
  623.                     var a = e && e.constructor,
  624.                         i = a && a.prototype;
  625.                     r = Y(i)
  626.                 }
  627.             return t && (t = g.createCallback(t, n, 4), (o ? Ke : cn)(e, function(e, n, o) {
  628.                 return t(r, e, n, o)
  629.             })), r
  630.         }
  631.  
  632.         function qe(e) {
  633.             for (var t = -1, r = Jr(e), n = r.length, o = pr(n); ++t < n;) o[t] = e[r[t]];
  634.             return o
  635.         }
  636.  
  637.         function Ve(e) {
  638.             for (var t = arguments, r = -1, n = ee(t, !0, !1, 1), o = t[2] && t[2][t[1]] === e ? 1 : n.length, a = pr(o); ++r < o;) a[r] = e[n[r]];
  639.             return a
  640.         }
  641.  
  642.         function Xe(e, t, r) {
  643.             var n = -1,
  644.                 o = ce(),
  645.                 a = e ? e.length : 0,
  646.                 i = !1;
  647.             return r = (0 > r ? Vr(0, a + r) : r) || 0, Qr(e) ? i = o(e, t, r) > -1 : "number" == typeof a ? i = (Ie(e) ? e.indexOf(t, r) : o(e, t, r)) > -1 : cn(e, function(e) {
  648.                 return ++n >= r ? !(i = e === t) : void 0
  649.             }), i
  650.         }
  651.  
  652.         function ze(e, t, r) {
  653.             var n = !0;
  654.             t = g.createCallback(t, r, 3);
  655.             var o = -1,
  656.                 a = e ? e.length : 0;
  657.             if ("number" == typeof a)
  658.                 for (; ++o < a && (n = !!t(e[o], o, e)););
  659.             else cn(e, function(e, r, o) {
  660.                 return n = !!t(e, r, o)
  661.             });
  662.             return n
  663.         }
  664.  
  665.         function He(e, t, r) {
  666.             var n = [];
  667.             t = g.createCallback(t, r, 3);
  668.             var o = -1,
  669.                 a = e ? e.length : 0;
  670.             if ("number" == typeof a)
  671.                 for (; ++o < a;) {
  672.                     var i = e[o];
  673.                     t(i, o, e) && n.push(i)
  674.                 } else cn(e, function(e, r, o) {
  675.                     t(e, r, o) && n.push(e)
  676.                 });
  677.             return n
  678.         }
  679.  
  680.         function $e(e, t, r) {
  681.             t = g.createCallback(t, r, 3);
  682.             var n = -1,
  683.                 o = e ? e.length : 0;
  684.             if ("number" != typeof o) {
  685.                 var a;
  686.                 return cn(e, function(e, r, n) {
  687.                     return t(e, r, n) ? (a = e, !1) : void 0
  688.                 }), a
  689.             }
  690.             for (; ++n < o;) {
  691.                 var i = e[n];
  692.                 if (t(i, n, e)) return i
  693.             }
  694.         }
  695.  
  696.         function Ye(e, t, r) {
  697.             var n;
  698.             return t = g.createCallback(t, r, 3), Qe(e, function(e, r, o) {
  699.                 return t(e, r, o) ? (n = e, !1) : void 0
  700.             }), n
  701.         }
  702.  
  703.         function Ke(e, t, r) {
  704.             var n = -1,
  705.                 o = e ? e.length : 0;
  706.             if (t = t && "undefined" == typeof r ? t : K(t, r, 3), "number" == typeof o)
  707.                 for (; ++n < o && t(e[n], n, e) !== !1;);
  708.             else cn(e, t);
  709.             return e
  710.         }
  711.  
  712.         function Qe(e, t, r) {
  713.             var n = e ? e.length : 0;
  714.             if (t = t && "undefined" == typeof r ? t : K(t, r, 3), "number" == typeof n)
  715.                 for (; n-- && t(e[n], n, e) !== !1;);
  716.             else {
  717.                 var o = Jr(e);
  718.                 n = o.length, cn(e, function(e, r, a) {
  719.                     return r = o ? o[--n] : --n, t(a[r], r, a)
  720.                 })
  721.             }
  722.             return e
  723.         }
  724.  
  725.         function Ze(e, t) {
  726.             var r = f(arguments, 2),
  727.                 n = -1,
  728.                 o = "function" == typeof t,
  729.                 a = e ? e.length : 0,
  730.                 i = pr("number" == typeof a ? a : 0);
  731.             return Ke(e, function(e) {
  732.                 i[++n] = (o ? t : e[t]).apply(e, r)
  733.             }), i
  734.         }
  735.  
  736.         function Je(e, t, r) {
  737.             var n = -1,
  738.                 o = e ? e.length : 0;
  739.             if (t = g.createCallback(t, r, 3), "number" == typeof o)
  740.                 for (var a = pr(o); ++n < o;) a[n] = t(e[n], n, e);
  741.             else a = [], cn(e, function(e, r, o) {
  742.                 a[++n] = t(e, r, o)
  743.             });
  744.             return a
  745.         }
  746.  
  747.         function et(e, t, r) {
  748.             var o = -(1 / 0),
  749.                 a = o;
  750.             if ("function" != typeof t && r && r[t] === e && (t = null), null == t && Qr(e))
  751.                 for (var i = -1, u = e.length; ++i < u;) {
  752.                     var c = e[i];
  753.                     c > a && (a = c)
  754.                 } else t = null == t && Ie(e) ? n : g.createCallback(t, r, 3), Ke(e, function(e, r, n) {
  755.                     var i = t(e, r, n);
  756.                     i > o && (o = i, a = e)
  757.                 });
  758.             return a
  759.         }
  760.  
  761.         function tt(e, t, r) {
  762.             var o = 1 / 0,
  763.                 a = o;
  764.             if ("function" != typeof t && r && r[t] === e && (t = null), null == t && Qr(e))
  765.                 for (var i = -1, u = e.length; ++i < u;) {
  766.                     var c = e[i];
  767.                     a > c && (a = c)
  768.                 } else t = null == t && Ie(e) ? n : g.createCallback(t, r, 3), Ke(e, function(e, r, n) {
  769.                     var i = t(e, r, n);
  770.                     o > i && (o = i, a = e)
  771.                 });
  772.             return a
  773.         }
  774.  
  775.         function rt(e, t, r, n) {
  776.             if (!e) return r;
  777.             var o = arguments.length < 3;
  778.             t = g.createCallback(t, n, 4);
  779.             var a = -1,
  780.                 i = e.length;
  781.             if ("number" == typeof i)
  782.                 for (o && (r = e[++a]); ++a < i;) r = t(r, e[a], a, e);
  783.             else cn(e, function(e, n, a) {
  784.                 r = o ? (o = !1, e) : t(r, e, n, a)
  785.             });
  786.             return r
  787.         }
  788.  
  789.         function nt(e, t, r, n) {
  790.             var o = arguments.length < 3;
  791.             return t = g.createCallback(t, n, 4), Qe(e, function(e, n, a) {
  792.                 r = o ? (o = !1, e) : t(r, e, n, a)
  793.             }), r
  794.         }
  795.  
  796.         function ot(e, t, r) {
  797.             return t = g.createCallback(t, r, 3), He(e, function(e, r, n) {
  798.                 return !t(e, r, n)
  799.             })
  800.         }
  801.  
  802.         function at(e, t, r) {
  803.             if (e && "number" != typeof e.length && (e = qe(e)), null == t || r) return e ? e[ne(0, e.length - 1)] : p;
  804.             var n = it(e);
  805.             return n.length = Xr(Vr(0, t), n.length), n
  806.         }
  807.  
  808.         function it(e) {
  809.             var t = -1,
  810.                 r = e ? e.length : 0,
  811.                 n = pr("number" == typeof r ? r : 0);
  812.             return Ke(e, function(e) {
  813.                 var r = ne(0, ++t);
  814.                 n[t] = n[r], n[r] = e
  815.             }), n
  816.         }
  817.  
  818.         function ut(e) {
  819.             var t = e ? e.length : 0;
  820.             return "number" == typeof t ? t : Jr(e).length
  821.         }
  822.  
  823.         function ct(e, t, r) {
  824.             var n;
  825.             t = g.createCallback(t, r, 3);
  826.             var o = -1,
  827.                 a = e ? e.length : 0;
  828.             if ("number" == typeof a)
  829.                 for (; ++o < a && !(n = t(e[o], o, e)););
  830.             else cn(e, function(e, r, o) {
  831.                 return !(n = t(e, r, o))
  832.             });
  833.             return !!n
  834.         }
  835.  
  836.         function lt(e, t, r) {
  837.             var n = -1,
  838.                 a = Qr(t),
  839.                 i = e ? e.length : 0,
  840.                 f = pr("number" == typeof i ? i : 0);
  841.             for (a || (t = g.createCallback(t, r, 3)), Ke(e, function(e, r, o) {
  842.                     var i = f[++n] = c();
  843.                     a ? i.criteria = Je(t, function(t) {
  844.                         return e[t]
  845.                     }) : (i.criteria = u())[0] = t(e, r, o), i.index = n, i.value = e
  846.                 }), i = f.length, f.sort(o); i--;) {
  847.                 var v = f[i];
  848.                 f[i] = v.value, a || l(v.criteria), s(v)
  849.             }
  850.             return f
  851.         }
  852.  
  853.         function st(e) {
  854.             return e && "number" == typeof e.length ? f(e) : qe(e)
  855.         }
  856.  
  857.         function ft(e) {
  858.             for (var t = -1, r = e ? e.length : 0, n = []; ++t < r;) {
  859.                 var o = e[t];
  860.                 o && n.push(o)
  861.             }
  862.             return n
  863.         }
  864.  
  865.         function vt(e) {
  866.             return Z(e, ee(arguments, !0, !0, 1))
  867.         }
  868.  
  869.         function pt(e, t, r) {
  870.             var n = -1,
  871.                 o = e ? e.length : 0;
  872.             for (t = g.createCallback(t, r, 3); ++n < o;)
  873.                 if (t(e[n], n, e)) return n;
  874.             return -1
  875.         }
  876.  
  877.         function gt(e, t, r) {
  878.             var n = e ? e.length : 0;
  879.             for (t = g.createCallback(t, r, 3); n--;)
  880.                 if (t(e[n], n, e)) return n;
  881.             return -1
  882.         }
  883.  
  884.         function ht(e, t, r) {
  885.             var n = 0,
  886.                 o = e ? e.length : 0;
  887.             if ("number" != typeof t && null != t) {
  888.                 var a = -1;
  889.                 for (t = g.createCallback(t, r, 3); ++a < o && t(e[a], a, e);) n++
  890.             } else if (n = t, null == n || r) return e ? e[0] : p;
  891.             return f(e, 0, Xr(Vr(0, n), o))
  892.         }
  893.  
  894.         function mt(e, t, r, n) {
  895.             return "boolean" != typeof t && null != t && (n = r, r = "function" != typeof t && n && n[t] === e ? null : t, t = !1), null != r && (e = Je(e, r, n)), ee(e, t)
  896.         }
  897.  
  898.         function dt(t, r, n) {
  899.             if ("number" == typeof n) {
  900.                 var o = t ? t.length : 0;
  901.                 n = 0 > n ? Vr(0, o + n) : n || 0
  902.             } else if (n) {
  903.                 var a = Mt(t, r);
  904.                 return t[a] === r ? a : -1
  905.             }
  906.             return e(t, r, n)
  907.         }
  908.  
  909.         function _t(e, t, r) {
  910.             var n = 0,
  911.                 o = e ? e.length : 0;
  912.             if ("number" != typeof t && null != t) {
  913.                 var a = o;
  914.                 for (t = g.createCallback(t, r, 3); a-- && t(e[a], a, e);) n++
  915.             } else n = null == t || r ? 1 : t || n;
  916.             return f(e, 0, Xr(Vr(0, o - n), o))
  917.         }
  918.  
  919.         function bt() {
  920.             for (var r = [], n = -1, o = arguments.length, i = u(), c = ce(), f = c === e, v = u(); ++n < o;) {
  921.                 var p = arguments[n];
  922.                 (Qr(p) || ve(p)) && (r.push(p), i.push(f && p.length >= _ && a(n ? r[n] : v)))
  923.             }
  924.             var g = r[0],
  925.                 h = -1,
  926.                 m = g ? g.length : 0,
  927.                 d = [];
  928.             e: for (; ++h < m;) {
  929.                 var b = i[0];
  930.                 if (p = g[h], (b ? t(b, p) : c(v, p)) < 0) {
  931.                     for (n = o, (b || v).push(p); --n;)
  932.                         if (b = i[n], (b ? t(b, p) : c(r[n], p)) < 0) continue e;
  933.                     d.push(p)
  934.                 }
  935.             }
  936.             for (; o--;) b = i[o], b && s(b);
  937.             return l(i), l(v), d
  938.         }
  939.  
  940.         function yt(e, t, r) {
  941.             var n = 0,
  942.                 o = e ? e.length : 0;
  943.             if ("number" != typeof t && null != t) {
  944.                 var a = o;
  945.                 for (t = g.createCallback(t, r, 3); a-- && t(e[a], a, e);) n++
  946.             } else if (n = t, null == n || r) return e ? e[o - 1] : p;
  947.             return f(e, Vr(0, o - n))
  948.         }
  949.  
  950.         function Tt(e, t, r) {
  951.             var n = e ? e.length : 0;
  952.             for ("number" == typeof r && (n = (0 > r ? Vr(0, n + r) : Xr(r, n - 1)) + 1); n--;)
  953.                 if (e[n] === t) return n;
  954.             return -1
  955.         }
  956.  
  957.         function wt(e) {
  958.             for (var t = arguments, r = 0, n = t.length, o = e ? e.length : 0; ++r < n;)
  959.                 for (var a = -1, i = t[r]; ++a < o;) e[a] === i && (Ur.call(e, a--, 1), o--);
  960.             return e
  961.         }
  962.  
  963.         function Et(e, t, r) {
  964.             e = +e || 0, r = "number" == typeof r ? r : +r || 1, null == t && (t = e, e = 0);
  965.             for (var n = -1, o = Vr(0, Pr((t - e) / (r || 1))), a = pr(o); ++n < o;) a[n] = e, e += r;
  966.             return a
  967.         }
  968.  
  969.         function xt(e, t, r) {
  970.             var n = -1,
  971.                 o = e ? e.length : 0,
  972.                 a = [];
  973.             for (t = g.createCallback(t, r, 3); ++n < o;) {
  974.                 var i = e[n];
  975.                 t(i, n, e) && (a.push(i), Ur.call(e, n--, 1), o--)
  976.             }
  977.             return a
  978.         }
  979.  
  980.         function At(e, t, r) {
  981.             if ("number" != typeof t && null != t) {
  982.                 var n = 0,
  983.                     o = -1,
  984.                     a = e ? e.length : 0;
  985.                 for (t = g.createCallback(t, r, 3); ++o < a && t(e[o], o, e);) n++
  986.             } else n = null == t || r ? 1 : Vr(0, t);
  987.             return f(e, n)
  988.         }
  989.  
  990.         function Mt(e, t, r, n) {
  991.             var o = 0,
  992.                 a = e ? e.length : o;
  993.             for (r = r ? g.createCallback(r, n, 1) : Qt, t = r(t); a > o;) {
  994.                 var i = o + a >>> 1;
  995.                 r(e[i]) < t ? o = i + 1 : a = i
  996.             }
  997.             return o
  998.         }
  999.  
  1000.         function Rt() {
  1001.             return oe(ee(arguments, !0, !0))
  1002.         }
  1003.  
  1004.         function Pt(e, t, r, n) {
  1005.             return "boolean" != typeof t && null != t && (n = r, r = "function" != typeof t && n && n[t] === e ? null : t, t = !1), null != r && (r = g.createCallback(r, n, 3)), oe(e, t, r)
  1006.         }
  1007.  
  1008.         function Lt(e) {
  1009.             return Z(e, f(arguments, 1))
  1010.         }
  1011.  
  1012.         function Dt() {
  1013.             for (var e = -1, t = arguments.length; ++e < t;) {
  1014.                 var r = arguments[e];
  1015.                 if (Qr(r) || ve(r)) var n = n ? oe(Z(n, r).concat(Z(r, n))) : r
  1016.             }
  1017.             return n || []
  1018.         }
  1019.  
  1020.         function St() {
  1021.             for (var e = arguments.length > 1 ? arguments : arguments[0], t = -1, r = e ? et(pn(e, "length")) : 0, n = pr(0 > r ? 0 : r); ++t < r;) n[t] = pn(e, t);
  1022.             return n
  1023.         }
  1024.  
  1025.         function Ft(e, t) {
  1026.             var r = -1,
  1027.                 n = e ? e.length : 0,
  1028.                 o = {};
  1029.             for (t || !n || Qr(e[0]) || (t = []); ++r < n;) {
  1030.                 var a = e[r];
  1031.                 t ? o[a] = t[r] : a && (o[a[0]] = a[1])
  1032.             }
  1033.             return o
  1034.         }
  1035.  
  1036.         function kt(e, t) {
  1037.             if (!Le(t)) throw new wr;
  1038.             return function() {
  1039.                 return --e < 1 ? t.apply(this, arguments) : void 0
  1040.             }
  1041.         }
  1042.  
  1043.         function Gt(e, t) {
  1044.             return arguments.length > 2 ? ie(e, 17, f(arguments, 2), null, t) : ie(e, 1, null, null, t)
  1045.         }
  1046.  
  1047.         function It(e) {
  1048.             for (var t = arguments.length > 1 ? ee(arguments, !0, !1, 1) : ye(e), r = -1, n = t.length; ++r < n;) {
  1049.                 var o = t[r];
  1050.                 e[o] = ie(e[o], 1, null, null, e)
  1051.             }
  1052.             return e
  1053.         }
  1054.  
  1055.         function Ut(e, t) {
  1056.             return arguments.length > 2 ? ie(t, 19, f(arguments, 2), null, e) : ie(t, 3, null, null, e)
  1057.         }
  1058.  
  1059.         function Nt() {
  1060.             for (var e = arguments, t = e.length; t--;)
  1061.                 if (!Le(e[t])) throw new wr;
  1062.             return function() {
  1063.                 for (var t = arguments, r = e.length; r--;) t = [e[r].apply(this, t)];
  1064.                 return t[0]
  1065.             }
  1066.         }
  1067.  
  1068.         function Bt(e, t) {
  1069.             return t = "number" == typeof t ? t : +t || e.length, ie(e, 4, null, null, null, t)
  1070.         }
  1071.  
  1072.         function Wt(e, t, r) {
  1073.             var n, o, a, i, u, c, l, s = 0,
  1074.                 f = !1,
  1075.                 v = !0;
  1076.             if (!Le(e)) throw new wr;
  1077.             if (t = Vr(0, t) || 0, r === !0) {
  1078.                 var g = !0;
  1079.                 v = !1
  1080.             } else De(r) && (g = r.leading, f = "maxWait" in r && (Vr(t, r.maxWait) || 0), v = "trailing" in r ? r.trailing : v);
  1081.             var h = function() {
  1082.                     var r = t - (hn() - i);
  1083.                     if (0 >= r) {
  1084.                         o && Lr(o);
  1085.                         var f = l;
  1086.                         o = c = l = p, f && (s = hn(), a = e.apply(u, n), c || o || (n = u = null))
  1087.                     } else c = Ir(h, r)
  1088.                 },
  1089.                 m = function() {
  1090.                     c && Lr(c), o = c = l = p, (v || f !== t) && (s = hn(), a = e.apply(u, n), c || o || (n = u = null))
  1091.                 };
  1092.             return function() {
  1093.                 if (n = arguments, i = hn(), u = this, l = v && (c || !g), f === !1) var r = g && !c;
  1094.                 else {
  1095.                     o || g || (s = i);
  1096.                     var p = f - (i - s),
  1097.                         d = 0 >= p;
  1098.                     d ? (o && (o = Lr(o)), s = i, a = e.apply(u, n)) : o || (o = Ir(m, p))
  1099.                 }
  1100.                 return d && c ? c = Lr(c) : c || t === f || (c = Ir(h, t)), r && (d = !0, a = e.apply(u, n)), !d || c || o || (n = u = null), a
  1101.             }
  1102.         }
  1103.  
  1104.         function Ot(e) {
  1105.             if (!Le(e)) throw new wr;
  1106.             var t = f(arguments, 1);
  1107.             return Ir(function() {
  1108.                 e.apply(p, t)
  1109.             }, 1)
  1110.         }
  1111.  
  1112.         function Ct(e, t) {
  1113.             if (!Le(e)) throw new wr;
  1114.             var r = f(arguments, 2);
  1115.             return Ir(function() {
  1116.                 e.apply(p, r)
  1117.             }, t)
  1118.         }
  1119.  
  1120.         function jt(e, t) {
  1121.             if (!Le(e)) throw new wr;
  1122.             var r = function() {
  1123.                 var n = r.cache,
  1124.                     o = t ? t.apply(this, arguments) : d + arguments[0];
  1125.                 return kr.call(n, o) ? n[o] : n[o] = e.apply(this, arguments)
  1126.             };
  1127.             return r.cache = {}, r
  1128.         }
  1129.  
  1130.         function qt(e) {
  1131.             var t, r;
  1132.             if (!Le(e)) throw new wr;
  1133.             return function() {
  1134.                 return t ? r : (t = !0, r = e.apply(this, arguments), e = null, r)
  1135.             }
  1136.         }
  1137.  
  1138.         function Vt(e) {
  1139.             return ie(e, 16, f(arguments, 1))
  1140.         }
  1141.  
  1142.         function Xt(e) {
  1143.             return ie(e, 32, null, f(arguments, 1))
  1144.         }
  1145.  
  1146.         function zt(e, t, r) {
  1147.             var n = !0,
  1148.                 o = !0;
  1149.             if (!Le(e)) throw new wr;
  1150.             return r === !1 ? n = !1 : De(r) && (n = "leading" in r ? r.leading : n, o = "trailing" in r ? r.trailing : o), V.leading = n, V.maxWait = t, V.trailing = o, Wt(e, t, V)
  1151.         }
  1152.  
  1153.         function Ht(e, t) {
  1154.             return ie(t, 16, [e])
  1155.         }
  1156.  
  1157.         function $t(e) {
  1158.             return function() {
  1159.                 return e
  1160.             }
  1161.         }
  1162.  
  1163.         function Yt(e, t, r) {
  1164.             var n = typeof e;
  1165.             if (null == e || "function" == n) return K(e, t, r);
  1166.             if ("object" != n) return tr(e);
  1167.             var o = Jr(e),
  1168.                 a = o[0],
  1169.                 i = e[a];
  1170.             return 1 != o.length || i !== i || De(i) ? function(t) {
  1171.                 for (var r = o.length, n = !1; r-- && (n = te(t[o[r]], e[o[r]], null, !0)););
  1172.                 return n
  1173.             } : function(e) {
  1174.                 var t = e[a];
  1175.                 return i === t && (0 !== i || 1 / i == 1 / t)
  1176.             }
  1177.         }
  1178.  
  1179.         function Kt(e) {
  1180.             return null == e ? "" : Tr(e).replace(nn, ue)
  1181.         }
  1182.  
  1183.         function Qt(e) {
  1184.             return e
  1185.         }
  1186.  
  1187.         function Zt(e, t, r) {
  1188.             var n = !0,
  1189.                 o = t && ye(t);
  1190.             t && (r || o.length) || (null == r && (r = t), a = h, t = e, e = g, o = ye(t)), r === !1 ? n = !1 : De(r) && "chain" in r && (n = r.chain);
  1191.             var a = e,
  1192.                 i = Le(a);
  1193.             Ke(o, function(r) {
  1194.                 var o = e[r] = t[r];
  1195.                 i && (a.prototype[r] = function() {
  1196.                     var t = this.__chain__,
  1197.                         r = this.__wrapped__,
  1198.                         i = [r];
  1199.                     Gr.apply(i, arguments);
  1200.                     var u = o.apply(e, i);
  1201.                     if (n || t) {
  1202.                         if (r === u && De(u)) return this;
  1203.                         u = new a(u), u.__chain__ = t
  1204.                     }
  1205.                     return u
  1206.                 })
  1207.             })
  1208.         }
  1209.  
  1210.         function Jt() {
  1211.             return r._ = Ar, this
  1212.         }
  1213.  
  1214.         function er() {}
  1215.  
  1216.         function tr(e) {
  1217.             return function(t) {
  1218.                 return t[e]
  1219.             }
  1220.         }
  1221.  
  1222.         function rr(e, t, r) {
  1223.             var n = null == e,
  1224.                 o = null == t;
  1225.             if (null == r && ("boolean" == typeof e && o ? (r = e, e = 1) : o || "boolean" != typeof t || (r = t, o = !0)), n && o && (t = 1), e = +e || 0, o ? (t = e, e = 0) : t = +t || 0, r || e % 1 || t % 1) {
  1226.                 var a = Hr();
  1227.                 return Xr(e + a * (t - e + parseFloat("1e-" + ((a + "").length - 1))), t)
  1228.             }
  1229.             return ne(e, t)
  1230.         }
  1231.  
  1232.         function nr(e, t) {
  1233.             if (e) {
  1234.                 var r = e[t];
  1235.                 return Le(r) ? e[t]() : r
  1236.             }
  1237.         }
  1238.  
  1239.         function or(e, t, r) {
  1240.             var n = g.templateSettings;
  1241.             e = Tr(e || ""), r = an({}, r, n);
  1242.             var o, a = an({}, r.imports, n.imports),
  1243.                 u = Jr(a),
  1244.                 c = qe(a),
  1245.                 l = 0,
  1246.                 s = r.interpolate || L,
  1247.                 f = "__p += '",
  1248.                 v = yr((r.escape || L).source + "|" + s.source + "|" + (s === R ? x : L).source + "|" + (r.evaluate || L).source + "|$", "g");
  1249.             e.replace(v, function(t, r, n, a, u, c) {
  1250.                 return n || (n = a), f += e.slice(l, c).replace(S, i), r && (f += "' +\n__e(" + r + ") +\n'"), u && (o = !0, f += "';\n" + u + ";\n__p += '"), n && (f += "' +\n((__t = (" + n + ")) == null ? '' : __t) +\n'"), l = c + t.length, t
  1251.             }), f += "';\n";
  1252.             var h = r.variable,
  1253.                 m = h;
  1254.             m || (h = "obj", f = "with (" + h + ") {\n" + f + "\n}\n"), f = (o ? f.replace(T, "") : f).replace(w, "$1").replace(E, "$1;"), f = "function(" + h + ") {\n" + (m ? "" : h + " || (" + h + " = {});\n") + "var __t, __p = '', __e = _.escape" + (o ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + f + "return __p\n}";
  1255.             var d = "\n/*\n//# sourceURL=" + (r.sourceURL || "/lodash/template/source[" + k++ + "]") + "\n*/";
  1256.             try {
  1257.                 var _ = mr(u, "return " + f + d).apply(p, c)
  1258.             } catch (b) {
  1259.                 throw b.source = f, b
  1260.             }
  1261.             return t ? _(t) : (_.source = f, _)
  1262.         }
  1263.  
  1264.         function ar(e, t, r) {
  1265.             e = (e = +e) > -1 ? e : 0;
  1266.             var n = -1,
  1267.                 o = pr(e);
  1268.             for (t = K(t, r, 1); ++n < e;) o[n] = t(n);
  1269.             return o
  1270.         }
  1271.  
  1272.         function ir(e) {
  1273.             return null == e ? "" : Tr(e).replace(rn, fe)
  1274.         }
  1275.  
  1276.         function ur(e) {
  1277.             var t = ++m;
  1278.             return Tr(null == e ? "" : e) + t
  1279.         }
  1280.  
  1281.         function cr(e) {
  1282.             return e = new h(e), e.__chain__ = !0, e
  1283.         }
  1284.  
  1285.         function lr(e, t) {
  1286.             return t(e), e
  1287.         }
  1288.  
  1289.         function sr() {
  1290.             return this.__chain__ = !0, this
  1291.         }
  1292.  
  1293.         function fr() {
  1294.             return Tr(this.__wrapped__)
  1295.         }
  1296.  
  1297.         function vr() {
  1298.             return this.__wrapped__
  1299.         }
  1300.         r = r ? J.defaults($.Object(), r, J.pick($, F)) : $;
  1301.         var pr = r.Array,
  1302.             gr = r.Boolean,
  1303.             hr = r.Date,
  1304.             mr = r.Function,
  1305.             dr = r.Math,
  1306.             _r = r.Number,
  1307.             br = r.Object,
  1308.             yr = r.RegExp,
  1309.             Tr = r.String,
  1310.             wr = r.TypeError,
  1311.             Er = [],
  1312.             xr = br.prototype,
  1313.             Ar = r._,
  1314.             Mr = xr.toString,
  1315.             Rr = yr("^" + Tr(Mr).replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/toString| for [^\]]+/g, ".*?") + "$"),
  1316.             Pr = dr.ceil,
  1317.             Lr = r.clearTimeout,
  1318.             Dr = dr.floor,
  1319.             Sr = mr.prototype.toString,
  1320.             Fr = le(Fr = br.getPrototypeOf) && Fr,
  1321.             kr = xr.hasOwnProperty,
  1322.             Gr = Er.push,
  1323.             Ir = r.setTimeout,
  1324.             Ur = Er.splice,
  1325.             Nr = Er.unshift,
  1326.             Br = function() {
  1327.                 try {
  1328.                     var e = {},
  1329.                         t = le(t = br.defineProperty) && t,
  1330.                         r = t(e, e, e) && t
  1331.                 } catch (n) {}
  1332.                 return r
  1333.             }(),
  1334.             Wr = le(Wr = br.create) && Wr,
  1335.             Or = le(Or = pr.isArray) && Or,
  1336.             Cr = r.isFinite,
  1337.             jr = r.isNaN,
  1338.             qr = le(qr = br.keys) && qr,
  1339.             Vr = dr.max,
  1340.             Xr = dr.min,
  1341.             zr = r.parseInt,
  1342.             Hr = dr.random,
  1343.             $r = {};
  1344.         $r[I] = pr, $r[U] = gr, $r[N] = hr, $r[B] = mr, $r[O] = br, $r[W] = _r, $r[C] = yr, $r[j] = Tr, h.prototype = g.prototype;
  1345.         var Yr = g.support = {};
  1346.         Yr.funcDecomp = !le(r.WinRTError) && D.test(v), Yr.funcNames = "string" == typeof mr.name, g.templateSettings = {
  1347.             escape: /<%-([\s\S]+?)%>/g,
  1348.             evaluate: /<%([\s\S]+?)%>/g,
  1349.             interpolate: R,
  1350.             variable: "",
  1351.             imports: {
  1352.                 _: g
  1353.             }
  1354.         }, Wr || (Y = function() {
  1355.             function e() {}
  1356.             return function(t) {
  1357.                 if (De(t)) {
  1358.                     e.prototype = t;
  1359.                     var n = new e;
  1360.                     e.prototype = null
  1361.                 }
  1362.                 return n || r.Object()
  1363.             }
  1364.         }());
  1365.         var Kr = Br ? function(e, t) {
  1366.                 X.value = t, Br(e, "__bindData__", X)
  1367.             } : er,
  1368.             Qr = Or || function(e) {
  1369.                 return e && "object" == typeof e && "number" == typeof e.length && Mr.call(e) == I || !1
  1370.             },
  1371.             Zr = function(e) {
  1372.                 var t, r = e,
  1373.                     n = [];
  1374.                 if (!r) return n;
  1375.                 if (!z[typeof e]) return n;
  1376.                 for (t in r) kr.call(r, t) && n.push(t);
  1377.                 return n
  1378.             },
  1379.             Jr = qr ? function(e) {
  1380.                 return De(e) ? qr(e) : []
  1381.             } : Zr,
  1382.             en = {
  1383.                 "&": "&amp;",
  1384.                 "<": "&lt;",
  1385.                 ">": "&gt;",
  1386.                 '"': "&quot;",
  1387.                 "'": "&#39;"
  1388.             },
  1389.             tn = we(en),
  1390.             rn = yr("(" + Jr(tn).join("|") + ")", "g"),
  1391.             nn = yr("[" + Jr(en).join("") + "]", "g"),
  1392.             on = function(e, t, r) {
  1393.                 var n, o = e,
  1394.                     a = o;
  1395.                 if (!o) return a;
  1396.                 var i = arguments,
  1397.                     u = 0,
  1398.                     c = "number" == typeof r ? 2 : i.length;
  1399.                 if (c > 3 && "function" == typeof i[c - 2]) var l = K(i[--c - 1], i[c--], 2);
  1400.                 else c > 2 && "function" == typeof i[c - 1] && (l = i[--c]);
  1401.                 for (; ++u < c;)
  1402.                     if (o = i[u], o && z[typeof o])
  1403.                         for (var s = -1, f = z[typeof o] && Jr(o), v = f ? f.length : 0; ++s < v;) n = f[s], a[n] = l ? l(a[n], o[n]) : o[n];
  1404.                 return a
  1405.             },
  1406.             an = function(e, t, r) {
  1407.                 var n, o = e,
  1408.                     a = o;
  1409.                 if (!o) return a;
  1410.                 for (var i = arguments, u = 0, c = "number" == typeof r ? 2 : i.length; ++u < c;)
  1411.                     if (o = i[u], o && z[typeof o])
  1412.                         for (var l = -1, s = z[typeof o] && Jr(o), f = s ? s.length : 0; ++l < f;) n = s[l], "undefined" == typeof a[n] && (a[n] = o[n]);
  1413.                 return a
  1414.             },
  1415.             un = function(e, t, r) {
  1416.                 var n, o = e,
  1417.                     a = o;
  1418.                 if (!o) return a;
  1419.                 if (!z[typeof o]) return a;
  1420.                 t = t && "undefined" == typeof r ? t : K(t, r, 3);
  1421.                 for (n in o)
  1422.                     if (t(o[n], n, e) === !1) return a;
  1423.                 return a
  1424.             },
  1425.             cn = function(e, t, r) {
  1426.                 var n, o = e,
  1427.                     a = o;
  1428.                 if (!o) return a;
  1429.                 if (!z[typeof o]) return a;
  1430.                 t = t && "undefined" == typeof r ? t : K(t, r, 3);
  1431.                 for (var i = -1, u = z[typeof o] && Jr(o), c = u ? u.length : 0; ++i < c;)
  1432.                     if (n = u[i], t(o[n], n, e) === !1) return a;
  1433.                 return a
  1434.             },
  1435.             ln = Fr ? function(e) {
  1436.                 if (!e || Mr.call(e) != O) return !1;
  1437.                 var t = e.valueOf,
  1438.                     r = le(t) && (r = Fr(t)) && Fr(r);
  1439.                 return r ? e == r || Fr(e) == r : se(e)
  1440.             } : se,
  1441.             sn = ae(function(e, t, r) {
  1442.                 kr.call(e, r) ? e[r]++ : e[r] = 1
  1443.             }),
  1444.             fn = ae(function(e, t, r) {
  1445.                 (kr.call(e, r) ? e[r] : e[r] = []).push(t)
  1446.             }),
  1447.             vn = ae(function(e, t, r) {
  1448.                 e[r] = t
  1449.             }),
  1450.             pn = Je,
  1451.             gn = He,
  1452.             hn = le(hn = hr.now) && hn || function() {
  1453.                 return (new hr).getTime()
  1454.             },
  1455.             mn = 8 == zr(y + "08") ? zr : function(e, t) {
  1456.                 return zr(Ie(e) ? e.replace(P, "") : e, t || 0)
  1457.             };
  1458.         return g.after = kt, g.assign = on, g.at = Ve, g.bind = Gt, g.bindAll = It, g.bindKey = Ut, g.chain = cr, g.compact = ft, g.compose = Nt, g.constant = $t, g.countBy = sn, g.create = he, g.createCallback = Yt, g.curry = Bt, g.debounce = Wt, g.defaults = an, g.defer = Ot, g.delay = Ct, g.difference = vt, g.filter = He, g.flatten = mt, g.forEach = Ke, g.forEachRight = Qe, g.forIn = un, g.forInRight = _e, g.forOwn = cn, g.forOwnRight = be, g.functions = ye, g.groupBy = fn, g.indexBy = vn, g.initial = _t, g.intersection = bt, g.invert = we, g.invoke = Ze, g.keys = Jr, g.map = Je, g.mapValues = Ne, g.max = et, g.memoize = jt, g.merge = Be, g.min = tt, g.omit = We, g.once = qt, g.pairs = Oe, g.partial = Vt, g.partialRight = Xt, g.pick = Ce, g.pluck = pn, g.property = tr, g.pull = wt, g.range = Et, g.reject = ot, g.remove = xt, g.rest = At, g.shuffle = it, g.sortBy = lt, g.tap = lr, g.throttle = zt, g.times = ar, g.toArray = st, g.transform = je, g.union = Rt, g.uniq = Pt, g.values = qe, g.where = gn, g.without = Lt, g.wrap = Ht, g.xor = Dt, g.zip = St, g.zipObject = Ft, g.collect = Je, g.drop = At, g.each = Ke, g.eachRight = Qe, g.extend = on, g.methods = ye, g.object = Ft, g.select = He, g.tail = At, g.unique = Pt, g.unzip = St, Zt(g), g.clone = pe, g.cloneDeep = ge, g.contains = Xe, g.escape = Kt, g.every = ze, g.find = $e, g.findIndex = pt, g.findKey = me, g.findLast = Ye, g.findLastIndex = gt, g.findLastKey = de, g.has = Te, g.identity = Qt, g.indexOf = dt, g.isArguments = ve, g.isArray = Qr, g.isBoolean = Ee, g.isDate = xe, g.isElement = Ae, g.isEmpty = Me, g.isEqual = Re, g.isFinite = Pe, g.isFunction = Le, g.isNaN = Se, g.isNull = Fe, g.isNumber = ke, g.isObject = De, g.isPlainObject = ln, g.isRegExp = Ge, g.isString = Ie, g.isUndefined = Ue, g.lastIndexOf = Tt, g.mixin = Zt, g.noConflict = Jt, g.noop = er, g.now = hn, g.parseInt = mn, g.random = rr, g.reduce = rt, g.reduceRight = nt, g.result = nr, g.runInContext = v, g.size = ut, g.some = ct, g.sortedIndex = Mt, g.template = or, g.unescape = ir, g.uniqueId = ur, g.all = ze, g.any = ct, g.detect = $e, g.findWhere = $e, g.foldl = rt, g.foldr = nt, g.include = Xe, g.inject = rt, Zt(function() {
  1459.             var e = {};
  1460.             return cn(g, function(t, r) {
  1461.                 g.prototype[r] || (e[r] = t)
  1462.             }), e
  1463.         }(), !1), g.first = ht, g.last = yt, g.sample = at, g.take = ht, g.head = ht, cn(g, function(e, t) {
  1464.             var r = "sample" !== t;
  1465.             g.prototype[t] || (g.prototype[t] = function(t, n) {
  1466.                 var o = this.__chain__,
  1467.                     a = e(this.__wrapped__, t, n);
  1468.                 return o || null != t && (!n || r && "function" == typeof t) ? new h(a, o) : a
  1469.             })
  1470.         }), g.VERSION = "2.4.1", g.prototype.chain = sr, g.prototype.toString = fr, g.prototype.value = vr, g.prototype.valueOf = vr, Ke(["join", "pop", "shift"], function(e) {
  1471.             var t = Er[e];
  1472.             g.prototype[e] = function() {
  1473.                 var e = this.__chain__,
  1474.                     r = t.apply(this.__wrapped__, arguments);
  1475.                 return e ? new h(r, e) : r
  1476.             }
  1477.         }), Ke(["push", "reverse", "sort", "unshift"], function(e) {
  1478.             var t = Er[e];
  1479.             g.prototype[e] = function() {
  1480.                 return t.apply(this.__wrapped__, arguments), this
  1481.             }
  1482.         }), Ke(["concat", "slice", "splice"], function(e) {
  1483.             var t = Er[e];
  1484.             g.prototype[e] = function() {
  1485.                 return new h(t.apply(this.__wrapped__, arguments), this.__chain__)
  1486.             }
  1487.         }), g
  1488.     }
  1489.     var p, g = [],
  1490.         h = [],
  1491.         m = 0,
  1492.         d = +new Date + "",
  1493.         _ = 75,
  1494.         b = 40,
  1495.         y = "   \f \ufeff\n\r\u2028\u2029 ᠎              ",
  1496.         T = /\b__p \+= '';/g,
  1497.         w = /\b(__p \+=) '' \+/g,
  1498.         E = /(__e\(.*?\)|\b__t\)) \+\n'';/g,
  1499.         x = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,
  1500.         A = /\w*$/,
  1501.         M = /^\s*function[ \n\r\t]+\w/,
  1502.         R = /<%=([\s\S]+?)%>/g,
  1503.         P = RegExp("^[" + y + "]*0+(?=.$)"),
  1504.         L = /($^)/,
  1505.         D = /\bthis\b/,
  1506.         S = /['\n\r\t\u2028\u2029\\]/g,
  1507.         F = ["Array", "Boolean", "Date", "Function", "Math", "Number", "Object", "RegExp", "String", "_", "attachEvent", "clearTimeout", "isFinite", "isNaN", "parseInt", "setTimeout"],
  1508.         k = 0,
  1509.         G = "[object Arguments]",
  1510.         I = "[object Array]",
  1511.         U = "[object Boolean]",
  1512.         N = "[object Date]",
  1513.         B = "[object Function]",
  1514.         W = "[object Number]",
  1515.         O = "[object Object]",
  1516.         C = "[object RegExp]",
  1517.         j = "[object String]",
  1518.         q = {};
  1519.     q[B] = !1, q[G] = q[I] = q[U] = q[N] = q[W] = q[O] = q[C] = q[j] = !0;
  1520.     var V = {
  1521.             leading: !1,
  1522.             maxWait: 0,
  1523.             trailing: !1
  1524.         },
  1525.         X = {
  1526.             configurable: !1,
  1527.             enumerable: !1,
  1528.             value: null,
  1529.             writable: !1
  1530.         },
  1531.         z = {
  1532.             "boolean": !1,
  1533.             "function": !0,
  1534.             object: !0,
  1535.             number: !1,
  1536.             string: !1,
  1537.             undefined: !1
  1538.         },
  1539.         H = {
  1540.             "\\": "\\",
  1541.             "'": "'",
  1542.             "\n": "n",
  1543.             "\r": "r",
  1544.             "   ": "t",
  1545.             "\u2028": "u2028",
  1546.             "\u2029": "u2029"
  1547.         },
  1548.         $ = z[typeof window] && window || this,
  1549.         Y = z[typeof exports] && exports && !exports.nodeType && exports,
  1550.         K = z[typeof module] && module && !module.nodeType && module,
  1551.         Q = K && K.exports === Y && Y,
  1552.         Z = z[typeof global] && global;
  1553.     !Z || Z.global !== Z && Z.window !== Z || ($ = Z);
  1554.     var J = v();
  1555.     "function" == typeof define && "object" == typeof define.amd && define.amd ? ($._ = J, define(function() {
  1556.         return J
  1557.     })) : Y && K ? Q ? (K.exports = J)._ = J : Y._ = J : $._ = J
  1558. }).call(this),
  1559.     function(e) {
  1560.         function t(e, t) {
  1561.             for (var r = e.length; r--;)
  1562.                 if (e[r] === t) return r;
  1563.             return -1
  1564.         }
  1565.  
  1566.         function r(e, t) {
  1567.             if (e.length != t.length) return !1;
  1568.             for (var r = 0; r < e.length; r++)
  1569.                 if (e[r] !== t[r]) return !1;
  1570.             return !0
  1571.         }
  1572.  
  1573.         function n(e) {
  1574.             for (b in T) T[b] = e[R[b]]
  1575.         }
  1576.  
  1577.         function o(e) {
  1578.             var r, o, a, i, c, l;
  1579.             if (r = e.keyCode, -1 == t(M, r) && M.push(r), (93 == r || 224 == r) && (r = 91), r in T) {
  1580.                 T[r] = !0;
  1581.                 for (a in E) E[a] == r && (u[a] = !0)
  1582.             } else if (n(e), u.filter.call(this, e) && r in y)
  1583.                 for (l = p(), i = 0; i < y[r].length; i++)
  1584.                     if (o = y[r][i], o.scope == l || "all" == o.scope) {
  1585.                         c = o.mods.length > 0;
  1586.                         for (a in T)(!T[a] && t(o.mods, +a) > -1 || T[a] && -1 == t(o.mods, +a)) && (c = !1);
  1587.                         (0 != o.mods.length || T[16] || T[18] || T[17] || T[91]) && !c || o.method(e, o) === !1 && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, e.stopPropagation && e.stopPropagation(), e.cancelBubble && (e.cancelBubble = !0))
  1588.                     }
  1589.         }
  1590.  
  1591.         function a(e) {
  1592.             var r, n = e.keyCode,
  1593.                 o = t(M, n);
  1594.             if (o >= 0 && M.splice(o, 1), (93 == n || 224 == n) && (n = 91), n in T) {
  1595.                 T[n] = !1;
  1596.                 for (r in E) E[r] == n && (u[r] = !1)
  1597.             }
  1598.         }
  1599.  
  1600.         function i() {
  1601.             for (b in T) T[b] = !1;
  1602.             for (b in E) u[b] = !1
  1603.         }
  1604.  
  1605.         function u(e, t, r) {
  1606.             var n, o;
  1607.             n = h(e), void 0 === r && (r = t, t = "all");
  1608.             for (var a = 0; a < n.length; a++) o = [], e = n[a].split("+"), e.length > 1 && (o = m(e), e = [e[e.length - 1]]), e = e[0], e = A(e), e in y || (y[e] = []), y[e].push({
  1609.                 shortcut: n[a],
  1610.                 scope: t,
  1611.                 method: r,
  1612.                 key: n[a],
  1613.                 mods: o
  1614.             })
  1615.         }
  1616.  
  1617.         function c(e, t) {
  1618.             var n, o, a, i, u, c = [];
  1619.             for (n = h(e), i = 0; i < n.length; i++) {
  1620.                 if (o = n[i].split("+"), o.length > 1 && (c = m(o), e = o[o.length - 1]), e = A(e), void 0 === t && (t = p()), !y[e]) return;
  1621.                 for (a in y[e]) u = y[e][a], u.scope === t && r(u.mods, c) && (y[e][a] = {})
  1622.             }
  1623.         }
  1624.  
  1625.         function l(e) {
  1626.             return "string" == typeof e && (e = A(e)), -1 != t(M, e)
  1627.         }
  1628.  
  1629.         function s() {
  1630.             return M.slice(0)
  1631.         }
  1632.  
  1633.         function f(e) {
  1634.             var t = (e.target || e.srcElement).tagName;
  1635.             return !("INPUT" == t || "SELECT" == t || "TEXTAREA" == t)
  1636.         }
  1637.  
  1638.         function v(e) {
  1639.             w = e || "all"
  1640.         }
  1641.  
  1642.         function p() {
  1643.             return w || "all"
  1644.         }
  1645.  
  1646.         function g(e) {
  1647.             var t, r, n;
  1648.             for (t in y)
  1649.                 for (r = y[t], n = 0; n < r.length;) r[n].scope === e ? r.splice(n, 1) : n++
  1650.         }
  1651.  
  1652.         function h(e) {
  1653.             var t;
  1654.             return e = e.replace(/\s/g, ""), t = e.split(","), "" == t[t.length - 1] && (t[t.length - 2] += ","), t
  1655.         }
  1656.  
  1657.         function m(e) {
  1658.             for (var t = e.slice(0, e.length - 1), r = 0; r < t.length; r++) t[r] = E[t[r]];
  1659.             return t
  1660.         }
  1661.  
  1662.         function d(e, t, r) {
  1663.             e.addEventListener ? e.addEventListener(t, r, !1) : e.attachEvent && e.attachEvent("on" + t, function() {
  1664.                 r(window.event)
  1665.             })
  1666.         }
  1667.  
  1668.         function _() {
  1669.             var t = e.key;
  1670.             return e.key = P, t
  1671.         }
  1672.         var b, y = {},
  1673.             T = {
  1674.                 16: !1,
  1675.                 18: !1,
  1676.                 17: !1,
  1677.                 91: !1
  1678.             },
  1679.             w = "all",
  1680.             E = {
  1681.                 "⇧": 16,
  1682.                 shift: 16,
  1683.                 "⌥": 18,
  1684.                 alt: 18,
  1685.                 option: 18,
  1686.                 "⌃": 17,
  1687.                 ctrl: 17,
  1688.                 control: 17,
  1689.                 "⌘": 91,
  1690.                 command: 91
  1691.             },
  1692.             x = {
  1693.                 backspace: 8,
  1694.                 tab: 9,
  1695.                 clear: 12,
  1696.                 enter: 13,
  1697.                 "return": 13,
  1698.                 esc: 27,
  1699.                 escape: 27,
  1700.                 space: 32,
  1701.                 left: 37,
  1702.                 up: 38,
  1703.                 right: 39,
  1704.                 down: 40,
  1705.                 del: 46,
  1706.                 "delete": 46,
  1707.                 home: 36,
  1708.                 end: 35,
  1709.                 pageup: 33,
  1710.                 pagedown: 34,
  1711.                 ",": 188,
  1712.                 ".": 190,
  1713.                 "/": 191,
  1714.                 "`": 192,
  1715.                 "-": 189,
  1716.                 "=": 187,
  1717.                 ";": 186,
  1718.                 "'": 222,
  1719.                 "[": 219,
  1720.                 "]": 221,
  1721.                 "\\": 220
  1722.             },
  1723.             A = function(e) {
  1724.                 return x[e] || e.toUpperCase().charCodeAt(0)
  1725.             },
  1726.             M = [];
  1727.         for (b = 1; 20 > b; b++) x["f" + b] = 111 + b;
  1728.         var R = {
  1729.             16: "shiftKey",
  1730.             18: "altKey",
  1731.             17: "ctrlKey",
  1732.             91: "metaKey"
  1733.         };
  1734.         for (b in E) u[b] = !1;
  1735.         d(document, "keydown", function(e) {
  1736.             o(e)
  1737.         }), d(document, "keyup", a), d(window, "focus", i);
  1738.         var P = e.key;
  1739.         e.key = u, e.key.setScope = v, e.key.getScope = p, e.key.deleteScope = g, e.key.filter = f, e.key.isPressed = l, e.key.getPressedKeyCodes = s, e.key.noConflict = _, e.key.unbind = c, "undefined" != typeof module && (module.exports = key)
  1740.     }(this),
  1741.     function(e) {
  1742.         "use strict";
  1743.         var t = {};
  1744.         "undefined" == typeof exports ? "function" == typeof define && "object" == typeof define.amd && define.amd ? (t.exports = {},
  1745.                 define(function() {
  1746.                     return t.exports
  1747.                 })) : t.exports = "undefined" != typeof window ? window : e : t.exports = exports,
  1748.             function(e) {
  1749.                 if (!t) var t = 1e-6;
  1750.                 if (!r) var r = "undefined" != typeof Float32Array ? Float32Array : Array;
  1751.                 if (!n) var n = Math.random;
  1752.                 var o = {};
  1753.                 o.setMatrixArrayType = function(e) {
  1754.                     r = e
  1755.                 }, "undefined" != typeof e && (e.glMatrix = o);
  1756.                 var a = Math.PI / 180;
  1757.                 o.toRadian = function(e) {
  1758.                     return e * a
  1759.                 };
  1760.                 var i = {};
  1761.                 i.create = function() {
  1762.                     var e = new r(2);
  1763.                     return e[0] = 0, e[1] = 0, e
  1764.                 }, i.clone = function(e) {
  1765.                     var t = new r(2);
  1766.                     return t[0] = e[0], t[1] = e[1], t
  1767.                 }, i.fromValues = function(e, t) {
  1768.                     var n = new r(2);
  1769.                     return n[0] = e, n[1] = t, n
  1770.                 }, i.copy = function(e, t) {
  1771.                     return e[0] = t[0], e[1] = t[1], e
  1772.                 }, i.set = function(e, t, r) {
  1773.                     return e[0] = t, e[1] = r, e
  1774.                 }, i.add = function(e, t, r) {
  1775.                     return e[0] = t[0] + r[0], e[1] = t[1] + r[1], e
  1776.                 }, i.subtract = function(e, t, r) {
  1777.                     return e[0] = t[0] - r[0], e[1] = t[1] - r[1], e
  1778.                 }, i.sub = i.subtract, i.multiply = function(e, t, r) {
  1779.                     return e[0] = t[0] * r[0], e[1] = t[1] * r[1], e
  1780.                 }, i.mul = i.multiply, i.divide = function(e, t, r) {
  1781.                     return e[0] = t[0] / r[0], e[1] = t[1] / r[1], e
  1782.                 }, i.div = i.divide, i.min = function(e, t, r) {
  1783.                     return e[0] = Math.min(t[0], r[0]), e[1] = Math.min(t[1], r[1]), e
  1784.                 }, i.max = function(e, t, r) {
  1785.                     return e[0] = Math.max(t[0], r[0]), e[1] = Math.max(t[1], r[1]), e
  1786.                 }, i.scale = function(e, t, r) {
  1787.                     return e[0] = t[0] * r, e[1] = t[1] * r, e
  1788.                 }, i.scaleAndAdd = function(e, t, r, n) {
  1789.                     return e[0] = t[0] + r[0] * n, e[1] = t[1] + r[1] * n, e
  1790.                 }, i.distance = function(e, t) {
  1791.                     var r = t[0] - e[0],
  1792.                         n = t[1] - e[1];
  1793.                     return Math.sqrt(r * r + n * n)
  1794.                 }, i.dist = i.distance, i.squaredDistance = function(e, t) {
  1795.                     var r = t[0] - e[0],
  1796.                         n = t[1] - e[1];
  1797.                     return r * r + n * n
  1798.                 }, i.sqrDist = i.squaredDistance, i.length = function(e) {
  1799.                     var t = e[0],
  1800.                         r = e[1];
  1801.                     return Math.sqrt(t * t + r * r)
  1802.                 }, i.len = i.length, i.squaredLength = function(e) {
  1803.                     var t = e[0],
  1804.                         r = e[1];
  1805.                     return t * t + r * r
  1806.                 }, i.sqrLen = i.squaredLength, i.negate = function(e, t) {
  1807.                     return e[0] = -t[0], e[1] = -t[1], e
  1808.                 }, i.inverse = function(e, t) {
  1809.                     return e[0] = 1 / t[0], e[1] = 1 / t[1], e
  1810.                 }, i.normalize = function(e, t) {
  1811.                     var r = t[0],
  1812.                         n = t[1],
  1813.                         o = r * r + n * n;
  1814.                     return o > 0 && (o = 1 / Math.sqrt(o), e[0] = t[0] * o, e[1] = t[1] * o), e
  1815.                 }, i.dot = function(e, t) {
  1816.                     return e[0] * t[0] + e[1] * t[1]
  1817.                 }, i.cross = function(e, t, r) {
  1818.                     var n = t[0] * r[1] - t[1] * r[0];
  1819.                     return e[0] = e[1] = 0, e[2] = n, e
  1820.                 }, i.lerp = function(e, t, r, n) {
  1821.                     var o = t[0],
  1822.                         a = t[1];
  1823.                     return e[0] = o + n * (r[0] - o), e[1] = a + n * (r[1] - a), e
  1824.                 }, i.random = function(e, t) {
  1825.                     t = t || 1;
  1826.                     var r = 2 * n() * Math.PI;
  1827.                     return e[0] = Math.cos(r) * t, e[1] = Math.sin(r) * t, e
  1828.                 }, i.transformMat2 = function(e, t, r) {
  1829.                     var n = t[0],
  1830.                         o = t[1];
  1831.                     return e[0] = r[0] * n + r[2] * o, e[1] = r[1] * n + r[3] * o, e
  1832.                 }, i.transformMat2d = function(e, t, r) {
  1833.                     var n = t[0],
  1834.                         o = t[1];
  1835.                     return e[0] = r[0] * n + r[2] * o + r[4], e[1] = r[1] * n + r[3] * o + r[5], e
  1836.                 }, i.transformMat3 = function(e, t, r) {
  1837.                     var n = t[0],
  1838.                         o = t[1];
  1839.                     return e[0] = r[0] * n + r[3] * o + r[6], e[1] = r[1] * n + r[4] * o + r[7], e
  1840.                 }, i.transformMat4 = function(e, t, r) {
  1841.                     var n = t[0],
  1842.                         o = t[1];
  1843.                     return e[0] = r[0] * n + r[4] * o + r[12], e[1] = r[1] * n + r[5] * o + r[13], e
  1844.                 }, i.forEach = function() {
  1845.                     var e = i.create();
  1846.                     return function(t, r, n, o, a, i) {
  1847.                         var u, c;
  1848.                         for (r || (r = 2), n || (n = 0), c = o ? Math.min(o * r + n, t.length) : t.length, u = n; c > u; u += r) e[0] = t[u], e[1] = t[u + 1], a(e, e, i), t[u] = e[0], t[u + 1] = e[1];
  1849.                         return t
  1850.                     }
  1851.                 }(), i.str = function(e) {
  1852.                     return "vec2(" + e[0] + ", " + e[1] + ")"
  1853.                 }, "undefined" != typeof e && (e.vec2 = i);
  1854.                 var u = {};
  1855.                 u.create = function() {
  1856.                     var e = new r(3);
  1857.                     return e[0] = 0, e[1] = 0, e[2] = 0, e
  1858.                 }, u.clone = function(e) {
  1859.                     var t = new r(3);
  1860.                     return t[0] = e[0], t[1] = e[1], t[2] = e[2], t
  1861.                 }, u.fromValues = function(e, t, n) {
  1862.                     var o = new r(3);
  1863.                     return o[0] = e, o[1] = t, o[2] = n, o
  1864.                 }, u.copy = function(e, t) {
  1865.                     return e[0] = t[0], e[1] = t[1], e[2] = t[2], e
  1866.                 }, u.set = function(e, t, r, n) {
  1867.                     return e[0] = t, e[1] = r, e[2] = n, e
  1868.                 }, u.add = function(e, t, r) {
  1869.                     return e[0] = t[0] + r[0], e[1] = t[1] + r[1], e[2] = t[2] + r[2], e
  1870.                 }, u.subtract = function(e, t, r) {
  1871.                     return e[0] = t[0] - r[0], e[1] = t[1] - r[1], e[2] = t[2] - r[2], e
  1872.                 }, u.sub = u.subtract, u.multiply = function(e, t, r) {
  1873.                     return e[0] = t[0] * r[0], e[1] = t[1] * r[1], e[2] = t[2] * r[2], e
  1874.                 }, u.mul = u.multiply, u.divide = function(e, t, r) {
  1875.                     return e[0] = t[0] / r[0], e[1] = t[1] / r[1], e[2] = t[2] / r[2], e
  1876.                 }, u.div = u.divide, u.min = function(e, t, r) {
  1877.                     return e[0] = Math.min(t[0], r[0]), e[1] = Math.min(t[1], r[1]), e[2] = Math.min(t[2], r[2]), e
  1878.                 }, u.max = function(e, t, r) {
  1879.                     return e[0] = Math.max(t[0], r[0]), e[1] = Math.max(t[1], r[1]), e[2] = Math.max(t[2], r[2]), e
  1880.                 }, u.scale = function(e, t, r) {
  1881.                     return e[0] = t[0] * r, e[1] = t[1] * r, e[2] = t[2] * r, e
  1882.                 }, u.scaleAndAdd = function(e, t, r, n) {
  1883.                     return e[0] = t[0] + r[0] * n, e[1] = t[1] + r[1] * n, e[2] = t[2] + r[2] * n, e
  1884.                 }, u.distance = function(e, t) {
  1885.                     var r = t[0] - e[0],
  1886.                         n = t[1] - e[1],
  1887.                         o = t[2] - e[2];
  1888.                     return Math.sqrt(r * r + n * n + o * o)
  1889.                 }, u.dist = u.distance, u.squaredDistance = function(e, t) {
  1890.                     var r = t[0] - e[0],
  1891.                         n = t[1] - e[1],
  1892.                         o = t[2] - e[2];
  1893.                     return r * r + n * n + o * o
  1894.                 }, u.sqrDist = u.squaredDistance, u.length = function(e) {
  1895.                     var t = e[0],
  1896.                         r = e[1],
  1897.                         n = e[2];
  1898.                     return Math.sqrt(t * t + r * r + n * n)
  1899.                 }, u.len = u.length, u.squaredLength = function(e) {
  1900.                     var t = e[0],
  1901.                         r = e[1],
  1902.                         n = e[2];
  1903.                     return t * t + r * r + n * n
  1904.                 }, u.sqrLen = u.squaredLength, u.negate = function(e, t) {
  1905.                     return e[0] = -t[0], e[1] = -t[1], e[2] = -t[2], e
  1906.                 }, u.inverse = function(e, t) {
  1907.                     return e[0] = 1 / t[0], e[1] = 1 / t[1], e[2] = 1 / t[2], e
  1908.                 }, u.normalize = function(e, t) {
  1909.                     var r = t[0],
  1910.                         n = t[1],
  1911.                         o = t[2],
  1912.                         a = r * r + n * n + o * o;
  1913.                     return a > 0 && (a = 1 / Math.sqrt(a), e[0] = t[0] * a, e[1] = t[1] * a, e[2] = t[2] * a), e
  1914.                 }, u.dot = function(e, t) {
  1915.                     return e[0] * t[0] + e[1] * t[1] + e[2] * t[2]
  1916.                 }, u.cross = function(e, t, r) {
  1917.                     var n = t[0],
  1918.                         o = t[1],
  1919.                         a = t[2],
  1920.                         i = r[0],
  1921.                         u = r[1],
  1922.                         c = r[2];
  1923.                     return e[0] = o * c - a * u, e[1] = a * i - n * c, e[2] = n * u - o * i, e
  1924.                 }, u.lerp = function(e, t, r, n) {
  1925.                     var o = t[0],
  1926.                         a = t[1],
  1927.                         i = t[2];
  1928.                     return e[0] = o + n * (r[0] - o), e[1] = a + n * (r[1] - a), e[2] = i + n * (r[2] - i), e
  1929.                 }, u.random = function(e, t) {
  1930.                     t = t || 1;
  1931.                     var r = 2 * n() * Math.PI,
  1932.                         o = 2 * n() - 1,
  1933.                         a = Math.sqrt(1 - o * o) * t;
  1934.                     return e[0] = Math.cos(r) * a, e[1] = Math.sin(r) * a, e[2] = o * t, e
  1935.                 }, u.transformMat4 = function(e, t, r) {
  1936.                     var n = t[0],
  1937.                         o = t[1],
  1938.                         a = t[2],
  1939.                         i = r[3] * n + r[7] * o + r[11] * a + r[15];
  1940.                     return i = i || 1, e[0] = (r[0] * n + r[4] * o + r[8] * a + r[12]) / i, e[1] = (r[1] * n + r[5] * o + r[9] * a + r[13]) / i, e[2] = (r[2] * n + r[6] * o + r[10] * a + r[14]) / i, e
  1941.                 }, u.transformMat3 = function(e, t, r) {
  1942.                     var n = t[0],
  1943.                         o = t[1],
  1944.                         a = t[2];
  1945.                     return e[0] = n * r[0] + o * r[3] + a * r[6], e[1] = n * r[1] + o * r[4] + a * r[7], e[2] = n * r[2] + o * r[5] + a * r[8], e
  1946.                 }, u.transformQuat = function(e, t, r) {
  1947.                     var n = t[0],
  1948.                         o = t[1],
  1949.                         a = t[2],
  1950.                         i = r[0],
  1951.                         u = r[1],
  1952.                         c = r[2],
  1953.                         l = r[3],
  1954.                         s = l * n + u * a - c * o,
  1955.                         f = l * o + c * n - i * a,
  1956.                         v = l * a + i * o - u * n,
  1957.                         p = -i * n - u * o - c * a;
  1958.                     return e[0] = s * l + p * -i + f * -c - v * -u, e[1] = f * l + p * -u + v * -i - s * -c, e[2] = v * l + p * -c + s * -u - f * -i, e
  1959.                 }, u.rotateX = function(e, t, r, n) {
  1960.                     var o = [],
  1961.                         a = [];
  1962.                     return o[0] = t[0] - r[0], o[1] = t[1] - r[1], o[2] = t[2] - r[2], a[0] = o[0], a[1] = o[1] * Math.cos(n) - o[2] * Math.sin(n), a[2] = o[1] * Math.sin(n) + o[2] * Math.cos(n), e[0] = a[0] + r[0], e[1] = a[1] + r[1], e[2] = a[2] + r[2], e
  1963.                 }, u.rotateY = function(e, t, r, n) {
  1964.                     var o = [],
  1965.                         a = [];
  1966.                     return o[0] = t[0] - r[0], o[1] = t[1] - r[1], o[2] = t[2] - r[2], a[0] = o[2] * Math.sin(n) + o[0] * Math.cos(n), a[1] = o[1], a[2] = o[2] * Math.cos(n) - o[0] * Math.sin(n), e[0] = a[0] + r[0], e[1] = a[1] + r[1], e[2] = a[2] + r[2], e
  1967.                 }, u.rotateZ = function(e, t, r, n) {
  1968.                     var o = [],
  1969.                         a = [];
  1970.                     return o[0] = t[0] - r[0], o[1] = t[1] - r[1], o[2] = t[2] - r[2], a[0] = o[0] * Math.cos(n) - o[1] * Math.sin(n), a[1] = o[0] * Math.sin(n) + o[1] * Math.cos(n), a[2] = o[2], e[0] = a[0] + r[0], e[1] = a[1] + r[1], e[2] = a[2] + r[2], e
  1971.                 }, u.forEach = function() {
  1972.                     var e = u.create();
  1973.                     return function(t, r, n, o, a, i) {
  1974.                         var u, c;
  1975.                         for (r || (r = 3), n || (n = 0), c = o ? Math.min(o * r + n, t.length) : t.length, u = n; c > u; u += r) e[0] = t[u], e[1] = t[u + 1], e[2] = t[u + 2], a(e, e, i), t[u] = e[0], t[u + 1] = e[1], t[u + 2] = e[2];
  1976.                         return t
  1977.                     }
  1978.                 }(), u.str = function(e) {
  1979.                     return "vec3(" + e[0] + ", " + e[1] + ", " + e[2] + ")"
  1980.                 }, "undefined" != typeof e && (e.vec3 = u);
  1981.                 var c = {};
  1982.                 c.create = function() {
  1983.                     var e = new r(4);
  1984.                     return e[0] = 0, e[1] = 0, e[2] = 0, e[3] = 0, e
  1985.                 }, c.clone = function(e) {
  1986.                     var t = new r(4);
  1987.                     return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t
  1988.                 }, c.fromValues = function(e, t, n, o) {
  1989.                     var a = new r(4);
  1990.                     return a[0] = e, a[1] = t, a[2] = n, a[3] = o, a
  1991.                 }, c.copy = function(e, t) {
  1992.                     return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e
  1993.                 }, c.set = function(e, t, r, n, o) {
  1994.                     return e[0] = t, e[1] = r, e[2] = n, e[3] = o, e
  1995.                 }, c.add = function(e, t, r) {
  1996.                     return e[0] = t[0] + r[0], e[1] = t[1] + r[1], e[2] = t[2] + r[2], e[3] = t[3] + r[3], e
  1997.                 }, c.subtract = function(e, t, r) {
  1998.                     return e[0] = t[0] - r[0], e[1] = t[1] - r[1], e[2] = t[2] - r[2], e[3] = t[3] - r[3], e
  1999.                 }, c.sub = c.subtract, c.multiply = function(e, t, r) {
  2000.                     return e[0] = t[0] * r[0], e[1] = t[1] * r[1], e[2] = t[2] * r[2], e[3] = t[3] * r[3], e
  2001.                 }, c.mul = c.multiply, c.divide = function(e, t, r) {
  2002.                     return e[0] = t[0] / r[0], e[1] = t[1] / r[1], e[2] = t[2] / r[2], e[3] = t[3] / r[3], e
  2003.                 }, c.div = c.divide, c.min = function(e, t, r) {
  2004.                     return e[0] = Math.min(t[0], r[0]), e[1] = Math.min(t[1], r[1]), e[2] = Math.min(t[2], r[2]), e[3] = Math.min(t[3], r[3]), e
  2005.                 }, c.max = function(e, t, r) {
  2006.                     return e[0] = Math.max(t[0], r[0]), e[1] = Math.max(t[1], r[1]), e[2] = Math.max(t[2], r[2]), e[3] = Math.max(t[3], r[3]), e
  2007.                 }, c.scale = function(e, t, r) {
  2008.                     return e[0] = t[0] * r, e[1] = t[1] * r, e[2] = t[2] * r, e[3] = t[3] * r, e
  2009.                 }, c.scaleAndAdd = function(e, t, r, n) {
  2010.                     return e[0] = t[0] + r[0] * n, e[1] = t[1] + r[1] * n, e[2] = t[2] + r[2] * n, e[3] = t[3] + r[3] * n, e
  2011.                 }, c.distance = function(e, t) {
  2012.                     var r = t[0] - e[0],
  2013.                         n = t[1] - e[1],
  2014.                         o = t[2] - e[2],
  2015.                         a = t[3] - e[3];
  2016.                     return Math.sqrt(r * r + n * n + o * o + a * a)
  2017.                 }, c.dist = c.distance, c.squaredDistance = function(e, t) {
  2018.                     var r = t[0] - e[0],
  2019.                         n = t[1] - e[1],
  2020.                         o = t[2] - e[2],
  2021.                         a = t[3] - e[3];
  2022.                     return r * r + n * n + o * o + a * a
  2023.                 }, c.sqrDist = c.squaredDistance, c.length = function(e) {
  2024.                     var t = e[0],
  2025.                         r = e[1],
  2026.                         n = e[2],
  2027.                         o = e[3];
  2028.                     return Math.sqrt(t * t + r * r + n * n + o * o)
  2029.                 }, c.len = c.length, c.squaredLength = function(e) {
  2030.                     var t = e[0],
  2031.                         r = e[1],
  2032.                         n = e[2],
  2033.                         o = e[3];
  2034.                     return t * t + r * r + n * n + o * o
  2035.                 }, c.sqrLen = c.squaredLength, c.negate = function(e, t) {
  2036.                     return e[0] = -t[0], e[1] = -t[1], e[2] = -t[2], e[3] = -t[3], e
  2037.                 }, c.inverse = function(e, t) {
  2038.                     return e[0] = 1 / t[0], e[1] = 1 / t[1], e[2] = 1 / t[2], e[3] = 1 / t[3], e
  2039.                 }, c.normalize = function(e, t) {
  2040.                     var r = t[0],
  2041.                         n = t[1],
  2042.                         o = t[2],
  2043.                         a = t[3],
  2044.                         i = r * r + n * n + o * o + a * a;
  2045.                     return i > 0 && (i = 1 / Math.sqrt(i), e[0] = t[0] * i, e[1] = t[1] * i, e[2] = t[2] * i, e[3] = t[3] * i), e
  2046.                 }, c.dot = function(e, t) {
  2047.                     return e[0] * t[0] + e[1] * t[1] + e[2] * t[2] + e[3] * t[3]
  2048.                 }, c.lerp = function(e, t, r, n) {
  2049.                     var o = t[0],
  2050.                         a = t[1],
  2051.                         i = t[2],
  2052.                         u = t[3];
  2053.                     return e[0] = o + n * (r[0] - o), e[1] = a + n * (r[1] - a), e[2] = i + n * (r[2] - i), e[3] = u + n * (r[3] - u), e
  2054.                 }, c.random = function(e, t) {
  2055.                     return t = t || 1, e[0] = n(), e[1] = n(), e[2] = n(), e[3] = n(), c.normalize(e, e), c.scale(e, e, t), e
  2056.                 }, c.transformMat4 = function(e, t, r) {
  2057.                     var n = t[0],
  2058.                         o = t[1],
  2059.                         a = t[2],
  2060.                         i = t[3];
  2061.                     return e[0] = r[0] * n + r[4] * o + r[8] * a + r[12] * i, e[1] = r[1] * n + r[5] * o + r[9] * a + r[13] * i, e[2] = r[2] * n + r[6] * o + r[10] * a + r[14] * i, e[3] = r[3] * n + r[7] * o + r[11] * a + r[15] * i, e
  2062.                 }, c.transformQuat = function(e, t, r) {
  2063.                     var n = t[0],
  2064.                         o = t[1],
  2065.                         a = t[2],
  2066.                         i = r[0],
  2067.                         u = r[1],
  2068.                         c = r[2],
  2069.                         l = r[3],
  2070.                         s = l * n + u * a - c * o,
  2071.                         f = l * o + c * n - i * a,
  2072.                         v = l * a + i * o - u * n,
  2073.                         p = -i * n - u * o - c * a;
  2074.                     return e[0] = s * l + p * -i + f * -c - v * -u, e[1] = f * l + p * -u + v * -i - s * -c, e[2] = v * l + p * -c + s * -u - f * -i, e
  2075.                 }, c.forEach = function() {
  2076.                     var e = c.create();
  2077.                     return function(t, r, n, o, a, i) {
  2078.                         var u, c;
  2079.                         for (r || (r = 4), n || (n = 0), c = o ? Math.min(o * r + n, t.length) : t.length, u = n; c > u; u += r) e[0] = t[u], e[1] = t[u + 1], e[2] = t[u + 2], e[3] = t[u + 3], a(e, e, i), t[u] = e[0], t[u + 1] = e[1], t[u + 2] = e[2], t[u + 3] = e[3];
  2080.                         return t
  2081.                     }
  2082.                 }(), c.str = function(e) {
  2083.                     return "vec4(" + e[0] + ", " + e[1] + ", " + e[2] + ", " + e[3] + ")"
  2084.                 }, "undefined" != typeof e && (e.vec4 = c);
  2085.                 var l = {};
  2086.                 l.create = function() {
  2087.                     var e = new r(4);
  2088.                     return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 1, e
  2089.                 }, l.clone = function(e) {
  2090.                     var t = new r(4);
  2091.                     return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t
  2092.                 }, l.copy = function(e, t) {
  2093.                     return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e
  2094.                 }, l.identity = function(e) {
  2095.                     return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 1, e
  2096.                 }, l.transpose = function(e, t) {
  2097.                     if (e === t) {
  2098.                         var r = t[1];
  2099.                         e[1] = t[2], e[2] = r
  2100.                     } else e[0] = t[0], e[1] = t[2], e[2] = t[1], e[3] = t[3];
  2101.                     return e
  2102.                 }, l.invert = function(e, t) {
  2103.                     var r = t[0],
  2104.                         n = t[1],
  2105.                         o = t[2],
  2106.                         a = t[3],
  2107.                         i = r * a - o * n;
  2108.                     return i ? (i = 1 / i, e[0] = a * i, e[1] = -n * i, e[2] = -o * i, e[3] = r * i, e) : null
  2109.                 }, l.adjoint = function(e, t) {
  2110.                     var r = t[0];
  2111.                     return e[0] = t[3], e[1] = -t[1], e[2] = -t[2], e[3] = r, e
  2112.                 }, l.determinant = function(e) {
  2113.                     return e[0] * e[3] - e[2] * e[1]
  2114.                 }, l.multiply = function(e, t, r) {
  2115.                     var n = t[0],
  2116.                         o = t[1],
  2117.                         a = t[2],
  2118.                         i = t[3],
  2119.                         u = r[0],
  2120.                         c = r[1],
  2121.                         l = r[2],
  2122.                         s = r[3];
  2123.                     return e[0] = n * u + a * c, e[1] = o * u + i * c, e[2] = n * l + a * s, e[3] = o * l + i * s, e
  2124.                 }, l.mul = l.multiply, l.rotate = function(e, t, r) {
  2125.                     var n = t[0],
  2126.                         o = t[1],
  2127.                         a = t[2],
  2128.                         i = t[3],
  2129.                         u = Math.sin(r),
  2130.                         c = Math.cos(r);
  2131.                     return e[0] = n * c + a * u, e[1] = o * c + i * u, e[2] = n * -u + a * c, e[3] = o * -u + i * c, e
  2132.                 }, l.scale = function(e, t, r) {
  2133.                     var n = t[0],
  2134.                         o = t[1],
  2135.                         a = t[2],
  2136.                         i = t[3],
  2137.                         u = r[0],
  2138.                         c = r[1];
  2139.                     return e[0] = n * u, e[1] = o * u, e[2] = a * c, e[3] = i * c, e
  2140.                 }, l.str = function(e) {
  2141.                     return "mat2(" + e[0] + ", " + e[1] + ", " + e[2] + ", " + e[3] + ")"
  2142.                 }, l.frob = function(e) {
  2143.                     return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2))
  2144.                 }, l.LDU = function(e, t, r, n) {
  2145.                     return e[2] = n[2] / n[0], r[0] = n[0], r[1] = n[1], r[3] = n[3] - e[2] * r[1], [e, t, r]
  2146.                 }, "undefined" != typeof e && (e.mat2 = l);
  2147.                 var s = {};
  2148.                 s.create = function() {
  2149.                     var e = new r(6);
  2150.                     return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 1, e[4] = 0, e[5] = 0, e
  2151.                 }, s.clone = function(e) {
  2152.                     var t = new r(6);
  2153.                     return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t
  2154.                 }, s.copy = function(e, t) {
  2155.                     return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4], e[5] = t[5], e
  2156.                 }, s.identity = function(e) {
  2157.                     return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 1, e[4] = 0, e[5] = 0, e
  2158.                 }, s.invert = function(e, t) {
  2159.                     var r = t[0],
  2160.                         n = t[1],
  2161.                         o = t[2],
  2162.                         a = t[3],
  2163.                         i = t[4],
  2164.                         u = t[5],
  2165.                         c = r * a - n * o;
  2166.                     return c ? (c = 1 / c, e[0] = a * c, e[1] = -n * c, e[2] = -o * c, e[3] = r * c, e[4] = (o * u - a * i) * c, e[5] = (n * i - r * u) * c, e) : null
  2167.                 }, s.determinant = function(e) {
  2168.                     return e[0] * e[3] - e[1] * e[2]
  2169.                 }, s.multiply = function(e, t, r) {
  2170.                     var n = t[0],
  2171.                         o = t[1],
  2172.                         a = t[2],
  2173.                         i = t[3],
  2174.                         u = t[4],
  2175.                         c = t[5],
  2176.                         l = r[0],
  2177.                         s = r[1],
  2178.                         f = r[2],
  2179.                         v = r[3],
  2180.                         p = r[4],
  2181.                         g = r[5];
  2182.                     return e[0] = n * l + a * s, e[1] = o * l + i * s, e[2] = n * f + a * v, e[3] = o * f + i * v, e[4] = n * p + a * g + u, e[5] = o * p + i * g + c, e
  2183.                 }, s.mul = s.multiply, s.rotate = function(e, t, r) {
  2184.                     var n = t[0],
  2185.                         o = t[1],
  2186.                         a = t[2],
  2187.                         i = t[3],
  2188.                         u = t[4],
  2189.                         c = t[5],
  2190.                         l = Math.sin(r),
  2191.                         s = Math.cos(r);
  2192.                     return e[0] = n * s + a * l, e[1] = o * s + i * l, e[2] = n * -l + a * s, e[3] = o * -l + i * s, e[4] = u, e[5] = c, e
  2193.                 }, s.scale = function(e, t, r) {
  2194.                     var n = t[0],
  2195.                         o = t[1],
  2196.                         a = t[2],
  2197.                         i = t[3],
  2198.                         u = t[4],
  2199.                         c = t[5],
  2200.                         l = r[0],
  2201.                         s = r[1];
  2202.                     return e[0] = n * l, e[1] = o * l, e[2] = a * s, e[3] = i * s, e[4] = u, e[5] = c, e
  2203.                 }, s.translate = function(e, t, r) {
  2204.                     var n = t[0],
  2205.                         o = t[1],
  2206.                         a = t[2],
  2207.                         i = t[3],
  2208.                         u = t[4],
  2209.                         c = t[5],
  2210.                         l = r[0],
  2211.                         s = r[1];
  2212.                     return e[0] = n, e[1] = o, e[2] = a, e[3] = i, e[4] = n * l + a * s + u, e[5] = o * l + i * s + c, e
  2213.                 }, s.str = function(e) {
  2214.                     return "mat2d(" + e[0] + ", " + e[1] + ", " + e[2] + ", " + e[3] + ", " + e[4] + ", " + e[5] + ")"
  2215.                 }, s.frob = function(e) {
  2216.                     return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2) + Math.pow(e[4], 2) + Math.pow(e[5], 2) + 1)
  2217.                 }, "undefined" != typeof e && (e.mat2d = s);
  2218.                 var f = {};
  2219.                 f.create = function() {
  2220.                     var e = new r(9);
  2221.                     return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 1, e[5] = 0, e[6] = 0, e[7] = 0, e[8] = 1, e
  2222.                 }, f.fromMat4 = function(e, t) {
  2223.                     return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[4], e[4] = t[5], e[5] = t[6], e[6] = t[8], e[7] = t[9], e[8] = t[10], e
  2224.                 }, f.clone = function(e) {
  2225.                     var t = new r(9);
  2226.                     return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t[6] = e[6], t[7] = e[7], t[8] = e[8], t
  2227.                 }, f.copy = function(e, t) {
  2228.                     return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4], e[5] = t[5], e[6] = t[6], e[7] = t[7], e[8] = t[8], e
  2229.                 }, f.identity = function(e) {
  2230.                     return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 1, e[5] = 0, e[6] = 0, e[7] = 0, e[8] = 1, e
  2231.                 }, f.transpose = function(e, t) {
  2232.                     if (e === t) {
  2233.                         var r = t[1],
  2234.                             n = t[2],
  2235.                             o = t[5];
  2236.                         e[1] = t[3], e[2] = t[6], e[3] = r, e[5] = t[7], e[6] = n, e[7] = o
  2237.                     } else e[0] = t[0], e[1] = t[3], e[2] = t[6], e[3] = t[1], e[4] = t[4], e[5] = t[7], e[6] = t[2], e[7] = t[5], e[8] = t[8];
  2238.                     return e
  2239.                 }, f.invert = function(e, t) {
  2240.                     var r = t[0],
  2241.                         n = t[1],
  2242.                         o = t[2],
  2243.                         a = t[3],
  2244.                         i = t[4],
  2245.                         u = t[5],
  2246.                         c = t[6],
  2247.                         l = t[7],
  2248.                         s = t[8],
  2249.                         f = s * i - u * l,
  2250.                         v = -s * a + u * c,
  2251.                         p = l * a - i * c,
  2252.                         g = r * f + n * v + o * p;
  2253.                     return g ? (g = 1 / g, e[0] = f * g, e[1] = (-s * n + o * l) * g, e[2] = (u * n - o * i) * g, e[3] = v * g, e[4] = (s * r - o * c) * g, e[5] = (-u * r + o * a) * g, e[6] = p * g, e[7] = (-l * r + n * c) * g, e[8] = (i * r - n * a) * g, e) : null
  2254.                 }, f.adjoint = function(e, t) {
  2255.                     var r = t[0],
  2256.                         n = t[1],
  2257.                         o = t[2],
  2258.                         a = t[3],
  2259.                         i = t[4],
  2260.                         u = t[5],
  2261.                         c = t[6],
  2262.                         l = t[7],
  2263.                         s = t[8];
  2264.                     return e[0] = i * s - u * l, e[1] = o * l - n * s, e[2] = n * u - o * i, e[3] = u * c - a * s, e[4] = r * s - o * c, e[5] = o * a - r * u, e[6] = a * l - i * c, e[7] = n * c - r * l, e[8] = r * i - n * a, e
  2265.                 }, f.determinant = function(e) {
  2266.                     var t = e[0],
  2267.                         r = e[1],
  2268.                         n = e[2],
  2269.                         o = e[3],
  2270.                         a = e[4],
  2271.                         i = e[5],
  2272.                         u = e[6],
  2273.                         c = e[7],
  2274.                         l = e[8];
  2275.                     return t * (l * a - i * c) + r * (-l * o + i * u) + n * (c * o - a * u)
  2276.                 }, f.multiply = function(e, t, r) {
  2277.                     var n = t[0],
  2278.                         o = t[1],
  2279.                         a = t[2],
  2280.                         i = t[3],
  2281.                         u = t[4],
  2282.                         c = t[5],
  2283.                         l = t[6],
  2284.                         s = t[7],
  2285.                         f = t[8],
  2286.                         v = r[0],
  2287.                         p = r[1],
  2288.                         g = r[2],
  2289.                         h = r[3],
  2290.                         m = r[4],
  2291.                         d = r[5],
  2292.                         _ = r[6],
  2293.                         b = r[7],
  2294.                         y = r[8];
  2295.                     return e[0] = v * n + p * i + g * l, e[1] = v * o + p * u + g * s, e[2] = v * a + p * c + g * f, e[3] = h * n + m * i + d * l, e[4] = h * o + m * u + d * s, e[5] = h * a + m * c + d * f, e[6] = _ * n + b * i + y * l, e[7] = _ * o + b * u + y * s, e[8] = _ * a + b * c + y * f, e
  2296.                 }, f.mul = f.multiply, f.translate = function(e, t, r) {
  2297.                     var n = t[0],
  2298.                         o = t[1],
  2299.                         a = t[2],
  2300.                         i = t[3],
  2301.                         u = t[4],
  2302.                         c = t[5],
  2303.                         l = t[6],
  2304.                         s = t[7],
  2305.                         f = t[8],
  2306.                         v = r[0],
  2307.                         p = r[1];
  2308.                     return e[0] = n, e[1] = o, e[2] = a, e[3] = i, e[4] = u, e[5] = c, e[6] = v * n + p * i + l, e[7] = v * o + p * u + s, e[8] = v * a + p * c + f, e
  2309.                 }, f.rotate = function(e, t, r) {
  2310.                     var n = t[0],
  2311.                         o = t[1],
  2312.                         a = t[2],
  2313.                         i = t[3],
  2314.                         u = t[4],
  2315.                         c = t[5],
  2316.                         l = t[6],
  2317.                         s = t[7],
  2318.                         f = t[8],
  2319.                         v = Math.sin(r),
  2320.                         p = Math.cos(r);
  2321.                     return e[0] = p * n + v * i, e[1] = p * o + v * u, e[2] = p * a + v * c, e[3] = p * i - v * n, e[4] = p * u - v * o, e[5] = p * c - v * a, e[6] = l, e[7] = s, e[8] = f, e
  2322.                 }, f.scale = function(e, t, r) {
  2323.                     var n = r[0],
  2324.                         o = r[1];
  2325.                     return e[0] = n * t[0], e[1] = n * t[1], e[2] = n * t[2], e[3] = o * t[3], e[4] = o * t[4], e[5] = o * t[5], e[6] = t[6], e[7] = t[7], e[8] = t[8], e
  2326.                 }, f.fromMat2d = function(e, t) {
  2327.                     return e[0] = t[0], e[1] = t[1], e[2] = 0, e[3] = t[2], e[4] = t[3], e[5] = 0, e[6] = t[4], e[7] = t[5], e[8] = 1, e
  2328.                 }, f.fromQuat = function(e, t) {
  2329.                     var r = t[0],
  2330.                         n = t[1],
  2331.                         o = t[2],
  2332.                         a = t[3],
  2333.                         i = r + r,
  2334.                         u = n + n,
  2335.                         c = o + o,
  2336.                         l = r * i,
  2337.                         s = n * i,
  2338.                         f = n * u,
  2339.                         v = o * i,
  2340.                         p = o * u,
  2341.                         g = o * c,
  2342.                         h = a * i,
  2343.                         m = a * u,
  2344.                         d = a * c;
  2345.                     return e[0] = 1 - f - g, e[3] = s - d, e[6] = v + m, e[1] = s + d, e[4] = 1 - l - g, e[7] = p - h, e[2] = v - m, e[5] = p + h, e[8] = 1 - l - f, e
  2346.                 }, f.normalFromMat4 = function(e, t) {
  2347.                     var r = t[0],
  2348.                         n = t[1],
  2349.                         o = t[2],
  2350.                         a = t[3],
  2351.                         i = t[4],
  2352.                         u = t[5],
  2353.                         c = t[6],
  2354.                         l = t[7],
  2355.                         s = t[8],
  2356.                         f = t[9],
  2357.                         v = t[10],
  2358.                         p = t[11],
  2359.                         g = t[12],
  2360.                         h = t[13],
  2361.                         m = t[14],
  2362.                         d = t[15],
  2363.                         _ = r * u - n * i,
  2364.                         b = r * c - o * i,
  2365.                         y = r * l - a * i,
  2366.                         T = n * c - o * u,
  2367.                         w = n * l - a * u,
  2368.                         E = o * l - a * c,
  2369.                         x = s * h - f * g,
  2370.                         A = s * m - v * g,
  2371.                         M = s * d - p * g,
  2372.                         R = f * m - v * h,
  2373.                         P = f * d - p * h,
  2374.                         L = v * d - p * m,
  2375.                         D = _ * L - b * P + y * R + T * M - w * A + E * x;
  2376.                     return D ? (D = 1 / D, e[0] = (u * L - c * P + l * R) * D, e[1] = (c * M - i * L - l * A) * D, e[2] = (i * P - u * M + l * x) * D, e[3] = (o * P - n * L - a * R) * D, e[4] = (r * L - o * M + a * A) * D, e[5] = (n * M - r * P - a * x) * D, e[6] = (h * E - m * w + d * T) * D, e[7] = (m * y - g * E - d * b) * D, e[8] = (g * w - h * y + d * _) * D, e) : null
  2377.                 }, f.str = function(e) {
  2378.                     return "mat3(" + e[0] + ", " + e[1] + ", " + e[2] + ", " + e[3] + ", " + e[4] + ", " + e[5] + ", " + e[6] + ", " + e[7] + ", " + e[8] + ")"
  2379.                 }, f.frob = function(e) {
  2380.                     return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2) + Math.pow(e[4], 2) + Math.pow(e[5], 2) + Math.pow(e[6], 2) + Math.pow(e[7], 2) + Math.pow(e[8], 2))
  2381.                 }, "undefined" != typeof e && (e.mat3 = f);
  2382.                 var v = {};
  2383.                 v.create = function() {
  2384.                     var e = new r(16);
  2385.                     return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = 1, e[6] = 0, e[7] = 0, e[8] = 0, e[9] = 0, e[10] = 1, e[11] = 0, e[12] = 0, e[13] = 0, e[14] = 0, e[15] = 1, e
  2386.                 }, v.clone = function(e) {
  2387.                     var t = new r(16);
  2388.                     return t[0] = e[0], t[1] = e[1], t[2] = e[2], t[3] = e[3], t[4] = e[4], t[5] = e[5], t[6] = e[6], t[7] = e[7], t[8] = e[8], t[9] = e[9], t[10] = e[10], t[11] = e[11], t[12] = e[12], t[13] = e[13], t[14] = e[14], t[15] = e[15], t
  2389.                 }, v.copy = function(e, t) {
  2390.                     return e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[4] = t[4], e[5] = t[5], e[6] = t[6], e[7] = t[7], e[8] = t[8], e[9] = t[9], e[10] = t[10], e[11] = t[11], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15], e
  2391.                 }, v.identity = function(e) {
  2392.                     return e[0] = 1, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = 1, e[6] = 0, e[7] = 0, e[8] = 0, e[9] = 0, e[10] = 1, e[11] = 0, e[12] = 0, e[13] = 0, e[14] = 0, e[15] = 1, e
  2393.                 }, v.transpose = function(e, t) {
  2394.                     if (e === t) {
  2395.                         var r = t[1],
  2396.                             n = t[2],
  2397.                             o = t[3],
  2398.                             a = t[6],
  2399.                             i = t[7],
  2400.                             u = t[11];
  2401.                         e[1] = t[4], e[2] = t[8], e[3] = t[12], e[4] = r, e[6] = t[9], e[7] = t[13], e[8] = n, e[9] = a, e[11] = t[14], e[12] = o, e[13] = i, e[14] = u
  2402.                     } else e[0] = t[0], e[1] = t[4], e[2] = t[8], e[3] = t[12], e[4] = t[1], e[5] = t[5], e[6] = t[9], e[7] = t[13], e[8] = t[2], e[9] = t[6], e[10] = t[10], e[11] = t[14], e[12] = t[3], e[13] = t[7], e[14] = t[11], e[15] = t[15];
  2403.                     return e
  2404.                 }, v.invert = function(e, t) {
  2405.                     var r = t[0],
  2406.                         n = t[1],
  2407.                         o = t[2],
  2408.                         a = t[3],
  2409.                         i = t[4],
  2410.                         u = t[5],
  2411.                         c = t[6],
  2412.                         l = t[7],
  2413.                         s = t[8],
  2414.                         f = t[9],
  2415.                         v = t[10],
  2416.                         p = t[11],
  2417.                         g = t[12],
  2418.                         h = t[13],
  2419.                         m = t[14],
  2420.                         d = t[15],
  2421.                         _ = r * u - n * i,
  2422.                         b = r * c - o * i,
  2423.                         y = r * l - a * i,
  2424.                         T = n * c - o * u,
  2425.                         w = n * l - a * u,
  2426.                         E = o * l - a * c,
  2427.                         x = s * h - f * g,
  2428.                         A = s * m - v * g,
  2429.                         M = s * d - p * g,
  2430.                         R = f * m - v * h,
  2431.                         P = f * d - p * h,
  2432.                         L = v * d - p * m,
  2433.                         D = _ * L - b * P + y * R + T * M - w * A + E * x;
  2434.                     return D ? (D = 1 / D, e[0] = (u * L - c * P + l * R) * D, e[1] = (o * P - n * L - a * R) * D, e[2] = (h * E - m * w + d * T) * D, e[3] = (v * w - f * E - p * T) * D, e[4] = (c * M - i * L - l * A) * D, e[5] = (r * L - o * M + a * A) * D, e[6] = (m * y - g * E - d * b) * D, e[7] = (s * E - v * y + p * b) * D, e[8] = (i * P - u * M + l * x) * D, e[9] = (n * M - r * P - a * x) * D, e[10] = (g * w - h * y + d * _) * D, e[11] = (f * y - s * w - p * _) * D, e[12] = (u * A - i * R - c * x) * D, e[13] = (r * R - n * A + o * x) * D, e[14] = (h * b - g * T - m * _) * D, e[15] = (s * T - f * b + v * _) * D, e) : null
  2435.                 }, v.adjoint = function(e, t) {
  2436.                     var r = t[0],
  2437.                         n = t[1],
  2438.                         o = t[2],
  2439.                         a = t[3],
  2440.                         i = t[4],
  2441.                         u = t[5],
  2442.                         c = t[6],
  2443.                         l = t[7],
  2444.                         s = t[8],
  2445.                         f = t[9],
  2446.                         v = t[10],
  2447.                         p = t[11],
  2448.                         g = t[12],
  2449.                         h = t[13],
  2450.                         m = t[14],
  2451.                         d = t[15];
  2452.                     return e[0] = u * (v * d - p * m) - f * (c * d - l * m) + h * (c * p - l * v), e[1] = -(n * (v * d - p * m) - f * (o * d - a * m) + h * (o * p - a * v)), e[2] = n * (c * d - l * m) - u * (o * d - a * m) + h * (o * l - a * c), e[3] = -(n * (c * p - l * v) - u * (o * p - a * v) + f * (o * l - a * c)), e[4] = -(i * (v * d - p * m) - s * (c * d - l * m) + g * (c * p - l * v)), e[5] = r * (v * d - p * m) - s * (o * d - a * m) + g * (o * p - a * v), e[6] = -(r * (c * d - l * m) - i * (o * d - a * m) + g * (o * l - a * c)), e[7] = r * (c * p - l * v) - i * (o * p - a * v) + s * (o * l - a * c), e[8] = i * (f * d - p * h) - s * (u * d - l * h) + g * (u * p - l * f), e[9] = -(r * (f * d - p * h) - s * (n * d - a * h) + g * (n * p - a * f)), e[10] = r * (u * d - l * h) - i * (n * d - a * h) + g * (n * l - a * u), e[11] = -(r * (u * p - l * f) - i * (n * p - a * f) + s * (n * l - a * u)), e[12] = -(i * (f * m - v * h) - s * (u * m - c * h) + g * (u * v - c * f)), e[13] = r * (f * m - v * h) - s * (n * m - o * h) + g * (n * v - o * f), e[14] = -(r * (u * m - c * h) - i * (n * m - o * h) + g * (n * c - o * u)), e[15] = r * (u * v - c * f) - i * (n * v - o * f) + s * (n * c - o * u), e
  2453.                 }, v.determinant = function(e) {
  2454.                     var t = e[0],
  2455.                         r = e[1],
  2456.                         n = e[2],
  2457.                         o = e[3],
  2458.                         a = e[4],
  2459.                         i = e[5],
  2460.                         u = e[6],
  2461.                         c = e[7],
  2462.                         l = e[8],
  2463.                         s = e[9],
  2464.                         f = e[10],
  2465.                         v = e[11],
  2466.                         p = e[12],
  2467.                         g = e[13],
  2468.                         h = e[14],
  2469.                         m = e[15],
  2470.                         d = t * i - r * a,
  2471.                         _ = t * u - n * a,
  2472.                         b = t * c - o * a,
  2473.                         y = r * u - n * i,
  2474.                         T = r * c - o * i,
  2475.                         w = n * c - o * u,
  2476.                         E = l * g - s * p,
  2477.                         x = l * h - f * p,
  2478.                         A = l * m - v * p,
  2479.                         M = s * h - f * g,
  2480.                         R = s * m - v * g,
  2481.                         P = f * m - v * h;
  2482.                     return d * P - _ * R + b * M + y * A - T * x + w * E
  2483.                 }, v.multiply = function(e, t, r) {
  2484.                     var n = t[0],
  2485.                         o = t[1],
  2486.                         a = t[2],
  2487.                         i = t[3],
  2488.                         u = t[4],
  2489.                         c = t[5],
  2490.                         l = t[6],
  2491.                         s = t[7],
  2492.                         f = t[8],
  2493.                         v = t[9],
  2494.                         p = t[10],
  2495.                         g = t[11],
  2496.                         h = t[12],
  2497.                         m = t[13],
  2498.                         d = t[14],
  2499.                         _ = t[15],
  2500.                         b = r[0],
  2501.                         y = r[1],
  2502.                         T = r[2],
  2503.                         w = r[3];
  2504.                     return e[0] = b * n + y * u + T * f + w * h, e[1] = b * o + y * c + T * v + w * m, e[2] = b * a + y * l + T * p + w * d, e[3] = b * i + y * s + T * g + w * _, b = r[4], y = r[5], T = r[6], w = r[7], e[4] = b * n + y * u + T * f + w * h, e[5] = b * o + y * c + T * v + w * m, e[6] = b * a + y * l + T * p + w * d, e[7] = b * i + y * s + T * g + w * _, b = r[8], y = r[9], T = r[10], w = r[11], e[8] = b * n + y * u + T * f + w * h, e[9] = b * o + y * c + T * v + w * m, e[10] = b * a + y * l + T * p + w * d, e[11] = b * i + y * s + T * g + w * _, b = r[12], y = r[13], T = r[14], w = r[15], e[12] = b * n + y * u + T * f + w * h, e[13] = b * o + y * c + T * v + w * m, e[14] = b * a + y * l + T * p + w * d, e[15] = b * i + y * s + T * g + w * _, e
  2505.                 }, v.mul = v.multiply, v.translate = function(e, t, r) {
  2506.                     var n, o, a, i, u, c, l, s, f, v, p, g, h = r[0],
  2507.                         m = r[1],
  2508.                         d = r[2];
  2509.                     return t === e ? (e[12] = t[0] * h + t[4] * m + t[8] * d + t[12], e[13] = t[1] * h + t[5] * m + t[9] * d + t[13], e[14] = t[2] * h + t[6] * m + t[10] * d + t[14], e[15] = t[3] * h + t[7] * m + t[11] * d + t[15]) : (n = t[0], o = t[1], a = t[2], i = t[3], u = t[4], c = t[5], l = t[6], s = t[7], f = t[8], v = t[9], p = t[10], g = t[11], e[0] = n, e[1] = o, e[2] = a, e[3] = i, e[4] = u, e[5] = c, e[6] = l, e[7] = s, e[8] = f, e[9] = v, e[10] = p, e[11] = g, e[12] = n * h + u * m + f * d + t[12], e[13] = o * h + c * m + v * d + t[13], e[14] = a * h + l * m + p * d + t[14], e[15] = i * h + s * m + g * d + t[15]), e
  2510.                 }, v.scale = function(e, t, r) {
  2511.                     var n = r[0],
  2512.                         o = r[1],
  2513.                         a = r[2];
  2514.                     return e[0] = t[0] * n, e[1] = t[1] * n, e[2] = t[2] * n, e[3] = t[3] * n, e[4] = t[4] * o, e[5] = t[5] * o, e[6] = t[6] * o, e[7] = t[7] * o, e[8] = t[8] * a, e[9] = t[9] * a, e[10] = t[10] * a, e[11] = t[11] * a, e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15], e
  2515.                 }, v.rotate = function(e, r, n, o) {
  2516.                     var a, i, u, c, l, s, f, v, p, g, h, m, d, _, b, y, T, w, E, x, A, M, R, P, L = o[0],
  2517.                         D = o[1],
  2518.                         S = o[2],
  2519.                         F = Math.sqrt(L * L + D * D + S * S);
  2520.                     return Math.abs(F) < t ? null : (F = 1 / F, L *= F, D *= F, S *= F, a = Math.sin(n), i = Math.cos(n), u = 1 - i, c = r[0], l = r[1], s = r[2], f = r[3], v = r[4], p = r[5], g = r[6], h = r[7], m = r[8], d = r[9], _ = r[10], b = r[11], y = L * L * u + i, T = D * L * u + S * a, w = S * L * u - D * a, E = L * D * u - S * a, x = D * D * u + i, A = S * D * u + L * a, M = L * S * u + D * a, R = D * S * u - L * a, P = S * S * u + i, e[0] = c * y + v * T + m * w, e[1] = l * y + p * T + d * w, e[2] = s * y + g * T + _ * w, e[3] = f * y + h * T + b * w, e[4] = c * E + v * x + m * A, e[5] = l * E + p * x + d * A, e[6] = s * E + g * x + _ * A, e[7] = f * E + h * x + b * A, e[8] = c * M + v * R + m * P, e[9] = l * M + p * R + d * P, e[10] = s * M + g * R + _ * P, e[11] = f * M + h * R + b * P, r !== e && (e[12] = r[12], e[13] = r[13], e[14] = r[14], e[15] = r[15]), e)
  2521.                 }, v.rotateX = function(e, t, r) {
  2522.                     var n = Math.sin(r),
  2523.                         o = Math.cos(r),
  2524.                         a = t[4],
  2525.                         i = t[5],
  2526.                         u = t[6],
  2527.                         c = t[7],
  2528.                         l = t[8],
  2529.                         s = t[9],
  2530.                         f = t[10],
  2531.                         v = t[11];
  2532.                     return t !== e && (e[0] = t[0], e[1] = t[1], e[2] = t[2], e[3] = t[3], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15]), e[4] = a * o + l * n, e[5] = i * o + s * n, e[6] = u * o + f * n, e[7] = c * o + v * n, e[8] = l * o - a * n, e[9] = s * o - i * n, e[10] = f * o - u * n, e[11] = v * o - c * n, e
  2533.                 }, v.rotateY = function(e, t, r) {
  2534.                     var n = Math.sin(r),
  2535.                         o = Math.cos(r),
  2536.                         a = t[0],
  2537.                         i = t[1],
  2538.                         u = t[2],
  2539.                         c = t[3],
  2540.                         l = t[8],
  2541.                         s = t[9],
  2542.                         f = t[10],
  2543.                         v = t[11];
  2544.                     return t !== e && (e[4] = t[4], e[5] = t[5], e[6] = t[6], e[7] = t[7], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15]), e[0] = a * o - l * n, e[1] = i * o - s * n, e[2] = u * o - f * n, e[3] = c * o - v * n, e[8] = a * n + l * o, e[9] = i * n + s * o, e[10] = u * n + f * o, e[11] = c * n + v * o, e
  2545.                 }, v.rotateZ = function(e, t, r) {
  2546.                     var n = Math.sin(r),
  2547.                         o = Math.cos(r),
  2548.                         a = t[0],
  2549.                         i = t[1],
  2550.                         u = t[2],
  2551.                         c = t[3],
  2552.                         l = t[4],
  2553.                         s = t[5],
  2554.                         f = t[6],
  2555.                         v = t[7];
  2556.                     return t !== e && (e[8] = t[8], e[9] = t[9], e[10] = t[10], e[11] = t[11], e[12] = t[12], e[13] = t[13], e[14] = t[14], e[15] = t[15]), e[0] = a * o + l * n, e[1] = i * o + s * n, e[2] = u * o + f * n, e[3] = c * o + v * n, e[4] = l * o - a * n, e[5] = s * o - i * n, e[6] = f * o - u * n, e[7] = v * o - c * n, e
  2557.                 }, v.fromRotationTranslation = function(e, t, r) {
  2558.                     var n = t[0],
  2559.                         o = t[1],
  2560.                         a = t[2],
  2561.                         i = t[3],
  2562.                         u = n + n,
  2563.                         c = o + o,
  2564.                         l = a + a,
  2565.                         s = n * u,
  2566.                         f = n * c,
  2567.                         v = n * l,
  2568.                         p = o * c,
  2569.                         g = o * l,
  2570.                         h = a * l,
  2571.                         m = i * u,
  2572.                         d = i * c,
  2573.                         _ = i * l;
  2574.                     return e[0] = 1 - (p + h), e[1] = f + _, e[2] = v - d, e[3] = 0, e[4] = f - _, e[5] = 1 - (s + h), e[6] = g + m, e[7] = 0, e[8] = v + d, e[9] = g - m, e[10] = 1 - (s + p), e[11] = 0, e[12] = r[0], e[13] = r[1], e[14] = r[2], e[15] = 1, e
  2575.                 }, v.fromQuat = function(e, t) {
  2576.                     var r = t[0],
  2577.                         n = t[1],
  2578.                         o = t[2],
  2579.                         a = t[3],
  2580.                         i = r + r,
  2581.                         u = n + n,
  2582.                         c = o + o,
  2583.                         l = r * i,
  2584.                         s = n * i,
  2585.                         f = n * u,
  2586.                         v = o * i,
  2587.                         p = o * u,
  2588.                         g = o * c,
  2589.                         h = a * i,
  2590.                         m = a * u,
  2591.                         d = a * c;
  2592.                     return e[0] = 1 - f - g, e[1] = s + d, e[2] = v - m, e[3] = 0, e[4] = s - d, e[5] = 1 - l - g, e[6] = p + h, e[7] = 0, e[8] = v + m, e[9] = p - h, e[10] = 1 - l - f, e[11] = 0, e[12] = 0, e[13] = 0, e[14] = 0, e[15] = 1, e
  2593.                 }, v.frustum = function(e, t, r, n, o, a, i) {
  2594.                     var u = 1 / (r - t),
  2595.                         c = 1 / (o - n),
  2596.                         l = 1 / (a - i);
  2597.                     return e[0] = 2 * a * u, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = 2 * a * c, e[6] = 0, e[7] = 0, e[8] = (r + t) * u, e[9] = (o + n) * c, e[10] = (i + a) * l, e[11] = -1, e[12] = 0, e[13] = 0, e[14] = i * a * 2 * l, e[15] = 0, e
  2598.                 }, v.perspective = function(e, t, r, n, o) {
  2599.                     var a = 1 / Math.tan(t / 2),
  2600.                         i = 1 / (n - o);
  2601.                     return e[0] = a / r, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = a, e[6] = 0, e[7] = 0, e[8] = 0, e[9] = 0, e[10] = (o + n) * i, e[11] = -1, e[12] = 0, e[13] = 0, e[14] = 2 * o * n * i, e[15] = 0, e
  2602.                 }, v.ortho = function(e, t, r, n, o, a, i) {
  2603.                     var u = 1 / (t - r),
  2604.                         c = 1 / (n - o),
  2605.                         l = 1 / (a - i);
  2606.                     return e[0] = -2 * u, e[1] = 0, e[2] = 0, e[3] = 0, e[4] = 0, e[5] = -2 * c, e[6] = 0, e[7] = 0, e[8] = 0, e[9] = 0, e[10] = 2 * l, e[11] = 0, e[12] = (t + r) * u, e[13] = (o + n) * c, e[14] = (i + a) * l, e[15] = 1, e
  2607.                 }, v.lookAt = function(e, r, n, o) {
  2608.                     var a, i, u, c, l, s, f, p, g, h, m = r[0],
  2609.                         d = r[1],
  2610.                         _ = r[2],
  2611.                         b = o[0],
  2612.                         y = o[1],
  2613.                         T = o[2],
  2614.                         w = n[0],
  2615.                         E = n[1],
  2616.                         x = n[2];
  2617.                     return Math.abs(m - w) < t && Math.abs(d - E) < t && Math.abs(_ - x) < t ? v.identity(e) : (f = m - w, p = d - E, g = _ - x, h = 1 / Math.sqrt(f * f + p * p + g * g), f *= h, p *= h, g *= h, a = y * g - T * p, i = T * f - b * g, u = b * p - y * f, h = Math.sqrt(a * a + i * i + u * u), h ? (h = 1 / h, a *= h, i *= h, u *= h) : (a = 0, i = 0, u = 0), c = p * u - g * i, l = g * a - f * u, s = f * i - p * a, h = Math.sqrt(c * c + l * l + s * s), h ? (h = 1 / h, c *= h, l *= h, s *= h) : (c = 0, l = 0, s = 0), e[0] = a, e[1] = c, e[2] = f, e[3] = 0, e[4] = i, e[5] = l, e[6] = p, e[7] = 0, e[8] = u, e[9] = s, e[10] = g, e[11] = 0, e[12] = -(a * m + i * d + u * _), e[13] = -(c * m + l * d + s * _), e[14] = -(f * m + p * d + g * _), e[15] = 1, e)
  2618.                 }, v.str = function(e) {
  2619.                     return "mat4(" + e[0] + ", " + e[1] + ", " + e[2] + ", " + e[3] + ", " + e[4] + ", " + e[5] + ", " + e[6] + ", " + e[7] + ", " + e[8] + ", " + e[9] + ", " + e[10] + ", " + e[11] + ", " + e[12] + ", " + e[13] + ", " + e[14] + ", " + e[15] + ")"
  2620.                 }, v.frob = function(e) {
  2621.                     return Math.sqrt(Math.pow(e[0], 2) + Math.pow(e[1], 2) + Math.pow(e[2], 2) + Math.pow(e[3], 2) + Math.pow(e[4], 2) + Math.pow(e[5], 2) + Math.pow(e[6], 2) + Math.pow(e[7], 2) + Math.pow(e[8], 2) + Math.pow(e[9], 2) + Math.pow(e[10], 2) + Math.pow(e[11], 2) + Math.pow(e[12], 2) + Math.pow(e[13], 2) + Math.pow(e[14], 2) + Math.pow(e[15], 2))
  2622.                 }, "undefined" != typeof e && (e.mat4 = v);
  2623.                 var p = {};
  2624.                 p.create = function() {
  2625.                     var e = new r(4);
  2626.                     return e[0] = 0, e[1] = 0, e[2] = 0, e[3] = 1, e
  2627.                 }, p.rotationTo = function() {
  2628.                     var e = u.create(),
  2629.                         t = u.fromValues(1, 0, 0),
  2630.                         r = u.fromValues(0, 1, 0);
  2631.                     return function(n, o, a) {
  2632.                         var i = u.dot(o, a);
  2633.                         return -.999999 > i ? (u.cross(e, t, o), u.length(e) < 1e-6 && u.cross(e, r, o), u.normalize(e, e), p.setAxisAngle(n, e, Math.PI), n) : i > .999999 ? (n[0] = 0, n[1] = 0, n[2] = 0, n[3] = 1, n) : (u.cross(e, o, a), n[0] = e[0], n[1] = e[1], n[2] = e[2], n[3] = 1 + i, p.normalize(n, n))
  2634.                     }
  2635.                 }(), p.setAxes = function() {
  2636.                     var e = f.create();
  2637.                     return function(t, r, n, o) {
  2638.                         return e[0] = n[0], e[3] = n[1], e[6] = n[2], e[1] = o[0], e[4] = o[1], e[7] = o[2], e[2] = -r[0], e[5] = -r[1], e[8] = -r[2], p.normalize(t, p.fromMat3(t, e))
  2639.                     }
  2640.                 }(), p.clone = c.clone, p.fromValues = c.fromValues, p.copy = c.copy, p.set = c.set, p.identity = function(e) {
  2641.                     return e[0] = 0, e[1] = 0, e[2] = 0, e[3] = 1, e
  2642.                 }, p.setAxisAngle = function(e, t, r) {
  2643.                     r = .5 * r;
  2644.                     var n = Math.sin(r);
  2645.                     return e[0] = n * t[0], e[1] = n * t[1], e[2] = n * t[2], e[3] = Math.cos(r), e
  2646.                 }, p.add = c.add, p.multiply = function(e, t, r) {
  2647.                     var n = t[0],
  2648.                         o = t[1],
  2649.                         a = t[2],
  2650.                         i = t[3],
  2651.                         u = r[0],
  2652.                         c = r[1],
  2653.                         l = r[2],
  2654.                         s = r[3];
  2655.                     return e[0] = n * s + i * u + o * l - a * c, e[1] = o * s + i * c + a * u - n * l, e[2] = a * s + i * l + n * c - o * u, e[3] = i * s - n * u - o * c - a * l, e
  2656.                 }, p.mul = p.multiply, p.scale = c.scale, p.rotateX = function(e, t, r) {
  2657.                     r *= .5;
  2658.                     var n = t[0],
  2659.                         o = t[1],
  2660.                         a = t[2],
  2661.                         i = t[3],
  2662.                         u = Math.sin(r),
  2663.                         c = Math.cos(r);
  2664.                     return e[0] = n * c + i * u, e[1] = o * c + a * u, e[2] = a * c - o * u, e[3] = i * c - n * u, e
  2665.                 }, p.rotateY = function(e, t, r) {
  2666.                     r *= .5;
  2667.                     var n = t[0],
  2668.                         o = t[1],
  2669.                         a = t[2],
  2670.                         i = t[3],
  2671.                         u = Math.sin(r),
  2672.                         c = Math.cos(r);
  2673.                     return e[0] = n * c - a * u, e[1] = o * c + i * u, e[2] = a * c + n * u, e[3] = i * c - o * u, e
  2674.                 }, p.rotateZ = function(e, t, r) {
  2675.                     r *= .5;
  2676.                     var n = t[0],
  2677.                         o = t[1],
  2678.                         a = t[2],
  2679.                         i = t[3],
  2680.                         u = Math.sin(r),
  2681.                         c = Math.cos(r);
  2682.                     return e[0] = n * c + o * u, e[1] = o * c - n * u, e[2] = a * c + i * u, e[3] = i * c - a * u, e
  2683.                 }, p.calculateW = function(e, t) {
  2684.                     var r = t[0],
  2685.                         n = t[1],
  2686.                         o = t[2];
  2687.                     return e[0] = r, e[1] = n, e[2] = o, e[3] = Math.sqrt(Math.abs(1 - r * r - n * n - o * o)), e
  2688.                 }, p.dot = c.dot, p.lerp = c.lerp, p.slerp = function(e, t, r, n) {
  2689.                     var o, a, i, u, c, l = t[0],
  2690.                         s = t[1],
  2691.                         f = t[2],
  2692.                         v = t[3],
  2693.                         p = r[0],
  2694.                         g = r[1],
  2695.                         h = r[2],
  2696.                         m = r[3];
  2697.                     return a = l * p + s * g + f * h + v * m, 0 > a && (a = -a, p = -p, g = -g, h = -h, m = -m), 1 - a > 1e-6 ? (o = Math.acos(a), i = Math.sin(o), u = Math.sin((1 - n) * o) / i, c = Math.sin(n * o) / i) : (u = 1 - n, c = n), e[0] = u * l + c * p, e[1] = u * s + c * g, e[2] = u * f + c * h, e[3] = u * v + c * m, e
  2698.                 }, p.invert = function(e, t) {
  2699.                     var r = t[0],
  2700.                         n = t[1],
  2701.                         o = t[2],
  2702.                         a = t[3],
  2703.                         i = r * r + n * n + o * o + a * a,
  2704.                         u = i ? 1 / i : 0;
  2705.                     return e[0] = -r * u, e[1] = -n * u, e[2] = -o * u, e[3] = a * u, e
  2706.                 }, p.conjugate = function(e, t) {
  2707.                     return e[0] = -t[0], e[1] = -t[1], e[2] = -t[2], e[3] = t[3], e
  2708.                 }, p.length = c.length, p.len = p.length, p.squaredLength = c.squaredLength, p.sqrLen = p.squaredLength, p.normalize = c.normalize, p.fromMat3 = function(e, t) {
  2709.                     var r, n = t[0] + t[4] + t[8];
  2710.                     if (n > 0) r = Math.sqrt(n + 1), e[3] = .5 * r, r = .5 / r, e[0] = (t[5] - t[7]) * r, e[1] = (t[6] - t[2]) * r, e[2] = (t[1] - t[3]) * r;
  2711.                     else {
  2712.                         var o = 0;
  2713.                         t[4] > t[0] && (o = 1), t[8] > t[3 * o + o] && (o = 2);
  2714.                         var a = (o + 1) % 3,
  2715.                             i = (o + 2) % 3;
  2716.                         r = Math.sqrt(t[3 * o + o] - t[3 * a + a] - t[3 * i + i] + 1), e[o] = .5 * r, r = .5 / r, e[3] = (t[3 * a + i] - t[3 * i + a]) * r, e[a] = (t[3 * a + o] + t[3 * o + a]) * r, e[i] = (t[3 * i + o] + t[3 * o + i]) * r
  2717.                     }
  2718.                     return e
  2719.                 }, p.str = function(e) {
  2720.                     return "quat(" + e[0] + ", " + e[1] + ", " + e[2] + ", " + e[3] + ")"
  2721.                 }, "undefined" != typeof e && (e.quat = p)
  2722.             }(t.exports)
  2723.     }(this),
  2724.     function(e, t) {
  2725.         "use strict";
  2726.         "object" == typeof exports ? module.exports = t() : "function" == typeof define && define.amd ? define(t) : e.MersenneTwister = t()
  2727.     }(this, function() {
  2728.         "use strict";
  2729.         var e = 4294967296,
  2730.             t = 624,
  2731.             r = 397,
  2732.             n = 2147483648,
  2733.             o = 2147483647,
  2734.             a = 2567483615,
  2735.             i = function(e) {
  2736.                 "undefined" == typeof e && (e = (new Date).getTime()), this.mt = new Array(t), this.mti = t + 1, this.seed(e)
  2737.             };
  2738.         i.prototype.seed = function(e) {
  2739.             var r;
  2740.             for (this.mt[0] = e >>> 0, this.mti = 1; this.mti < t; this.mti++) r = this.mt[this.mti - 1] ^ this.mt[this.mti - 1] >>> 30, this.mt[this.mti] = (1812433253 * ((4294901760 & r) >>> 16) << 16) + 1812433253 * (65535 & r) + this.mti, this.mt[this.mti] >>>= 0
  2741.         }, i.prototype.seedArray = function(e) {
  2742.             var r, n = 1,
  2743.                 o = 0,
  2744.                 a = t > e.length ? t : e.length;
  2745.             for (this.seed(19650218); a > 0; a--) r = this.mt[n - 1] ^ this.mt[n - 1] >>> 30, this.mt[n] = (this.mt[n] ^ (1664525 * ((4294901760 & r) >>> 16) << 16) + 1664525 * (65535 & r)) + e[o] + o, this.mt[n] >>>= 0, n++, o++, n >= t && (this.mt[0] = this.mt[t - 1], n = 1), o >= e.length && (o = 0);
  2746.             for (a = t - 1; a; a--) r = this.mt[n - 1] ^ this.mt[n - 1] >>> 30, this.mt[n] = (this.mt[n] ^ (1566083941 * ((4294901760 & r) >>> 16) << 16) + 1566083941 * (65535 & r)) - n, this.mt[n] >>>= 0, n++, n >= t && (this.mt[0] = this.mt[t - 1], n = 1);
  2747.             this.mt[0] = 2147483648
  2748.         }, i.prototype["int"] = function() {
  2749.             var e, i, u = new Array(0, a);
  2750.             if (this.mti >= t) {
  2751.                 for (this.mti === t + 1 && this.seed(5489), i = 0; t - r > i; i++) e = this.mt[i] & n | this.mt[i + 1] & o, this.mt[i] = this.mt[i + r] ^ e >>> 1 ^ u[1 & e];
  2752.                 for (; t - 1 > i; i++) e = this.mt[i] & n | this.mt[i + 1] & o, this.mt[i] = this.mt[i + (r - t)] ^ e >>> 1 ^ u[1 & e];
  2753.                 e = this.mt[t - 1] & n | this.mt[0] & o, this.mt[t - 1] = this.mt[r - 1] ^ e >>> 1 ^ u[1 & e], this.mti = 0
  2754.             }
  2755.             return e = this.mt[this.mti++], e ^= e >>> 11, e ^= e << 7 & 2636928640, e ^= e << 15 & 4022730752, e ^= e >>> 18, e >>> 0
  2756.         }, i.prototype.int31 = function() {
  2757.             return this["int"]() >>> 1
  2758.         }, i.prototype.real = function() {
  2759.             return this["int"]() * (1 / (e - 1))
  2760.         }, i.prototype.realx = function() {
  2761.             return (this["int"]() + .5) * (1 / e)
  2762.         }, i.prototype.rnd = function() {
  2763.             return this["int"]() * (1 / e)
  2764.         }, i.prototype.rndHiRes = function() {
  2765.             var e = this["int"]() >>> 5,
  2766.                 t = this["int"]() >>> 6;
  2767.             return (67108864 * e + t) * (1 / 9007199254740992)
  2768.         };
  2769.         var u = new i;
  2770.         return i.random = function() {
  2771.             return u.rnd()
  2772.         }, i
  2773.     }),
  2774.     function(e) {
  2775.         function t(e, t, r) {
  2776.             this.x = e, this.y = t, this.z = r
  2777.         }
  2778.  
  2779.         function r(e) {
  2780.             return e * e * e * (e * (6 * e - 15) + 10)
  2781.         }
  2782.  
  2783.         function n(e, t, r) {
  2784.             return (1 - r) * e + r * t
  2785.         }
  2786.         var o = e.noise = {};
  2787.         t.prototype.dot2 = function(e, t) {
  2788.             return this.x * e + this.y * t
  2789.         }, t.prototype.dot3 = function(e, t, r) {
  2790.             return this.x * e + this.y * t + this.z * r
  2791.         };
  2792.         var a = [new t(1, 1, 0), new t(-1, 1, 0), new t(1, -1, 0), new t(-1, -1, 0), new t(1, 0, 1), new t(-1, 0, 1), new t(1, 0, -1), new t(-1, 0, -1), new t(0, 1, 1), new t(0, -1, 1), new t(0, 1, -1), new t(0, -1, -1)],
  2793.             i = [151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180],
  2794.             u = new Array(512),
  2795.             c = new Array(512);
  2796.         o.seed = function(e) {
  2797.             e > 0 && 1 > e && (e *= 65536), e = Math.floor(e), 256 > e && (e |= e << 8);
  2798.             for (var t = 0; 256 > t; t++) {
  2799.                 var r;
  2800.                 r = 1 & t ? i[t] ^ 255 & e : i[t] ^ e >> 8 & 255, u[t] = u[t + 256] = r, c[t] = c[t + 256] = a[r % 12]
  2801.             }
  2802.         }, o.seed(0);
  2803.         var l = .5 * (Math.sqrt(3) - 1),
  2804.             s = (3 - Math.sqrt(3)) / 6,
  2805.             f = 1 / 3,
  2806.             v = 1 / 6;
  2807.         o.simplex2 = function(e, t) {
  2808.             var r, n, o, a, i, f = (e + t) * l,
  2809.                 v = Math.floor(e + f),
  2810.                 p = Math.floor(t + f),
  2811.                 g = (v + p) * s,
  2812.                 h = e - v + g,
  2813.                 m = t - p + g;
  2814.             h > m ? (a = 1, i = 0) : (a = 0, i = 1);
  2815.             var d = h - a + s,
  2816.                 _ = m - i + s,
  2817.                 b = h - 1 + 2 * s,
  2818.                 y = m - 1 + 2 * s;
  2819.             v &= 255, p &= 255;
  2820.             var T = c[v + u[p]],
  2821.                 w = c[v + a + u[p + i]],
  2822.                 E = c[v + 1 + u[p + 1]],
  2823.                 x = .5 - h * h - m * m;
  2824.             0 > x ? r = 0 : (x *= x, r = x * x * T.dot2(h, m));
  2825.             var A = .5 - d * d - _ * _;
  2826.             0 > A ? n = 0 : (A *= A, n = A * A * w.dot2(d, _));
  2827.             var M = .5 - b * b - y * y;
  2828.             return 0 > M ? o = 0 : (M *= M, o = M * M * E.dot2(b, y)), 70 * (r + n + o)
  2829.         }, o.simplex3 = function(e, t, r) {
  2830.             var n, o, a, i, l, s, p, g, h, m, d = (e + t + r) * f,
  2831.                 _ = Math.floor(e + d),
  2832.                 b = Math.floor(t + d),
  2833.                 y = Math.floor(r + d),
  2834.                 T = (_ + b + y) * v,
  2835.                 w = e - _ + T,
  2836.                 E = t - b + T,
  2837.                 x = r - y + T;
  2838.             w >= E ? E >= x ? (l = 1, s = 0, p = 0, g = 1, h = 1, m = 0) : w >= x ? (l = 1, s = 0, p = 0, g = 1, h = 0, m = 1) : (l = 0, s = 0, p = 1, g = 1, h = 0, m = 1) : x > E ? (l = 0, s = 0, p = 1, g = 0, h = 1, m = 1) : x > w ? (l = 0, s = 1, p = 0, g = 0, h = 1, m = 1) : (l = 0,
  2839.                 s = 1, p = 0, g = 1, h = 1, m = 0);
  2840.             var A = w - l + v,
  2841.                 M = E - s + v,
  2842.                 R = x - p + v,
  2843.                 P = w - g + 2 * v,
  2844.                 L = E - h + 2 * v,
  2845.                 D = x - m + 2 * v,
  2846.                 S = w - 1 + 3 * v,
  2847.                 F = E - 1 + 3 * v,
  2848.                 k = x - 1 + 3 * v;
  2849.             _ &= 255, b &= 255, y &= 255;
  2850.             var G = c[_ + u[b + u[y]]],
  2851.                 I = c[_ + l + u[b + s + u[y + p]]],
  2852.                 U = c[_ + g + u[b + h + u[y + m]]],
  2853.                 N = c[_ + 1 + u[b + 1 + u[y + 1]]],
  2854.                 B = .6 - w * w - E * E - x * x;
  2855.             0 > B ? n = 0 : (B *= B, n = B * B * G.dot3(w, E, x));
  2856.             var W = .6 - A * A - M * M - R * R;
  2857.             0 > W ? o = 0 : (W *= W, o = W * W * I.dot3(A, M, R));
  2858.             var O = .6 - P * P - L * L - D * D;
  2859.             0 > O ? a = 0 : (O *= O, a = O * O * U.dot3(P, L, D));
  2860.             var C = .6 - S * S - F * F - k * k;
  2861.             return 0 > C ? i = 0 : (C *= C, i = C * C * N.dot3(S, F, k)), 32 * (n + o + a + i)
  2862.         }, o.perlin2 = function(e, t) {
  2863.             var o = Math.floor(e),
  2864.                 a = Math.floor(t);
  2865.             e -= o, t -= a, o = 255 & o, a = 255 & a;
  2866.             var i = c[o + u[a]].dot2(e, t),
  2867.                 l = c[o + u[a + 1]].dot2(e, t - 1),
  2868.                 s = c[o + 1 + u[a]].dot2(e - 1, t),
  2869.                 f = c[o + 1 + u[a + 1]].dot2(e - 1, t - 1),
  2870.                 v = r(e);
  2871.             return n(n(i, s, v), n(l, f, v), r(t))
  2872.         }, o.perlin3 = function(e, t, o) {
  2873.             var a = Math.floor(e),
  2874.                 i = Math.floor(t),
  2875.                 l = Math.floor(o);
  2876.             e -= a, t -= i, o -= l, a = 255 & a, i = 255 & i, l = 255 & l;
  2877.             var s = c[a + u[i + u[l]]].dot3(e, t, o),
  2878.                 f = c[a + u[i + u[l + 1]]].dot3(e, t, o - 1),
  2879.                 v = c[a + u[i + 1 + u[l]]].dot3(e, t - 1, o),
  2880.                 p = c[a + u[i + 1 + u[l + 1]]].dot3(e, t - 1, o - 1),
  2881.                 g = c[a + 1 + u[i + u[l]]].dot3(e - 1, t, o),
  2882.                 h = c[a + 1 + u[i + u[l + 1]]].dot3(e - 1, t, o - 1),
  2883.                 m = c[a + 1 + u[i + 1 + u[l]]].dot3(e - 1, t - 1, o),
  2884.                 d = c[a + 1 + u[i + 1 + u[l + 1]]].dot3(e - 1, t - 1, o - 1),
  2885.                 _ = r(e),
  2886.                 b = r(t),
  2887.                 y = r(o);
  2888.             return n(n(n(s, g, _), n(f, h, _), y), n(n(v, m, _), n(p, d, _), y), b)
  2889.         }
  2890.     }(this);
  2891. var GTW = window.GTW || {};
  2892. GTW.resource_url = function(e) {
  2893.         return "assets/map/" + e
  2894.     },
  2895.     function() {
  2896.         function e(e) {
  2897.             return Math.PI * e / 180
  2898.         }
  2899.  
  2900.         function t(e) {
  2901.             return 180 * e / Math.PI
  2902.         }
  2903.  
  2904.         function r(e, t, r) {
  2905.             return (1 - r) * e + r * t
  2906.         }
  2907.  
  2908.         function n(e, t, r) {
  2909.             return t > e ? t : e > r ? r : e
  2910.         }
  2911.  
  2912.         function o(e) {
  2913.             return 3 * e * e - 2 * e * e * e
  2914.         }
  2915.  
  2916.         function a(e, t) {
  2917.             return (e % t + t) % t
  2918.         }
  2919.  
  2920.         function i(e) {
  2921.             return 0 > e ? -1 : e > 0 ? 1 : 0
  2922.         }
  2923.  
  2924.         function u(e, t) {
  2925.             return e[t] = !e[t]
  2926.         }
  2927.  
  2928.         function c(e) {
  2929.             for (var t = 5381, r = e.length - 1; r >= 0; --r) t = (t << 5) + t + e.charCodeAt(r);
  2930.             return t
  2931.         }
  2932.  
  2933.         function l(e) {
  2934.             function t(e) {
  2935.                 e = e || 1;
  2936.                 for (var t = ""; e--;) t += (65536 * (1 + Math.random()) | 0).toString(16).substring(1);
  2937.                 return t
  2938.             }
  2939.             return _.isUndefined(e) && (e = "-"), _.map([2, 1, 1, 1, 3], function(e) {
  2940.                 return t(e)
  2941.             }).join(e)
  2942.         }
  2943.  
  2944.         function s(e, t) {
  2945.             for (var t = t || 1, r = [], n = 0; n < e.length; ++n) r.push(n);
  2946.             for (var o = vec3.create(), a = vec3.create(), i = 0, u = 1 / 0, c = vec3.create(), l = 0; t > l; ++l) {
  2947.                 l > 0 && y.shuffle(r);
  2948.                 for (var n = 0; n < r.length; ++n) {
  2949.                     var s = r[n],
  2950.                         f = e[s];
  2951.                     if (0 !== n) {
  2952.                         if (!(vec3.dist(o, f) < i) && (vec3.sub(c, o, f), vec3.normalize(c, c), vec3.scale(c, c, i), vec3.add(c, c, o), vec3.lerp(o, f, c, .5), i = .5 * vec3.dist(f, c), i > u)) break
  2953.                     } else vec3.copy(o, f), i = 0
  2954.                 }
  2955.                 i && u > i && (vec3.copy(a, o), u = i)
  2956.             }
  2957.             return {
  2958.                 center: a,
  2959.                 radius: u
  2960.             }
  2961.         }
  2962.  
  2963.         function f(e, t) {
  2964.             for (var r = 0, n = 0; r < e.length;) {
  2965.                 var o = e.indexOf("\n", r); - 1 == o && (o = e.length);
  2966.                 var a = e.substr(r, o - r);
  2967.                 r = o + 1, t(a, n++)
  2968.             }
  2969.         }
  2970.  
  2971.         function v(e) {
  2972.             return _.isUndefined(e.offsetX) ? [e.layerX, e.layerY] : [e.offsetX, e.offsetY]
  2973.         }
  2974.         var p, g = Math.PI,
  2975.             h = g / 2,
  2976.             m = 2 * g,
  2977.             d = 0,
  2978.             b = Math.random,
  2979.             y = {
  2980.                 cardinal: function(e) {
  2981.                     return Math.floor(e * b())
  2982.                 },
  2983.                 integer: function(e, t) {
  2984.                     return e + Math.floor((t - e) * b())
  2985.                 },
  2986.                 uniform: function(e, t) {
  2987.                     return r(e, t, Math.random())
  2988.                 },
  2989.                 gauss: function(e, t) {
  2990.                     var r = d;
  2991.                     if (d = 0, 0 === r) {
  2992.                         var n = m * b(),
  2993.                             o = Math.sqrt(-2 * Math.log(1 - b()));
  2994.                         r = Math.cos(n) * o, d = Math.sin(n) * o
  2995.                     }
  2996.                     return e + r * t
  2997.                 },
  2998.                 choose: function(e) {
  2999.                     var t = y.cardinal(e.length);
  3000.                     return e[t]
  3001.                 },
  3002.                 uniformVec3: function(e, t) {
  3003.                     return e[0] = 2 * t * (b() - .5), e[1] = 2 * t * (b() - .5), e[2] = 2 * t * (b() - .5), e
  3004.                 },
  3005.                 unitVec3: function(e) {
  3006.                     return y.uniformVec3(e, 1), vec3.normalize(e, e), e
  3007.                 },
  3008.                 shuffle: function(e) {
  3009.                     for (var t = e.length - 1; t >= 0; --t) {
  3010.                         var r = y.cardinal(t + 1),
  3011.                             n = e[t];
  3012.                         e[t] = e[r], e[r] = n
  3013.                     }
  3014.                 },
  3015.                 distribute: function(e, t, n) {
  3016.                     return r(e, t, Math.pow(b(), n))
  3017.                 }
  3018.             },
  3019.             T = {
  3020.                 decode: function(e, t) {
  3021.                     for (var r = atob(e), n = r.length, o = new ArrayBuffer(n), a = new Uint8Array(o), i = 0; n > i; ++i) a[i] = r.charCodeAt(i);
  3022.                     return t ? new t(o) : o
  3023.                 },
  3024.                 encode: function(e) {
  3025.                     for (var e = new Uint8Array(e.buffer, e.byteOffset, e.byteLength), t = e.length, r = "", n = 0; t > n; ++n) r += String.fromCharCode(e[n]);
  3026.                     return btoa(r)
  3027.                 }
  3028.             };
  3029.         p = this.performance && performance.now ? function() {
  3030.             return .001 * performance.now()
  3031.         } : function() {
  3032.             return .001 * Date.now()
  3033.         }, _.extend(this, {
  3034.             PI: g,
  3035.             HALF_PI: h,
  3036.             TWO_PI: m,
  3037.             deg2rad: e,
  3038.             rad2deg: t,
  3039.             lerp: r,
  3040.             clamp: n,
  3041.             smoothstep: o,
  3042.             modulo: a,
  3043.             sign: i,
  3044.             toggleProperty: u,
  3045.             hashDJB2: c,
  3046.             makeUuid: l,
  3047.             Random: y,
  3048.             miniball: s,
  3049.             Base64: T,
  3050.             timeNow: p,
  3051.             forEachLine: f,
  3052.             getMouseEventOffset: v
  3053.         }), this.requestAnimationFrame || (this.requestAnimationFrame = this.webkitRequestAnimationFrame || this.mozRequestAnimationFrame || this.msRequestAnimationFrame || function(e) {
  3054.             setTimeout(e, 1e3 / 60)
  3055.         }), this.saveFileAs = function(e, t, r) {
  3056.             r = r || "application/octet-binary";
  3057.             var n = new Blob([e], {
  3058.                     type: r
  3059.                 }),
  3060.                 o = URL.createObjectURL(n),
  3061.                 a = document.createElement("a");
  3062.             a.setAttribute("href", o), a.setAttribute("download", t), a.click(), URL.revokeObjectURL(n)
  3063.         }
  3064.     }.call(window), vec2.load = function(e, t, r) {
  3065.         e[0] = t[r + 0], e[1] = t[r + 1]
  3066.     }, vec2.save = function(e, t, r) {
  3067.         t[r + 0] = e[0], t[r + 1] = e[1]
  3068.     }, vec3.load = function(e, t, r) {
  3069.         e[0] = t[r + 0], e[1] = t[r + 1], e[2] = t[r + 2]
  3070.     }, vec3.save = function(e, t, r) {
  3071.         t[r + 0] = e[0], t[r + 1] = e[1], t[r + 2] = e[2]
  3072.     }, vec4.load = function(e, t, r) {
  3073.         e[0] = t[r + 0], e[1] = t[r + 1], e[2] = t[r + 2], e[3] = t[r + 3]
  3074.     }, vec4.save = function(e, t, r) {
  3075.         t[r + 0] = e[0], t[r + 1] = e[1], t[r + 2] = e[2], t[r + 3] = e[3]
  3076.     }, vec2.perp = function(e, t) {
  3077.         var r = t[0];
  3078.         e[0] = -t[1], e[1] = r
  3079.     }, mat4.lerp = function(e, t, r, n) {
  3080.         for (var o = 0; 16 > o; ++o) e[o] = (1 - n) * t[o] + n * r[o];
  3081.         return e
  3082.     };
  3083. var webgl = function() {
  3084.     function e(e) {
  3085.         this.name = e, this.program = null, this.attribs = {}, this.uniforms = {}
  3086.     }
  3087.  
  3088.     function t(e, t, r) {
  3089.         var n = gl.createShader(e);
  3090.         if (gl.shaderSource(n, t), gl.compileShader(n), gl.getShaderParameter(n, gl.COMPILE_STATUS)) return n;
  3091.         gl.getShaderInfoLog(n);
  3092.         throw console.log("Shader: " + r), console.log("Type: " + (e == gl.VERTEX_SHADER ? "vertex" : "fragment")), forEachLine(t, function(e, t) {
  3093.             var r = ("  " + (t + 1)).slice(-3);
  3094.             console.log(r + ": " + e)
  3095.         }), {
  3096.             type: "COMPILE",
  3097.             shaderType: e == gl.VERTEX_SHADER ? "vertex" : "fragment",
  3098.             name: r,
  3099.             shader: n,
  3100.             source: gl.getShaderSource(n),
  3101.             log: gl.getShaderInfoLog(n)
  3102.         }
  3103.     }
  3104.  
  3105.     function r(e) {
  3106.         var r = "precision highp float;\n",
  3107.             n = gl.createProgram();
  3108.         if (gl.attachShader(n, t(gl.VERTEX_SHADER, e.vertexSource, e.name)), gl.attachShader(n, t(gl.FRAGMENT_SHADER, r + e.fragmentSource, e.name)), gl.linkProgram(n), gl.getProgramParameter(n, gl.LINK_STATUS)) return n;
  3109.         throw {
  3110.             type: "LINK",
  3111.             name: e.name,
  3112.             program: n,
  3113.             log: gl.getProgramInfoLog(n)
  3114.         }
  3115.     }
  3116.  
  3117.     function n(e) {
  3118.         function t(e) {
  3119.             var t = /^\/\/\s*(\w+(?:.(vertex|fragment))?)\s*\/\//,
  3120.                 r = [];
  3121.             forEachLine(e, function(e) {
  3122.                 var n = t.exec(e);
  3123.                 if (n) {
  3124.                     var o = n[1];
  3125.                     i[o] = r = []
  3126.                 } else r.push(e)
  3127.             })
  3128.         }
  3129.         i = {}, _.each(e, function(e) {
  3130.             return _.isObject(e) ? void _.extend(i, e) : void $.ajax({
  3131.                 url: e,
  3132.                 async: !1,
  3133.                 cache: !1,
  3134.                 success: t
  3135.             })
  3136.         }), _.each(i, function(e, t) {
  3137.             _.isArray(e) && (i[t] = e.join("\n"))
  3138.         })
  3139.     }
  3140.  
  3141.     function o(e, t, r, n) {
  3142.         switch (this.width = e, this.height = t, this.framebuffer = gl.createFramebuffer(), gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer), this.texture = gl.createTexture(), gl.bindTexture(gl.TEXTURE_2D, this.texture), this.dataType = n ? gl.FLOAT : gl.UNSIGNED_BYTE, gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, e, t, 0, gl.RGBA, this.dataType, null), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE), gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0), this.depthTexture = null, this.depthRenderbuffer = null, r = r ? "TEXTURE" : "NONE", r = "RENDERBUFFER") {
  3143.             case "TEXTURE":
  3144.                 this.depthTexture = gl.createTexture(), gl.bindTexture(gl.TEXTURE_2D, this.depthTexture), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE), gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, e, t, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null), gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, this.depthTexture, 0);
  3145.                 break;
  3146.             case "RENDERBUFFER":
  3147.                 this.depthRenderbuffer = gl.createRenderbuffer(), gl.bindRenderbuffer(gl.RENDERBUFFER, this.depthRenderbuffer), gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, e, t), gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.depthRenderbuffer), gl.bindRenderbuffer(gl.RENDERBUFFER, null)
  3148.         }
  3149.         gl.bindFramebuffer(gl.FRAMEBUFFER, null)
  3150.     }
  3151.     var a = {
  3152.         enabledMask: 0,
  3153.         maxEnabledIndex: -1,
  3154.         disableAll: function() {
  3155.             for (var e = 0; e <= this.maxEnabledIndex; ++e) {
  3156.                 var t = 1 << e;
  3157.                 t & this.enabledMask && gl.disableVertexAttribArray(e)
  3158.             }
  3159.             this.enabledMask = 0, this.maxEnabledIndex = -1
  3160.         },
  3161.         enable: function(e) {
  3162.             var t = 1 << e;
  3163.             t & this.enabledMask || (gl.enableVertexAttribArray(e), this.enabledMask |= t, this.maxEnabledIndex = Math.max(this.maxEnabledIndex, e))
  3164.         },
  3165.         disable: function(e) {
  3166.             var t = 1 << e;
  3167.             t & this.enabledMask && (gl.disableVertexAttribArray(e), this.enabledMask &= ~t)
  3168.         }
  3169.     };
  3170.     e.prototype.setProgram = function(e) {
  3171.         function t(e) {
  3172.             if (e.type == gl.SAMPLER_2D || e.type == gl.SAMPLER_CUBE) {
  3173.                 var t = a;
  3174.                 return a += e.size, t
  3175.             }
  3176.             return -1
  3177.         }
  3178.         this.program = e;
  3179.         for (var r = gl.getProgramParameter(e, gl.ACTIVE_ATTRIBUTES), n = 0; r > n; ++n) {
  3180.             var o = gl.getActiveAttrib(e, n);
  3181.             this.attribs[o.name] = {
  3182.                 index: gl.getAttribLocation(e, o.name),
  3183.                 name: o.name,
  3184.                 size: o.size,
  3185.                 type: o.type
  3186.             }
  3187.         }
  3188.         for (var a = 0, i = gl.getProgramParameter(e, gl.ACTIVE_UNIFORMS), n = 0; i > n; ++n) {
  3189.             var u = gl.getActiveUniform(e, n);
  3190.             this.uniforms[u.name] = {
  3191.                 location: gl.getUniformLocation(e, u.name),
  3192.                 name: u.name,
  3193.                 size: u.size,
  3194.                 type: u.type,
  3195.                 texUnit: t(u)
  3196.             }
  3197.         }
  3198.     }, e.prototype.use = function() {
  3199.         return gl.useProgram(this.program), a.disableAll(), this
  3200.     }, e.prototype.getUniformLocation = function(e) {
  3201.         var t = this.uniforms[e];
  3202.         return t ? t.location : null
  3203.     }, e.prototype.getAttribIndex = function(e) {
  3204.         var t = this.attribs[e];
  3205.         return t ? t.index : -1
  3206.     }, e.prototype.uniform1i = function(e, t) {
  3207.         var r = this.getUniformLocation(e);
  3208.         r && gl.uniform1i(r, t)
  3209.     }, e.prototype.uniform1f = function(e, t) {
  3210.         var r = this.getUniformLocation(e);
  3211.         r && gl.uniform1f(r, t)
  3212.     }, e.prototype.uniform2f = function(e, t, r) {
  3213.         var n = this.getUniformLocation(e);
  3214.         n && gl.uniform2f(n, t, r)
  3215.     }, e.prototype.uniform3f = function(e, t, r, n) {
  3216.         var o = this.getUniformLocation(e);
  3217.         o && gl.uniform3f(o, t, r, n)
  3218.     }, e.prototype.uniform4f = function(e, t, r, n, o) {
  3219.         var a = this.getUniformLocation(e);
  3220.         a && gl.uniform4f(a, t, r, n, o)
  3221.     }, e.prototype.uniform1fv = function(e, t) {
  3222.         var r = this.getUniformLocation(e);
  3223.         r && gl.uniform1fv(r, t)
  3224.     }, e.prototype.uniform2fv = function(e, t) {
  3225.         var r = this.getUniformLocation(e);
  3226.         r && gl.uniform2fv(r, t)
  3227.     }, e.prototype.uniform3fv = function(e, t) {
  3228.         var r = this.getUniformLocation(e);
  3229.         r && gl.uniform3fv(r, t)
  3230.     }, e.prototype.uniform4fv = function(e, t) {
  3231.         var r = this.getUniformLocation(e);
  3232.         r && gl.uniform4fv(r, t)
  3233.     }, e.prototype.uniformMatrix3fv = function(e, t, r) {
  3234.         var n = this.getUniformLocation(e);
  3235.         n && (r = r || !1, gl.uniformMatrix3fv(n, r, t))
  3236.     }, e.prototype.uniformMatrix4fv = function(e, t, r) {
  3237.         var n = this.getUniformLocation(e);
  3238.         n && (r = r || !1, gl.uniformMatrix4fv(n, r, t))
  3239.     }, e.prototype.uniformSampler = function(e, t, r) {
  3240.         var n = this.uniforms[e];
  3241.         n && (gl.activeTexture(gl.TEXTURE0 + n.texUnit), gl.bindTexture(t, r), gl.uniform1i(n.location, n.texUnit))
  3242.     }, e.prototype.uniformSampler2D = function(e, t) {
  3243.         this.uniformSampler(e, gl.TEXTURE_2D, t)
  3244.     }, e.prototype.uniformSamplerCube = function(e, t) {
  3245.         this.uniformSampler(e, gl.TEXTURE_CUBE_MAP, t)
  3246.     }, e.prototype.enableVertexAttribArray = function(e) {
  3247.         var t = this.attribs[e];
  3248.         t && a.enable(t.index)
  3249.     }, e.prototype.disableVertexAttribArray = function(e) {
  3250.         var t = this.attribs[e];
  3251.         t && a.disable(t.index)
  3252.     }, e.prototype.vertexAttribPointer = function(e, t, r, n, o, i) {
  3253.         var u = this.attribs[e];
  3254.         u && (a.enable(u.index), gl.vertexAttribPointer(u.index, t, r, n, o, i))
  3255.     };
  3256.     var i = {},
  3257.         u = function() {
  3258.             function t(e) {
  3259.                 var t = !!i[e];
  3260.                 return console.assert(t, e + " not found."), t
  3261.             }
  3262.  
  3263.             function n(n, o) {
  3264.                 if (t(n) && t(n + ".vertex") && t(n + ".fragment")) {
  3265.                     o = o || {};
  3266.                     var a = "";
  3267.                     o.defines && _.each(o.defines, function(e, t) {
  3268.                         a += "#define " + t + " " + e + "\n"
  3269.                     });
  3270.                     var u = a + (i[n] || ""),
  3271.                         c = _.reject(u.split("\n"), function(e) {
  3272.                             return e.match(/attribute/)
  3273.                         }).join("\n");
  3274.                     try {
  3275.                         var l = new e(n);
  3276.                         return l.setProgram(r({
  3277.                             name: n,
  3278.                             vertexSource: u + i[n + ".vertex"],
  3279.                             fragmentSource: c + i[n + ".fragment"]
  3280.                         })), l
  3281.                     } catch (s) {
  3282.                         return onGLSLError(s), null
  3283.                     }
  3284.                 }
  3285.             }
  3286.  
  3287.             function o(e, t) {
  3288.                 var r = [];
  3289.                 return t && t.defines && _.each(t.defines, function(e, t) {
  3290.                     r.push(t + "=" + e)
  3291.                 }), e + " " + r.join(" ")
  3292.             }
  3293.             return _.memoize(n, o)
  3294.         }();
  3295.     return o.prototype.render = function(e) {
  3296.         var t = gl.getParameter(gl.VIEWPORT);
  3297.         gl.viewport(0, 0, this.width, this.height), gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer), e(), gl.bindFramebuffer(gl.FRAMEBUFFER, null), gl.viewport(t[0], t[1], t[2], t[3])
  3298.     }, o.prototype.resize = function(e, t) {
  3299.         this.width = e, this.height = t, gl.bindTexture(gl.TEXTURE_2D, this.texture), gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, e, t, 0, gl.RGBA, this.dataType, null), this.depthTexture && (gl.bindTexture(gl.TEXTURE_2D, this.depthTexture), gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, e, t, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null)), this.depthRenderbuffer && (gl.bindRenderbuffer(gl.RENDERBUFFER, this.depthRenderbuffer), gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, e, t), gl.bindRenderbuffer(gl.RENDERBUFFER, null))
  3300.     }, {
  3301.         makeBuffer: function(e, t, r) {
  3302.             r = r || gl.STATIC_DRAW;
  3303.             var n = gl.createBuffer();
  3304.             return gl.bindBuffer(e, n), gl.bufferData(e, t, r), n
  3305.         },
  3306.         makeVertexBuffer: function(e, t) {
  3307.             return this.makeBuffer(gl.ARRAY_BUFFER, e, t)
  3308.         },
  3309.         makeElementBuffer: function(e, t) {
  3310.             return this.makeBuffer(gl.ELEMENT_ARRAY_BUFFER, e, t)
  3311.         },
  3312.         bindVertexBuffer: function(e) {
  3313.             gl.bindBuffer(gl.ARRAY_BUFFER, e)
  3314.         },
  3315.         bindElementBuffer: function(e) {
  3316.             gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, e)
  3317.         },
  3318.         setupCanvas: function(e, t) {
  3319.             function r(r) {
  3320.                 try {
  3321.                     return e.getContext(r, t)
  3322.                 } catch (n) {
  3323.                     return null
  3324.                 }
  3325.             }
  3326.             t = t || {}, t = _.defaults(t, {
  3327.                 antialias: !1,
  3328.                 preserveDrawingBuffer: !0,
  3329.                 extensions: [],
  3330.                 shaderSources: ["shaders/all-shaders.glsl"]
  3331.             });
  3332.             var o = r("webgl") || r("experimental-webgl");
  3333.             if (o) {
  3334.                 var a = this.extensions = {};
  3335.                 _.each(t.extensions, function(e) {
  3336.                     a[e] = o.getExtension(e)
  3337.                 }), window.gl = o, n(t.shaderSources)
  3338.             }
  3339.             return o
  3340.         },
  3341.         getProgram: u,
  3342.         createTexture2D: function(e) {
  3343.             var t = gl.createTexture();
  3344.             gl.bindTexture(gl.TEXTURE_2D, t), e = e || {}, e.width = e.width || e.size || 4, e.height = e.height || e.width, e.format = e.format || gl.RGBA, e.type = e.type || gl.UNSIGNED_BYTE, e.mag = e.mag || e.filter || gl.NEAREST, e.min = e.min || e.mag, e.wrapS = e.wrapS || e.wrap || gl.CLAMP_TO_EDGE, e.wrapT = e.wrapT || e.wrapS, e.dataFormat = e.dataFormat || e.format, e.data = e.data || null;
  3345.             var r = 0,
  3346.                 n = 0;
  3347.             if (gl.texImage2D(gl.TEXTURE_2D, r, e.format, e.width, e.height, n, e.dataFormat, e.type, e.data), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, e.min), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, e.mag), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, e.wrapS), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, e.wrapT), e.aniso) {
  3348.                 var o = webgl.extensions.WEBKIT_EXT_texture_filter_anisotropic;
  3349.                 o && gl.texParameteri(gl.TEXTURE_2D, o.TEXTURE_MAX_ANISOTROPY_EXT, e.aniso)
  3350.             }
  3351.             return t
  3352.         },
  3353.         loadTexture2D: function(e, t) {
  3354.             t = t || {}, t = _.defaults(t, {
  3355.                 mipmap: !1,
  3356.                 flip: !1,
  3357.                 callback: null,
  3358.                 filter: gl.LINEAR
  3359.             });
  3360.             var r = this.createTexture2D(t),
  3361.                 n = new Image;
  3362.             return n.src = e, n.onload = function() {
  3363.                 gl.bindTexture(gl.TEXTURE_2D, r), gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, t.flip ? 1 : 0), gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, n), t.mipmap && (gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR), gl.generateMipmap(gl.TEXTURE_2D)), t.callback && t.callback(r)
  3364.             }, r
  3365.         },
  3366.         RenderTexture: o
  3367.     }
  3368. }();
  3369. window.onGLSLError = function(e) {
  3370.     console.log("GLSL error:", e);
  3371.     var t = {};
  3372.     switch (forEachLine(e.log, function(e, r) {
  3373.         var n = e.match(/^ERROR: \d+:(\d+):(.*)$/);
  3374.         if (n) {
  3375.             var o = parseInt(n[1]),
  3376.                 a = n[2];
  3377.             t[o] || (t[o] = []), t[o].push(a)
  3378.         }
  3379.     }), console.log(t), e.type) {
  3380.         case "COMPILE":
  3381.             html = '<div class="description">GLSL compile error in ' + e.shaderType.toLowerCase() + ' shader "' + e.name + '":</div>', forEachLine(e.source, function(e, r) {
  3382.                 var n = t[r + 1];
  3383.                 n ? (n = _.map(n, function(e) {
  3384.                     return "<div class='description'>" + e + "</div>"
  3385.                 }).join(""), html += "<span class='highlight'>" + e + "</span> " + n) : html += e + "\n"
  3386.             });
  3387.             break;
  3388.         case "LINK":
  3389.             html = '<div class="description">GLSL link error in program "' + e.name + '":<br/>\n' + e.log + "\n</div>"
  3390.     }
  3391.     $(".glsl-error").html("<code>" + html + "</code>").show()
  3392. };
  3393. var GTW = GTW || {};
  3394. ! function() {
  3395.     GTW.create_gradient_texture = function(e) {
  3396.         var t = document.createElement("canvas");
  3397.         t.width = 1024, t.height = 1;
  3398.         var r = t.getContext("2d"),
  3399.             n = r.createLinearGradient(0, 0, t.width, 0);
  3400.         _.each(e, function(e, t) {
  3401.             n.addColorStop(parseFloat(t), e)
  3402.         }), r.fillStyle = n, r.fillRect(0, 0, t.width, t.height);
  3403.         var o = webgl.createTexture2D({
  3404.             filter: gl.LINEAR
  3405.         });
  3406.         return gl.bindTexture(gl.TEXTURE_2D, o), gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, t), o
  3407.     }, GTW.load_resources = function(e, t) {
  3408.         function r(e, r) {
  3409.             n[e] = r, 0 === --o && t(n)
  3410.         }
  3411.         var n = {},
  3412.             o = _.keys(e).length;
  3413.         _.each(e, function(e, t) {
  3414.             if (/\.(jpg|png)$/i.test(e)) {
  3415.                 var n = new Image;
  3416.                 n.src = e, n.onload = function() {
  3417.                     r(t, n)
  3418.                 }
  3419.             } else $.getJSON(e, function(e) {
  3420.                 r(t, e)
  3421.             })
  3422.         })
  3423.     }
  3424. }();
  3425. var GTW = GTW || {};
  3426. ! function() {
  3427.     function e() {
  3428.         this.fov = 60, this.near = .01, this.far = 150, this.viewport = vec4.create(), this.proj = mat4.create(), this.view = mat4.create(), this.bill = mat3.create(), this.mvp = mat4.create(), this.mvpInv = mat4.create(), this.viewInv = mat4.create(), this.viewPos = vec3.create(), this.viewDir = vec3.create()
  3429.     }
  3430.     var t = vec3.fromValues(0, 1, 0),
  3431.         r = vec3.create();
  3432.     e.prototype._update_projection = function() {
  3433.         var e = this.viewport[2] / this.viewport[3];
  3434.         mat4.perspective(this.proj, deg2rad(this.fov), e, this.near, this.far)
  3435.     }, e.prototype._update_mvp = function() {
  3436.         var e = this.bill,
  3437.             t = this.view;
  3438.         e[0] = t[0], e[1] = t[4], e[2] = t[8], e[3] = t[1], e[4] = t[5], e[5] = t[9], e[6] = t[2], e[7] = t[6], e[8] = t[10], mat4.multiply(this.mvp, this.proj, this.view), mat4.invert(this.mvpInv, this.mvp), mat4.invert(this.viewInv, this.view), vec3.transformMat4(this.viewPos, [0, 0, 0], this.viewInv), vec3.set(this.viewDir, -this.viewInv[8], -this.viewInv[9], -this.viewInv[10])
  3439.     }, e.prototype.update = function(e, n) {
  3440.         this._update_projection(), vec3.add(r, e, n), mat4.lookAt(this.view, e, r, t), this._update_mvp()
  3441.     };
  3442.     var n = mat4.create();
  3443.     e.prototype.update_quat = function(e, t, r) {
  3444.         if (this._update_projection(), mat4.fromRotationTranslation(n, t, e), mat4.invert(n, n), r)
  3445.             for (var o = n, a = this.view, i = r, u = 1 - r, c = 0; 16 > c; ++c) a[c] = i * a[c] + u * o[c];
  3446.         else mat4.copy(this.view, n);
  3447.         this._update_mvp()
  3448.     }, e.prototype.unproject = function(e, t) {
  3449.         var r = vec4.create();
  3450.         r[0] = 2 * (t[0] / this.viewport[2]) - 1, r[1] = 2 * (t[1] / this.viewport[3]) - 1, r[1] = 1 - r[1], r[2] = 0, r[3] = 1, vec4.transformMat4(r, r, this.mvpInv), e[0] = r[0] / r[3], e[1] = r[1] / r[3]
  3451.     }, GTW.Camera = e
  3452. }();
  3453. var GTW = GTW || {};
  3454. ! function() {
  3455.     function e(e) {
  3456.         return -e * Math.log(1 - MersenneTwister.random())
  3457.     }
  3458.  
  3459.     function t() {
  3460.         this.key = 0, this.count = 0, this.remaining = 0, this.end_time = 0, this.next_event_time = 0, this.coords = null, this.angle = 0
  3461.     }
  3462.  
  3463.     function r() {
  3464.         this.next_fetch_time = 0, this.kevents = []
  3465.     }
  3466.     var n = 6e4,
  3467.         o = 60 * n,
  3468.         a = 24 * o;
  3469.     t.prototype.next_event = function() {
  3470.         var t = Math.max(0, this.end_time - this.next_event_time),
  3471.             r = t / this.remaining,
  3472.             n = e(r);
  3473.         this.next_event_time += n, this.angle += Math.PI / 5
  3474.     }, r.prototype.clear_events = function() {
  3475.         this.kevents = []
  3476.     }, r.prototype.add_events = function(e, r) {
  3477.         for (var n = 0; n < e.length; n += 2) {
  3478.             var a = e[n + 0],
  3479.                 i = e[n + 1],
  3480.                 u = new t;
  3481.             u.key = a, u.remaining = u.count = i, u.next_event_time = r, u.end_time = r + o, u.next_event(), this.kevents.push(u)
  3482.         }
  3483.     }, r.prototype.add_ddos_events = function(e, r) {
  3484.         function n(e) {
  3485.             return e = 65535 & e, e >= 32768 && (e = -(65536 - e)), e / 32768
  3486.         }
  3487.  
  3488.         function a(e, t) {
  3489.             var r = n(t >> 0),
  3490.                 o = n(t >> 16);
  3491.             e[0] = 180 * r, e[1] = 90 * o
  3492.         }
  3493.         for (var i = o / 100, u = 0, c = vec2.create(), l = vec2.create(); u < e.length;) {
  3494.             var s = e[u++],
  3495.                 f = s >> 16 & 255;
  3496.             for (console.assert(8 == f), a(c, e[u++]), a(l, e[u++]);;) {
  3497.                 var v = e[u++],
  3498.                     p = 65535 & v,
  3499.                     g = v >> 16;
  3500.                 if (console.assert(p >= 0 && 100 > p), 0 == g) break;
  3501.                 var h = r + i * p,
  3502.                     m = 30,
  3503.                     d = 500;
  3504.                 g = Math.min(g * m, d);
  3505.                 var _ = new t;
  3506.                 _.key = s, _.remaining = _.count = g, _.next_event_time = h, _.end_time = h + i, _.coords = vec4.fromValues(c[0], c[1], l[0], l[1]), _.next_event(), this.kevents.push(_)
  3507.             }
  3508.         }
  3509.     }, r.prototype.fetch = function(e) {
  3510.         function t(t) {
  3511.             var i = Base64.decode(t.events, Uint32Array),
  3512.                 u = Base64.decode(t.totals, Uint32Array);
  3513.             if (GTW.reset_counters(), GTW.update_counters(u), t.totals8) {
  3514.                 var c = Base64.decode(t.totals8, Uint32Array);
  3515.                 GTW.update_counters(c)
  3516.             }
  3517.             var l = Math.floor(e / a) * a + r * o;
  3518.             if (n.clear_events(), n.add_events(i, l), t.events8) {
  3519.                 var s = Base64.decode(t.events8, Uint32Array);
  3520.                 n.add_ddos_events(s, l)
  3521.             }
  3522.             if (t.counts8) {
  3523.                 var f = Base64.decode(t.counts8, Uint32Array);
  3524.                 n.add_events(f, l)
  3525.             }
  3526.             var v = n.poll_events(e);
  3527.             _.each(v, function(e) {
  3528.                 var t = e.key,
  3529.                     r = t >> 16 & 255,
  3530.                     n = t >> 8 & 255,
  3531.                     o = !0;
  3532.                 if (8 == r && e.coords && (o = !1), 8 == r && 0 == n && (o = !1), o) {
  3533.                     var a = GTW.systems[r];
  3534.                     ++a.count, ++a.target_count[n], ++GTW.total_target_count[n]
  3535.                 }
  3536.             })
  3537.         }
  3538.         var r = Math.floor(e / o % 24);
  3539.         this.next_fetch_time = (1 + Math.floor(e / o)) * o;
  3540.         var n = this,
  3541.             i = "assets/data/events/" + r + ".json";
  3542.         $.getJSON(i, t)
  3543.     }, r.prototype.poll_events = function(e) {
  3544.         this.next_fetch_time < e && this.fetch(e);
  3545.         var t = [];
  3546.         return _.each(this.kevents, function(r) {
  3547.             for (; r.next_event_time <= e;) {
  3548.                 if (t.push(r), 0 == --r.remaining) {
  3549.                     r.next_event_time = 1 / 0;
  3550.                     break
  3551.                 }
  3552.                 r.next_event()
  3553.             }
  3554.         }), t
  3555.     }, GTW.Simulator = r
  3556. }();
  3557. var GTW = GTW || {};
  3558. ! function() {
  3559.     function e(e) {
  3560.         function t(t) {
  3561.             return parseInt(e.substr(2 * t, 2), 16) / 255
  3562.         }
  3563.         "#" == e[0] && (e = e.substr(1));
  3564.         var r = vec3.create();
  3565.         return r[0] = t(0), r[1] = t(1), r[2] = t(2), r
  3566.     }
  3567.  
  3568.     function t(t, r, n, o, a) {
  3569.         function i(t) {
  3570.             return {
  3571.                 f: e(t),
  3572.                 css: "#" + t
  3573.             }
  3574.         }
  3575.         this.id = t, this.name = r, this.description = n;
  3576.         var o = o.split(" ");
  3577.         1 === o.length && o.push(o[0]), this.color = {
  3578.             dark: i(o[0]),
  3579.             light: i(o[1])
  3580.         }, this.n_sides = a, this.enabled = !0, this.enabled_graph = !0, this.count = 0, this.target_count = new Int32Array(256), this.target_rank = new Int32Array(256), this.graph = new Int32Array(60), this.el_count_selector = ".type-icons .symbol." + r.toLowerCase() + " .count", this.el_popcount_selector = "#" + r.toLowerCase() + "-popcount", this.el_popcount = $("#" + r.toLowerCase() + "-popcount")
  3581.     }
  3582.  
  3583.     function r(e, t) {
  3584.         s.sort(function(t, r) {
  3585.             return e[r] - e[t]
  3586.         }), _.each(s, function(e, r) {
  3587.             t[e] = 1 + r
  3588.         })
  3589.     }
  3590.  
  3591.     function n() {
  3592.         GTW.systems_foreach(function(e) {
  3593.             e.count = 0;
  3594.             for (var t = 0; 256 > t; ++t) e.target_count[t] = 0
  3595.         });
  3596.         for (var e = 0; 256 > e; ++e) GTW.total_target_count[e] = 0
  3597.     }
  3598.  
  3599.     function o(e) {
  3600.         if (e)
  3601.             for (var t = 0; t < e.length; t += 2) {
  3602.                 var r = e[t + 0],
  3603.                     n = e[t + 1],
  3604.                     o = r >> 16 & 255,
  3605.                     a = r >> 8 & 255,
  3606.                     i = GTW.systems[o];
  3607.                 0 === a ? i.count = n : (i.target_count[a] = n, GTW.total_target_count[a] += n)
  3608.             }
  3609.     }
  3610.  
  3611.     function a(e, t) {
  3612.         for (var r = null, n = 0, o = 0; o < t.length; ++o) {
  3613.             var a = t[o];
  3614.             if (!a.alive) return a;
  3615.             var i = e - a.start_time;
  3616.             i > n && (n = i, r = a)
  3617.         }
  3618.         return r ? r : _.sample(t)
  3619.     }
  3620.  
  3621.     function i(e) {
  3622.         var t = this;
  3623.         this.programs = {
  3624.                 missile: webgl.getProgram("missile"),
  3625.                 impact: webgl.getProgram("impact"),
  3626.                 icon: webgl.getProgram("icon"),
  3627.                 cone: webgl.getProgram("cone")
  3628.             }, this.buffers = {
  3629.                 missile: null,
  3630.                 icon: null,
  3631.                 cone: null,
  3632.                 quad: webgl.makeVertexBuffer(new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]))
  3633.             }, this.textures = {
  3634.                 impact: webgl.loadTexture2D(GTW.resource_url("textures/impact-512.jpg"), {
  3635.                     mipmap: !1
  3636.                 })
  3637.             },
  3638.             function() {
  3639.                 for (var e = [], r = 32, n = 0; r > n; ++n) {
  3640.                     var o = TWO_PI * n / (r - 1),
  3641.                         a = Math.cos(o),
  3642.                         i = Math.sin(o);
  3643.                     e.push(a, 0, i, a, 1, i)
  3644.                 }
  3645.                 e = new Float32Array(e), t.buffers.cone = webgl.makeVertexBuffer(e), t.n_cone_verts = e.length / 3
  3646.             }(), this.init_missiles(e), this.init_icons()
  3647.     }
  3648.     var u = {
  3649.             use_missiles: !0,
  3650.             use_impacts: !0,
  3651.             use_cones: !0,
  3652.             use_icons: !0,
  3653.             scale: 1,
  3654.             width: .1,
  3655.             height: .005,
  3656.             ff_impacts: !1
  3657.         },
  3658.         c = _.assign(_.clone(u), {
  3659.             use_impacts: !1,
  3660.             scale: 30,
  3661.             width: 10,
  3662.             height: .1,
  3663.             ff_impacts: !0
  3664.         }),
  3665.         l = u;
  3666.     GTW.total_target_count = new Int32Array(256), GTW.total_target_rank = new Int32Array(256), GTW.top_infected = new Int32Array(10);
  3667.     for (var s = [], f = 0; 256 > f; ++f) s.push(f);
  3668.     t.prototype.compute_target_rank = function() {
  3669.         r(this.target_count, this.target_rank)
  3670.     }, GTW.compute_total_target_rank = function() {
  3671.         r(GTW.total_target_count, GTW.total_target_rank);
  3672.         for (var e = 0; e < GTW.top_infected.length; ++e) GTW.top_infected[e] = s[e]
  3673.     }, GTW.systems = {
  3674.         1: new t(1, "OAS", "On-Access Scanner", "38b349", 5),
  3675.         2: new t(2, "ODS", "On-Demand Scanner", "ed1c24", 4),
  3676.         3: new t(3, "MAV", "Mail Anti-Virus", "f26522", 3),
  3677.         4: new t(4, "WAV", "Web Anti-Virus", "0087f4 0000f4", 32),
  3678.         5: new t(5, "IDS", "Intrusion Detection System", "ec008c ff00b4", 6),
  3679.         6: new t(6, "VUL", "Vulnerability Scanner", "fbf267", 8),
  3680.         7: new t(7, "KAS", "Kaspersky Anti-Spam", "855ff4", -16),
  3681.         8: new t(8, "BAD", "Botnet Activity Detection", "00d1a9", 31)
  3682.     };
  3683.     var v = 8;
  3684.     GTW.systems_foreach = function(e) {
  3685.         for (var t = 1; v >= t; ++t) {
  3686.             var r = GTW.systems[t];
  3687.             e(r, t)
  3688.         }
  3689.     };
  3690.     var p = 1e3,
  3691.         g = 100,
  3692.         h = 8 * g;
  3693.     i.prototype.init_missiles = function(e) {
  3694.         function t(t) {
  3695.             this.index = t, this.verts = o.subarray(this.index * h, (this.index + 1) * h), this.source_coord = vec3.create(), this.target_coord = vec3.create(), this.source_mat = mat4.create(), this.target_mat = mat4.create(), this.start_time = 0, this.alive = !1, this.style = 1, this.color = GTW.systems[this.style].color[e.palette].f, this.has_source = !0, this.has_target = !0, this.draw_source_impact = !0
  3696.         }
  3697.  
  3698.         function r(e, t, r, n) {
  3699.             var o = i,
  3700.                 a = u,
  3701.                 l = c,
  3702.                 f = s;
  3703.             n.project(f, t), n.projection.blend > .5 ? (vec3.normalize(l, f), vec3.set(o, 0, 1, 0), vec3.cross(o, l, o), vec3.normalize(o, o), vec3.cross(a, o, l), e[0] = o[0], e[1] = o[1], e[2] = o[2], e[4] = l[0], e[5] = l[1], e[6] = l[2], e[8] = a[0], e[9] = a[1], e[10] = a[2]) : (mat4.identity(e), mat4.rotateX(e, e, -.5 * Math.PI)), r && mat4.scale(e, e, [r, r, r]), e[12] = f[0], e[13] = f[1], e[14] = f[2]
  3704.         }
  3705.         var n = this,
  3706.             o = new Float32Array(p * h),
  3707.             a = null,
  3708.             i = vec3.create(),
  3709.             u = vec3.create(),
  3710.             c = vec3.create(),
  3711.             s = vec3.create();
  3712.         t.prototype.launch = function(e, t, c, s, f, v) {
  3713.             if (this.style = t, this.shape = n.shapes[this.style], this.color = GTW.systems[this.style].color[e.palette].f, this.has_source = !!s, this.start_time = e.time, this.alive = !0, this.has_source && vec3.copy(this.source_coord, s), vec3.copy(this.target_coord, c), this.has_source) {
  3714.                 var p = vec2.distance(s, c),
  3715.                     m = l.height * p,
  3716.                     d = (c[0] - s[0]) / p,
  3717.                     _ = (c[1] - s[1]) / p,
  3718.                     b = 200,
  3719.                     y = b * -_,
  3720.                     T = b * d;
  3721.                 v = v || 0;
  3722.                 for (var w = Math.cos(v), E = Math.sin(v), x = this.index * h, A = i, M = u, R = 0; g > R; ++R) {
  3723.                     var P = R / (g - 1);
  3724.                     vec3.lerp(M, s, c, P);
  3725.                     var L = m * Math.sin(P * Math.PI) * .15;
  3726.                     M[0] += E * L * y, M[1] += E * L * T, M[2] += w * L, e.project(A, M), o[x + 0] = A[0], o[x + 1] = A[1], o[x + 2] = A[2], o[x + 3] = -P, o[x + 4] = A[0], o[x + 5] = A[1], o[x + 6] = A[2], o[x + 7] = P, x += 8
  3727.                 }
  3728.                 var D = 4 * this.index * h;
  3729.                 webgl.bindVertexBuffer(a), gl.bufferSubData(gl.ARRAY_BUFFER, D, this.verts)
  3730.             }
  3731.             this.has_source ? this.source_coord[2] < .015 ? (r(this.source_mat, this.source_coord, f, e), this.draw_source_impact = !0) : this.draw_source_impact = !1 : l.ff_impacts && (this.start_time -= 1), r(this.target_mat, this.target_coord, f, e)
  3732.         }, this.missiles = [];
  3733.         for (var f = 0; p > f; ++f) this.missiles.push(new t(f));
  3734.         this.buffers.missile = a = webgl.makeVertexBuffer(o)
  3735.     }, i.prototype.init_icons = function() {
  3736.         function e(e, t) {
  3737.             n.push(Math.cos(e), Math.sin(e), t)
  3738.         }
  3739.  
  3740.         function t() {
  3741.             this.offset = 0, this.count = 0
  3742.         }
  3743.  
  3744.         function r(r) {
  3745.             var o = new t;
  3746.             o.offset = n.length / 3;
  3747.             var a = 0 > r;
  3748.             r = Math.abs(r);
  3749.             var i;
  3750.             i = a ? Math.PI / r : TWO_PI / r;
  3751.             for (var u = 5, c = 0; u > c; ++c) {
  3752.                 for (var l = 0, s = 0; r > s; ++s) e(l, c), e(l + i, c), l += i;
  3753.                 a && (e(l, c), e(0, c)), 31 == r && (l = .8, e(l, c), e(l + Math.PI, c))
  3754.             }
  3755.             return o.count = n.length / 3 - o.offset, o
  3756.         }
  3757.         var n = [],
  3758.             o = [];
  3759.         t.prototype.draw = function() {
  3760.             gl.drawArrays(gl.LINES, this.offset, this.count)
  3761.         }, GTW.systems_foreach(function(e) {
  3762.             var t = r(e.n_sides);
  3763.             o[e.id] = t
  3764.         }), this.shapes = o, n = new Float32Array(n), this.buffers.icon = webgl.makeVertexBuffer(n)
  3765.     }, i.prototype.draw = function(e) {
  3766.         var t = this,
  3767.             r = {
  3768.                 active: 0,
  3769.                 curves: 0
  3770.             };
  3771.         if (gl.enable(gl.DEPTH_TEST), gl.depthMask(!1), l.use_missiles) {
  3772.             gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
  3773.             var n = this.programs.missile.use();
  3774.             n.uniformMatrix4fv("mvp", e.camera.mvp), n.uniform3fv("view_position", e.camera.viewPos), n.uniform1f("width", l.width), webgl.bindVertexBuffer(this.buffers.missile), n.vertexAttribPointer("position", 4, gl.FLOAT, !1, 0, 0), _.each(this.missiles, function(t) {
  3775.                 if (t.alive && t.has_source) {
  3776.                     ++r.curves;
  3777.                     var o = e.time - t.start_time;
  3778.                     if (2 > o) {
  3779.                         n.uniform1f("time", .5 * o), n.uniform3fv("color", t.color);
  3780.                         var a = 2 * g,
  3781.                             i = a * t.index;
  3782.                         gl.drawArrays(gl.TRIANGLE_STRIP, i, a)
  3783.                     }
  3784.                 }
  3785.             })
  3786.         }
  3787.         if (gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE), l.use_impacts && e.high_quality) {
  3788.             var n = this.programs.impact.use();
  3789.             n.uniformMatrix4fv("mvp", e.camera.mvp), n.uniformSampler2D("t_color", this.textures.impact), webgl.bindVertexBuffer(this.buffers.quad), n.vertexAttribPointer("position", 2, gl.FLOAT, !1, 0, 0), _.each(this.missiles, function(t) {
  3790.                 if (t.alive) {
  3791.                     ++r.active;
  3792.                     var o = e.time - t.start_time;
  3793.                     if (o > 4) return void(t.alive = !1);
  3794.                     n.uniform3fv("color", t.color), t.has_source && t.draw_source_impact && 1 > o && (n.uniformMatrix4fv("mat", t.source_mat), n.uniform1f("time", o), gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)), t.has_target && o >= 1 && (n.uniformMatrix4fv("mat", t.target_mat), n.uniform1f("time", (o - 1) / 3), gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4))
  3795.                 }
  3796.             })
  3797.         }
  3798.         if (l.use_cones && e.high_quality) {
  3799.             var n = this.programs.cone.use();
  3800.             n.uniformMatrix4fv("mvp", e.camera.mvp), webgl.bindVertexBuffer(this.buffers.cone), n.vertexAttribPointer("position", 3, gl.FLOAT, !1, 0, 0), _.each(this.missiles, function(r) {
  3801.                 if (r.alive) {
  3802.                     var o = e.time - r.start_time;
  3803.                     r.has_target && o >= 1 && 2 > o && (n.uniform3fv("color", r.color), n.uniformMatrix4fv("mat", r.target_mat), n.uniform1f("time", o - 1), gl.drawArrays(gl.TRIANGLE_STRIP, 0, t.n_cone_verts))
  3804.                 }
  3805.             })
  3806.         }
  3807.         if (l.use_icons) {
  3808.             var n = this.programs.icon.use();
  3809.             n.uniformMatrix4fv("mvp", e.camera.mvp), n.uniform1f("scale", .05), webgl.bindVertexBuffer(this.buffers.icon), n.vertexAttribPointer("vertex", 3, gl.FLOAT, !1, 0, 0), gl.lineWidth(2), _.each(this.missiles, function(t) {
  3810.                 if (t.alive) {
  3811.                     var r = e.time - t.start_time;
  3812.                     r >= 1 && 2 > r && (n.uniformMatrix4fv("mat", t.target_mat), n.uniform3fv("color", t.color), n.uniform1f("time", r - 1), t.shape.draw())
  3813.                 }
  3814.             }), gl.lineWidth(1)
  3815.         }
  3816.         gl.depthMask(!0)
  3817.     }, i.prototype.launch = function(e, t, r, n, o) {
  3818.         var i = a(e.time, this.missiles);
  3819.         return i.launch(e, t, r, n, l.scale, o), i
  3820.     }, i.prototype.set_mode = function(e) {
  3821.         switch (e) {
  3822.             case "world":
  3823.                 l = u;
  3824.                 break;
  3825.             case "scape":
  3826.                 l = c
  3827.         }
  3828.         this.clear()
  3829.     }, i.prototype.clear = function() {
  3830.         _.each(this.missiles, function(e) {
  3831.             e.alive = !1
  3832.         })
  3833.     }, GTW.MissileSystem = i, GTW.reset_counters = n, GTW.update_counters = o
  3834. }();
  3835. var GTW = GTW || {};
  3836. ! function() {
  3837.     var e = 1,
  3838.         t = 10;
  3839.     GTW.project_mercator = function(r, n) {
  3840.         var o = n[0],
  3841.             a = n[1],
  3842.             i = Math.PI * a / 180,
  3843.             u = 90 / Math.PI * Math.log(Math.tan(.25 * Math.PI + .5 * i));
  3844.         r[0] = -o / 180, r[1] = clamp(u / 90, -1, 1), r[2] = -e * n[2], vec3.scale(r, r, t)
  3845.     }, GTW.project_ecef = function(r, n) {
  3846.         var o = deg2rad(n[0]),
  3847.             a = deg2rad(n[1]),
  3848.             i = e * n[2],
  3849.             u = Math.cos(a),
  3850.             c = Math.sin(a),
  3851.             l = 1,
  3852.             s = 1;
  3853.         r[0] = -(l + i) * u * Math.cos(o), r[2] = (l + i) * u * Math.sin(o), r[1] = (s + i) * c, vec3.scale(r, r, t)
  3854.     }
  3855. }();
  3856. var GTW = GTW || {};
  3857. GTW.get_country_name = function(e) {
  3858.         return window.lang ? lang.getText("MAP_COUNTRY_" + e.iso3) : e.name.en
  3859.     },
  3860.     function() {
  3861.         function e(e) {
  3862.             for (var t = 1; t < arguments.length; ++t) e.push.apply(e, arguments[t])
  3863.         }
  3864.         var t = [1440, 720],
  3865.             r = .014,
  3866.             n = 10 * r;
  3867.         GTW.Stars = function() {
  3868.             function e() {
  3869.                 function e() {
  3870.                     for (var e = vec3.create(), r = new Float32Array(t << 2), n = 0; n < r.length; n += 4) Random.unitVec3(e), vec3.scale(e, e, 50), r[n + 0] = e[0], r[n + 1] = e[1], r[n + 2] = e[2], r[n + 3] = lerp(.1, 2.5, Math.pow(Math.random(), 10));
  3871.                     return webgl.makeVertexBuffer(r)
  3872.                 }
  3873.                 var t = 1e4;
  3874.                 this.count = t, this.buffers = {
  3875.                     vert: e()
  3876.                 }, this.programs = {
  3877.                     main: webgl.getProgram("stars")
  3878.                 }, this.mvp = mat4.create()
  3879.             }
  3880.             return e.prototype.draw = function(e) {
  3881.                 gl.disable(gl.DEPTH_TEST), gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
  3882.                 var t = this.programs.main.use(),
  3883.                     r = this.mvp;
  3884.                 mat4.copy(r, e.camera.view), r[12] = 0, r[13] = 0, r[14] = 0, mat4.multiply(r, e.camera.proj, r), t.uniformMatrix4fv("mvp", r), t.uniform4f("color", 1, 1, 1, .5), webgl.bindVertexBuffer(this.buffers.vert), t.vertexAttribPointer("position", 4, gl.FLOAT, !1, 0, 0), gl.drawArrays(gl.POINTS, 0, this.count)
  3885.             }, e
  3886.         }(), GTW.Corona = function() {
  3887.             function e() {
  3888.                 function e() {
  3889.                     for (var e = [], r = 128, n = 0; r + 1 > n; ++n) {
  3890.                         var o = TWO_PI * n / r,
  3891.                             a = n / (r + 1),
  3892.                             i = Math.cos(o),
  3893.                             u = Math.sin(o);
  3894.                         e.push(i, u, a, 0, i, u, a, 1)
  3895.                     }
  3896.                     return t = e.length / 4, webgl.makeVertexBuffer(new Float32Array(e))
  3897.                 }
  3898.                 var t = 0;
  3899.                 this.buffers = {
  3900.                     vert: e()
  3901.                 }, this.vertex_count = t, this.programs = {
  3902.                     main: webgl.getProgram("corona")
  3903.                 }, this.textures = {
  3904.                     smoke: webgl.loadTexture2D(GTW.resource_url("textures/smoke.jpg"), {
  3905.                         mipmap: !0,
  3906.                         wrapS: gl.REPEAT,
  3907.                         wrapT: gl.CLAMP_TO_EDGE
  3908.                     })
  3909.                 }
  3910.             }
  3911.             return e.prototype.draw = function(e, t) {
  3912.                 var r = this.programs.main.use();
  3913.                 r.uniformMatrix4fv("mvp", e.camera.mvp), r.uniformMatrix3fv("bill", e.camera.bill), r.uniformSampler2D("t_smoke", this.textures.smoke), r.uniform1f("time", e.time), r.uniform1f("zoff", t || 0), gl.disable(gl.CULL_FACE), gl.enable(gl.BLEND), "dark" === e.palette ? (gl.blendFunc(gl.SRC_ALPHA, gl.ONE), r.uniform3f("color0", .07, .25, .16), r.uniform3f("color1", 0, 0, 0)) : (gl.blendFunc(gl.DST_COLOR, gl.ZERO), r.uniform3f("color0", .07, .25, .16), r.uniform3f("color1", 1, 1, 1)), webgl.bindVertexBuffer(this.buffers.vert), r.vertexAttribPointer("vertex", 4, gl.FLOAT, !1, 0, 0), gl.drawArrays(gl.TRIANGLE_STRIP, 0, this.vertex_count), gl.disable(gl.BLEND)
  3914.             }, e
  3915.         }(), GTW.World = function() {
  3916.             function o() {
  3917.                 this.buffers = {
  3918.                     map: {
  3919.                         vert: null,
  3920.                         face: null,
  3921.                         line: null
  3922.                     },
  3923.                     grid: {
  3924.                         vert: null,
  3925.                         elem: null
  3926.                     }
  3927.                 }, this.border = {
  3928.                     buffer: gl.createBuffer(),
  3929.                     count: 0
  3930.                 }, this.build_grid(), this.programs = {
  3931.                     main: webgl.getProgram("map_main"),
  3932.                     grid: webgl.getProgram("map_grid"),
  3933.                     line: webgl.getProgram("map_line"),
  3934.                     pick: webgl.getProgram("map_pick")
  3935.                 }, this.textures = {
  3936.                     blur: webgl.loadTexture2D(GTW.resource_url("textures/map_blur.jpg")),
  3937.                     pattern: webgl.loadTexture2D(GTW.resource_url("textures/pattern.png"), {
  3938.                         mipmap: !0,
  3939.                         wrap: gl.REPEAT,
  3940.                         aniso: 4
  3941.                     })
  3942.                 }, this.countries = [];
  3943.                 var e = this;
  3944.                 this.key_to_country = {};
  3945.                 var t = !1,
  3946.                     n = t ? GTW.resource_url("data/map-ru.json") : GTW.resource_url("data/map.json"),
  3947.                     o = location.host.match(/cybermap.kaspersky.com/) ? "/geoip" : GTW.resource_url("data/geoip.json");
  3948.                 this.extruded_country_index = -1, this.bordered_country_index = -1, GTW.load_resources({
  3949.                     map: n,
  3950.                     geoip: o
  3951.                 }, function(t) {
  3952.                     e.countries = t.map.countries, e.geoip = function() {
  3953.                         if (!t.geoip) return null;
  3954.                         var n = t.geoip.country,
  3955.                             o = t.geoip.coord,
  3956.                             a = _.find(e.countries, function(e) {
  3957.                                 return e.iso2 == n
  3958.                             });
  3959.                         return a ? {
  3960.                             country: a,
  3961.                             country_index: e.countries.indexOf(a),
  3962.                             coord: vec3.fromValues(o[1], o[0], r)
  3963.                         } : null
  3964.                     }(), e.geoip && (e.extruded_country_index = e.geoip.country_index), _.each(e.countries, function(t) {
  3965.                         t.tone = Math.random();
  3966.                         for (var n = Base64.decode(t.cities, Int16Array), o = t.cities = new Float32Array(n.length), a = 0; a < o.length; a += 3) o[a + 0] = n[a + 0] / 32768, o[a + 1] = 180 * n[a + 1] / 32768, o[a + 2] = 90 * n[a + 2] / 32768;
  3967.                         e.key_to_country[t.key] = t;
  3968.                         var i = e.geoip ? e.geoip.country : null;
  3969.                         t.borders = Base64.decode(t.borders, Uint16Array), t.center = vec3.fromValues(t.center[0], t.center[1], t == i ? r : 0)
  3970.                     }), e.build_geometry(t.map), e.emit("loaded")
  3971.                 })
  3972.             }
  3973.             return make_event_emitter(o.prototype), o.prototype.build_grid = function() {
  3974.                 function t(e, t) {
  3975.                     return 181 * e + t
  3976.                 }
  3977.                 var n = [],
  3978.                     o = [],
  3979.                     a = vec3.create();
  3980.                 a[2] = -r;
  3981.                 for (var i = vec3.create(), u = vec3.create(), c = vec2.create(), l = -180; 180 >= l; l += 1)
  3982.                     for (var s = -90; 90 >= s; s += 1) vec2.set(a, l, s), vec2.set(c, (l + 180) / 360, 1 - (s + 90) / 180), GTW.project_mercator(i, a), vec3.set(u, 0, 0, -1), e(n, i, u), GTW.project_ecef(i, a), vec3.normalize(u, i), e(n, i, u), e(n, c);
  3983.                 for (var f = 0; 360 > f; ++f)
  3984.                     for (var v = 0; 180 > v; ++v) o.push(t(f, v), t(f + 1, v), t(f + 1, v + 1), t(f + 1, v + 1), t(f, v + 1), t(f, v));
  3985.                 this.buffers.grid.vert = webgl.makeVertexBuffer(new Float32Array(n)), this.buffers.grid.elem = webgl.makeElementBuffer(new Uint16Array(o)), this.grid_vert_count = n.length / 5, this.grid_elem_count = o.length, this.grid_vert_stride_bytes = 56
  3986.             }, o.prototype.build_geometry = function(e) {
  3987.                 function t(e, t) {
  3988.                     a[0] = 180 * o.verts[2 * e + 0] / 32768, a[1] = 90 * o.verts[2 * e + 1] / 32768, a[2] = t, u[0] = .5 + a[0] / 360, u[1] = .5 - a[1] / 180;
  3989.                     var r = n.length / 14;
  3990.                     return GTW.project_mercator(i, a), n.push(i[0], i[1], i[2]), n.push(0, 0, 0), GTW.project_ecef(i, a), n.push(i[0], i[1], i[2]), n.push(0, 0, 0), n.push(u[0], u[1]), r
  3991.                 }
  3992.                 var n = [],
  3993.                     o = e.geom,
  3994.                     a = vec3.create(),
  3995.                     i = vec3.create(),
  3996.                     u = vec2.create();
  3997.                 o.faces = Base64.decode(o.faces, Uint16Array), o.lines = Base64.decode(o.lines, Uint16Array), o.coast = Base64.decode(o.coast, Uint16Array), o.verts = Base64.decode(o.verts, Int16Array);
  3998.                 for (var c = o.verts.length, l = 0; c > l; ++l) t(l, 0);
  3999.                 var s = Array.apply([], o.faces);
  4000.                 s.length = o.faces.length, s.constructor = Array, this.coast_start = s.length;
  4001.                 for (var l = 0; l < o.coast.length; l += 2) {
  4002.                     var f = o.coast[l + 0],
  4003.                         v = o.coast[l + 1],
  4004.                         p = t(f, -r),
  4005.                         g = t(v, -r),
  4006.                         f = t(f, 0),
  4007.                         v = t(v, 0);
  4008.                     s.push(f, v, p), s.push(v, g, p)
  4009.                 }
  4010.                 if (this.geoip)
  4011.                     for (var h = this.geoip.country.borders, m = 65535, l = 0; l < h.length; ++l) {
  4012.                         var d = h[l];
  4013.                         if (65535 != d) {
  4014.                             if (65535 != m) {
  4015.                                 var p = t(m, 0),
  4016.                                     g = t(d, 0),
  4017.                                     f = t(m, 1.02 * r),
  4018.                                     v = t(d, 1.02 * r);
  4019.                                 s.push(f, v, p), s.push(v, g, p)
  4020.                             }
  4021.                             m = d
  4022.                         } else m = 65535
  4023.                     }
  4024.                 this.coast_count = s.length - this.coast_start;
  4025.                 for (var _ = vec3.create(), b = vec3.create(), y = 14, l = 0; l < s.length; l += 3)
  4026.                     for (var f = s[l + 0], v = s[l + 1], T = s[l + 2], w = 0; 2 > w; ++w) {
  4027.                         for (var E = 6 * w, x = 0; 3 > x; ++x) _[x] = n[y * v + E + x] - n[y * f + E + x], b[x] = n[y * T + E + x] - n[y * f + E + x];
  4028.                         vec3.cross(i, _, b), vec3.normalize(i, i);
  4029.                         for (var x = 0; 3 > x; ++x) n[y * f + E + 3 + x] += i[x], n[y * v + E + 3 + x] += i[x], n[y * T + E + 3 + x] += i[x]
  4030.                     }
  4031.                 vec3.forEach(n, y, 3, 0, function(e) {
  4032.                     vec3.normalize(e, e)
  4033.                 }), vec3.forEach(n, y, 9, 0, function(e) {
  4034.                     vec3.normalize(e, e)
  4035.                 }), this.buffers.map.vert = webgl.makeVertexBuffer(new Float32Array(n)), this.buffers.map.face = webgl.makeElementBuffer(new Uint16Array(s)), this.buffers.map.line = webgl.makeElementBuffer(new Uint16Array(o.lines)), this.face_count = o.faces.length, this.line_count = o.lines.length, this.map_vert_stride_bytes = 56
  4036.             }, o.prototype.draw = function(e) {
  4037.                 if (this.buffers.map.vert) {
  4038.                     gl.disable(gl.BLEND), gl.enable(gl.CULL_FACE), gl.cullFace(gl.BACK), gl.enable(gl.DEPTH_TEST);
  4039.                     var r = !0,
  4040.                         o = !0,
  4041.                         a = !0,
  4042.                         i = !0,
  4043.                         u = !0,
  4044.                         c = smoothstep(e.projection.blend),
  4045.                         l = .25 > c,
  4046.                         s = this;
  4047.                     if (r) {
  4048.                         var f = this.programs.grid.use();
  4049.                         f.uniformMatrix4fv("mvp", e.camera.mvp), f.uniformSampler2D("t_blur", this.textures.blur), f.uniformSampler2D("t_pattern", this.textures.pattern), f.uniform2fv("pattern_scale", t), f.uniform1f("blend", c), "dark" === e.palette ? (f.uniform3f("color0", .07, .09, .07), f.uniform3f("color1", .36, .41, .36)) : (f.uniform3f("color0", .93, .95, .93), f.uniform3f("color1", .42, .48, .42));
  4050.                         var v = this.grid_vert_stride_bytes;
  4051.                         webgl.bindVertexBuffer(this.buffers.grid.vert), f.vertexAttribPointer("position", 3, gl.FLOAT, !1, v, 0), f.vertexAttribPointer("position2", 3, gl.FLOAT, !1, v, 24), f.vertexAttribPointer("texcoord", 2, gl.FLOAT, !1, v, 48), f.uniform4f("color", 1, 1, 1, 1), webgl.bindElementBuffer(this.buffers.grid.elem), f.uniform1f("offset_x", 0), gl.drawElements(gl.TRIANGLES, this.grid_elem_count, gl.UNSIGNED_SHORT, 0), l && (f.uniform1f("offset_x", -20), gl.drawElements(gl.TRIANGLES, this.grid_elem_count, gl.UNSIGNED_SHORT, 0), f.uniform1f("offset_x", 20), gl.drawElements(gl.TRIANGLES, this.grid_elem_count, gl.UNSIGNED_SHORT, 0))
  4052.                     }
  4053.                     if (o) {
  4054.                         var f = this.programs.main.use();
  4055.                         f.uniformMatrix4fv("mvp", e.camera.mvp), f.uniformSampler2D("t_blur", this.textures.blur), f.uniform1f("blend", c), f.uniform3fv("view_pos", e.camera.viewPos), f.uniform3fv("light_pos", e.light.position);
  4056.                         var v = this.map_vert_stride_bytes;
  4057.                         if (webgl.bindVertexBuffer(this.buffers.map.vert), f.vertexAttribPointer("position", 3, gl.FLOAT, !1, v, 0), f.vertexAttribPointer("normal", 3, gl.FLOAT, !1, v, 12), f.vertexAttribPointer("position2", 3, gl.FLOAT, !1, v, 24), f.vertexAttribPointer("normal2", 3, gl.FLOAT, !1, v, 36), f.vertexAttribPointer("texcoord", 2, gl.FLOAT, !1, v, 48), f.uniform1f("alpha", 1), "dark" === e.palette ? (f.uniform3f("color0", .1, .12, .11), f.uniform3f("color1", .2, .23, .21)) : (f.uniform3f("color0", .41, .61, .48), f.uniform3f("color1", .51, .69, .53)), gl.disable(gl.BLEND), gl.enable(gl.CULL_FACE), gl.cullFace(gl.BACK), gl.enable(gl.DEPTH_TEST), webgl.bindElementBuffer(this.buffers.map.face), _.each(this.countries, function(e, t) {
  4058.                                 f.uniform1f("height", t == s.extruded_country_index ? n : 0), f.uniform1f("tone", e.tone), f.uniform1f("offset_x", 0), gl.drawElements(gl.TRIANGLES, e.face_count, gl.UNSIGNED_SHORT, e.face_offset << 1), l && (f.uniform1f("offset_x", -20), gl.drawElements(gl.TRIANGLES, e.face_count, gl.UNSIGNED_SHORT, e.face_offset << 1), f.uniform1f("offset_x", 20), gl.drawElements(gl.TRIANGLES, e.face_count, gl.UNSIGNED_SHORT, e.face_offset << 1))
  4059.                             }), gl.depthFunc(gl.LESS), i && (gl.disable(gl.CULL_FACE), f.uniform1f("tone", .5), f.uniform1f("offset_x", 0), gl.drawElements(gl.TRIANGLES, this.coast_count, gl.UNSIGNED_SHORT, this.coast_start << 1), l && (f.uniform1f("offset_x", -20), gl.drawElements(gl.TRIANGLES, this.coast_count, gl.UNSIGNED_SHORT, this.coast_start << 1), f.uniform1f("offset_x", 20), gl.drawElements(gl.TRIANGLES, this.coast_count, gl.UNSIGNED_SHORT, this.coast_start << 1))), gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE), gl.disable(gl.DEPTH_TEST), gl.enable(gl.CULL_FACE), e.pick_index >= 0) {
  4060.                             var p = this.countries[e.pick_index];
  4061.                             f.uniform1f("tone", 1), f.uniform1f("alpha", .5), f.uniform1f("offset_x", 0), f.uniform1f("height", e.pick_index == s.extruded_country_index ? n : 0), gl.drawElements(gl.TRIANGLES, p.face_count, gl.UNSIGNED_SHORT, p.face_offset << 1)
  4062.                         }
  4063.                         gl.disable(gl.CULL_FACE)
  4064.                     }
  4065.                     if (a) {
  4066.                         gl.enable(gl.DEPTH_TEST), gl.depthMask(!1);
  4067.                         var f = this.programs.line.use();
  4068.                         f.uniformMatrix4fv("mvp", e.camera.mvp), f.vertexAttribPointer("position", 3, gl.FLOAT, !1, v, 0), f.vertexAttribPointer("normal", 3, gl.FLOAT, !1, v, 12), f.vertexAttribPointer("position2", 3, gl.FLOAT, !1, v, 24), f.vertexAttribPointer("normal2", 3, gl.FLOAT, !1, v, 36), f.uniform1f("blend", c), f.uniform4f("color", 1, 1, 1, .125), f.uniform1f("height", 0), webgl.bindElementBuffer(this.buffers.map.line), gl.drawElements(gl.LINES, this.line_count, gl.UNSIGNED_SHORT, 0), gl.depthMask(!0)
  4069.                     }
  4070.                     if (u && (e.pick_index !== this.bordered_country_index && this.set_border(e.pick_index), this.border.count)) {
  4071.                         var f = this.programs.line.use();
  4072.                         f.uniformMatrix4fv("mvp", e.camera.mvp), f.vertexAttribPointer("position", 3, gl.FLOAT, !1, v, 0), f.vertexAttribPointer("normal", 3, gl.FLOAT, !1, v, 12), f.vertexAttribPointer("position2", 3, gl.FLOAT, !1, v, 24), f.vertexAttribPointer("normal2", 3, gl.FLOAT, !1, v, 36), f.uniform1f("blend", c), f.uniform1f("height", this.bordered_country_index == this.extruded_country_index ? n : 0), f.uniform4f("color", 1, 1, 1, .5), webgl.bindElementBuffer(this.border.buffer), gl.lineWidth(2), gl.drawElements(gl.LINES, this.border.count, gl.UNSIGNED_SHORT, 0), gl.lineWidth(1)
  4073.                     }
  4074.                     gl.disable(gl.DEPTH_TEST), gl.disable(gl.CULL_FACE)
  4075.                 }
  4076.             }, o.prototype.pick = function() {
  4077.                 function e(e, a, i) {
  4078.                     var u = e.camera.viewport,
  4079.                         c = t,
  4080.                         l = r,
  4081.                         s = r;
  4082.                     mat4.identity(c), mat4.translate(c, c, [(u[2] - 2 * (a - u[0])) / l, -(u[3] - 2 * (i - u[1])) / s, 0]), mat4.scale(c, c, [u[2] / l, u[3] / s, 1]), mat4.multiply(c, c, e.camera.mvp);
  4083.                     var f = o();
  4084.                     gl.viewport(0, 0, r, r), gl.bindFramebuffer(gl.FRAMEBUFFER, f), gl.clearColor(0, 0, 1, 0), gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT), gl.disable(gl.BLEND), gl.enable(gl.CULL_FACE), gl.cullFace(gl.BACK), gl.enable(gl.DEPTH_TEST);
  4085.                     var v = this.programs.pick.use();
  4086.                     v.uniformMatrix4fv("mvp", c), webgl.bindVertexBuffer(this.buffers.map.vert);
  4087.                     var p = this.map_vert_stride_bytes,
  4088.                         g = e.projection.blend < .5 ? 0 : 24;
  4089.                     v.vertexAttribPointer("position", 3, gl.FLOAT, !1, p, g), webgl.bindElementBuffer(this.buffers.map.face), _.each(this.countries, function(e, t) {
  4090.                         v.uniform1f("color", t / 255), gl.drawElements(gl.TRIANGLES, e.face_count, gl.UNSIGNED_SHORT, e.face_offset << 1)
  4091.                     }), gl.disable(gl.CULL_FACE), gl.disable(gl.DEPTH_TEST), gl.readPixels(0, 0, r, r, gl.RGBA, gl.UNSIGNED_BYTE, n), gl.bindFramebuffer(gl.FRAMEBUFFER, null), gl.viewport(u[0], u[1], u[2], u[3]);
  4092.                     for (var h = -1, m = 0, d = {}, b = 0; b < n.length; b += 4)
  4093.                         if (n[b + 3]) {
  4094.                             var y = n[b + 1] << 8 | n[b + 0],
  4095.                                 T = d[y] || 0;
  4096.                             d[y] = ++T, T > m && (h = y, m = T)
  4097.                         }
  4098.                     return h
  4099.                 }
  4100.                 var t = mat4.create(),
  4101.                     r = 4,
  4102.                     n = new Uint8Array(r * r << 2),
  4103.                     o = function() {
  4104.                         function e() {
  4105.                             t = gl.createFramebuffer(), gl.bindFramebuffer(gl.FRAMEBUFFER, t);
  4106.                             var e = webgl.createTexture2D({
  4107.                                 size: r
  4108.                             });
  4109.                             gl.bindTexture(gl.TEXTURE_2D, e), gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, e, 0);
  4110.                             var n = gl.createRenderbuffer();
  4111.                             gl.bindRenderbuffer(gl.RENDERBUFFER, n), gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, r, r), gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, n), gl.bindRenderbuffer(gl.RENDERBUFFER, null), gl.bindFramebuffer(gl.FRAMEBUFFER, null)
  4112.                         }
  4113.                         var t = null;
  4114.                         return function() {
  4115.                             return t || e(), t
  4116.                         }
  4117.                     }();
  4118.                 return e
  4119.             }(), o.prototype.set_border = function(e) {
  4120.                 if (0 > e) return this.border.count = 0, void(this.bordered_country_index = -1);
  4121.                 for (var t = this.countries[e], r = [], n = t.borders, o = -1, a = 0; a < n.length; ++a) {
  4122.                     var i = n[a];
  4123.                     65535 != i ? (o >= 0 && r.push(o, i), o = i) : o = -1
  4124.                 }
  4125.                 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.border.buffer), gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(r), gl.STATIC_DRAW), this.border.count = r.length, this.bordered_country_index = e
  4126.             }, o
  4127.         }()
  4128.     }();
  4129. var GTW = GTW || {};
  4130. ! function() {
  4131.     GTW.Labels = function() {
  4132.         function e() {
  4133.             this.buffers = {
  4134.                 vert: null
  4135.             }, this.programs = {
  4136.                 label: webgl.getProgram("label")
  4137.             }, this.texture = webgl.createTexture2D({
  4138.                 size: t,
  4139.                 mipmap: !0,
  4140.                 min: gl.LINEAR_MIPMAP_LINEAR,
  4141.                 aniso: 4,
  4142.                 format: gl.LUMINANCE
  4143.             }), gl.generateMipmap(gl.TEXTURE_2D), this.country_count = 0, this.labels = [], this.geoip_iso2 = null;
  4144.             var e = this;
  4145.             this.load_label_data(function() {
  4146.                 e.render_labels("en"), e.project_labels("ecef")
  4147.             })
  4148.         }
  4149.         var t = 2048;
  4150.         e.prototype.load_label_data = function(e) {
  4151.             var t = this;
  4152.             $.getJSON(GTW.resource_url("data/labels.json"), function(r) {
  4153.                 function n() {
  4154.                     var e = window.lang;
  4155.                     _.each(r.countries, function(t) {
  4156.                         var r = "MAP_COUNTRY_" + t.iso3.toUpperCase();
  4157.                         t.name = e.getText(r)
  4158.                     }), _.each(r.cities, function(t) {
  4159.                         var r = "MAP_CITY_" + t.code.toUpperCase();
  4160.                         t.name = e.getText(r)
  4161.                     })
  4162.                 }
  4163.  
  4164.                 function o() {
  4165.                     this.coord = vec3.create(), this.coord[2] = 1e-4, this.pos = vec3.create(), this.mat = mat4.create(), this.box = vec4.create(), this.name = "", this.font_size = 0
  4166.                 }
  4167.  
  4168.                 function a(e, r, n) {
  4169.                     _.each(e, function(e) {
  4170.                         if (r) {
  4171.                             if (n && e.font_size < 5) return;
  4172.                             if (!n && e.font_size > 5) return
  4173.                         }
  4174.                         var a = new o;
  4175.                         vec2.copy(a.coord, e.coord), a.coord[2] *= 2, a.name = e.name, a.font_size = e.font_size, r ? a.name = a.name.toUpperCase() : a.font_size = 3, e.iso2 && (a.iso2 = e.iso2), t.labels.push(a)
  4176.                     })
  4177.                 }
  4178.                 n(), a(r.countries, !0, !0), t.country_count = t.labels.length, a(r.cities, !1, !1), a(r.countries, !0, !1), t.city_count = t.labels.length - t.country_count;
  4179.                 var i = 30 * t.labels.length;
  4180.                 t.buffers.vert = webgl.makeVertexBuffer(new Float32Array(i)), e()
  4181.             })
  4182.         }, e.prototype.render_labels = function(e) {
  4183.             var r = document.createElement("canvas");
  4184.             r.width = r.height = t;
  4185.             var n = r.getContext("2d");
  4186.             n.fillStyle = "#000", n.fillRect(0, 0, r.width, r.height), n.font = "30px Ubuntu Mono", n.fillStyle = "white", n.textBaseline = "top";
  4187.             var o = [0, 0],
  4188.                 a = 35;
  4189.             _.each(this.labels, function(e) {
  4190.                 var i = e.name,
  4191.                     u = n.measureText(i).width;
  4192.                 o[0] + u >= r.width && (o[0] = 0, o[1] += a), n.fillText(i, o[0], o[1] - 0), vec4.set(e.box, o[0], o[1], o[0] + u, o[1] + a), vec4.scale(e.box, e.box, 1 / t), o[0] += u
  4193.             }), gl.bindTexture(gl.TEXTURE_2D, this.texture), gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, r), gl.generateMipmap(gl.TEXTURE_2D)
  4194.         }, e.prototype.project_labels = function(e) {
  4195.             function t(t, r, i, u) {
  4196.                 mat4.identity(t), "ecef" == e && (vec3.normalize(n, r), vec3.set(o, 0, 1, 0), vec3.cross(o, n, o), vec3.normalize(o, o), vec3.cross(a, o, n), t[0] = o[0], t[1] = o[1], t[2] = o[2], t[4] = n[0], t[5] = n[1], t[6] = n[2], t[8] = a[0], t[9] = a[1], t[10] = a[2], mat4.rotateX(t, t, HALF_PI)), mat4.scale(t, t, [i, u, 1]), t[12] = r[0], t[13] = r[1], t[14] = r[2]
  4197.             }
  4198.             if (this.labels.length) {
  4199.                 var r = "ecef" == e ? GTW.project_ecef : GTW.project_mercator,
  4200.                     n = vec3.create(),
  4201.                     o = vec3.create(),
  4202.                     a = vec3.create(),
  4203.                     i = [],
  4204.                     u = vec3.create(),
  4205.                     c = [-1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1],
  4206.                     l = this;
  4207.                 _.each(this.labels, function(e) {
  4208.                     e.iso2 == l.geoip_iso2 ? e.coord[2] = .015 : e.coord[2] = .001, r(e.pos, e.coord);
  4209.                     var n = 1 * e.font_size;
  4210.                     t(e.mat, e.pos, n * (e.box[2] - e.box[0]), n * (e.box[3] - e.box[1]));
  4211.                     for (var o = 0; o < c.length; o += 2) u[0] = c[o + 0], u[1] = c[o + 1], u[2] = 0, vec3.transformMat4(u, u, e.mat), i.push(u[0], u[1], u[2]), u[0] = .5 * (1 + c[o + 0]), u[1] = .5 * (1 + c[o + 1]), u[0] = lerp(e.box[2], e.box[0], u[0]), u[1] = lerp(e.box[3], e.box[1], u[1]), i.push(u[0], u[1])
  4212.                 }), webgl.bindVertexBuffer(this.buffers.vert), gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(i))
  4213.             }
  4214.         };
  4215.         var r = vec3.create();
  4216.         return e.prototype.draw = function(e) {
  4217.             if (0 != this.labels.length) {
  4218.                 gl.enable(gl.DEPTH_TEST), gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE), gl.depthMask(!1), e.project(r, e.geocam.coord);
  4219.                 var t = 3,
  4220.                     n = 10,
  4221.                     o = lerp(t, n, e.projection.blend),
  4222.                     a = this.programs.label.use();
  4223.                 a.uniformMatrix4fv("mvp", e.camera.mvp), a.uniform4f("circle_of_interest", r[0], r[1], r[2], o), a.uniformSampler2D("t_color", this.texture), webgl.bindVertexBuffer(this.buffers.vert), a.vertexAttribPointer("position", 3, gl.FLOAT, !1, 20, 0), a.vertexAttribPointer("texcoord", 2, gl.FLOAT, !1, 20, 12), a.uniform1i("inside", 0), gl.drawArrays(gl.TRIANGLES, 0, 6 * this.country_count), a.uniform1i("inside", 1), gl.drawArrays(gl.TRIANGLES, 6 * this.country_count, 6 * this.city_count), gl.depthMask(!0), gl.disable(gl.BLEND)
  4224.             }
  4225.         }, e
  4226.     }()
  4227. }();
  4228. var GTW = window.GTW || {};
  4229. GTW.init_scape = function(e, t) {
  4230.     function r(e, t) {
  4231.         e += I[0], t += I[1];
  4232.         for (var r = 16, n = 0, o = .5; r--;) n += o * noise.perlin2(e, t), o *= .5, e *= 2, t *= 2;
  4233.         return n
  4234.     }
  4235.  
  4236.     function n(e) {
  4237.         return .5 + .5 * noise.perlin2(B * e + I[0], I[1])
  4238.     }
  4239.  
  4240.     function o(t, r, n, o) {
  4241.         W(t, r, n, o), e.project(t, t)
  4242.     }
  4243.  
  4244.     function a() {
  4245.         I[0] = 100 * Math.random(), I[1] = 100 * Math.random(), U = lerp(1.5, 5.5, Math.random()), N = lerp(2, 3, Math.random()), B = lerp(1, 7, Math.random());
  4246.         for (var e = 0, t = 0; d > t; ++t)
  4247.             for (var r = 0; b > r; ++r) {
  4248.                 var n = r / (b - 1),
  4249.                     a = t / (d - 1);
  4250.                 o(D, n, a), y[e + 0] = D[0], y[e + 1] = D[1], y[e + 2] = D[2], e += 4
  4251.             }
  4252.         webgl.bindVertexBuffer(Y.verts), gl.bufferSubData(gl.ARRAY_BUFFER, 0, y)
  4253.     }
  4254.  
  4255.     function i() {
  4256.         vec3.lerp(ie, ie, ue, .05), vec3.lerp(ne, ne, oe, .05), vec3.lerp(ue, ue, ae, .05), vec3.lerp(oe, oe, re, .05);
  4257.         var t = Q.scape.use();
  4258.         t.uniformMatrix4fv("mvp", e.camera.mvp), t.uniform4fv("color", ne), t.uniform3fv("fog_color", ie), t.uniformSampler2D("pattern", K.pattern), webgl.bindVertexBuffer(Y.verts), t.vertexAttribPointer("position", 4, gl.FLOAT, !1, 0, 0), webgl.bindVertexBuffer(Y.texcoords), t.vertexAttribPointer("texcoord", 2, gl.FLOAT, !1, 0, 0), webgl.bindElementBuffer(Y.quads), gl.disable(gl.BLEND), gl.enable(gl.DEPTH_TEST), gl.enable(gl.POLYGON_OFFSET_FILL), gl.polygonOffset(1, 1), gl.drawElements(gl.TRIANGLE_STRIP, H, gl.UNSIGNED_SHORT, 0), gl.disable(gl.POLYGON_OFFSET_FILL), gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
  4259.         var t = Q.scape_lines.use();
  4260.         t.uniformMatrix4fv("mvp", e.camera.mvp), t.uniform4f("color", 140 / 255, 160 / 255, 138 / 255, .5), webgl.bindVertexBuffer(Y.verts), t.vertexAttribPointer("position", 4, gl.FLOAT, !1, 0, 0), webgl.bindElementBuffer(Y.lines), gl.drawElements(gl.LINES, $, gl.UNSIGNED_SHORT, 0)
  4261.     }
  4262.  
  4263.     function u(e) {
  4264.         return -e * Math.log(1 - MersenneTwister.random())
  4265.     }
  4266.  
  4267.     function c() {
  4268.         fe = 0, a(), ve = u(pe), he = !0
  4269.     }
  4270.  
  4271.     function l() {
  4272.         var e = [];
  4273.         return GTW.systems_foreach(function(t, r) {
  4274.             t.enabled && e.push(r)
  4275.         }), _.sample(e)
  4276.     }
  4277.  
  4278.     function s() {
  4279.         var r = fe / se;
  4280.         r *= .8, fe += 1 / 60;
  4281.         var a = n(r);
  4282.         if (o(Z, r, a, 0), o(J, r + .01, a, 0), vec3.sub(le, J, Z), vec3.normalize(le, le), vec3.normalize(S, Z), o(Z, r, a), vec3.scaleAndAdd(Z, Z, S, .5), he ? (vec3.copy(ce, Z), g.move_to(ce, le, S), vec3.copy(p.pos, g.pos), vec3.copy(p.rot, g.rot), he = !1) : (vec3.lerp(ce, ce, Z, .1), g.move_to(ce, null, S), p.follow(g.pos, g.rot, .1, .05)), p.roll(.01 * noise.perlin2(e.time, .934)), fe > ve) {
  4283.             ve = fe + u(pe);
  4284.             var i = l();
  4285.             if (Math.random() < .3) {
  4286.                 var c = Z,
  4287.                     s = null,
  4288.                     f = Math.random(),
  4289.                     v = r + lerp(.01, .2, f),
  4290.                     h = n(v) + Random.gauss(0, .1);
  4291.                 W(c, v, h);
  4292.                 var m = t.launch(e, i, c, s);
  4293.                 vec3.scaleAndAdd(ue, ue, m.color, .5 * f), vec3.scaleAndAdd(oe, oe, m.color, .5 * (1 - f)), .1 > f && (e.flash(m.color), ge = 1)
  4294.             } else {
  4295.                 var s = Z,
  4296.                     c = J,
  4297.                     v = Random.uniform(r + .2, 1),
  4298.                     h = n(v) + Random.gauss(0, .1),
  4299.                     d = Random.uniform(0, 1),
  4300.                     _ = Random.uniform(0, 1);
  4301.                 W(c, v, h), W(s, d, _), t.launch(e, i, c, s, 30)
  4302.             }
  4303.         }
  4304.     }
  4305.  
  4306.     function f() {
  4307.         if (vec3.copy(Z, p.pos), e.camera.update_quat(Z, p.rot), ge > .001) {
  4308.             var t = 5 * e.time,
  4309.                 n = 3 * Math.sin(Math.PI * ge);
  4310.             e.camera.mvp[12] += .2 * n * r(t, .3123123), e.camera.mvp[13] += 1.5 * n * (r(t, .9123123) - .125), mat4.invert(e.camera.mvpInv, e.camera.mvp), ge *= .85
  4311.         }
  4312.     }
  4313.     var v = function() {
  4314.             function e() {
  4315.                 this.pos = vec3.create(), this.rot = quat.create(), this.tan = vec3.create(), this.forward = vec3.fromValues(0, 0, -1), this.up = vec3.fromValues(0, 1, 0)
  4316.             }
  4317.             var t = vec3.create(),
  4318.                 r = vec3.create(),
  4319.                 n = vec3.create(),
  4320.                 o = vec3.create(),
  4321.                 a = quat.create(),
  4322.                 i = quat.create(),
  4323.                 u = vec3.create(),
  4324.                 c = vec3.create();
  4325.             return e.prototype.move_to = function(e, l, s) {
  4326.                 if (vec3.copy(t, e), vec3.copy(r, this.pos), vec3.copy(o, this.tan), vec3.sub(n, t, r), vec3.normalize(n, n), quat.copy(i, this.rot), s) {
  4327.                     vec3.transformQuat(u, this.up, this.rot), vec3.copy(c, s);
  4328.                     var f = vec3.dot(u, c);
  4329.                     .999999 > f && (vec3.cross(a, u, c), a[3] = 1 + f, quat.normalize(a, a), quat.multiply(a, a, i), quat.dot(i, a) < 0 && quat.scale(a, a, -1)), quat.copy(this.rot, a), quat.copy(i, a)
  4330.                 }
  4331.                 if (l) vec3.normalize(this.tan, l), quat.rotationTo(this.rot, this.forward, this.tan);
  4332.                 else {
  4333.                     var f = vec3.dot(o, n);
  4334.                     .999999 > f && (vec3.cross(a, o, n), a[3] = 1 + f, quat.normalize(a, a), quat.multiply(a, a, i), quat.dot(i, a) < 0 && quat.scale(a, a, -1)), vec3.copy(this.tan, n), quat.copy(this.rot, a)
  4335.                 }
  4336.                 vec3.copy(this.pos, t)
  4337.             }, e.prototype.follow = function(e, t, r, n) {
  4338.                 vec3.lerp(this.pos, this.pos, e, r || .05), vec4.lerp(this.rot, this.rot, t, n || .02), quat.normalize(this.rot, this.rot)
  4339.             }, e.prototype.roll = function(e) {
  4340.                 var t = this.rot;
  4341.                 quat.rotateZ(t, t, e)
  4342.             }, e
  4343.         }(),
  4344.         p = new v,
  4345.         g = new v,
  4346.         h = [-180, 0, 0],
  4347.         m = [180, 0, 0],
  4348.         d = 128,
  4349.         b = 512,
  4350.         y = [],
  4351.         T = [],
  4352.         w = [],
  4353.         E = [],
  4354.         x = vec3.fromValues(h[0], h[1], 0),
  4355.         A = vec3.fromValues(m[0], m[1], 0),
  4356.         M = vec3.create(),
  4357.         R = vec3.create();
  4358.     vec3.sub(M, A, x), vec2.normalize(M, M), vec2.perp(R, M);
  4359.     var P = 360,
  4360.         L = .2 * P;
  4361.     vec2.scale(M, M, P), vec2.scale(R, R, L);
  4362.     for (var D = vec4.create(), S = vec3.create(), F = 3, k = Math.pow, G = Math.abs, I = vec2.create(), U = 2.5, N = 3, B = 2, W = function() {
  4363.             var e = vec3.create();
  4364.             return function(t, o, a, i) {
  4365.                 "undefined" == typeof i && (i = 1), vec3.set(e, 0, 0, 0), vec3.scaleAndAdd(e, A, M, o), vec3.scaleAndAdd(e, e, R, 2 * (a - .5));
  4366.                 var u = n(o),
  4367.                     c = G(a - u),
  4368.                     l = .05 + .95 * smoothstep(clamp(U * c, 0, 1)),
  4369.                     s = i * (r(8 * F * o, F * a) + 1);
  4370.                 l *= k(s, N), l -= .075, 0 > l ? l = 0 : l *= 2;
  4371.                 var f = .25 * (1 + noise.perlin2(8 * o, 1 * a)) + .05 * r(8 * o, a);
  4372.                 l += f, e[2] = .5 * l, vec3.copy(t, e)
  4373.             }
  4374.         }(), O = 0; d > O; ++O)
  4375.         for (var C = 0; b > C; ++C) {
  4376.             var j = C / (b - 1),
  4377.                 q = O / (d - 1);
  4378.             o(D, j, q), y.push(D[0], D[1], D[2], 0), T.push(C, O);
  4379.             var V = O * b + C,
  4380.                 X = V + 1,
  4381.                 z = V + b;
  4382.             b - 1 > C && E.push(V, X), d - 1 > O && E.push(V, z), d - 1 > O && (O && !C && w.push(V), w.push(V, z), d - 2 > O && C == b - 1 && w.push(z))
  4383.         }
  4384.     y = new Float32Array(y);
  4385.     y.length / 4;
  4386.     w = new Uint16Array(w);
  4387.     var H = w.length;
  4388.     E = new Uint16Array(E);
  4389.     var $ = E.length;
  4390.     T = new Float32Array(T);
  4391.     var Y = {
  4392.             verts: webgl.makeVertexBuffer(y),
  4393.             quads: webgl.makeElementBuffer(w),
  4394.             lines: webgl.makeElementBuffer(E),
  4395.             texcoords: webgl.makeVertexBuffer(T)
  4396.         },
  4397.         K = {
  4398.             pattern: webgl.loadTexture2D(GTW.resource_url("textures/pattern2.png"), {
  4399.                 mipmap: !0,
  4400.                 wrap: gl.REPEAT,
  4401.                 aniso: 4
  4402.             })
  4403.         },
  4404.         Q = {
  4405.             scape: webgl.getProgram("scape"),
  4406.             scape_lines: webgl.getProgram("scape_lines")
  4407.         },
  4408.         Z = vec3.create();
  4409.     vec3.copy(Z, A);
  4410.     var J = vec3.clone(Z);
  4411.     vec3.scaleAndAdd(J, Z, M, 1), e.project(Z, Z), e.project(J, J);
  4412.     var ee = (vec3.create(), vec3.create());
  4413.     vec3.sub(ee, J, Z);
  4414.     var te = vec3.create();
  4415.     vec3.add(te, Z, J), vec3.normalize(te, te);
  4416.     var re = function() {
  4417.             var e = vec4.fromValues(.1, .12, .11, 1),
  4418.                 t = vec4.fromValues(.2, .23, .21, 1),
  4419.                 r = .1,
  4420.                 n = vec4.create();
  4421.             return vec4.lerp(n, e, t, r), n
  4422.         }(),
  4423.         ne = vec4.clone(re),
  4424.         oe = vec4.clone(re),
  4425.         ae = vec3.fromValues(.01, .05, .02),
  4426.         ie = vec3.clone(ae),
  4427.         ue = vec3.clone(ae),
  4428.         Z = vec3.create(),
  4429.         J = vec3.create(),
  4430.         ce = vec3.create(),
  4431.         le = vec3.create(),
  4432.         S = vec3.create(),
  4433.         se = 10,
  4434.         fe = se + 1,
  4435.         ve = 0,
  4436.         pe = .3,
  4437.         ge = 0,
  4438.         he = !0;
  4439.     return {
  4440.         reset: c,
  4441.         draw: i,
  4442.         update: s,
  4443.         update_camera: f,
  4444.         shake: function() {
  4445.             ge = 1
  4446.         }
  4447.     }
  4448. };
  4449. var GTW = window.GTW || {};
  4450. GTW.init_demo = function(e, t) {
  4451.     function r(e) {
  4452.         var t = 16;
  4453.         return _.times(t, e.create)
  4454.     }
  4455.  
  4456.     function n(t, r, n, o) {
  4457.         function a(e) {
  4458.             gl.enable(gl.DEPTH_TEST), gl.depthMask(!1), gl.lineWidth(5), gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
  4459.             var t = k.rings.use();
  4460.             t.uniformMatrix4fv("mvp", e.camera.mvp), t.uniform3fv("color", n), webgl.bindVertexBuffer(F.ring_verts), t.vertexAttribPointer("position", 4, gl.FLOAT, !1, 0, 0), gl.drawArrays(gl.TRIANGLE_STRIP, 0, D), gl.lineWidth(1), gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
  4461.             var t = k.missile.use();
  4462.             t.uniformMatrix4fv("mvp", e.camera.mvp), t.uniform3fv("color", n);
  4463.             var r = clamp(e.demo_time / 5, 0, 2);
  4464.             t.uniform1f("time", r), webgl.bindVertexBuffer(F.tube_verts), t.vertexAttribPointer("position", 4, gl.FLOAT, !1, 0, 0), gl.drawArrays(gl.TRIANGLE_STRIP, 0, S), gl.depthMask(!0), gl.disable(gl.BLEND), gl.disable(gl.DEPTH_TEST);
  4465.             var o = Math.max(0, e.demo_time);
  4466.             o /= 5, o -= ~~o;
  4467.             var a = o * (h - 1),
  4468.                 i = ~~a;
  4469.             a -= i;
  4470.             var u = 6 * i;
  4471.             vec3.set(I, 0, 0, 0), vec3.set(U, 0, 0, 0);
  4472.             for (var c = 0; 2 > c; ++c) {
  4473.                 a = 1 - a;
  4474.                 for (var l = 0; 3 > l; ++l) I[l] += a * y[u + l], U[l] += a * y[u + 3 + l];
  4475.                 u += 6
  4476.             }
  4477.             G.look(I, U, I)
  4478.         }
  4479.         for (var t = vec3.clone(t), r = vec3.clone(r), i = vec2.distance(t, r), u = .005 * i, c = vec3.create(), l = vec3.create(), s = 0, f = c, g = l, h = 103, m = new Float32Array(4 * h * 8), d = 0; h > d; ++d) {
  4480.             var _ = d / (h - 1);
  4481.             vec3.lerp(g, t, r, _);
  4482.             var b = u * Math.sin(_ * Math.PI) * .85;
  4483.             g[2] += b, e.project(f, g), vec3.save(f, m, s + 0), m[s + 3] = -_, vec3.save(f, m, s + 4), m[s + 7] = _, s += 8
  4484.         }
  4485.         for (var y = [], T = 0, w = c, E = l, x = vec3.create(), d = 0; h > d; ++d) vec3.load(w, m, T), y.push(w[0], w[1], w[2]), h - 1 > d && (vec3.load(E, m, T + 8), vec3.sub(x, E, w)), y.push(x[0], x[1], x[2]), T += 8;
  4486.         for (var A = function() {
  4487.                 function e() {
  4488.                     this.P = vec3.create(), this.T = vec3.create(), this.Q = quat.create()
  4489.                 }
  4490.                 return e.prototype.update = function() {
  4491.                     vec3.normalize(this.T, this.T), quat.rotationTo(this.Q, [0, 0, 1], this.T)
  4492.                 }, e.prototype.transform = function(e, t) {
  4493.                     vec3.transformQuat(e, t, this.Q), vec3.add(e, e, this.P)
  4494.                 }, e
  4495.             }(), M = [], T = 0; T < y.length; T += 6) {
  4496.             var R = new A;
  4497.             vec3.load(R.P, y, T + 0), vec3.load(R.T, y, T + 3), R.update(), quat.rotateZ(R.Q, R.Q, TWO_PI * d / h), M.push(R)
  4498.         }
  4499.         var P = [],
  4500.             L = [];
  4501.         ! function() {
  4502.             function e(e, t, n, o, a) {
  4503.                 r[0] = Math.cos(n) * o, r[1] = Math.sin(n) * o, r[2] = 0, t.transform(r, r), e.push(r[0], r[1], r[2], a)
  4504.             }
  4505.  
  4506.             function t(e) {
  4507.                 var t = e.length - 4;
  4508.                 e.push(e[t + 0], e[t + 1], e[t + 2], e[t + 3])
  4509.             }
  4510.             var r = vec3.create(),
  4511.                 n = (vec3.create(), 0 > o);
  4512.             o = Math.abs(o);
  4513.             for (var a = 0; a < M.length; ++a)
  4514.                 for (var i = M[a], u = M[a + 1], c = a / (h - 1), l = lerp(.02, .07, c), s = (n ? Math.PI : TWO_PI) / o, f = 0, v = 15e-5 / l, p = 0; o >= p; ++p) {
  4515.                     var g = a && !p;
  4516.                     n && p == o && (f = 0), g && t(L), e(L, i, f, l - v, -c), g && t(L), e(L, i, f, l + v, c), u && (g && t(P), e(P, i, f, l, c), g && t(P), e(P, u, f, l, c)), f += s
  4517.                 }
  4518.         }(), L = new Float32Array(L), P = new Float32Array(P);
  4519.         var D = L.length / 4,
  4520.             S = P.length / 4,
  4521.             F = {
  4522.                 verts: webgl.makeVertexBuffer(m),
  4523.                 ring_verts: webgl.makeVertexBuffer(L),
  4524.                 tube_verts: webgl.makeVertexBuffer(P)
  4525.             },
  4526.             k = {
  4527.                 missile: webgl.getProgram("missile_tube"),
  4528.                 simple: webgl.getProgram("simple"),
  4529.                 rings: webgl.getProgram("rings")
  4530.             },
  4531.             G = new v;
  4532.         p.missile = G;
  4533.         var I = vec3.create(),
  4534.             U = vec3.create();
  4535.         vec3.create();
  4536.         return {
  4537.             draw: a
  4538.         }
  4539.     }
  4540.  
  4541.     function o() {
  4542.         var r, n = p.player,
  4543.             o = e.camera;
  4544.         if (e.demo_time < 5) {
  4545.             g = 0, o.near = .01, o.far = 1e3, r = p.missile;
  4546.             var a = e.demo_time / 5;
  4547.             n.follow(r.pos, r.rot, .01 + .5 * a, a * a), n.roll(.1 * noise.perlin2(1 * e.demo_time, 0))
  4548.         } else if (e.demo_time < 15) 0 == g && (g = 1, e.flash(f), l.reset(), t.set_mode("scape"), e.draw_world = !1);
  4549.         else if (e.demo_time < 20) {
  4550.             1 == g && (g = 2, e.flash(f), t.set_mode("world"), e.draw_world = !0), o.near = .01, o.far = 500, r = p.orbit;
  4551.             var a = (e.demo_time - 15) / 5;
  4552.             return n.follow(r.pos, r.rot, 5e-5 + .5 * Math.pow(a, 3), .2), void o.update_quat(n.pos, n.rot, a)
  4553.         }
  4554.         o.update_quat(n.pos, n.rot)
  4555.     }
  4556.  
  4557.     function a(e) {
  4558.         o(), e.draw_world || (l.update(), l.update_camera())
  4559.     }
  4560.  
  4561.     function i(e) {
  4562.         e.draw_world ? s && e.demo_time < 5 && s.draw(e) : (l.draw(e), t.draw(e))
  4563.     }
  4564.  
  4565.     function u(e, t, r) {
  4566.         var o = GTW.systems[e.solo_system_id],
  4567.             a = o.color[e.palette].f;
  4568.         vec3.copy(f, a), s = n(t, r, a, o.n_sides);
  4569.         var i = p.player;
  4570.         vec3.copy(i.pos, e.camera.viewPos), quat.rotationTo(i.rot, [0, 0, -1], e.camera.viewDir);
  4571.         var u = [r[0], r[1], 1.6];
  4572.         e.project(p.orbit.pos, u);
  4573.         var c = vec3.clone(p.orbit.pos);
  4574.         vec3.normalize(c, c), vec3.negate(c, c), quat.rotationTo(p.orbit.rot, [0, 0, -1], c)
  4575.     }
  4576.  
  4577.     function c() {
  4578.         e.draw_world || (t.set_mode("world"), e.draw_world = !0)
  4579.     }
  4580.     var l = GTW.init_scape(e, t),
  4581.         s = null,
  4582.         f = vec3.create(),
  4583.         v = function() {
  4584.             function e() {
  4585.                 this.pos = vec3.create(), this.rot = quat.create()
  4586.             }
  4587.             var t = vec3.create(),
  4588.                 r = vec3.fromValues(0, 1, 0),
  4589.                 n = (vec3.create(), vec3.create(), vec3.create(), vec3.fromValues(0, 0, 1), mat4.create()),
  4590.                 o = mat3.create(),
  4591.                 a = vec3.create();
  4592.             e.prototype.look = function(e, t, i) {
  4593.                 i = i || r, vec3.copy(this.pos, e), vec3.add(a, e, t), mat4.lookAt(n, e, a, i), mat3.fromMat4(o, n), mat3.invert(o, o);
  4594.                 var u = this.rot;
  4595.                 quat.fromMat3(u, o), quat.normalize(u, u)
  4596.             };
  4597.             var i = vec3.create();
  4598.             return e.prototype.look_at = function(e, n, o) {
  4599.                 n = n || t, o = o || r, vec3.sub(i, n, e), this.look(e, i, o)
  4600.             }, e.prototype.move_forward = function() {
  4601.                 vec3.set(i, 0, 0, 1), vec3.transformQuat(i, i, this.rot);
  4602.                 var e = .1;
  4603.                 vec3.scaleAndAdd(this.pos, this.pos, i, e)
  4604.             }, e.prototype.follow = function(e, t, r, n) {
  4605.                 vec3.lerp(this.pos, this.pos, e, r || .05), vec4.lerp(this.rot, this.rot, t, n || .02), quat.normalize(this.rot, this.rot)
  4606.             }, e.prototype.roll = function(e) {
  4607.                 var t = this.rot;
  4608.                 quat.rotateZ(t, t, e)
  4609.             }, e
  4610.         }(),
  4611.         p = ({
  4612.             vec3: r(vec3),
  4613.             vec4: r(vec4),
  4614.             quat: r(quat),
  4615.             mat4: r(mat4),
  4616.             mat3: r(mat3)
  4617.         }, {
  4618.             missile: new v,
  4619.             player: new v,
  4620.             orbit: new v
  4621.         }),
  4622.         g = 0;
  4623.     return {
  4624.         draw: i,
  4625.         setup: u,
  4626.         update: a,
  4627.         exit: c
  4628.     }
  4629. };
  4630. var GTW = window.GTW || {};
  4631. GTW.init_hedgehog = function(e) {
  4632.     function t() {
  4633.         this.position = vec3.create();
  4634.         var e = 2;
  4635.         this.scale = vec2.fromValues(1 * e, .25 * e), this.texture = null
  4636.     }
  4637.  
  4638.     function r(e, r) {
  4639.         _.each(p, function(e) {
  4640.             e.destroy()
  4641.         }), p = [];
  4642.         for (var n = [], o = 0; 10 > o; ++o) {
  4643.             var a = GTW.top_infected[o],
  4644.                 i = r.key_to_country[a];
  4645.             if (i) {
  4646.                 var u = o + 1,
  4647.                     c = i.center,
  4648.                     s = new t,
  4649.                     g = s.position,
  4650.                     h = .5;
  4651.                 vec3.set(g, c[0], c[1], h), e.project(g, g);
  4652.                 var m = vec3.create();
  4653.                 vec3.set(m, c[0], c[1], 0), e.project(m, m), n.push(g[0], g[1], g[2]), n.push(m[0], m[1], m[2]);
  4654.                 var d = MAP.lang;
  4655.                 v.fillStyle = "#fff", v.fillRect(0, 0, f.width, f.height), v.fillStyle = "#000", v.font = 'bold 32px "Ubuntu Mono"', v.fillText(GTW.get_country_name(i).toUpperCase(), 30, 60), v.font = 'bold 20px "Ubuntu Mono"', window.lang ? v.fillText(window.lang.getText("NUMBER_SYMBOL") + u + " " + window.lang.getText("MOST_ATTACKED_COUNTRY"), 30, 90) : "ru" == d ? v.fillText("№" + u + " в мире по числу атак", 30, 90) : v.fillText("#" + u + " MOST-ATTACKED COUNTRY", 30, 90);
  4656.                 var b = s.texture = gl.createTexture();
  4657.                 gl.bindTexture(gl.TEXTURE_2D, b), gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, f), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE), gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE), gl.generateMipmap(gl.TEXTURE_2D), p.push(s)
  4658.             }
  4659.         }
  4660.         l.lines && (gl.deleteBuffer(l.lines), l.lines = null), l.lines = webgl.makeVertexBuffer(new Float32Array(n))
  4661.     }
  4662.  
  4663.     function n(e) {
  4664.         var t = s.simple.use();
  4665.         t.uniformMatrix4fv("mvp", e.camera.mvp), t.uniform4f("color", 1, 1, 1, .5 * g), webgl.bindVertexBuffer(l.lines), t.vertexAttribPointer("position", 3, gl.FLOAT, !1, 0, 0), gl.drawArrays(gl.LINES, 0, 2 * p.length)
  4666.     }
  4667.  
  4668.     function o(e) {
  4669.         var t = s.hedgehog.use();
  4670.         t.uniformMatrix4fv("mvp", e.camera.mvp), t.uniformMatrix3fv("bill", e.camera.bill), t.uniform4f("color", 1, 1, 1, 1), webgl.bindVertexBuffer(l.verts), t.vertexAttribPointer("coord", 2, gl.FLOAT, !1, 0, 0), _.each(p, function(e) {
  4671.             t.uniform3fv("position", e.position), t.uniform2fv("scale", e.scale), t.uniformSampler2D("t_color", e.texture), t.uniform1f("fade", g), gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
  4672.         })
  4673.     }
  4674.  
  4675.     function a(e) {
  4676.         g = m ? Math.min(1, g + h) : Math.max(0, g - h), 0 != g && (gl.enable(gl.DEPTH_TEST), gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA), o(e), n(e), gl.disable(gl.BLEND), gl.disable(gl.DEPTH_TEST))
  4677.     }
  4678.  
  4679.     function i() {
  4680.         m = !0
  4681.     }
  4682.  
  4683.     function u() {
  4684.         m = !1
  4685.     }
  4686.     var c = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]),
  4687.         l = {
  4688.             verts: webgl.makeVertexBuffer(c),
  4689.             lines: null
  4690.         },
  4691.         s = {
  4692.             simple: webgl.getProgram("simple"),
  4693.             hedgehog: webgl.getProgram("hedgehog")
  4694.         },
  4695.         f = document.createElement("canvas");
  4696.     f.width = 512, f.height = 128;
  4697.     var v = f.getContext("2d");
  4698.     t.prototype.destroy = function() {
  4699.         gl.deleteTexture(this.texture), this.texture = null
  4700.     };
  4701.     var p = [],
  4702.         g = 0,
  4703.         h = .02,
  4704.         m = !1;
  4705.     return {
  4706.         show: i,
  4707.         hide: u,
  4708.         draw: a,
  4709.         setup: r
  4710.     }
  4711. };
  4712. var GTW = window.GTW || {};
  4713. GTW.init_connectors = function() {
  4714.     function e(e) {
  4715.         gl.disable(gl.DEPTH_TEST);
  4716.         var t = u.connector.use();
  4717.         t.uniformMatrix4fv("mvp", e.camera.mvp);
  4718.         var r = 1;
  4719.         t.uniform4f("color", r, r, r, 1), webgl.bindVertexBuffer(i.verts), t.vertexAttribPointer("position", 4, gl.FLOAT, !1, 0, 0), gl.drawArrays(gl.LINES, 0, 2 * a)
  4720.     }
  4721.  
  4722.     function t(e, t) {
  4723.         var r = 8 * a;
  4724.         vec3.save(e, o, r + 0), o[r + 3] = 0, vec3.save(t, o, r + 4), o[r + 7] = 1, ++a, webgl.bindVertexBuffer(i.verts), gl.bufferSubData(gl.ARRAY_BUFFER, 0, o)
  4725.     }
  4726.  
  4727.     function r() {
  4728.         a = 0
  4729.     }
  4730.     var n = 20,
  4731.         o = new Float32Array(8 * n),
  4732.         a = 0,
  4733.         i = {
  4734.             verts: webgl.makeVertexBuffer(o)
  4735.         },
  4736.         u = {
  4737.             connector: webgl.getProgram("connector")
  4738.         };
  4739.     return {
  4740.         draw: e,
  4741.         add_line: t,
  4742.         clear: r
  4743.     }
  4744. };
  4745. var GTW = window.GTW || {};
  4746. GTW.init_marker = function(e) {
  4747.     function t(t) {
  4748.         var r = vec3.create();
  4749.         e.project(r, t), mat4.identity(u), mat4.translate(u, u, r), vec3.copy(l, r), vec3.copy(s, r);
  4750.         var n = vec3.create(),
  4751.             o = vec3.create(),
  4752.             a = vec3.create();
  4753.         vec3.normalize(n, l), vec3.set(o, 0, 1, 0), vec3.cross(a, n, o), vec3.normalize(a, a), vec3.cross(o, a, n), vec3.scaleAndAdd(s, s, o, 10), f = 0, v = !1
  4754.     }
  4755.  
  4756.     function r(e) {
  4757.         if (!v) {
  4758.             if (f += .01, f > 1) {
  4759.                 f = 1, v = !0;
  4760.                 var t = .7;
  4761.                 p || e.flash([t, t, t])
  4762.             }
  4763.             vec3.lerp(c, s, l, Math.pow(f, .75))
  4764.         }
  4765.         gl.enable(gl.DEPTH_TEST), gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
  4766.         var r = i.marker.use();
  4767.         r.uniformMatrix3fv("bill", e.camera.bill), r.uniformMatrix4fv("mvp", e.camera.mvp), r.uniform3fv("pos", c), r.uniformSampler2D("t_sharp", a.pin_sharp), r.uniformSampler2D("t_fuzzy", a.pin_fuzzy);
  4768.         var n = .7;
  4769.         r.uniform4f("color", n, n, n, 1), r.uniform1f("scale", .1), r.uniform1f("fuzz", 0), webgl.bindVertexBuffer(o.verts), r.vertexAttribPointer("coord", 2, gl.FLOAT, !1, 0, 0), gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4)
  4770.     }
  4771.     var n = [0, 0, 1, 0, 0, 1, 1, 1],
  4772.         o = {
  4773.             verts: webgl.makeVertexBuffer(new Float32Array(n))
  4774.         },
  4775.         a = {
  4776.             pin_sharp: webgl.loadTexture2D(GTW.resource_url("textures/pin-sharp.png"), {
  4777.                 mipmap: !0
  4778.             }),
  4779.             pin_fuzzy: webgl.loadTexture2D(GTW.resource_url("textures/pin-fuzzy.png"), {
  4780.                 mipmap: !0
  4781.             })
  4782.         },
  4783.         i = {
  4784.             marker: webgl.getProgram("marker")
  4785.         },
  4786.         u = mat4.create(),
  4787.         c = vec3.create(),
  4788.         l = vec3.create(),
  4789.         s = vec3.create(),
  4790.         f = 0,
  4791.         v = !0,
  4792.         p = !1;
  4793.     return {
  4794.         draw: r,
  4795.         set_coord: t,
  4796.         cancel_flash: function() {
  4797.             p = !0
  4798.         }
  4799.     }
  4800. };
  4801. var GTW = window.GTW || {};
  4802. GTW.init_flash = function(e) {
  4803.     function t(e) {
  4804.         if (!(i[3] < .001)) {
  4805.             i[3] *= .97;
  4806.             var t = o.simple.use();
  4807.             t.uniformMatrix4fv("mvp", a), t.uniform4fv("color", i), webgl.bindVertexBuffer(n.verts), t.vertexAttribPointer("position", 2, gl.FLOAT, !1, 0, 0), gl.enable(gl.BLEND), gl.blendFunc(gl.SRC_ALPHA, gl.ONE), gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4), gl.disable(gl.BLEND)
  4808.         }
  4809.     }
  4810.     var r = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]),
  4811.         n = {
  4812.             verts: webgl.makeVertexBuffer(r)
  4813.         },
  4814.         o = {
  4815.             simple: webgl.getProgram("simple")
  4816.         },
  4817.         a = mat4.create();
  4818.     mat4.translate(a, a, [-1, -1, 0, 0]), mat4.scale(a, a, [2, 2, 2]);
  4819.     var i = vec4.create();
  4820.     return {
  4821.         draw: t,
  4822.         flash: function(e) {
  4823.             vec3.copy(i, e), i[3] = 2
  4824.         }
  4825.     }
  4826. };
  4827. var GTW = window.GTW || {},
  4828.     MAP = window.MAP || {};
  4829. MAP.init = function(e) {
  4830.     function t() {
  4831.         q && (clearTimeout(q), q = null, vec3.copy(z.geocam.coord_target, z.geocam.coord), _e.cancel_flash())
  4832.     }
  4833.  
  4834.     function r(e, t) {
  4835.         if (ye.clear(), e && t) {
  4836.             var r = e.getBoundingClientRect(),
  4837.                 n = X.getBoundingClientRect(),
  4838.                 o = r.left + .5 * r.width,
  4839.                 a = r.top + .5 * r.height;
  4840.             o -= n.left, a -= n.top;
  4841.             var i = vec3.create();
  4842.             i[0] = 2 * (o / X.width - .5), i[1] = -2 * (a / X.height - .5);
  4843.             var u = vec3.create(),
  4844.                 c = vec3.create(),
  4845.                 l = {
  4846.                     NO: [9.787, 61.391],
  4847.                     SE: [15.179, 60.131],
  4848.                     FI: [26.199, 63.0149]
  4849.                 },
  4850.                 s = l[t.iso2];
  4851.             s ? vec2.copy(c, s) : vec3.copy(c, t.center), z.project(u, c), ye.add_line(i, u)
  4852.         }
  4853.     }
  4854.  
  4855.     function n() {
  4856.         j && !Ve(j, 70) && N.hide_country_popup()
  4857.     }
  4858.  
  4859.     function o(e) {
  4860.         e !== j && (e ? (N.show_country_popup(GTW.get_country_name(e)), we = 0, Ee = 0) : N.hide_country_popup(), j = e, r($("#countrypop")[0], e))
  4861.     }
  4862.  
  4863.     function a() {
  4864.         z.geocam.coord_target[2] = I, z.geocam.lerp_speed = .2
  4865.     }
  4866.  
  4867.     function i() {
  4868.         if ("orbit" == z.camera_mode) {
  4869.             var e = Y.mat4;
  4870.             mat4.identity(e), mat4.rotateY(e, e, -z.orbit.rotate[1]), mat4.rotateX(e, e, z.orbit.rotate[0]), vec3.transformMat4(z.orbit.pos, z.orbit.translate, e);
  4871.             var t = Y.vec3;
  4872.             vec3.set(t, 0, 0, 1), vec3.transformMat4(t, t, e), vec3.copy(z.orbit.dir, t), z.camera.update(z.orbit.pos, z.orbit.dir)
  4873.         } else if ("geocam" == z.camera_mode) {
  4874.             var r = z.projection.dir > 0,
  4875.                 n = z.geocam.coord,
  4876.                 o = z.geocam.coord_target,
  4877.                 a = z.geocam.coord_delta;
  4878.             vec3.add(o, o, a), o[1] = clamp(o[1], -80, 80);
  4879.             var i;
  4880.             i = r ? ee.ecef : ee.mercator, o[2] = clamp(o[2], i[0], i[1]), r ? n[0] < -180 ? (n[0] += 360, o[0] += 360) : n[0] > 180 && (n[0] -= 360, o[0] -= 360) : o[0] = clamp(o[0], -180, 180), vec3.lerp(n, n, o, z.geocam.lerp_speed), vec3.scale(a, a, .9), GTW.project_mercator(K, [n[0], n[1], 0]), GTW.project_mercator(Q, n), Q[1] -= 2, vec3.sub(Z, K, Q), vec3.normalize(Z, Z), vec3.copy(K, Q);
  4881.             var u = [0, 0, 0];
  4882.             GTW.project_ecef(u, [n[0], n[1], 0]), GTW.project_ecef(Q, n);
  4883.             var c = clamp(2 * (I - n[2]), 0, 1),
  4884.                 c = lerp(0, 2, c);
  4885.             Q[1] -= c, vec3.sub(J, u, Q), vec3.normalize(J, J);
  4886.             var l = smoothstep(z.projection.blend);
  4887.             vec3.lerp(K, K, Q, l), vec3.lerp(Z, Z, J, l), z.camera.update(K, Z)
  4888.         }
  4889.         z.projection.blend = clamp(z.projection.blend + z.projection.dir / 120, 0, 1)
  4890.     }
  4891.  
  4892.     function u() {
  4893.         return
  4894.     }
  4895.  
  4896.     function c(e) {
  4897.         ne !== e && (ne = e, oe = e.getContext("2d"))
  4898.     }
  4899.  
  4900.     function l() {
  4901.         var e = ne.clientWidth;
  4902.         ae !== e && (ae = ne.width = e);
  4903.         var t = $(document).height() - (250 + $(".header").height() + $(".footer").height());
  4904.         150 > t && (t = 150), t > 700 && (t = 700), ie !== t && (ie = ne.height = t);
  4905.         var r = ae / (ce - 1);
  4906.         oe.clearRect(0, 0, ae, ie), oe.font = "12px Ubuntu Mono";
  4907.         var n = 10 * Math.floor(.1 * se),
  4908.             o = 20;
  4909.         n > 100 && (o = 50), n > 500 && (o = 100), n > 2e3 && (o = 500), n > 5e3 && (o = 2e3), oe.textBaseline = "middle", oe.textAlign = "right";
  4910.         for (var a = 0; n > a; a += o) {
  4911.             var i = (1 - a / n) * ie;
  4912.             i = Math.floor(i), oe.fillStyle = "#181818", oe.fillRect(0, i, ae, 1)
  4913.         }
  4914.         oe.lineWidth = 1.5;
  4915.         var u = 0;
  4916.         GTW.systems_foreach(function(e) {
  4917.             if (e.enabled_graph) {
  4918.                 oe.strokeStyle = e.color[z.palette].css, oe.beginPath();
  4919.                 for (var t = 0; ce > t; ++t) {
  4920.                     var o = modulo(ue - t - 1, ce),
  4921.                         a = e.graph[o];
  4922.                     u = Math.max(u, a);
  4923.                     var i = ae - t * r,
  4924.                         c = (1 - a / n) * ie;
  4925.                     0 == t ? oe.moveTo(i, c) : oe.lineTo(i, c)
  4926.                 }
  4927.                 oe.stroke(), se = clamp(lerp(se, 1.5 * u, .2), 50, 1e4)
  4928.             }
  4929.         });
  4930.         for (var c = 0; n > c; c += o) {
  4931.             var i = (1 - c / n) * ie;
  4932.             oe.fillStyle = "#fff", oe.fillText("" + c, ae - 10, i - 10)
  4933.         }
  4934.     }
  4935.  
  4936.     function s() {
  4937.         var e = ~~le;
  4938.         le += 1 / 60;
  4939.         var t = e % ce;
  4940.         t !== ue && (ue = t, ne && l(), GTW.systems_foreach(function(e) {
  4941.             e.graph[ue] = 0
  4942.         }))
  4943.     }
  4944.  
  4945.     function f(e, t) {
  4946.         for (var r = t.length / 3, n = Math.random(), o = r - 1, a = 0, i = 0; o >= a;) {
  4947.             var u = a + o >> 1,
  4948.                 c = t[3 * u + 0];
  4949.             c > n ? o = u - 1 : a = u + 1
  4950.         }
  4951.         i = o;
  4952.         var l = 3 * i,
  4953.             s = t[l + 1],
  4954.             f = t[l + 2];
  4955.         f += Random.gauss(0, .01), s += Random.gauss(0, .01), e[0] = s, e[1] = f
  4956.     }
  4957.  
  4958.     function v(e, t) {
  4959.         if (0 === t) return !1;
  4960.         var r = he.key_to_country[t];
  4961.         return r ? (f(e, r.cities), he.geoip && r == he.geoip.country ? e[2] = .014 : e[2] = 0, !0) : !1
  4962.     }
  4963.  
  4964.     function p(e, t, r, n, o) {
  4965.         if (n)
  4966.             if (Re[0] = n[0], Re[1] = n[1], Re[2] = 0, he.geoip && t == he.geoip.country && (Re[2] += .014), r) Pe[0] = n[2], Pe[1] = n[3], Pe[2] = 0, he.geoip && r == he.geoip.country && (Re[2] += .014), o = (Math.random() - .5) * Math.PI, ve.launch(z, e, Re, Pe, o);
  4967.             else {
  4968.                 vec3.copy(Pe, Re);
  4969.                 var a = o,
  4970.                     i = .5 * lerp(5, 6, Math.random());
  4971.                 Pe[0] += i * Math.cos(a), Pe[1] += i * Math.sin(a), Pe[2] += lerp(.15, .2, Math.random()), ve.launch(z, e, Re, Pe)
  4972.             } else {
  4973.             if (!v(Re, t)) return;
  4974.             r ? (v(Pe, r), ve.launch(z, e, Re, Pe)) : ve.launch(z, e, Re, null)
  4975.         }
  4976.     }
  4977.  
  4978.     function g(e) {
  4979.         if (Le) return void(Le = !1);
  4980.         if (he.countries.length) {
  4981.             if (_.each(e, function(e) {
  4982.                     var t = e.key,
  4983.                         r = t >> 16 & 255,
  4984.                         n = t >> 8 & 255,
  4985.                         o = t >> 0 & 255,
  4986.                         a = GTW.systems[r],
  4987.                         i = !0;
  4988.                     8 == r && e.coords && (i = !1), 8 == r && 0 == n && (i = !1), i && (++a.count, ++a.graph[ue], ++a.target_count[n]), ++GTW.total_target_count[n], W && z.draw_world && a.enabled && p(r, n, o, e.coords, e.angle)
  4989.                 }), j && Ee < z.time) {
  4990.                 var t = j.key;
  4991.                 GTW.compute_total_target_rank(), Ae.text(GTW.total_target_rank[t]), Ee = z.time + 2
  4992.             }
  4993.             if (xe < z.time) {
  4994.                 GTW.compute_total_target_rank();
  4995.                 for (var r = [], n = 0; 5 > n; ++n) {
  4996.                     var t = GTW.top_infected[n],
  4997.                         o = he.key_to_country[t];
  4998.                     o && r.push('<li data-key="' + t + '">' + GTW.get_country_name(o) + "</li>")
  4999.                 }
  5000.                 if (Me.html(r.join("")), xe = z.time + 5, be.setup(z, he), De(), Xe) {
  5001.                     var a = GTW.top_infected[0],
  5002.                         i = he.key_to_country[a];
  5003.                     i && (k(i), Xe = !1)
  5004.                 }
  5005.             }
  5006.             we < z.time && (GTW.systems_foreach(function(e) {
  5007.                 if ($(e.el_count_selector).text(e.count), j) {
  5008.                     var t = j.key,
  5009.                         r = e.target_count[t];
  5010.                     $(e.el_popcount_selector + " h4").text(r)
  5011.                 }
  5012.             }), we = z.time + Random.uniform(.1, .5))
  5013.         }
  5014.     }
  5015.  
  5016.     function h(e, t) {
  5017.         Fe = z.time + t, ke = e
  5018.     }
  5019.  
  5020.     function m(e, r) {
  5021.         if ((r || e !== Se) && !$("body").hasClass("scroll")) {
  5022.             switch (e) {
  5023.                 case "idle":
  5024.                     N.set_demo_state(!1), z.geocam.lerp_speed = .2, B && h("spin_1", 30);
  5025.                     break;
  5026.                 case "spin_1":
  5027.                     z.projection.dir < 0 && MAP.set_view("globe"), MAP.is_bad_mode || (N.set_demo_state(!0), t(), be.setup(z, he), be.show(), h("solo", 20)), z.geocam.lerp_speed = .015, a(), o(null);
  5028.                     break;
  5029.                 case "solo":
  5030.                     be.hide();
  5031.                     var n = [];
  5032.                     GTW.systems_foreach(function(e, t) {
  5033.                         e.enabled && n.push(t)
  5034.                     }), n.length > 0 && (z.solo_system_id = _.sample(n), D(z.solo_system_id), h("spin_2", 15));
  5035.                     break;
  5036.                 case "spin_2":
  5037.                     D(null), h("demo", 5);
  5038.                     break;
  5039.                 case "demo":
  5040.                     z.demo_time_start = z.time;
  5041.                     var i = !1;
  5042.                     if (function() {
  5043.                             var e = S(!0),
  5044.                                 t = F();
  5045.                             if (!e || !t) return void console.log("BAD DEMO");
  5046.                             var r = vec3.create();
  5047.                             v(r, t.key), de.setup(z, e.center, r), vec2.copy(z.geocam.coord_target, r), vec2.copy(z.geocam.coord, r), setTimeout(function() {
  5048.                                 o(t), D(null)
  5049.                             }, 5e3), setTimeout(function() {
  5050.                                 o(null)
  5051.                             }, 15e3), i = !0
  5052.                         }(), !i) return void m("spin_2", 0);
  5053.                     h("spin_1", 20)
  5054.             }
  5055.             Se = e
  5056.         }
  5057.     }
  5058.  
  5059.     function d() {
  5060.         if (z.time > Fe && m(ke), O || C) return void(z.geocam.coord_delta[0] = 6 * z.dt);
  5061.         switch (Se) {
  5062.             case "spin_1":
  5063.             case "spin_2":
  5064.             case "solo":
  5065.                 var e = z.projection.dir > 0;
  5066.                 if (e) {
  5067.                     var t = z.dt,
  5068.                         r = 6 * t,
  5069.                         n = Math.min(1, .2 * z.time),
  5070.                         o = lerp(10, 2, n);
  5071.                     z.geocam.coord_delta[0] = o * r
  5072.                 }
  5073.         }
  5074.     }
  5075.  
  5076.     function b() {
  5077.         o(null), m("idle", !0), de.exit(), be.hide(), t()
  5078.     }
  5079.  
  5080.     function y() {
  5081.         m("idle", !0), de.exit(), be.hide(), t()
  5082.     }
  5083.  
  5084.     function T() {
  5085.         z.time = 1 * (timeNow() - te), z.dt = 1 / 60;
  5086.         var e = Ie(),
  5087.             t = fe.poll_events(e);
  5088.         if (g(t), s(), W) {
  5089.             if (d(), i(), u(), "demo" == Se && de.update(z), z.pick_required) {
  5090.                 var r = he.pick(z, Ne[0], Ne[1]);
  5091.                 r !== z.pick_index && (X.style.cursor = 0 > r ? "default" : "pointer", z.pick_index = r, re = r >= 0 ? he.countries[r] : null), z.pick_required = !1
  5092.             }
  5093.             var n = "dark" === z.palette ? 0 : .9;
  5094.             gl.clearColor(n, n, n, 1), gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT), z.projection.blend > .5 && (pe.draw(z), z.draw_world ? ge.draw(z) : ge.draw(z, -1)), z.draw_world && (he.draw(z), me.draw(z), ve.draw(z), _e.draw(z)), "demo" == Se && (z.demo_time = z.time - z.demo_time_start, de.draw(z)), be.draw(z), "idle" == Se && ye.draw(z), Te.draw(z)
  5095.         }
  5096.     }
  5097.  
  5098.     function w() {
  5099.         X.width = X.clientWidth, O || C ? X.height = X.clientHeight : platformDetection.isMobile ? X.height = parseInt($(window).innerHeight()) - (parseInt($(".header").height()) + 45) : X.height = parseInt($(window).innerHeight()) - (parseInt($(".header").height()) + parseInt($(".footer").height()));
  5100.         var e = X.width / X.height;
  5101.         1 > e ? z.camera.fov = 60 / e : z.camera.fov = 60, gl.viewport(0, 0, X.width, X.height), vec4.copy(z.camera.viewport, gl.getParameter(gl.VIEWPORT))
  5102.     }
  5103.  
  5104.     function E(e) {
  5105.         if (!O && !C) {
  5106.             var r = 5;
  5107.             if (!(e > r)) {
  5108.                 if (z.pick_index < 0) return o(null), void a();
  5109.                 t();
  5110.                 var n = he.countries[z.pick_index];
  5111.                 n === j ? (o(null), a()) : (vec3.set(z.geocam.coord_target, n.center[0], n.center[1], U), o(n)), D(null)
  5112.             }
  5113.         }
  5114.     }
  5115.  
  5116.     function x() {
  5117.         X.addEventListener("DOMMouseScroll", function(e) {
  5118.             return e.wheelDelta = -120 * e.detail, Oe.mousewheel(e)
  5119.         }, !1), _.each(Oe, function(e, t) {
  5120.             X.addEventListener(t, e, !1)
  5121.         }), document.addEventListener("mouseup", function(e) {
  5122.             We = -1
  5123.         }, !1)
  5124.     }
  5125.  
  5126.     function A() {
  5127.         function e(e, t) {
  5128.             var r = t.touches[0] || t.changedTouches[0],
  5129.                 n = X.getBoundingClientRect(),
  5130.                 o = r.clientX - n.left,
  5131.                 a = r.clientY - n.top;
  5132.             e[0] = o, e[1] = a
  5133.         }
  5134.  
  5135.         function t(e) {
  5136.             if (2 !== e.touches.length) return 0;
  5137.             var t = X.getBoundingClientRect(),
  5138.                 r = e.touches[0],
  5139.                 n = e.touches[1];
  5140.             return vec2.set(a, r.clientX - t.left, r.clientY - t.top), vec2.set(i, n.clientX - t.left, n.clientY - t.top), vec2.dist(a, i)
  5141.         }
  5142.         var r = 0,
  5143.             n = "none",
  5144.             o = vec2.create(),
  5145.             a = vec2.create(),
  5146.             i = vec2.create();
  5147.         X.addEventListener("touchstart", function(i) {
  5148.             var u = i.touches.length;
  5149.             2 == u ? (r = t(i), n = "pinch") : 1 == u && (e(a, i), vec2.copy(o, a), z.pick_required = !0, vec2.copy(Ne, o), n = "drag"), i.preventDefault(), i.stopPropagation()
  5150.         }, !1), X.addEventListener("touchend", function(t) {
  5151.             if ("drag" == n) {
  5152.                 e(i, t);
  5153.                 var r = vec2.dist(o, i);
  5154.                 E(r)
  5155.             }
  5156.             return n = "none", !1
  5157.         }, !1), X.addEventListener("touchmove", function(o) {
  5158.             if ("drag" == n) {
  5159.                 e(i, o);
  5160.                 var u = i[0] - a[0],
  5161.                     c = i[1] - a[1];
  5162.                 vec2.copy(a, i);
  5163.                 var l = z.geocam.coord_delta;
  5164.                 l[0] -= .03 * u, l[1] += .03 * c
  5165.             } else if ("pinch" == n) {
  5166.                 var s = t(o),
  5167.                     f = s / r,
  5168.                     l = z.geocam.coord_delta;
  5169.                 l[2] = 1 > f ? .02 / f : -.02 * f
  5170.             }
  5171.             return !1
  5172.         }, !1)
  5173.     }
  5174.  
  5175.     function M() {
  5176.         z.projection.dir = -z.projection.dir, z.projection.dir > 0 && a()
  5177.     }
  5178.  
  5179.     function R(e, t, r) {
  5180.         e = e.toUpperCase();
  5181.         var n = _.where(GTW.systems, {
  5182.             name: e
  5183.         })[0];
  5184.         return "undefined" == typeof r ? n[t] = !n[t] : n[t] = r
  5185.     }
  5186.  
  5187.     function P(e) {
  5188.         if (!MAP.is_bad_mode)
  5189.             if (e) {
  5190.                 var t = GTW.systems[e],
  5191.                     r = t.name.toLowerCase(),
  5192.                     n = {
  5193.                         top: Math.round(.7 * $(window).height()),
  5194.                         left: Math.round(.2 * $(window).width())
  5195.                     },
  5196.                     o = $(".type-icons .symbol." + r).offset();
  5197.                 o.top = o.top - 35;
  5198.                 var a = 0,
  5199.                     i = Math.round(o.top - n.top),
  5200.                     u = $("#systempop_line")[0];
  5201.                 if (!u) return void console.log("solo_system_line: no canvas");
  5202.                 var c = u.getContext("2d");
  5203.                 o.left = o.left + parseInt($(".type-icons .symbol." + r).outerWidth()) / 2, a = o.left > n.left ? Math.round(o.left - n.left) : o.left < n.left ? Math.round(n.left - o.left) : 1, $("#systempop_line").attr("width", a).attr("height", i).css({
  5204.                     width: a,
  5205.                     height: i,
  5206.                     top: n.top
  5207.                 }), o.left > n.left ? $("#systempop_line").css({
  5208.                     left: n.left
  5209.                 }) : o.left < n.left ? $("#systempop_line").css({
  5210.                     left: o.left
  5211.                 }) : $("#systempop_line").css({
  5212.                     left: n.left
  5213.                 }), c.beginPath(), o.left > n.left ? (c.moveTo(.5, 0), c.lineTo(.5, Math.floor(i / 2) + .5), c.lineTo(a - .5, Math.floor(i / 2) + .5), c.lineTo(a - .5, i)) : o.left < n.left ? (c.moveTo(a - .5, 0), c.lineTo(a - .5, Math.floor(i / 2) + .5), c.lineTo(.5, Math.floor(i / 2) + .5), c.lineTo(.5, i)) : (c.moveTo(.5, 0), c.lineTo(.5, i)), c.lineWidth = 1, c.strokeStyle = "#FFFFFF", c.stroke(), $("#systempop_line").fadeIn()
  5214.             } else $("#systempop_line").fadeOut()
  5215.     }
  5216.  
  5217.     function L() {
  5218.         var e = !1;
  5219.         GTW.systems_foreach(function(t, r) {
  5220.             t.enabled && $("#systempop").is(":visible") && (P(+r), e = !0)
  5221.         }), e || P(null)
  5222.     }
  5223.  
  5224.     function D(e) {
  5225.         var t = function() {
  5226.             var e = [];
  5227.             return GTW.systems_foreach(function(t) {
  5228.                 e.push(t.name.toLowerCase())
  5229.             }), e.join(" ")
  5230.         }();
  5231.         if (e) {
  5232.             var r = GTW.systems[e],
  5233.                 n = r.name.toLowerCase(),
  5234.                 o = $(".subpage .subsystems_content .subsystem_block." + n + " .subsystem_block_content").html(),
  5235.                 a = $("<i>").addClass("icon"),
  5236.                 i = $("<div>");
  5237.             i.html(o), $("img", i).remove(), i.prepend(a), $("#systempop").removeClass(t).empty().html(""), $("#systempop").addClass(n).append(i).fadeIn()
  5238.         } else $("#systempop").fadeOut(400, function() {
  5239.             $("#systempop").removeClass(t).empty().html("")
  5240.         });
  5241.         P(e)
  5242.     }
  5243.  
  5244.     function S(e) {
  5245.         var e = _.filter(he.countries, function(t) {
  5246.             return Ve(t, 30) == e
  5247.         });
  5248.         return _.sample(e)
  5249.     }
  5250.  
  5251.     function F() {
  5252.         var e = _.sample(GTW.top_infected),
  5253.             t = he.key_to_country[e];
  5254.         return t
  5255.     }
  5256.  
  5257.     function k(e, t) {
  5258.         if (e && !O) {
  5259.             b();
  5260.             var r = e.center;
  5261.             z.geocam.lerp_speed = .015, vec3.set(z.geocam.coord_target, r[0], r[1], U), t = t || r, setTimeout(function() {
  5262.                 _e.set_coord(t)
  5263.             }, 3e3), B && (q = setTimeout(function() {
  5264.                 o(e)
  5265.             }, 5e3))
  5266.         }
  5267.     }
  5268.  
  5269.     function G() {
  5270.         if (N.got_country_data) {
  5271.             var e = {};
  5272.             _.each(he.countries, function(t) {
  5273.                 e[t.key] = {
  5274.                     key: t.key,
  5275.                     name: t.name
  5276.                 }
  5277.             }), N.got_country_data(e)
  5278.         }
  5279.     }
  5280.     var I = 1.6,
  5281.         U = 1,
  5282.         N = e.functions,
  5283.         B = "high" == e.quality,
  5284.         W = !0,
  5285.         O = !!e.widget,
  5286.         C = !!e.screensaver,
  5287.         j = null,
  5288.         q = null;
  5289.     setInterval(n, 500), $("#countrypop").on("click", ".popclose", function() {
  5290.         o(null)
  5291.     }), $("#topinfected").on("click", "li", function(e) {
  5292.         b();
  5293.         var t = this.dataset.key,
  5294.             r = he.key_to_country[t];
  5295.         r && (vec3.set(z.geocam.coord_target, r.center[0], r.center[1], U), o(r))
  5296.     });
  5297.     var V = key.noConflict(),
  5298.         X = $("#webgl-canvas")[0];
  5299.     if (window.gl = webgl.setupCanvas(X, {
  5300.             antialias: B ? !0 : !1,
  5301.             extensions: B ? ["WEBKIT_EXT_texture_filter_anisotropic"] : [],
  5302.             shaderSources: [GTW.SHADER_SOURCES || "assets/map/shaders/all-shaders.glsl", "assets/map/shaders/demo-shaders.glsl"]
  5303.         }), !window.gl) return console.warn("WebGL initialization failed."), $("#webgl-splash").show(), $("#webgl-proceed").on("click", function() {
  5304.         $("#webgl-splash").hide()
  5305.     }), MAP.lang = "en", void _.assign(MAP, {
  5306.         zoom_in: function() {},
  5307.         zoom_out: function() {},
  5308.         set_view: function() {},
  5309.         set_language: function(e) {
  5310.             MAP.lang = e
  5311.         },
  5312.         set_palette: function() {},
  5313.         toggle_palette: function() {},
  5314.         toggle_map: function(e) {},
  5315.         toggle_graph: function(e) {}
  5316.     });
  5317.     var z = {
  5318.             camera: new GTW.Camera,
  5319.             flash: function(e) {
  5320.                 Te.flash(e)
  5321.             },
  5322.             high_quality: B,
  5323.             orbit: {
  5324.                 rotate: vec3.fromValues(deg2rad(15), 0, 0),
  5325.                 translate: vec3.fromValues(0, 0, -20),
  5326.                 pos: vec3.create(),
  5327.                 dir: vec3.create()
  5328.             },
  5329.             geocam: {
  5330.                 coord: vec3.fromValues(0, 0, 5),
  5331.                 coord_target: vec3.fromValues(0, 0, 2),
  5332.                 coord_delta: vec3.create(),
  5333.                 lerp_speed: .2
  5334.             },
  5335.             camera_mode: "geocam",
  5336.             time: timeNow(),
  5337.             demo_time_start: 0,
  5338.             demo_time: 0,
  5339.             pickRay: null,
  5340.             light: {
  5341.                 position: vec3.fromValues(20, 20, -20),
  5342.                 position2: vec3.fromValues(20, -25, -20)
  5343.             },
  5344.             project: function(e, t) {
  5345.                 this.projection.blend < .5 ? GTW.project_mercator(e, t) : GTW.project_ecef(e, t)
  5346.             },
  5347.             projection: {
  5348.                 blend: 1,
  5349.                 dir: 1
  5350.             },
  5351.             pick_required: !1,
  5352.             pick_index: -1,
  5353.             palette: "dark",
  5354.             solo_system_id: 1,
  5355.             draw_world: !0
  5356.         },
  5357.         H = [-90, 30.0444];
  5358.     vec2.copy(z.geocam.coord, H), vec2.copy(z.geocam.coord_target, H), z.camera.near = .01, z.camera.far = 200, MAP._env = z, (O || C) && (z.camera.near = 1);
  5359.     var Y = {
  5360.             mat4: mat4.create(),
  5361.             vec3: vec3.create(),
  5362.             vec4: vec4.create()
  5363.         },
  5364.         K = vec3.create(),
  5365.         Q = vec3.create(),
  5366.         Z = vec3.create(),
  5367.         J = vec3.create(),
  5368.         ee = {
  5369.             mercator: [.15, 1],
  5370.             ecef: [.35, 4.5]
  5371.         },
  5372.         te = timeNow(),
  5373.         re = null,
  5374.         ne = null,
  5375.         oe = null,
  5376.         ae = 0,
  5377.         ie = 0,
  5378.         ue = 0,
  5379.         ce = 100;
  5380.     GTW.systems_foreach(function(e) {
  5381.         e.graph = new Int32Array(ce)
  5382.     });
  5383.     var le = 0,
  5384.         se = 100,
  5385.         fe = new GTW.Simulator,
  5386.         ve = new GTW.MissileSystem(z),
  5387.         pe = new GTW.Stars,
  5388.         ge = new GTW.Corona,
  5389.         he = new GTW.World,
  5390.         me = new GTW.Labels,
  5391.         de = GTW.init_demo(z, ve),
  5392.         _e = GTW.init_marker(z),
  5393.         be = GTW.init_hedgehog(),
  5394.         ye = GTW.init_connectors(),
  5395.         Te = GTW.init_flash(),
  5396.         we = 0,
  5397.         Ee = 0,
  5398.         xe = 0,
  5399.         Ae = $("#countrypop #ranking"),
  5400.         Me = $("#topinfectedlist"),
  5401.         Re = vec3.create(),
  5402.         Pe = vec3.create(),
  5403.         Le = !1,
  5404.         De = function() {
  5405.             var e = [0, 0, 0, 0, 0];
  5406.             return function() {
  5407.                 if (N.stats_top5) {
  5408.                     for (var t = !1, r = 0; 5 > r; ++r) {
  5409.                         var n = GTW.top_infected[r];
  5410.                         if (e[r] !== n) {
  5411.                             t = !0;
  5412.                             break
  5413.                         }
  5414.                     }
  5415.                     if (t) {
  5416.                         for (var o = [], r = 0; 5 > r; ++r) {
  5417.                             var n = GTW.top_infected[r];
  5418.                             e[r] = n;
  5419.                             var a = he.key_to_country[n];
  5420.                             a && o.push({
  5421.                                 key: n,
  5422.                                 name: a.name
  5423.                             })
  5424.                         }
  5425.                         N.stats_top5(o)
  5426.                     }
  5427.                 }
  5428.             }
  5429.         }(),
  5430.         Se = "idle",
  5431.         Fe = 0,
  5432.         ke = "idle";
  5433.     m("idle");
  5434.     var Ge = function() {
  5435.             var e = 0;
  5436.             return function() {
  5437.                 return Date.now() + e
  5438.             }
  5439.         }(),
  5440.         Ie = function() {
  5441.             var e = Ge(),
  5442.                 t = 1e3;
  5443.             return function() {
  5444.                 var r = Ge();
  5445.                 return r - e > t && (Le = !0), e = r, r
  5446.             }
  5447.         }(),
  5448.         Ue = function() {
  5449.             function e() {
  5450.                 t && (requestAnimationFrame(e), T())
  5451.             }
  5452.             var t = !1;
  5453.             return {
  5454.                 start: function() {
  5455.                     t || (t = !0, Le = !0, e())
  5456.                 },
  5457.                 stop: function() {
  5458.                     t = !1
  5459.                 }
  5460.             }
  5461.         }();
  5462.     window.addEventListener("resize", w, !1), w();
  5463.     var Ne = [0, 0],
  5464.         Be = [0, 0],
  5465.         We = -1;
  5466.     X.oncontextmenu = function() {
  5467.         return !1
  5468.     };
  5469.     var Oe = {
  5470.         mousedown: function(e) {
  5471.             return y(), Ne = Be = getMouseEventOffset(e), We = e.button, e.preventDefault(), !1
  5472.         },
  5473.         mouseup: function(e) {
  5474.             var t = getMouseEventOffset(e),
  5475.                 r = vec2.dist(t, Be);
  5476.             return E(r), We = -1, !1
  5477.         },
  5478.         mousemove: function(e) {
  5479.             var t = getMouseEventOffset(e),
  5480.                 r = t[0] - Ne[0],
  5481.                 n = t[1] - Ne[1];
  5482.             if (Ne = t, "orbit" == z.camera_mode) switch (We) {
  5483.                 case 0:
  5484.                     z.orbit.rotate[0] += .0025 * n, z.orbit.rotate[1] += .0025 * r;
  5485.                     break;
  5486.                 case 1:
  5487.                     z.orbit.translate[0] += .01 * r, z.orbit.translate[1] += .01 * n;
  5488.                     break;
  5489.                 case 2:
  5490.                     var o = Math.abs(r) > Math.abs(n) ? r : -n;
  5491.                     z.orbit.translate[2] += .05 * o;
  5492.                     break;
  5493.                 default:
  5494.                     z.pick_required = !0
  5495.             } else if ("geocam" == z.camera_mode) {
  5496.                 var a = z.geocam.coord_delta;
  5497.                 switch (We) {
  5498.                     case 0:
  5499.                         a[0] -= .03 * r, a[1] += .03 * n;
  5500.                         break;
  5501.                     case 2:
  5502.                         var o = Math.abs(r) > Math.abs(n) ? r : -n;
  5503.                         a[2] = -.01 * o;
  5504.                         break;
  5505.                     default:
  5506.                         z.pick_required = !0
  5507.                 }
  5508.             }
  5509.             return !1
  5510.         },
  5511.         mousewheel: function(e) {
  5512.             b(), e.preventDefault();
  5513.             var t = .9,
  5514.                 r = e.wheelDelta / 120;
  5515.             return "orbit" == z.camera_mode ? z.orbit.translate[2] *= 0 > r ? t : 1 / t : "geocam" == z.camera_mode && (z.geocam.coord_delta[2] -= .01 * r), !1
  5516.         }
  5517.     };
  5518.     if (O || C);
  5519.     else {
  5520.         var Ce = "ontouchstart" in document.documentElement;
  5521.         Ce ? A() : x()
  5522.     }
  5523.     var je = {};
  5524.     _.each(je, function(e, t) {
  5525.         V(t, e)
  5526.     }), Ue.start(), $(".toggle").on("click", function(e) {
  5527.         return $(this).toggleClass("disabled"), "projection" == this.id ? void M() : void 0
  5528.     }), MAP.lang = "en";
  5529.     var qe = .025;
  5530.     _.assign(MAP, {
  5531.         zoom_in: function() {
  5532.             z.geocam.coord_delta[2] -= qe
  5533.         },
  5534.         zoom_out: function() {
  5535.             z.geocam.coord_delta[2] += qe
  5536.         },
  5537.         set_view: function(e) {
  5538.             "flat" == e ? (z.projection.dir = -1, me.project_labels("mercator"), a(), o(null), this.set_demo(!1), N.set_view_state("flat")) : "globe" == e && (z.projection.dir = 1, me.project_labels("ecef"), a(), o(null), N.set_view_state("globe"))
  5539.         },
  5540.         set_language: function(e) {
  5541.             MAP.lang !== e && (MAP.lang = e, me.render_labels(e), me.project_labels(z.projection.blend < .5 ? "mercator" : "ecef"), be.setup(z, he))
  5542.         },
  5543.         set_palette: function(e) {
  5544.             e !== z.palette && (z.palette = e)
  5545.         },
  5546.         toggle_palette: function() {
  5547.             this.set_palette("dark" === z.palette ? "light" : "dark")
  5548.         },
  5549.         toggle_map: function(e, t) {
  5550.             return R(e, "enabled", t)
  5551.         },
  5552.         toggle_graph: function(e, t) {
  5553.             return R(e, "enabled_graph", t)
  5554.         },
  5555.         set_demo: function(e) {
  5556.             B && (N.hide_country_popup(), e ? m("spin_1") : (m("idle"), z.draw_world = !0, ve.set_mode("world"), be.hide(), o(null)))
  5557.         },
  5558.         get_demo: function() {
  5559.             return "idle" != Se
  5560.         },
  5561.         pause: function() {
  5562.             W = !1
  5563.         },
  5564.         resume: function() {
  5565.             W = !0
  5566.         },
  5567.         attach_graph_canvas: function(e) {
  5568.             c(e)
  5569.         },
  5570.         detach_graph_canvas: function() {
  5571.             this.attach_graph_canvas(null)
  5572.         }
  5573.     });
  5574.     var Ve = function() {
  5575.             var e = vec3.create(),
  5576.                 t = vec3.create(),
  5577.                 r = vec3.create();
  5578.             return function(n, o) {
  5579.                 if (z.projection.blend < .5) return !0;
  5580.                 var a = Math.cos(deg2rad(o || 90));
  5581.                 return vec2.copy(r, n.center), z.project(e, r), vec3.normalize(t, e), vec3.dot(t, z.camera.viewDir) < -a
  5582.             }
  5583.         }(),
  5584.         Xe = !1;
  5585.     he.on("loaded", function() {
  5586.         function e() {
  5587.             var e = he.geoip;
  5588.             k(e.country, e.coord)
  5589.         }
  5590.         if (G(), !MAP.is_bad_mode)
  5591.             if (he.geoip) {
  5592.                 setTimeout(e, 1e3);
  5593.                 var t = he.geoip;
  5594.                 me.geoip_iso2 = t.country.iso2, me.project_labels("ecef"), N.got_geoip_data(t.country.key)
  5595.             } else Xe = !0, N.got_geoip_data(-1)
  5596.     }), $(window).resize(function() {
  5597.         L()
  5598.     }), MAP.is_bad_mode && GTW.systems_foreach(function(e) {
  5599.         e.enabled = "BAD" == e.name, m("spin_1")
  5600.     })
  5601. };
Advertisement
Add Comment
Please, Sign In to add comment