Plan your vaccine: Everything you need to know about getting a Covid-19 vaccination
“)
}
function Sp(t) {
return new RegExp(“^(?:” + t.map(Ap).join(“|”) + “)”, “i”)
}
function kp(t) {
for (var n = {}, e = -1, r = t.length; ++e 68 ? 1900 : 2e3), e + r[0].length) : -1
}
function Lp(t, n, e) {
var r = /^(Z)|([+-]dd)(?::?(dd))?/.exec(n.slice(e, e + 6));
return r ? (t.Z = r[1] ? 0 : -(r[2] + (r[3] || “00”)), e + r[0].length) : -1
}
function Up(t, n, e) {
var r = wp.exec(n.slice(e, e + 1));
return r ? (t.q = 3 * r[0] – 3, e + r[0].length) : -1
}
function Op(t, n, e) {
var r = wp.exec(n.slice(e, e + 2));
return r ? (t.m = r[0] – 1, e + r[0].length) : -1
}
function Bp(t, n, e) {
var r = wp.exec(n.slice(e, e + 2));
return r ? (t.d = +r[0], e + r[0].length) : -1
}
function Fp(t, n, e) {
var r = wp.exec(n.slice(e, e + 3));
return r ? (t.m = 0, t.d = +r[0], e + r[0].length) : -1
}
function Yp(t, n, e) {
var r = wp.exec(n.slice(e, e + 2));
return r ? (t.H = +r[0], e + r[0].length) : -1
}
function Ip(t, n, e) {
var r = wp.exec(n.slice(e, e + 2));
return r ? (t.M = +r[0], e + r[0].length) : -1
}
function Hp(t, n, e) {
var r = wp.exec(n.slice(e, e + 2));
return r ? (t.S = +r[0], e + r[0].length) : -1
}
function jp(t, n, e) {
var r = wp.exec(n.slice(e, e + 3));
return r ? (t.L = +r[0], e + r[0].length) : -1
}
function Xp(t, n, e) {
var r = wp.exec(n.slice(e, e + 6));
return r ? (t.L = Math.floor(r[0] / 1e3), e + r[0].length) : -1
}
function Vp(t, n, e) {
var r = Mp.exec(n.slice(e, e + 1));
return r ? e + r[0].length : -1
}
function Gp(t, n, e) {
var r = wp.exec(n.slice(e));
return r ? (t.Q = +r[0], e + r[0].length) : -1
}
function $p(t, n, e) {
var r = wp.exec(n.slice(e));
return r ? (t.s = +r[0], e + r[0].length) : -1
}
function Wp(t, n) {
return Tp(t.getDate(), n, 2)
}
function Zp(t, n) {
return Tp(t.getHours(), n, 2)
}
function Qp(t, n) {
return Tp(t.getHours() % 12 || 12, n, 2)
}
function Kp(t, n) {
return Tp(1 + Nd.count(Hd(t), t), n, 3)
}
function Jp(t, n) {
return Tp(t.getMilliseconds(), n, 3)
}
function tv(t, n) {
return Jp(t, n) + “000”
}
function nv(t, n) {
return Tp(t.getMonth() + 1, n, 2)
}
function ev(t, n) {
return Tp(t.getMinutes(), n, 2)
}
function rv(t, n) {
return Tp(t.getSeconds(), n, 2)
}
function iv(t) {
var n = t.getDay();
return 0 === n ? 7 : n
}
function ov(t, n) {
return Tp(Sd.count(Hd(t) – 1, t), n, 2)
}
function av(t, n) {
var e = t.getDay();
return t = e >= 4 || 0 === e ? Pd(t) : Pd.ceil(t), Tp(Pd.count(Hd(t), t) + (4 === Hd(t).getDay()), n, 2)
}
function uv(t) {
return t.getDay()
}
function cv(t, n) {
return Tp(kd.count(Hd(t) – 1, t), n, 2)
}
function fv(t, n) {
return Tp(t.getFullYear() % 100, n, 2)
}
function sv(t, n) {
return Tp(t.getFullYear() % 1e4, n, 4)
}
function lv(t) {
var n = t.getTimezoneOffset();
return (n > 0 ? “-” : (n *= -1, “+”)) + Tp(n / 60 | 0, “0”, 2) + Tp(n % 60, “0”, 2)
}
function hv(t, n) {
return Tp(t.getUTCDate(), n, 2)
}
function dv(t, n) {
return Tp(t.getUTCHours(), n, 2)
}
function pv(t, n) {
return Tp(t.getUTCHours() % 12 || 12, n, 2)
}
function vv(t, n) {
return Tp(1 + Wd.count(pp(t), t), n, 3)
}
function gv(t, n) {
return Tp(t.getUTCMilliseconds(), n, 3)
}
function yv(t, n) {
return gv(t, n) + “000”
}
function _v(t, n) {
return Tp(t.getUTCMonth() + 1, n, 2)
}
function bv(t, n) {
return Tp(t.getUTCMinutes(), n, 2)
}
function mv(t, n) {
return Tp(t.getUTCSeconds(), n, 2)
}
function xv(t) {
var n = t.getUTCDay();
return 0 === n ? 7 : n
}
function wv(t, n) {
return Tp(Kd.count(pp(t) – 1, t), n, 2)
}
function Mv(t, n) {
var e = t.getUTCDay();
return t = e >= 4 || 0 === e ? ep(t) : ep.ceil(t), Tp(ep.count(pp(t), t) + (4 === pp(t).getUTCDay()), n, 2)
}
function Nv(t) {
return t.getUTCDay()
}
function Tv(t, n) {
return Tp(Jd.count(pp(t) – 1, t), n, 2)
}
function Av(t, n) {
return Tp(t.getUTCFullYear() % 100, n, 2)
}
function Sv(t, n) {
return Tp(t.getUTCFullYear() % 1e4, n, 4)
}
function kv() {
return “+0000”
}
function Ev() {
return “%”
}
function Cv(t) {
return +t
}
function Pv(t) {
return Math.floor(+t / 1e3)
}
function zv(n) {
return mp = bp(n), t.timeFormat = mp.format, t.timeParse = mp.parse, t.utcFormat = mp.utcFormat, t.utcParse = mp.utcParse, mp
}
zv({
dateTime: “%x, %X”,
date: “%-m/%-d/%Y”,
time: “%-I:%M:%S %p”,
periods: [“AM”, “PM”],
days: [“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”],
shortDays: [“Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”],
months: [“January”, “February”, “March”, “April”, “May”, “June”, “July”, “August”, “September”, “October”, “November”, “December”],
shortMonths: [“Jan”, “Feb”, “Mar”, “Apr”, “May”, “Jun”, “Jul”, “Aug”, “Sep”, “Oct”, “Nov”, “Dec”]
});
var Rv = Date.prototype.toISOString ? function(t) {
return t.toISOString()
} : t.utcFormat(“%Y-%m-%dT%H:%M:%S.%LZ”);
var Dv = +new Date(“2000-01-01T00:00:00.000Z”) ? function(t) {
var n = new Date(t);
return isNaN(n) ? null : n
} : t.utcParse(“%Y-%m-%dT%H:%M:%S.%LZ”),
qv = 1e3,
Lv = 60 * qv,
Uv = 60 * Lv,
Ov = 24 * Uv,
Bv = 7 * Ov,
Fv = 30 * Ov,
Yv = 365 * Ov;
function Iv(t) {
return new Date(t)
}
function Hv(t) {
return t instanceof Date ? +t : +new Date(+t)
}
function jv(t, n, r, i, o, a, u, c, f) {
var s = Vh(Bh, Bh),
l = s.invert,
h = s.domain,
d = f(“.%L”),
p = f(“:%S”),
v = f(“%I:%M”),
g = f(“%I %p”),
y = f(“%a %d”),
_ = f(“%b %d”),
b = f(“%B”),
m = f(“%Y”),
x = [
[u, 1, qv],
[u, 5, 5 * qv],
[u, 15, 15 * qv],
[u, 30, 30 * qv],
[a, 1, Lv],
[a, 5, 5 * Lv],
[a, 15, 15 * Lv],
[a, 30, 30 * Lv],
[o, 1, Uv],
[o, 3, 3 * Uv],
[o, 6, 6 * Uv],
[o, 12, 12 * Uv],
[i, 1, Ov],
[i, 2, 2 * Ov],
[r, 1, Bv],
[n, 1, Fv],
[n, 3, 3 * Fv],
[t, 1, Yv]
];
function M(e) {
return (u(e) = 1 ? Cy : t C * C + P * P && (N = A, T = S), {
cx: N,
cy: T,
x01: -s,
y01: -l,
x11: N * (i / x – 1),
y11: T * (i / x – 1)
}
}
function By(t) {
this._context = t
}
function Fy(t) {
return new By(t)
}
function Yy(t) {
return t[0]
}
function Iy(t) {
return t[1]
}
function Hy() {
var t = Yy,
n = Iy,
e = my(!0),
r = null,
i = Fy,
o = null;
function a(a) {
var u, c, f, s = a.length,
l = !1;
for (null == r && (o = i(f = no())), u = 0; u = s; –l) u.point(g[l], y[l]);
u.lineEnd(), u.areaEnd()
} v && (g[f] = +t(h, f, c), y[f] = +e(h, f, c), u.point(n ? +n(h, f, c) : g[f], r ? +r(h, f, c) : y[f]))
}
if (d) return u = null, d + “” || null
}
function f() {
return Hy().defined(i).curve(a).context(o)
}
return c.x = function(e) {
return arguments.length ? (t = “function” == typeof e ? e : my(+e), n = null, c) : t
}, c.x0 = function(n) {
return arguments.length ? (t = “function” == typeof n ? n : my(+n), c) : t
}, c.x1 = function(t) {
return arguments.length ? (n = null == t ? null : “function” == typeof t ? t : my(+t), c) : n
}, c.y = function(t) {
return arguments.length ? (e = “function” == typeof t ? t : my(+t), r = null, c) : e
}, c.y0 = function(t) {
return arguments.length ? (e = “function” == typeof t ? t : my(+t), c) : e
}, c.y1 = function(t) {
return arguments.length ? (r = null == t ? null : “function” == typeof t ? t : my(+t), c) : r
}, c.lineX0 = c.lineY0 = function() {
return f().x(t).y(e)
}, c.lineY1 = function() {
return f().x(t).y(r)
}, c.lineX1 = function() {
return f().x(n).y(e)
}, c.defined = function(t) {
return arguments.length ? (i = “function” == typeof t ? t : my(!!t), c) : i
}, c.curve = function(t) {
return arguments.length ? (a = t, null != o && (u = a(o)), c) : a
}, c.context = function(t) {
return arguments.length ? (null == t ? o = u = null : u = a(o = t), c) : o
}, c
}
function Xy(t, n) {
return n t ? 1 : n >= t ? 0 : NaN
}
function Vy(t) {
return t
}
By.prototype = {
areaStart: function() {
this._line = 0
},
areaEnd: function() {
this._line = NaN
},
lineStart: function() {
this._point = 0
},
lineEnd: function() {
(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 – this._line
},
point: function(t, n) {
switch (t = +t, n = +n, this._point) {
case 0:
this._point = 1, this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n);
break;
case 1:
this._point = 2;
default:
this._context.lineTo(t, n)
}
}
};
var Gy = Wy(Fy);
function $y(t) {
this._curve = t
}
function Wy(t) {
function n(n) {
return new $y(t(n))
}
return n._curve = t, n
}
function Zy(t) {
var n = t.curve;
return t.angle = t.x, delete t.x, t.radius = t.y, delete t.y, t.curve = function(t) {
return arguments.length ? n(Wy(t)) : n()._curve
}, t
}
function Qy() {
return Zy(Hy().curve(Gy))
}
function Ky() {
var t = jy().curve(Gy),
n = t.curve,
e = t.lineX0,
r = t.lineX1,
i = t.lineY0,
o = t.lineY1;
return t.angle = t.x, delete t.x, t.startAngle = t.x0, delete t.x0, t.endAngle = t.x1, delete t.x1, t.radius = t.y, delete t.y, t.innerRadius = t.y0, delete t.y0, t.outerRadius = t.y1, delete t.y1, t.lineStartAngle = function() {
return Zy(e())
}, delete t.lineX0, t.lineEndAngle = function() {
return Zy(r())
}, delete t.lineX1, t.lineInnerRadius = function() {
return Zy(i())
}, delete t.lineY0, t.lineOuterRadius = function() {
return Zy(o())
}, delete t.lineY1, t.curve = function(t) {
return arguments.length ? n(Wy(t)) : n()._curve
}, t
}
function Jy(t, n) {
return [(n = +n) * Math.cos(t -= Math.PI / 2), n * Math.sin(t)]
}
$y.prototype = {
areaStart: function() {
this._curve.areaStart()
},
areaEnd: function() {
this._curve.areaEnd()
},
lineStart: function() {
this._curve.lineStart()
},
lineEnd: function() {
this._curve.lineEnd()
},
point: function(t, n) {
this._curve.point(n * Math.sin(t), n * -Math.cos(t))
}
};
var t_ = Array.prototype.slice;
function n_(t) {
return t.source
}
function e_(t) {
return t.target
}
function r_(t) {
var n = n_,
e = e_,
r = Yy,
i = Iy,
o = null;
function a() {
var a, u = t_.call(arguments),
c = n.apply(this, u),
f = e.apply(this, u);
if (o || (o = a = no()), t(o, +r.apply(this, (u[0] = c, u)), +i.apply(this, u), +r.apply(this, (u[0] = f, u)), +i.apply(this, u)), a) return o = null, a + “” || null
}
return a.source = function(t) {
return arguments.length ? (n = t, a) : n
}, a.target = function(t) {
return arguments.length ? (e = t, a) : e
}, a.x = function(t) {
return arguments.length ? (r = “function” == typeof t ? t : my(+t), a) : r
}, a.y = function(t) {
return arguments.length ? (i = “function” == typeof t ? t : my(+t), a) : i
}, a.context = function(t) {
return arguments.length ? (o = null == t ? null : t, a) : o
}, a
}
function i_(t, n, e, r, i) {
t.moveTo(n, e), t.bezierCurveTo(n = (n + r) / 2, e, n, i, r, i)
}
function o_(t, n, e, r, i) {
t.moveTo(n, e), t.bezierCurveTo(n, e = (e + i) / 2, r, e, r, i)
}
function a_(t, n, e, r, i) {
var o = Jy(n, e),
a = Jy(n, e = (e + i) / 2),
u = Jy(r, e),
c = Jy(r, i);
t.moveTo(o[0], o[1]), t.bezierCurveTo(a[0], a[1], u[0], u[1], c[0], c[1])
}
var u_ = {
draw: function(t, n) {
var e = Math.sqrt(n / Ey);
t.moveTo(e, 0), t.arc(0, 0, e, 0, Py)
}
},
c_ = {
draw: function(t, n) {
var e = Math.sqrt(n / 5) / 2;
t.moveTo(-3 * e, -e), t.lineTo(-e, -e), t.lineTo(-e, -3 * e), t.lineTo(e, -3 * e), t.lineTo(e, -e), t.lineTo(3 * e, -e), t.lineTo(3 * e, e), t.lineTo(e, e), t.lineTo(e, 3 * e), t.lineTo(-e, 3 * e), t.lineTo(-e, e), t.lineTo(-3 * e, e), t.closePath()
}
},
f_ = Math.sqrt(1 / 3),
s_ = 2 * f_,
l_ = {
draw: function(t, n) {
var e = Math.sqrt(n / s_),
r = e * f_;
t.moveTo(0, -e), t.lineTo(r, 0), t.lineTo(0, e), t.lineTo(-r, 0), t.closePath()
}
},
h_ = Math.sin(Ey / 10) / Math.sin(7 * Ey / 10),
d_ = Math.sin(Py / 10) * h_,
p_ = -Math.cos(Py / 10) * h_,
v_ = {
draw: function(t, n) {
var e = Math.sqrt(.8908130915292852 * n),
r = d_ * e,
i = p_ * e;
t.moveTo(0, -e), t.lineTo(r, i);
for (var o = 1; o 0)
for (var r, i = t[0], o = n[0], a = t[e] – i, u = n[e] – o, c = -1; ++c ky) {
var u = 2 * t._l01_2a + 3 * t._l01_a * t._l12_a + t._l12_2a,
c = 3 * t._l01_a * (t._l01_a + t._l12_a);
r = (r * u – t._x0 * t._l12_2a + t._x2 * t._l01_2a) / c, i = (i * u – t._y0 * t._l12_2a + t._y2 * t._l01_2a) / c
}
if (t._l23_a > ky) {
var f = 2 * t._l23_2a + 3 * t._l23_a * t._l12_a + t._l12_2a,
s = 3 * t._l23_a * (t._l23_a + t._l12_a);
o = (o * f + t._x1 * t._l23_2a – n * t._l12_2a) / s, a = (a * f + t._y1 * t._l23_2a – e * t._l12_2a) / s
}
t._context.bezierCurveTo(r, i, o, a, t._x2, t._y2)
}
function B_(t, n) {
this._context = t, this._alpha = n
}
B_.prototype = {
areaStart: function() {
this._line = 0
},
areaEnd: function() {
this._line = NaN
},
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0
},
lineEnd: function() {
switch (this._point) {
case 2:
this._context.lineTo(this._x2, this._y2);
break;
case 3:
this.point(this._x2, this._y2)
}(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 – this._line
},
point: function(t, n) {
if (t = +t, n = +n, this._point) {
var e = this._x2 – t,
r = this._y2 – n;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(e * e + r * r, this._alpha))
}
switch (this._point) {
case 0:
this._point = 1, this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n);
break;
case 1:
this._point = 2;
break;
case 2:
this._point = 3;
default:
O_(this, t, n)
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = t, this._y0 = this._y1, this._y1 = this._y2, this._y2 = n
}
};
var F_ = function t(n) {
function e(t) {
return n ? new B_(t, n) : new z_(t, 0)
}
return e.alpha = function(n) {
return t(+n)
}, e
}(.5);
function Y_(t, n) {
this._context = t, this._alpha = n
}
Y_.prototype = {
areaStart: N_,
areaEnd: N_,
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0
},
lineEnd: function() {
switch (this._point) {
case 1:
this._context.moveTo(this._x3, this._y3), this._context.closePath();
break;
case 2:
this._context.lineTo(this._x3, this._y3), this._context.closePath();
break;
case 3:
this.point(this._x3, this._y3), this.point(this._x4, this._y4), this.point(this._x5, this._y5)
}
},
point: function(t, n) {
if (t = +t, n = +n, this._point) {
var e = this._x2 – t,
r = this._y2 – n;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(e * e + r * r, this._alpha))
}
switch (this._point) {
case 0:
this._point = 1, this._x3 = t, this._y3 = n;
break;
case 1:
this._point = 2, this._context.moveTo(this._x4 = t, this._y4 = n);
break;
case 2:
this._point = 3, this._x5 = t, this._y5 = n;
break;
default:
O_(this, t, n)
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = t, this._y0 = this._y1, this._y1 = this._y2, this._y2 = n
}
};
var I_ = function t(n) {
function e(t) {
return n ? new Y_(t, n) : new D_(t, 0)
}
return e.alpha = function(n) {
return t(+n)
}, e
}(.5);
function H_(t, n) {
this._context = t, this._alpha = n
}
H_.prototype = {
areaStart: function() {
this._line = 0
},
areaEnd: function() {
this._line = NaN
},
lineStart: function() {
this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0
},
lineEnd: function() {
(this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), this._line = 1 – this._line
},
point: function(t, n) {
if (t = +t, n = +n, this._point) {
var e = this._x2 – t,
r = this._y2 – n;
this._l23_a = Math.sqrt(this._l23_2a = Math.pow(e * e + r * r, this._alpha))
}
switch (this._point) {
case 0:
this._point = 1;
break;
case 1:
this._point = 2;
break;
case 2:
this._point = 3, this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2);
break;
case 3:
this._point = 4;
default:
O_(this, t, n)
}
this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = t, this._y0 = this._y1, this._y1 = this._y2, this._y2 = n
}
};
var j_ = function t(n) {
function e(t) {
return n ? new H_(t, n) : new L_(t, 0)
}
return e.alpha = function(n) {
return t(+n)
}, e
}(.5);
function X_(t) {
this._context = t
}
function V_(t) {
return t = 0; –n) i[n] = (a[n] – i[n + 1]) / o[n];
for (o[r – 1] = (t[r] + i[r – 1]) / 2, n = 0; n 1)
for (var e, r, i, o = 1, a = t[n[0]], u = a.length; o = 0;) e[n] = n;
return e
}
function ib(t, n) {
return t[n]
}
function ob(t) {
var n = t.map(ab);
return rb(t).sort(function(t, e) {
return n[t] – n[e]
})
}
function ab(t) {
for (var n, e = -1, r = 0, i = t.length, o = -1 / 0; ++e o && (o = n, r = e);
return r
}
function ub(t) {
var n = t.map(cb);
return rb(t).sort(function(t, e) {
return n[t] – n[e]
})
}
function cb(t) {
for (var n, e = 0, r = -1, i = t.length; ++r 0)) {
if (o /= h, h 0) {
if (o > l) return;
o > s && (s = o)
}
if (o = r – c, h || !(o l) return;
o > s && (s = o)
} else if (h > 0) {
if (o 0)) {
if (o /= d, d 0) {
if (o > l) return;
o > s && (s = o)
}
if (o = i – f, d || !(o l) return;
o > s && (s = o)
} else if (d > 0) {
if (o 0 || l 0 && (t[0] = [c + s * h, f + s * d]), l = r) return;
if (l > d) {
if (c) {
if (c[1] >= i) return
} else c = [v, e];
o = [v, i]
} else {
if (c) {
if (c[1] 1)
if (l > d) {
if (c) {
if (c[1] >= i) return
} else c = [(e – u) / a, e];
o = [(i – u) / a, i]
} else {
if (c) {
if (c[1] = r) return
} else c = [n, a * n + u];
o = [r, a * r + u]
} else {
if (c) {
if (c[0] = 0 && (this._t = 1 – this._t, this._line = 1 – this._line)
},
point: function(t, n) {
switch (t = +t, n = +n, this._point) {
case 0:
this._point = 1, this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n);
break;
case 1:
this._point = 2;
default:
if (this._t = -Hb)) {
var d = c * c + f * f,
p = s * s + l * l,
v = (l * d – f * p) / h,
g = (c * p – s * d) / h,
y = Ab.pop() || new Sb;
y.arc = t, y.site = i, y.x = v + a, y.y = (y.cy = g + u) + Math.sqrt(v * v + g * g), t.circle = y;
for (var _ = null, b = Fb._; b;)
if (y.y Ib) u = u.L;
else {
if (!((i = o – Ub(u, a)) > Ib)) {
r > -Ib ? (n = u.P, e = u) : i > -Ib ? (n = u, e = u.N) : n = e = u;
break
}
if (!u.R) {
n = u;
break
}
u = u.R
}!
function(t) {
Bb[t.index] = {
site: t,
halfedges: []
}
}(t);
var c = zb(t);
if (Ob.insert(n, c), n || e) {
if (n === e) return Eb(n), e = zb(n.site), Ob.insert(c, e), c.edge = e.edge = yb(n.site, c.site), kb(n), void kb(e);
if (e) {
Eb(n), Eb(e);
var f = n.site,
s = f[0],
l = f[1],
h = t[0] – s,
d = t[1] – l,
p = e.site,
v = p[0] – s,
g = p[1] – l,
y = 2 * (h * g – d * v),
_ = h * h + d * d,
b = v * v + g * g,
m = [(g * _ – d * b) / y + s, (h * b – v * _) / y + l];
bb(e.edge, f, p, m), c.edge = yb(f, t, null, m), e.edge = yb(t, p, null, m), kb(n), kb(e)
} else c.edge = yb(n.site, c.site)
}
}
function Lb(t, n) {
var e = t.site,
r = e[0],
i = e[1],
o = i – n;
if (!o) return r;
var a = t.P;
if (!a) return -1 / 0;
var u = (e = a.site)[0],
c = e[1],
f = c – n;
if (!f) return u;
var s = u – r,
l = 1 / o – 1 / f,
h = s / f;
return l ? (-h + Math.sqrt(h * h – 2 * l * (s * s / (-2 * f) – c + f / 2 + i – o / 2))) / l + r : (r + u) / 2
}
function Ub(t, n) {
var e = t.N;
if (e) return Lb(e, n);
var r = t.site;
return r[1] === n ? r[0] : 1 / 0
}
var Ob, Bb, Fb, Yb, Ib = 1e-6,
Hb = 1e-12;
function jb(t, n, e) {
return (t[0] – e[0]) * (n[1] – t[1]) – (t[0] – n[0]) * (e[1] – t[1])
}
function Xb(t, n) {
return n[1] – t[1] || n[0] – t[0]
}
function Vb(t, n) {
var e, r, i, o = t.sort(Xb).pop();
for (Yb = [], Bb = new Array(t.length), Ob = new hb, Fb = new hb;;)
if (i = Tb, o && (!i || o[1] Ib || Math.abs(i[0][1] – i[1][1]) > Ib) || delete Yb[o]
}(a, u, c, f),
function(t, n, e, r) {
var i, o, a, u, c, f, s, l, h, d, p, v, g = Bb.length,
y = !0;
for (i = 0; i Ib || Math.abs(v – h) > Ib) && (c.splice(u, 0, Yb.push(_b(a, d, Math.abs(p – t) Ib ? [t, Math.abs(l – t) Ib ? [Math.abs(h – r) Ib ? [e, Math.abs(l – e) Ib ? [Math.abs(h – n) = u) return null;
var c = t – i.site[0],
f = n – i.site[1],
s = c * c + f * f;
do {
i = o.cells[r = a], a = null, i.halfedges.forEach(function(e) {
var r = o.edges[e],
u = r.left;
if (u !== i.site && u || (u = r.right)) {
var c = t – u[0],
f = n – u[1],
l = c * c + f * f;
l r ? (r + i) / 2 : Math.min(0, r) || Math.max(0, i), a > o ? (o + a) / 2 : Math.min(0, o) || Math.max(0, a))
}
Qb.prototype = Wb.prototype, t.FormatSpecifier = Ba, t.active = function(t, n) {
var e, r, i = t.__transition;
if (i)
for (r in n = null == n ? null : n + “”, i)
if ((e = i[r]).state > xr && e.name === n) return new Ur([
[t]
], yi, n, +r);
return null
}, t.arc = function() {
var t = Ry,
n = Dy,
e = my(0),
r = null,
i = qy,
o = Ly,
a = Uy,
u = null;
function c() {
var c, f, s = +t.apply(this, arguments),
l = +n.apply(this, arguments),
h = i.apply(this, arguments) – Cy,
d = o.apply(this, arguments) – Cy,
p = xy(d – h),
v = d > h;
if (u || (u = c = no()), l ky)
if (p > Py – ky) u.moveTo(l * My(h), l * Ay(h)), u.arc(0, 0, l, h, d, !v), s > ky && (u.moveTo(s * My(d), s * Ay(d)), u.arc(0, 0, s, d, h, v));
else {
var g, y, _ = h,
b = d,
m = h,
x = d,
w = p,
M = p,
N = a.apply(this, arguments) / 2,
T = N > ky && (r ? +r.apply(this, arguments) : Sy(s * s + l * l)),
A = Ty(xy(l – s) / 2, +e.apply(this, arguments)),
S = A,
k = A;
if (T > ky) {
var E = zy(T / s * Ay(N)),
C = zy(T / l * Ay(N));
(w -= 2 * E) > ky ? (m += E *= v ? 1 : -1, x -= E) : (w = 0, m = x = (h + d) / 2), (M -= 2 * C) > ky ? (_ += C *= v ? 1 : -1, b -= C) : (M = 0, _ = b = (h + d) / 2)
}
var P = l * My(_),
z = l * Ay(_),
R = s * My(x),
D = s * Ay(x);
if (A > ky) {
var q, L = l * My(b),
U = l * Ay(b),
O = s * My(m),
B = s * Ay(m);
if (p 1 ? 0 : t ky ? k > ky ? (g = Oy(O, B, P, z, l, k, v), y = Oy(L, U, R, D, l, k, v), u.moveTo(g.cx + g.x01, g.cy + g.y01), k ky && w > ky ? S > ky ? (g = Oy(R, D, L, U, s, -S, v), y = Oy(P, z, O, B, s, -S, v), u.lineTo(g.cx + g.x01, g.cy + g.y01), S > a,
f = i + 2 * u >> a,
s = bo(20);
function l(r) {
var i = new Float32Array(c * f),
l = new Float32Array(c * f);
r.forEach(function(r, o, s) {
var l = +t(r, o, s) + u >> a,
h = +n(r, o, s) + u >> a,
d = +e(r, o, s);
l >= 0 && l = 0 && h > a), So({
width: c,
height: f,
data: l
}, {
width: c,
height: f,
data: i
}, o >> a), Ao({
width: c,
height: f,
data: i
}, {
width: c,
height: f,
data: l
}, o >> a), So({
width: c,
height: f,
data: l
}, {
width: c,
height: f,
data: i
}, o >> a), Ao({
width: c,
height: f,
data: i
}, {
width: c,
height: f,
data: l
}, o >> a), So({
width: c,
height: f,
data: l
}, {
width: c,
height: f,
data: i
}, o >> a);
var d = s(i);
if (!Array.isArray(d)) {
var p = T(i);
d = w(0, p, d), (d = g(0, Math.floor(p / d) * d, d)).shift()
}
return To().thresholds(d).size([c, f])(i).map(h)
}
function h(t) {
return t.value *= Math.pow(2, -2 * a), t.coordinates.forEach(d), t
}
function d(t) {
t.forEach(p)
}
function p(t) {
t.forEach(v)
}
function v(t) {
t[0] = t[0] * Math.pow(2, a) – u, t[1] = t[1] * Math.pow(2, a) – u
}
function y() {
return c = r + 2 * (u = 3 * o) >> a, f = i + 2 * u >> a, l
}
return l.x = function(n) {
return arguments.length ? (t = “function” == typeof n ? n : bo(+n), l) : t
}, l.y = function(t) {
return arguments.length ? (n = “function” == typeof t ? t : bo(+t), l) : n
}, l.weight = function(t) {
return arguments.length ? (e = “function” == typeof t ? t : bo(+t), l) : e
}, l.size = function(t) {
if (!arguments.length) return [r, i];
var n = Math.ceil(t[0]),
e = Math.ceil(t[1]);
if (!(n >= 0 || n >= 0)) throw new Error(“invalid size”);
return r = n, i = e, y()
}, l.cellSize = function(t) {
if (!arguments.length) return 1 = 1)) throw new Error(“invalid cell size”);
return a = Math.floor(Math.log(t) / Math.LN2), y()
}, l.thresholds = function(t) {
return arguments.length ? (s = “function” == typeof t ? t : Array.isArray(t) ? bo(yo.call(t)) : bo(t), l) : s
}, l.bandwidth = function(t) {
if (!arguments.length) return Math.sqrt(o * (o + 1));
if (!((t = +t) >= 0)) throw new Error(“invalid bandwidth”);
return o = Math.round((Math.sqrt(4 * t * t + 1) – 1) / 2), y()
}, l
}, t.contours = To, t.create = function(t) {
return Rt(Z(t).call(document.documentElement))
}, t.creator = Z, t.cross = function(t, n, e) {
var r, i, o, u, c = t.length,
f = n.length,
s = new Array(c * f);
for (null == e && (e = a), r = o = 0; r t ? 1 : n >= t ? 0 : NaN
}, t.deviation = f, t.dispatch = I, t.drag = function() {
var n, e, r, i, o = Gt,
a = $t,
u = Wt,
c = Zt,
f = {},
s = I(“start”, “drag”, “end”),
l = 0,
h = 0;
function d(t) {
t.on(“mousedown.drag”, p).filter(c).on(“touchstart.drag”, y).on(“touchmove.drag”, _).on(“touchend.drag touchcancel.drag”, b).style(“touch-action”, “none”).style(“-webkit-tap-highlight-color”, “rgba(0,0,0,0)”)
}
function p() {
if (!i && o.apply(this, arguments)) {
var u = m(“mouse”, a.apply(this, arguments), Bt, this, arguments);
u && (Rt(t.event.view).on(“mousemove.drag”, v, !0).on(“mouseup.drag”, g, !0), Ht(t.event.view), Yt(), r = !1, n = t.event.clientX, e = t.event.clientY, u(“start”))
}
}
function v() {
if (It(), !r) {
var i = t.event.clientX – n,
o = t.event.clientY – e;
r = i * i + o * o > h
}
f.mouse(“drag”)
}
function g() {
Rt(t.event.view).on(“mousemove.drag mouseup.drag”, null), jt(t.event.view, r), It(), f.mouse(“end”)
}
function y() {
if (o.apply(this, arguments)) {
var n, e, r = t.event.changedTouches,
i = a.apply(this, arguments),
u = r.length;
for (n = 0; n c + d || i f + d || o u.index) {
var p = c – a.x – a.vx,
v = f – a.y – a.vy,
g = p * p + v * v;
g t.r && (t.r = t[n].r)
}
function u() {
if (n) {
var r, i, o = n.length;
for (e = new Array(o), r = 0; r = a)) {
(t.data !== n || t.next) && (0 === s && (d += (s = ya()) * s), 0 === l && (d += (l = ya()) * l), d 1 ? (null == e ? u.remove(t) : u.set(t, d(e)), n) : u.get(t)
},
find: function(n, e, r) {
var i, o, a, u, c, f = 0,
s = t.length;
for (null == r ? r = 1 / 0 : r *= r, f = 0; f 1 ? (f.on(t, e), n) : f.on(t)
}
}
}, t.forceX = function(t) {
var n, e, r, i = ga(.1);
function o(t) {
for (var i, o = 0, a = n.length; o = .12 && i = -.425 && r = .166 && i = -.214 && r Pc(r[0], r[1]) && (r[1] = i[1]), Pc(i[0], r[1]) > Pc(r[0], r[1]) && (r[0] = i[0])) : o.push(r = i);
for (a = -1 / 0, n = 0, r = o[e = o.length – 1]; n a && (a = u, Zu = i[0], Ku = r[1])
}
return ic = oc = null, Zu === 1 / 0 || Qu === 1 / 0 ? [
[NaN, NaN],
[NaN, NaN]
] : [
[Zu, Qu],
[Ku, Ju]
]
}, t.geoCentroid = function(t) {
ac = uc = cc = fc = sc = lc = hc = dc = pc = vc = gc = 0, Cu(t, Dc);
var n = pc,
e = vc,
r = gc,
i = n * n + e * e + r * r;
return i 2 ? t[2] + 90 : 90]) : [(t = e())[0], t[1], t[2] – 90]
}, e([0, 0, 90]).scale(159.155)
}, t.geoTransverseMercatorRaw = Ml, t.gray = function(t, n) {
return new Bn(t, 0, 0, null == n ? 1 : n)
}, t.hcl = Xn, t.hierarchy = kl, t.histogram = function() {
var t = v,
n = s,
e = M;
function r(r) {
var o, a, u = r.length,
c = new Array(u);
for (o = 0; o l;) h.pop(), –d;
var p, v = new Array(d + 1);
for (o = 0; o 0 ? h[o – 1] : s, p.x1 = o 1) && (t -= Math.floor(t));
var n = Math.abs(t – .5);
return ly.h = 360 * t – 100, ly.s = 1.5 – 1.5 * n, ly.l = .8 – .9 * n, ly + “”
}, t.interpolateRdBu = yg, t.interpolateRdGy = bg, t.interpolateRdPu = Yg, t.interpolateRdYlBu = xg, t.interpolateRdYlGn = Mg, t.interpolateReds = oy, t.interpolateRgb = he, t.interpolateRgbBasis = pe, t.interpolateRgbBasisClosed = ve, t.interpolateRound = Ae, t.interpolateSinebow = function(t) {
var n;
return t = (.5 – t) * Math.PI, hy.r = 255 * (n = Math.sin(t)) * n, hy.g = 255 * (n = Math.sin(t + dy)) * n, hy.b = 255 * (n = Math.sin(t + py)) * n, hy + “”
}, t.interpolateSpectral = Tg, t.interpolateString = Ne, t.interpolateTransformCss = qe, t.interpolateTransformSvg = Le, t.interpolateTurbo = function(t) {
return t = Math.max(0, Math.min(1, t)), “rgb(” + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 – t * (10793.56 – t * (33300.12 – t * (38394.49 – 14825.05 * t))))))) + “, ” + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 – t * (3574.96 – t * (1073.77 + 707.56 * t))))))) + “, ” + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 – t * (15327.97 – t * (27814 – t * (22569.18 – 6838.66 * t))))))) + “)”
}, t.interpolateViridis = gy, t.interpolateWarm = fy, t.interpolateYlGn = Xg, t.interpolateYlGnBu = Hg, t.interpolateYlOrBr = Gg, t.interpolateYlOrRd = Wg, t.interpolateZoom = Ie, t.interrupt = Pr, t.interval = function(t, n, e) {
var r = new lr,
i = n;
return null == n ? (r.restart(t, n, e), r) : (n = +n, e = null == e ? fr() : +e, r.restart(function o(a) {
a += i, r.restart(o, i += n, e), t(a)
}, n, e), r)
}, t.isoFormat = Rv, t.isoParse = Dv, t.json = function(t, n) {
return fetch(t, n).then(la)
}, t.keys = function(t) {
var n = [];
for (var e in t) n.push(e);
return n
}, t.lab = On, t.lch = function(t, n, e, r) {
return 1 === arguments.length ? jn(t) : new Vn(e, n, t, null == r ? 1 : r)
}, t.line = Hy, t.lineRadial = Qy, t.linkHorizontal = function() {
return r_(i_)
}, t.linkRadial = function() {
var t = r_(a_);
return t.angle = t.x, delete t.x, t.radius = t.y, delete t.y, t
}, t.linkVertical = function() {
return r_(o_)
}, t.local = qt, t.map = co, t.matcher = nt, t.max = T, t.mean = function(t, n) {
var e, r = t.length,
i = r,
o = -1,
a = 0;
if (null == n)
for (; ++o = r.length) return null != t && e.sort(t), null != n ? n(e) : e;
for (var c, f, s, l = -1, h = e.length, d = r[i++], p = co(), v = a(); ++l r.length) return e;
var a, u = i[o – 1];
return null != n && o >= r.length ? a = e.entries() : (a = [], e.each(function(n, e) {
a.push({
key: e,
values: t(n, o)
})
})), null != u ? a.sort(function(t, n) {
return u(t.key, n.key)
}) : a
}(o(t, 0, lo, ho), 0)
},
key: function(t) {
return r.push(t), e
},
sortKeys: function(t) {
return i[r.length – 1] = t, e
},
sortValues: function(n) {
return t = n, e
},
rollup: function(t) {
return n = t, e
}
}
}, t.now = fr, t.pack = function() {
var t = null,
n = 1,
e = 1,
r = Wl;
function i(i) {
return i.x = n / 2, i.y = e / 2, t ? i.eachBefore(Kl(t)).eachAfter(Jl(r, .5)).eachBefore(th(1)) : i.eachBefore(Kl(Ql)).eachAfter(Jl(Wl, 1)).eachAfter(Jl(r, i.r / Math.min(n, e))).eachBefore(th(Math.min(n, e) / (2 * i.r))), i
}
return i.radius = function(n) {
return arguments.length ? (t = Gl(n), i) : t
}, i.size = function(t) {
return arguments.length ? (n = +t[0], e = +t[1], i) : [n, e]
}, i.padding = function(t) {
return arguments.length ? (r = “function” == typeof t ? t : Zl(+t), i) : r
}, i
}, t.packEnclose = Dl, t.packSiblings = function(t) {
return Vl(t), t
}, t.pairs = function(t, n) {
null == n && (n = a);
for (var e = 0, r = t.length – 1, i = t[0], o = new Array(r 0 && (d += l);
for (null != n ? p.sort(function(t, e) {
return n(v[t], v[e])
}) : null != e && p.sort(function(t, n) {
return e(a[t], a[n])
}), u = 0, f = d ? (y – h * b) / d : 0; u 0 ? l * f : 0) + b, v[c] = {
data: a[c],
index: u,
value: l,
startAngle: g,
endAngle: s,
padAngle: _
};
return v
}
return a.value = function(n) {
return arguments.length ? (t = “function” == typeof n ? n : my(+n), a) : t
}, a.sortValues = function(t) {
return arguments.length ? (n = t, e = null, a) : n
}, a.sort = function(t) {
return arguments.length ? (e = t, n = null, a) : e
}, a.startAngle = function(t) {
return arguments.length ? (r = “function” == typeof t ? t : my(+t), a) : r
}, a.endAngle = function(t) {
return arguments.length ? (i = “function” == typeof t ? t : my(+t), a) : i
}, a.padAngle = function(t) {
return arguments.length ? (o = “function” == typeof t ? t : my(+t), a) : o
}, a
}, t.piecewise = function(t, n) {
for (var e = 0, r = n.length – 1, i = n[0], o = new Array(r u != f > u && a = 0; –n) f.push(t[r[o[n]][2]]);
for (n = +u; n 0 ? a[n – 1] : r[0], n = o ? [a[o – 1], r] : [a[n – 1], a[n]]
}, c.unknown = function(t) {
return arguments.length ? (n = t, c) : c
}, c.thresholds = function() {
return a.slice()
}, c.copy = function() {
return t().domain([e, r]).range(u).unknown(n)
}, Eh.apply($h(c), arguments)
}, t.scaleSequential = function t() {
var n = $h(Xv()(Bh));
return n.copy = function() {
return Vv(n, t())
}, Ch.apply(n, arguments)
}, t.scaleSequentialLog = function t() {
var n = ed(Xv()).domain([1, 10]);
return n.copy = function() {
return Vv(n, t()).base(n.base())
}, Ch.apply(n, arguments)
}, t.scaleSequentialPow = Gv, t.scaleSequentialQuantile = function t() {
var e = [],
r = Bh;
function o(t) {
if (!isNaN(t = +t)) return r((i(e, t) – 1) / (e.length – 1))
}
return o.domain = function(t) {
if (!arguments.length) return e.slice();
e = [];
for (var r, i = 0, a = t.length; i 0)
for (var e, r, i, o, a, u, c = 0, f = t[n[0]].length; c 0 ? (r[0] = o, r[1] = o += i) : i 0) {
for (var e, r, i, o = 0, a = t[0].length; o 0) {
for (var e, r = 0, i = t[n[0]], o = i.length; r 0 && (r = (e = t[n[0]]).length) > 0) {
for (var e, r, i, o = 0, a = 1; a 0) throw new Error(“cycle”);
return o
}
return e.id = function(n) {
return arguments.length ? (t = $l(n), e) : t
}, e.parentId = function(t) {
return arguments.length ? (n = $l(t), e) : n
}, e
}, t.style = ft, t.sum = function(t, n) {
var e, r = t.length,
i = -1,
o = 0;
if (null == n)
for (; ++i = 0; –i) u.push(e = n.children[i] = new dh(r[i], i)), e.parent = n;
return (a.parent = new dh(null, 0)).children = [a], a
}(i);
if (c.eachAfter(o), c.parent.m = -c.z, c.eachBefore(a), r) i.eachBefore(u);
else {
var f = i,
s = i,
l = i;
i.eachBefore(function(t) {
t.x s.x && (s = t), t.depth > l.depth && (l = t)
});
var h = f === s ? 1 : t(f, s) / 2,
d = h – f.x,
p = n / (s.x + h + d),
v = e / (l.depth || 1);
i.eachBefore(function(t) {
t.x = (t.x + d) * p, t.y = t.depth * v
})
}
return i
}
function o(n) {
var e = n.children,
r = n.parent.children,
i = n.i ? r[n.i – 1] : null;
if (e) {
! function(t) {
for (var n, e = 0, r = 0, i = t.children, o = i.length; –o >= 0;)(n = i[o]).z += e, n.m += e, e += n.s + (r += n.c)
}(n);
var o = (e[0].z + e[e.length – 1].z) / 2;
i ? (n.z = i.z + t(n._, i._), n.m = n.z – o) : n.z = o
} else i && (n.z = i.z + t(n._, i._));
n.parent.A = function(n, e, r) {
if (e) {
for (var i, o = n, a = n, u = e, c = o.parent.children[0], f = o.m, s = a.m, l = u.m, h = c.m; u = sh(u), o = fh(o), u && o;) c = fh(c), (a = sh(a)).a = n, (i = u.z + l – o.z – f + t(u._, o._)) > 0 && (lh(hh(u, n, r), n, i), f += i, s += i), l += u.m, f += o.m, h += c.m, s += a.m;
u && !sh(a) && (a.t = u, a.m += l – s), o && !fh(c) && (c.t = o, c.m += f – h, r = n)
}
return r
}(n, i, n.parent.A || r[0])
}
function a(t) {
t._.x = t.z + t.parent.m, t.m += t.parent.m
}
function u(t) {
t.x *= n, t.y = t.depth * e
}
return i.separation = function(n) {
return arguments.length ? (t = n, i) : t
}, i.size = function(t) {
return arguments.length ? (r = !1, n = +t[0], e = +t[1], i) : r ? null : [n, e]
}, i.nodeSize = function(t) {
return arguments.length ? (r = !0, n = +t[0], e = +t[1], i) : r ? [n, e] : null
}, i
}, t.treemap = function() {
var t = yh,
n = !1,
e = 1,
r = 1,
i = [0],
o = Wl,
a = Wl,
u = Wl,
c = Wl,
f = Wl;
function s(t) {
return t.x0 = t.y0 = 0, t.x1 = e, t.y1 = r, t.eachBefore(l), i = [0], n && t.eachBefore(nh), t
}
function l(n) {
var e = i[n.depth],
r = n.x0 + e,
s = n.y0 + e,
l = n.x1 – e,
h = n.y1 – e;
l = e – 1) {
var s = u[n];
return s.x0 = i, s.y0 = o, s.x1 = a, void(s.y1 = c)
}
for (var l = f[n], h = r / 2 + l, d = n + 1, p = e – 1; d >> 1;
f[v] c – o) {
var _ = (i * y + a * g) / r;
t(n, d, g, i, o, _, c), t(d, e, y, _, o, a, c)
} else {
var b = (o * y + c * g) / r;
t(n, d, g, i, o, a, b), t(d, e, y, i, b, a, c)
}
}(0, c, t.value, n, e, r, i)
}, t.treemapDice = eh, t.treemapResquarify = _h, t.treemapSlice = ph, t.treemapSliceDice = function(t, n, e, r, i) {
(1 & t.depth ? ph : eh)(t, n, e, r, i)
}, t.treemapSquarify = yh, t.tsv = sa, t.tsvFormat = Ko, t.tsvFormatBody = Jo, t.tsvFormatRow = na, t.tsvFormatRows = ta, t.tsvFormatValue = ea, t.tsvParse = Zo, t.tsvParseRows = Qo, t.utcDay = Wd, t.utcDays = Zd, t.utcFriday = rp, t.utcFridays = sp, t.utcHour = Gd, t.utcHours = $d, t.utcMillisecond = pd, t.utcMilliseconds = vd, t.utcMinute = Xd, t.utcMinutes = Vd, t.utcMonday = Jd, t.utcMondays = ap, t.utcMonth = hp, t.utcMonths = dp, t.utcSaturday = ip, t.utcSaturdays = lp, t.utcSecond = _d, t.utcSeconds = bd, t.utcSunday = Kd, t.utcSundays = op, t.utcThursday = ep, t.utcThursdays = fp, t.utcTuesday = tp, t.utcTuesdays = up, t.utcWednesday = np, t.utcWednesdays = cp, t.utcWeek = Kd, t.utcWeeks = op, t.utcYear = pp, t.utcYears = vp, t.values = function(t) {
var n = [];
for (var e in t) n.push(t[e]);
return n
}, t.variance = c, t.version = “5.16.0”, t.voronoi = function() {
var t = sb,
n = lb,
e = null;
function r(r) {
return new Vb(r.map(function(e, i) {
var o = [Math.round(t(e, i, r) / Ib) * Ib, Math.round(n(e, i, r) / Ib) * Ib];
return o.index = i, o.data = e, o
}), e)
}
return r.polygons = function(t) {
return r(t).polygons()
}, r.links = function(t) {
return r(t).links()
}, r.triangles = function(t) {
return r(t).triangles()
}, r.x = function(n) {
return arguments.length ? (t = “function” == typeof n ? n : fb(+n), r) : t
}, r.y = function(t) {
return arguments.length ? (n = “function” == typeof t ? t : fb(+t), r) : n
}, r.extent = function(t) {
return arguments.length ? (e = null == t ? null : [
[+t[0][0], +t[0][1]],
[+t[1][0], +t[1][1]]
], r) : e && [
[e[0][0], e[0][1]],
[e[1][0], e[1][1]]
]
}, r.size = function(t) {
return arguments.length ? (e = null == t ? null : [
[0, 0],
[+t[0], +t[1]]
], r) : e && [e[1][0] – e[0][0], e[1][1] – e[0][1]]
}, r
}, t.window = ct, t.xml = da, t.zip = function() {
return k(arguments)
}, t.zoom = function() {
var n, e, r = tm,
i = nm,
o = om,
a = rm,
u = im,
c = [0, 1 / 0],
f = [
[-1 / 0, -1 / 0],
[1 / 0, 1 / 0]
],
s = 250,
l = Ie,
h = I(“start”, “zoom”, “end”),
d = 500,
p = 150,
v = 0;
function g(t) {
t.property(“__zoom”, em).on(“wheel.zoom”, M).on(“mousedown.zoom”, N).on(“dblclick.zoom”, T).filter(u).on(“touchstart.zoom”, A).on(“touchmove.zoom”, S).on(“touchend.zoom touchcancel.zoom”, k).style(“touch-action”, “none”).style(“-webkit-tap-highlight-color”, “rgba(0,0,0,0)”)
}
function y(t, n) {
return (n = Math.max(c[0], Math.min(c[1], n))) === t.k ? t : new Wb(n, t.x, t.y)
}
function _(t, n, e) {
var r = n[0] – e[0] * t.k,
i = n[1] – e[1] * t.k;
return r === t.x && i === t.y ? t : new Wb(t.k, r, i)
}
function b(t) {
return [(+t[0][0] + +t[1][0]) / 2, (+t[0][1] + +t[1][1]) / 2]
}
function m(t, n, e) {
t.on(“start.zoom”, function() {
x(this, arguments).start()
}).on(“interrupt.zoom end.zoom”, function() {
x(this, arguments).end()
}).tween(“zoom”, function() {
var t = this,
r = arguments,
o = x(t, r),
a = i.apply(t, r),
u = null == e ? b(a) : “function” == typeof e ? e.apply(t, r) : e,
c = Math.max(a[1][0] – a[0][0], a[1][1] – a[0][1]),
f = t.__zoom,
s = “function” == typeof n ? n.apply(t, r) : n,
h = l(f.invert(u).concat(c / f.k), s.invert(u).concat(c / s.k));
return function(t) {
if (1 === t) t = s;
else {
var n = h(t),
e = c / n[2];
t = new Wb(e, u[0] – n[0] * e, u[1] – n[1] * e)
}
o.zoom(null, t)
}
})
}
function x(t, n, e) {
return !e && t.__zooming || new w(t, n)
}
function w(t, n) {
this.that = t, this.args = n, this.active = 0, this.extent = i.apply(t, n), this.taps = 0
}
function M() {
if (r.apply(this, arguments)) {
var t = x(this, arguments),
n = this.__zoom,
e = Math.max(c[0], Math.min(c[1], n.k * Math.pow(2, a.apply(this, arguments)))),
i = Bt(this);
if (t.wheel) t.mouse[0][0] === i[0] && t.mouse[0][1] === i[1] || (t.mouse[1] = n.invert(t.mouse[0] = i)), clearTimeout(t.wheel);
else {
if (n.k === e) return;
t.mouse = [i, n.invert(i)], Pr(this), t.start()
}
Jb(), t.wheel = setTimeout(function() {
t.wheel = null, t.end()
}, p), t.zoom(“mouse”, o(_(y(n, e), t.mouse[0], t.mouse[1]), t.extent, f))
}
}
function N() {
if (!e && r.apply(this, arguments)) {
var n = x(this, arguments, !0),
i = Rt(t.event.view).on(“mousemove.zoom”, function() {
if (Jb(), !n.moved) {
var e = t.event.clientX – u,
r = t.event.clientY – c;
n.moved = e * e + r * r > v
}
n.zoom(“mouse”, o(_(n.that.__zoom, n.mouse[0] = Bt(n.that), n.mouse[1]), n.extent, f))
}, !0).on(“mouseup.zoom”, function() {
i.on(“mousemove.zoom mouseup.zoom”, null), jt(t.event.view, n.moved), Jb(), n.end()
}, !0),
a = Bt(this),
u = t.event.clientX,
c = t.event.clientY;
Ht(t.event.view), Kb(), n.mouse = [a, this.__zoom.invert(a)], Pr(this), n.start()
}
}
function T() {
if (r.apply(this, arguments)) {
var n = this.__zoom,
e = Bt(this),
a = n.invert(e),
u = n.k * (t.event.shiftKey ? .5 : 2),
c = o(_(y(n, u), e, a), i.apply(this, arguments), f);
Jb(), s > 0 ? Rt(this).transition().duration(s).call(m, c, e) : Rt(this).call(g.transform, c)
}
}
function A() {
if (r.apply(this, arguments)) {
var e, i, o, a, u = t.event.touches,
c = u.length,
f = x(this, arguments, t.event.changedTouches.length === c);
for (Kb(), i = 0; i 1 && arguments[1] !== undefined ? arguments[1] : false;
this.Filter.updateState(state, initialLoad);
}
}, {
key: “updateLanguage”,
value: function updateLanguage(newLanguage) {
var initialLoad = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
d3.select(‘.methodology__wrap’).attr(‘class’, “methodology__wrap “.concat(newLanguage)).html(methodologyLanguaages[newLanguage]);
if (this.footer) {
this.footer.select(‘.signup’).remove();
this.footerSignup = new _Signup.default(this.footer, newLanguage, this.states, ‘footer’);
}
d3.select(‘.contact > p’).html(contactLanguages[newLanguage]);
this.Filter.setOptionsByLanguage(newLanguage, initialLoad);
d3.select(‘#lead__desktop-img’).attr(‘src’, “https://dataviz.nbcnews.com/projects/20210106-plan-your-shot-shorthand/assets/plan-your-vaccine-“.concat(newLanguage, “-logo.png”)).attr(‘class’, “lead__logo “.concat(newLanguage));
d3.select(‘.lead__text-intro’).text(dekLanguages[newLanguage]);
}
}, {
key: “updateLeadMap”,
value: function updateLeadMap(appState) {
/* replace an embed with new language */
(0, _addEmbed.addEmbed)(‘20210112-plan-your-shot-phase-lead’, appState, ‘20210112-plan-your-shot-phase’, ‘index-lead.html’);
}
}, {
key: “updateAge”,
value: function updateAge(age) {
this.Filter.updateAge(age);
}
}, {
key: “updateJob”,
value: function updateJob(job) {
this.Filter.updateJob(job);
}
}, {
key: “updateCheck”,
value: function updateCheck(id, bool) {
this.Filter.updateCheck(id, bool);
}
}]);
return App;
}();
var _default = App;
/**
* getID
* @param {[string, object[]]} card this includes the card data, in the structure [header, [{…}, {…}]]. The ID is not maintained on the header level, so we have to expose it through the first element in the questions.
*/
exports.default = _default;
var getID = function getID(_ref15) {
var _ref16 = _slicedToArray(_ref15, 2),
header = _ref16[0],
questions = _ref16[1];
return +questions[0][_constants.CONSTANTS.ID];
};
var dekLanguages = {
english: ‘Everything you need to know about getting a Covid-19 vaccination as the rollout extends across the U.S.’,
spanish: ‘Todo lo que necesitas saber sobre la vacuna contra el COVID-19, a medida que el programa de inmunización avanza en Estados Unidos.’,
mandarin: ‘这里是所有你需要了解的有关新冠疫苗接种的信息。’
};
var methodologyLanguaages = {
english: “n
Methodology
n
NBC News based its description of the vaccine-eligible population groups on estimates provided by Surgo Ventures, a nonprofit with a focus on health problems, and Ariadne Labs, a joint center for health systems, which were in turn based on a variety of government data sources. n These estimates, described here in greater detail, take some groups, such as high-risk workers, and classify them into subgroups, such as doctors and nurses. The groups are then assigned to a state’s vaccination phase. For example: the group designated as first responders (police and firefighters) were placed within an essential group. n The estimates take into account overlap between groups, and follow the Centers for Disease Control and Preventionu2019s Advisory Committee on Immunization Practices (ACIP) guidelines. n The dynamic vaccination map showing the number of fully vaccinated people across the U.S. and the number of allocated vaccines that have been used is based on data from the CDC. NBC News ranks each placeu2019s progress on vaccine distribution based on the percentage of the distributed vaccine used. n The information on vaccine distribution in states, Washington, D.C. and Puerto Rico came from NBC News research efforts. NBC News researchers reached out to state health department officials and examined their web sites, and they gathered information from state and health department press conferences. Official social media communications were also used. n Covid-19 vaccination locations were sourced from state, county, district, health district and territory health departments, from information supplied from pharmacy chains and from data provided by Rx Open, which provides the operating status of health-care facilities in areas affected by a disaster, including the Covid-19 outbreak. This data was collated and then mapped.
n
“,
spanish: “n
MetodologxEDa
n
NBC News basa la descripcixF3n de los grupos elegibles para la vacunacixF3n en los estimados que proveen Surgo Ventures, una organizacixF3n sin xE1nimo de lucro enfocada en problemas de salud; y Ariadne Labs, un centro conjunto de sistemas de salud, los cuales utilizan una variedad de fuentes de datos gubernamentales. n Estos estimados, described here consideran a algunos grupos u2013como los trabajadores de alto riesgou2013 y los clasifican en subgrupos, como doctores y personal de enfermerxEDa. Luego estos grupos son asignados a una fase de vacunacixF3n del estado o localidad. Por ejemplo: el grupo designado como servicios de emergencia (policxEDas y bomberos) fueron ubicados en un grupo esencial. n Los estimados toman en cuenta la coincidencia entre grupos y se guxEDan por los lineamientos recomendados por el ComitxE9 Asesor en PrxE1cticas de InmunizacixF3n (ACIP) de los Centros para el Control y la PrevencixF3n de Enfermedades (CDC). n El mapa dinxE1mico de vacunacixF3n que muestra el nxFAmero de personas inmunizadas por completo en Estados Unidos y el nxFAmero de vacunas asignadas que se han utilizado estxE1 basado en datos de los CDC. NBC News clasifica el progreso de distribucixF3n de vacunas en cada localidad basxE1ndose en el porcentaje de uso de las vacunas distribuidas. n La informacixF3n sobre cxF3mo evoluciona la distribucixF3n de las vacunas en los estados, Washington D.C. y Puerto Rico se obtuvo con los esfuerzos de investigacixF3n de NBC News. Investigadores de NBC News contactaron a funcionarios del Departamento de Salud estatal y examinaron sus pxE1ginas web, ademxE1s de recolectar datos ofrecidos durante conferencias de prensa estatales. Las comunicaciones en cuentas oficiales de redes sociales tambixE9n se utilizaron. n La informacixF3n sobre los sitios de vacunacixF3n contra el COVID-19 fue conseguida en los departamentos de salud estatales, del condado, del distrito, del distrito sanitario y de los territorios; de informacixF3n proporcionada por cadenas de farmacias y datos de Rx Open, que ofrece el estatus operativo de los centros de salud en xE1reas afectadas por un desastre, incluyendo el brote de coronavirus. Estos datos fueron recopilados y luego esquematizados.
n
“,
mandarin: “n
u65B9u6CD5
n
NBC Newsu5BF9u7B26u5408u75ABu82D7u6CE8u5C04u7684u4EBAu7FA4u5206u7EC4u662Fu57FAu4E8ESurgo VenturesuFF08u4E00u5BB6u4E13u6CE8u4E8Eu5065u5EB7u95EEu9898u7684u975Eu8425u5229u7EC4u7EC7uFF09u548CAriadne LabsuFF08u4E00u5BB6u536Bu751Fu7CFBu7EDFu8054u5408u4E2Du5FC3uFF09u63D0u4F9Bu7684u4F30u7B97u503CuFF0Cu8BE5u4F30u8BA1u503Cu662Fu57FAu4E8Eu5404u653Fu5E9Cu6570u636Eu8D44u6599u6765u6E90u3002n u8FD9u4E9Bu4F30u7B97u503CuFF08u5728u6B64u8FDBu884Cu4E86u66F4u8BE6u7EC6u7684u63CFu8FF0 uFF09u5C06u4E00u4E9Bu4EBAu7FA4uFF08u4F8Bu5982u9AD8u98CEu9669u5DE5u4F5Cu4EBAu5458uFF09u5206u6210u7EC6u5206u7EC4uFF08u4F8Bu5982u533Bu751Fu3001u62A4u58EBuFF09u3002u7136u540Eu5C06u8FD9u4E9Bu4EBAu7FA4u7EC4u5206u7C7Bu5230u5404u4E2Au5DDEu7684u4E0Du540Cu75ABu82D7u63A5u79CDu9636u6BB5u3002 u4F8Bu5982uFF1Au6307u5B9Au4E3Au7B2Cu4E00u54CDu5E94u8005u7684u4EBAu7FA4uFF08u8B66u5BDFu548Cu6D88u9632u5458uFF09u88ABu653Eu7F6Eu5728u5BF9u793Eu4F1Au8FD0u884Cu81F3u5173u91CDu8981u7684u4EBAu7FA4u4E2Du3002n u8FD9u4E2Au4F30u7B97u503Cu8003u8651u4E86u5404u7EC4u4EBAu7FA4u4E4Bu95F4u53EFu80FDu7684u6570u636Eu4EA4u96C6uFF0Cu4E14u9075u5FAAu75BEu75C5u63A7u5236u548Cu9884u9632u4E2Du5FC3uFF08CDCuFF09u5BF9u4E34u5E8Au514Du75ABu5EFAu8BAEu4EBAu7FA4uFF08Advisory Committee on Immunization PracticesuFF09u7684u5B9Au4E49u3002n u52A8u6001u66F4u65B0u7684u75ABu82D7u63A5u79CDu5730u56FEu4E0Au663Eu793Au4E86u5168u7F8Eu56FDu5DF2u5B8Cu6210u75ABu82D7u63A5u79CDu7684u4EBAu6570u3001u4F7Fu7528u7684u5DF2u5206u53D1u75ABu82D7u6570u91CFuFF0Cu6B64u6570u636Eu6765u6E90u4E8Eu75BEu75C5u63A7u5236u548Cu9884u9632u4E2Du5FC3u3002u540Cu65F6uFF0CNBC Newsu6839u636Eu4F7Fu7528u5DF2u5206u53D1u75ABu82D7u7684u6BD4u4F8Bu5BF9u5404u4E2Au5DDEu3001u534Eu76DBu987Fu7279u533Au548Cu6CE2u591Au9ECEu5404u8FDBu884Cu4E86u6392u540Du3002n u6709u5173u5404u5DDEu3001u534Eu76DBu987Fu7279u533Au548Cu6CE2u591Au9ECEu5404u5982u4F55u8FDBu884Cu75ABu82D7u5206u914Du7684u4FE1u606Fu6765u81EAu4E8ENBC Newsu7684u7814u7A76u56E2u961FuFF0Cu6211u4EECu8054u7CFBu4E86u5404u5DDEu536Bu751Fu90E8u95E8u5B98u5458u3001u67E5u8BBFu4E86u536Bu751Fu90E8u7F51u7AD9uFF0Cu540Cu65F6u6211u4EECu4E5Fu4ECEu5404u5DDEu536Bu751Fu90E8u95E8u7684u65B0u95FBu53D1u5E03u4F1Au3001u548Cu536Bu751Fu90E8u95E8u5B98u65B9u793Eu4EA4u5A92u4F53u4E0Au6536u96C6u4E86u4FE1u606Fu3002n u6709u5173u65B0u51A0u75ABu82D7u63A5u79CDu70B9u7684u6570u636Eu6765u81EAu5404u5DDEu3001u53BFu3001u533Au3001u536Bu751Fu533Au548Cu9886u5730u7684u536Bu751Fu90E8u95E8uFF0Cu4EE5u53CAu8FDEu9501u836Fu623Fu63D0u4F9Bu7684u4FE1u606Fu3002u6B64u5916uFF0CRx Openu4E5Fu63D0u4F9Bu4E86u53D7u65B0u51A0u75ABu60C5u5F71u54CDu4E25u91CDu5730u533Au7684u533Bu7597u673Au6784u8FD0u884Cu72B6u6001u7684u6570u636Eu3002u6211u4EECu6574u7406u7EFCu5408u4EE5u4E0Au6570u636Eu6765u6E90uFF0Cu7136u540Eu5728u5730u56FEu4E0Au6807u6CE8u4E86u51FAu6765u3002
n
”
};
var contactLanguages = {
english: “The Plan Your Vaccine page will be updated as new information is released from state health departments. Please email planyourvaccine@nbcuni.com with any concerns.”,
spanish: “La pxE1gina de Planifica tu vacuna serxE1 actualizada con nueva informacixF3n que vayan publicando los departamentos de salud estatales. EnvxEDa tus dudas a planyourvaccine@nbcuni.com.”,
mandarin: “u968Fu7740u5DDEu536Bu751Fu90E8u95E8u53D1u5E03u65B0u4FE1u606FuFF0Cu201Cu75ABu82D7u8BA1u5212u201Du9875u9762u5C06u968Fu65F6u66F4u65B0u3002u5982u6709u4EFBu4F55u7591u95EEuFF0Cu8BF7u53D1u9001u7535u5B50u90AEu4EF6u81F3planyourvaccine@nbcuni.comu3002″
};
}, {
“./../constants”: 10,
“./Card”: 2,
“./Filter”: 3,
“./Signup”: 6,
“./helpers/addEmbed”: 7
}],
2: [function(require, module, exports) {
“use strict”;
Object.defineProperty(exports, “__esModule”, {
value: true
});
exports.default = void 0;
var _Question = _interopRequireDefault(require(“./Question”));
var _News = _interopRequireDefault(require(“./News”));
var _Signup = _interopRequireDefault(require(“./Signup”));
var _constants = require(“../constants.js”);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError(“Cannot call a class as a function”);
}
}
/**
* CARD NUMBERS
* 1 What is the vaccine distribution timeline in LOCATION?
* 2 In the news: Ongoing vaccination issues in LOCATION:
* 3 What are the requirements in LOCATION?
* 4 Where can I get the vaccine in LOCATION?
* 5 How much does the vaccine cost in LOCATION?
*/
var Card =
/**
* RE-USABLE CARD CLASS
* @param {*} el parent container to append card
* @param {string} header card title/category
* @param {object[]} questions questions, answers, footnotes, etc based on this state and language
*/
function Card(el, header, data, appState, states) {
var _this = this;
_classCallCheck(this, Card);
this.el = el;
this.header = header;
this.data = data; // wrapper
this.cardEl = this.el.append(‘div’).attr(‘class’, ‘info-card__wrap’); // header
this.cardEl.append(‘h2’).attr(‘class’, ‘info-card__category’).text(this.header.replace(‘LOCATION’, this.data[this.data.length – 1][_constants.CONSTANTS.LOCALSTATE])); // TODO: this only works if the news is the second card, this should not be so flimsy
if (Math.floor(+this.data[0][_constants.CONSTANTS.ID]) === 2) {
var contents = this.cardEl.append(‘div’).attr(‘class’, ‘info-card__news’).text(latestNewsTranslations[appState.language]).append(‘div’);
this.data.sort(function(a, b) {
return (b[_constants.CONSTANTS.BREAK] === ‘TRUE’) – (a[_constants.CONSTANTS.BREAK] === ‘TRUE’) || // breaking comes first,
(b[_constants.CONSTANTS.LOCALSTATE] === ‘National’) – (a[_constants.CONSTANTS.LOCALSTATE] === ‘National’) || a[_constants.CONSTANTS.ID] – b[_constants.CONSTANTS.ID];
}) // then national news, then state specific
.filter(function(_, i) {
return i Is the Covid-19 vaccination safe? Where are the other Covid-19 variants spreading across the country? Read more from NBC News.’);
}
if (Math.floor(+this.data[0][_constants.CONSTANTS.ID]) === 1) {
var wrapper = this.cardEl.append(‘div’).attr(‘class’, ‘info-card__signup’).text(‘Sign up to be alerted when there are vaccination updates in your state:’);
new _Signup.default(wrapper, appState.language, states, ‘inCard’);
}
if (Math.floor(+this.data[0][_constants.CONSTANTS.ID]) === 2) {
var _NBCNewsLinkDek$appSt = NBCNewsLinkDek[appState.language],
dek = _NBCNewsLinkDek$appSt.dek,
url = _NBCNewsLinkDek$appSt.url;
this.cardEl.append(‘a’).attr(‘class’, ‘info-card__read-more-NBC’).attr(‘target’, ‘_blank’).attr(‘href’, url).html(““).concat(dek));
}
};
var _default = Card;
exports.default = _default;
var NBCNewsLinkDek = {
english: {
dek: ‘Read more on Covid-19 from NBC News, including coverage of vaccine misinformation campaigns.’,
url: ‘https://www.nbcnews.com/health/coronavirus’
},
spanish: {
dek: ‘Lee más sobre el COVID-19 en Noticias Telemundo, incluyendo la cobertura de campañas de desinformación sobre la vacuna.’,
url: ‘https://www.telemundo.com/noticias/salud’
},
mandarin: {
dek: ‘点击阅读更多NBC News关于新冠疫情的最新报道,包括核查错误疫苗信息的报道。’,
url: ‘https://www.nbcnews.com/health/coronavirus’
}
};
var sourceLanguages = {
english: {
1: ‘Sources: Public health websites, state press briefings, public health officials, health department social media pages’,
3: ‘Sources: Public health websites, state press briefings, public health officials, health department social media pages’,
4: ‘Sources: State, county and health district health departments, Rx Open’,
5: ‘Sources: Public health websites, state press briefings, public health officials, health department social media pages’
},
spanish: {
1: ‘Fuentes: Sitios web de salud pública, conferencias de prensa estatales y redes sociales del Departamento de Salud.’,
3: ‘Fuentes: Sitios web de salud pública, conferencias de prensa estatales y redes sociales del Departamento de Salud.’,
4: ‘Fuentes: Departamentos de salud estatales, del condado y del distrito; y Rx Open.’,
5: ‘Fuentes: Sitios web de salud pública, conferencias de prensa estatales y redes sociales del Departamento de Salud.’
},
mandarin: {
1: ‘数据来源:公共卫生网站、各州新闻发布会、公共卫生部门官方和其社交媒体网站。’,
3: ‘数据来源:公共卫生网站、各州新闻发布会、公共卫生部门官方和其社交媒体网站。’,
4: ‘数据来源:州、县和卫生区的卫生部门,Rx Open。’,
5: ‘数据来源:公共卫生网站、各州新闻发布会、公共卫生部门官方和其社交媒体网站。’
}
};
var latestNewsTranslations = {
english: ‘Latest News’,
spanish: ‘Últimas noticias’,
mandarin: ‘Latest News’
};
}, {
“../constants.js”: 10,
“./News”: 4,
“./Question”: 5,
“./Signup”: 6
}],
3: [function(require, module, exports) {
“use strict”;
Object.defineProperty(exports, “__esModule”, {
value: true
});
exports.default = void 0;
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
}
function _nonIterableSpread() {
throw new TypeError(“Invalid attempt to spread non-iterable instance”);
}
function _iterableToArray(iter) {
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === “[object Arguments]”) return Array.from(iter);
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = new Array(arr.length); i option.filter__job-title’);
/* grab and save the age filters */
this.ageSelections = d3.selectAll(‘#filter__age, #sticky__age’).on(‘change’, function() {
setAppState({
age: this.value
});
});
/* grab and save the non-essential checkbox */
var that = this; // expose class elemends inside the event function()s
this.nonEssentialChecks = d3.selectAll(‘input#filter__non-essential, input#sticky__non-essential’).on(‘change’, function() {
that.resetOccupationSelections(this.checked);
that.nonEssentialChecks.property(‘checked’, this.checked);
});
/* grab and save the job filters */
this.jobSelections = d3.selectAll(‘#filter__job, #sticky__job’).on(‘change’, function() {
that.nonEssentialChecks.property(‘checked’, false); // BUG FIX: this was selected both filters and not appropriately setting the job title
var thisFilterSelction = d3.select(this).node();
setAppState({
jobGroup: thisFilterSelction.value,
job: thisFilterSelction.options[thisFilterSelction.selectedIndex].text
});
});
/* add on click functionality to the long term health checkbox selection */
d3.selectAll(‘#filter__long-term, #sticky__long-term’).on(‘change’, function() {
setAppState(_defineProperty({}, ‘long-term’, this.checked));
});
/* add on click functionality to the hight risk health checkbox selection */
d3.selectAll(‘#filter__high-risk, #sticky__high-risk’).on(‘change’, function() {
setAppState(_defineProperty({}, ‘high-risk’, this.checked));
});
/* grab and save the long term health checkbox label */
this.nonEssentialLabel = d3.selectAll(‘#label__non-essential’);
/* grab and save the long term health checkbox label */
this.longTermLabel = d3.selectAll(‘#label__long-term’);
/* grab and save the hight risk health checkbox label */
this.highRiskLabel = d3.selectAll(‘#label__high-risk’);
}
_createClass(Filter, [{
key: “updateState”,
value: function updateState(state) {
var _this = this;
var initialLoad = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
// update local state objects
this.state = state;
this.jobs = this.stateToJobsMap.get(this.language).get(this.state);
this.jobsForThisState = getJobsList(this.jobs);
var stateTranslated = this.states.find(function(d) {
return d.key === _this.state;
}).languages[this.language];
/* update the filter header instructions */
this.filterHeader.html(translations[this.language][‘filterHeader’](stateTranslated));
/* update the sticky header instructions */
this.stickyHeader.html(translations[this.language][‘stickyHeader’](stateTranslated));
/* set selected to show the state name */
d3.selectAll(‘option.state’).property(‘selected’, function(d) {
return d.languages[‘english’] === state;
});
/* populate job options by state/language */
this.setOccupationOptions(this.language, state, initialLoad);
/* allow jobs selection */
this.allowJobSelection();
/* update input job title by langauge and state */
this.updateJobTitleText(this.language, stateTranslated);
}
}, {
key: “updateAge”,
value: function updateAge(age) {
/* set selected to show the state name */
d3.selectAll(‘option.age’).property(‘selected’, function(d) {
return d.value === age;
});
}
}, {
key: “updateJob”,
value: function updateJob(job) {
/* set selected to show the state name */
d3.selectAll(‘option.occupation’).property(‘selected’, function(d) {
return d.text.trim() == job;
});
}
}, {
key: “updateCheck”,
value: function updateCheck(id, bool) {
/* update both checks if one is changed */
d3.selectAll(“#filter__”.concat(id, “, #sticky__”).concat(id)).property(‘checked’, bool);
}
}, {
key: “setOccupationOptions”,
value: function setOccupationOptions(language, state) {
var initialLoad = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
/* update local class values */
this.jobs = this.stateToJobsMap.get(language).get(state);
this.jobsForThisState = getJobsList(this.jobs);
/* prevent this reset behavior when the page is first loading */
if (!initialLoad) {
this.resetOccupationSelections();
}
/* populate job options by state/language */
this.jobSelections.selectAll(‘option.occupation’).data(this.jobsForThisState).join(‘option’).attr(‘class’, ‘occupation’).attr(‘value’, function(d) {
return d.value;
}).html(function(d) {
return d.text;
});
}
}, {
key: “resetOccupationSelections”,
value: function resetOccupationSelections() {
var nonessential = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
/* reset selection to the default */
this.jobSelections.property(‘selectedIndex’, 0);
/* if this is being triggered by clicking nonessential, set it
* as nonessential to avoid double state setting. Otherwise, remove. */
if (nonessential) {
this.setAppState({
jobGroup: ‘non-essential’,
job: ‘non-essential’
});
} else {
this.setAppState({
job: undefined,
jobGroup: undefined
});
}
}
}, {
key: “setOptionsByLanguage”,
value: function setOptionsByLanguage(language) {
var _this2 = this;
var initialLoad = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
/* update local class values */
this.language = language;
var translationObject = translations[language];
this.factorsHeader.text(translationObject[‘factorsHeader’]);
/* update age title based on language */
this.ageTitles.text(translationObject[‘ageTitle’]);
/* populate state options by langauge */
this.stateSelections.selectAll(‘option.state’).data(this.states).join(‘option’).attr(‘class’, ‘state’).attr(‘value’, function(d) {
return d.key;
}).html(function(d) {
return d.languages[language];
}); // this is in this.states
/* populate age options by langauge */
this.ageSelections.selectAll(‘option.age’).data(translationObject[‘ageOptions’]).join(‘option’).attr(‘class’, ‘age’).attr(‘value’, function(d) {
return d.value;
}).html(function(d) {
return d.text;
});
/* update non-essential check */
this.nonEssentialLabel.text(translationObject[‘nonessential’]);
/* update long term copy by langauge */
this.longTermLabel.html(translationObject[‘longterm’]);
/* update high risk copy by langauge */
this.highRiskLabel.html(translationObject[‘highrisk’]);
/* update input age title for the sticky by langauge */
this.ageSelections.select(‘option.filter__age-title’).html(translationObject[‘ageTitle’]);
/** STATE SPECIFC INFO
* state can be undefined for most of these — it returns a default value for no state
* but this.setOccupationOptions requires a state from our list
* */
var stateTranslated;
if (this.states.map(function(d) {
return d.key;
}).includes(this.state)) {
stateTranslated = this.states.filter(function(d) {
return d.key === _this2.state;
})[0].languages[language];
}
/* update the filter header instructions */
this.filterHeader.html(translationObject[‘filterHeader’](stateTranslated));
this.stickyHeader.html(translationObject[‘stickyHeader’](stateTranslated));
/* update the state title, which is either above the input or inside the input */
this.stateTitles.html(translationObject[‘stateTitle’](stateTranslated));
/* update input job title by langauge and state */
this.updateJobTitleText(language, stateTranslated);
/* this MUST have a matching state to run */
if (this.state) {
/* populate job options by state/language */
this.setOccupationOptions(language, this.state, initialLoad);
}
}
}, {
key: “allowJobSelection”,
value: function allowJobSelection() {
d3.selectAll(‘.filter__job-p’).classed(‘disabled’, false);
d3.selectAll(‘#filter__job’).property(‘disabled’, false);
}
}, {
key: “updateJobTitleText”,
value: function updateJobTitleText(language, state) {
this.jobDefault.html(translations[language][‘jobDefault’]);
d3.selectAll(‘.filter__job-p, #sticky__job > option.filter__job-title’).html(translations[language][‘jobTitle’](state));
}
}]);
return Filter;
}();
function getJobsList(jobs) {
return jobs.reduce(function(agg, _ref) {
var _ref2 = _slicedToArray(_ref, 2),
group = _ref2[0],
jobs = _ref2[1];
return [].concat(_toConsumableArray(agg), _toConsumableArray(jobs.map(function(job) {
return {
text: job,
value: group
};
})));
}, []).sort(function(a, b) {
return d3.ascending(a.text, b.text);
});
}
var translations = {
english: {
filterHeader: function filterHeader(state) {
if (state) return “Your plan for getting the vaccination is currently set for “.concat(state, “ rules.
n Complete the form below to see your customized vaccination information, including your eligibility status and where to get the vaccine.n You can change the state input below to view a vaccination plan in another state. “);
return ‘Select your age, occupation and other applicable factors to see if you are eligible now.’;
},
stickyHeader: function stickyHeader(state) {
if (state) return “You are viewing “.concat(state, “. Click the icon to make selections for another plan.”);
return ‘Select your age, occupation and other applicable factors to see if you are eligible now.’;
},
factorsHeader: ‘Additional factors’,
stateTitle: function stateTitle(state) {
if (state) return ‘Select another state’;
return ‘Select a state’;
},
ageTitle: ‘Age group’,
jobTitle: function jobTitle(state) {
if (state) return “Select an essential occupation for “.concat(state, “. Or check the box below.”);
return ‘State specific occupations’;
},
jobDefault: ‘Essential occupation’,
ageOptions: [{
value: ‘under64’,
text: ‘Under 65′
}, {
value: ’65-69′,
text: ’65-69′
}, {
value: ’70-74′,
text: ’70-74′
}, {
value: ’75older’,
text: ’75 or older’
}],
nonessential: ‘Other (non-essential) occupation’,
longterm: ‘Long-term care resident’,
highrisk: ‘High-risk health concerns’
},
spanish: {
filterHeader: function filterHeader(state) {
if (state) return “Tu plan para recibir la vacuna estxE1 establecido actualmente con las normas de “.concat(state, “.
Completa el formulario a continuacixF3n para ver tu informacixF3n de vacunacixF3n personalizada, incluyendo tu estatus de elegibilidad y dxF3nde obtener la vacuna. Abajo puedes seleccionar otro estado para ver su plan de vacunacixF3n.”);
return ‘Consulta tu plan seleccionando ubicación, grupo de edad, ocupación y otros factores aplicables.’;
},
stickyHeader: function stickyHeader(state) {
if (state) return “EstxE1s viendo el estado de “.concat(state, “. Cambia las selecciones abajo para ver otro plan.”);
return ‘Selecciona tu edad, ocupación y otros factores aplicables para ver si eres elegible ahora.’;
},
factorsHeader: ‘Otros factores’,
stateTitle: function stateTitle(state) {
if (state) return ‘Selecciona otro estado’;
return ‘Selecciona un estado’;
},
ageTitle: ‘Selecciona un rango de edad’,
jobTitle: function jobTitle(state) {
if (state) return “Selecciona un trabajo esencial para “.concat(state, “. O marca la casilla de abajo.”);
return ‘Trabajos esenciales específicos en este estado’;
},
jobDefault: ‘Trabajo esencial’,
ageOptions: [{
value: ‘under64’,
text: ‘Menores de 65 años’
}, {
value: ’65-69′,
text: ’65-69′
}, {
value: ’70-74′,
text: ’70-74′
}, {
value: ’75older’,
text: ‘Mayores de 75 años’
}],
nonessential: ‘Otras ocupaciones (no esenciales)’,
longterm: ‘Residentes de centros de cuidado a largo plazo’,
highrisk: ‘Problemas de salud de alto riesgo’
},
mandarin: {
filterHeader: function filterHeader(state) {
if (state) return “u76EEu524Du4F60u770Bu5230u7684u662F“.concat(state, “u7684u75ABu82D7u63A5u79CDu8BA1u5212u3002
u5B8Cu6210u4E0Bu9762u51E0u4E2Au9009u9879uFF0Cu53EFu81EAu5B9Au4E49u67E5u770Bu6709u5173u75ABu82D7u63A5u79CDu7684u4FE1u606FuFF0Cu5305u62ECu4F60u6240u5728u4EBAu7FA4u662Fu5426u5DF2u5F00u59CBu63A5u79CDu3001u5728u54EAu91CCu63A5u79CDu3002u4F60u53EFu4EE5u901Au8FC7u9009u62E9u4E0Du540Cu7684u5DDEuFF0Cu67E5u770Bu5176u4ED6u5DDEu7684u75ABu82D7u63A5u79CDu8BA1u5212u3002″);
return ‘完成下面几个选项,可自定义查看有关疫苗接种的信息,包括你所在人群是否已开始接种、在哪里接种。’;
},
stickyHeader: function stickyHeader(state) {
if (state) return “u76EEu524Du4F60u770Bu5230u7684u662F“.concat(state, “u7684u4FE1u606FuFF0Cu70B9u51FBu53F3u9762u9009u9879u67E5u770Bu5176u4ED6u5DDE”);
return ‘完成下面几个选项,可自定义查看有关疫苗接种的信息,包括你所在人群是否已开始接种、在哪里接种。’;
},
factorsHeader: ‘其他因素’,
stateTitle: function stateTitle(state) {
if (state) return ‘选择其他州’;
return ‘选择州’;
},
ageTitle: ‘年龄’,
jobTitle: function jobTitle(state) {
if (state) return “u9009u62E9“.concat(state, “u7684u91CDu8981u804Cu4E1AuFF0Cu6216u52FEu9009u4E0Bu9762u7684u9009u9879″);
return ‘对社会运行至关重要的职业’;
},
jobDefault: ‘对社会运行至关重要的职业’,
ageOptions: [{
value: ‘under64′,
text: ’65岁以下’
}, {
value: ’65-69′,
text: ’65至69′
}, {
value: ’70-74′,
text: ’70至74′
}, {
value: ’75older’,
text: ’75岁及以上’
}],
nonessential: ‘其他职业’,
longterm: ‘长期接受护理的人员’,
highrisk: ‘患有疾病的高风险人群’
}
};
var _default = Filter;
exports.default = _default;
}, {}],
4: [function(require, module, exports) {
“use strict”;
Object.defineProperty(exports, “__esModule”, {
value: true
});
exports.default = void 0;
var _constants = require(“../constants.js”);
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError(“Cannot call a class as a function”);
}
}
var template = function template() {
var breaking = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var head = arguments.length > 1 ? arguments[1] : undefined;
var url = arguments.length > 2 ? arguments[2] : undefined;
var language = arguments.length > 3 ? arguments[3] : undefined;
return “n “.concat(breaking ? ‘BREAKING‘ : ”, “n “).concat(head, “n “).concat(translations[language], “n”);
};
var News =
/**
* @param {*} contents parent container to append question
* @param {object} news the object with all info for this question
*/
function News(contents, news, language) {
_classCallCheck(this, News);
if (news[_constants.CONSTANTS.HEAD] && news[_constants.CONSTANTS.ARCH] !== ‘TRUE’) {
contents.append(‘ul’).append(‘li’).html(template(news[_constants.CONSTANTS.BREAK] === ‘TRUE’, news[_constants.CONSTANTS.HEAD], news[_constants.CONSTANTS.URL], language));
}
};
var _default = News;
exports.default = _default;
var translations = {
english: ‘Read more’,
spanish: ‘Lee más’,
mandarin: ‘阅读更多’
};
}, {
“../constants.js”: 10
}],
5: [function(require, module, exports) {
“use strict”;
Object.defineProperty(exports, “__esModule”, {
value: true
});
exports.default = void 0;
var _constants = require(“../constants.js”);
var _addEmbed = require(“./helpers/addEmbed.js”);
function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
}
function _nonIterableRest() {
throw new TypeError(“Invalid attempt to destructure non-iterable instance”);
}
function _iterableToArrayLimit(arr, i) {
var _arr = [];
var _n = true;
var _d = false;
var _e = undefined;
try {
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i[“return”] != null) _i[“return”]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
}
function _nonIterableSpread() {
throw new TypeError(“Invalid attempt to spread non-iterable instance”);
}
function _iterableToArray(iter) {
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === “[object Arguments]”) return Array.from(iter);
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = new Array(arr.length); i this.answerWrapper.node().clientHeight) {
this.expander.classed(‘inline’, true);
this.expanderDiv.classed(‘visible’, true);
this.expanderFade.classed(‘visible’, true);
}
}
}]);
return Question;
}();
var _default = Question;
/**
* special characters used for look up and resulting html template.
* `char` = the character we used to signify formatting.
* `single` = boolean if this is a single instance or bounding text,
* with a start and ending indication.
* `html` = templating function.
*/
exports.default = _default;
var characters = [{
char: ‘+’,
single: true,
html: function html() {
return “”;
}
}, {
char: ‘^’,
single: false,
html: function html(text) {
return ““.concat(text, ““);
}
}, {
char: ‘#’,
single: false,
html: function html(text) {
return “
“);
}
}, {
char: ‘_’,
single: false,
html: function html(text, link) {
return ““).concat(text, ““);
}
}];
/**
* generates an array of [start, end] for
* each emphasized section in an annotation.
*/
var getSingleIndiciesOf = function getSingleIndiciesOf(char, str) {
return Array.from(str).map(function(strChar, i) {
return strChar === char ? i : false;
}).filter(function(d) {
return d;
});
};
/**
* generates an array of [start, end] for
* each emphasized section in an annotation.
*/
var getPairedIndiciesOf = function getPairedIndiciesOf(char, str) {
return Array.from(str).reduce(function(a, c, i) {
return c === char ? [].concat(_toConsumableArray(a), [i]) : a;
}, []).reduce( // group into pairs of [start, end]
function(a, c, i, array) {
return i % 2 === 0 ? [].concat(_toConsumableArray(a), [
[array[i], array[i + 1]]
]) : a;
}, []);
};
/**
* htmlTemplating function
* @param {string} answer the string answer that should be parsed for special characters
*/
var htmlTemplating = function htmlTemplating(answer, links) {
return characters.reduce(function(string, obj) {
// if there are no special characters, just return the text as is.
if (string.indexOf(obj.char) === -1) return string; // otherwise, iterate over the indicies and inject the appropriate html template with the designated text in between. ex: ,
if (obj.single === true) {
var indicies = getSingleIndiciesOf(obj.char, string);
return [ // 1. any text prior to the first special character
string.slice(0, indicies[0])
].concat(_toConsumableArray(indicies.reduce(function(t, idx, i) {
return [].concat(_toConsumableArray(t), [ // all previous custom html templates already returned,
i > 0 ? string.slice(indicies[i – 1] + 1, idx) : [], // any text between the last template and this one
obj.html(string.slice(idx + 1, idx + 2)) // this custom html template
]);
}, [])), [ // 3. text after the last index
string.slice(indicies[indicies.length – 1] + 1, string.length)
]).join(”); // join all these segments
} else {
var _indicies = getPairedIndiciesOf(obj.char, string);
return [ // 1. any text prior to the first special character
string.slice(0, _indicies[0][0])
].concat(_toConsumableArray(_indicies.reduce(function(t, _ref, i) {
var _ref2 = _slicedToArray(_ref, 2),
start = _ref2[0],
end = _ref2[1];
return [].concat(_toConsumableArray(t), [ // all previous custom html templates already returned,
i > 0 ? string.slice(_indicies[i – 1][1] + 1, start) : [], // any text between the last template and this one
obj.html(string.slice(start + 1, end), links && links[i]) // this custom html template
]);
}, [])), [ // 3. text after the last index
string.slice(_indicies[_indicies.length – 1][1] + 1, string.length)
]).join(”); // join all these segments
}
}, answer);
};
var translations = {
english: [‘Read more’, ‘Hide’],
spanish: [‘Lee más’, ‘Ocultar’],
mandarin: [‘阅读更多’, ‘隐藏’]
};
}, {
“../constants.js”: 10,
“./helpers/addEmbed.js”: 7
}],
6: [function(require, module, exports) {
“use strict”;
Object.defineProperty(exports, “__esModule”, {
value: true
});
exports.default = void 0;
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError(“Cannot call a class as a function”);
}
}
var Signup =
/**
* @param {*} element d3 selection of the element to append the form to
* @param {string} language language selection for form text
* @param {string[]} states state names by language
* @param {string} formKey unique string for form ID
*/
function Signup(element, language, states, formKey) {
_classCallCheck(this, Signup);
var stateListInLanguage = states.map(function(d) {
return {
value: d[‘english’],
label: d[language]
};
});
element.html(“”));
var choices = new Choices(element.select(“#signup__state__”.concat(formKey)).node(), {
choices: stateListInLanguage.map(function(_ref) {
var value = _ref.value,
label = _ref.label;
return {
value: value,
label: label
};
})
});
d3.select(“#”.concat(formKey, ” .choices__input.choices__input–cloned”)).attr(‘placeholder’, translations[language].select);
try {
Sailthru.init({
customerId: ‘a839e8824b3cdd864a9ba3052205d70b’
});
} catch (e) {
console.error(e);
}
function changeFormToSuccess() {
d3.select(“#”.concat(formKey, ” .signup__wrap”)).attr(‘style’, ‘font-family: PublicoText,Georgia,Times New Roman,serif; font-size: 16px; margin-bottom: 12px;’).text(“”.concat(translations[language].success));
}
var checked = false;
function handleCheck() {
checked = !checked;
}
function handleSubmit(event) {
event.preventDefault();
var email = document.getElementById(“signup__email__”.concat(formKey)).value;
var signupValues = {
email: email,
lists: {
Master: 1
},
vars: {
sub_vaccineproject: 1,
language: language,
states: choices._currentState.items.map(function(choice) {
return choice.value;
})
},
onSuccess: function onSuccess(_ref2) {
var email = _ref2.email;
console.log(email, ’email success?’);
changeFormToSuccess();
},
onError: function onError(e) {
console.log(e, ’email error?’);
}
};
if (checked) {
signupValues.vars.breaking_news = 1;
}
try {
Sailthru.integration(‘userSignUp’, signupValues);
} catch (e) {
console.error(e);
}
}
document.getElementById(‘breaking’).addEventListener(‘change’, handleCheck);
document.getElementById(“form__”.concat(formKey)).addEventListener(‘submit’, handleSubmit);
};
var _default = Signup;
exports.default = _default;
var translations = {
english: {
header: ‘Sign up for NBC News alerts as changes are made to your vaccination plan in your state and/or another state:’,
email: ‘Enter your email’,
submit: ‘Submit’,
select: ‘Select one or multiple states’,
success: ‘Thank you for signing up to receive Plan Your Vaccine alerts when there are changes in the state or states you selected.’,
privacy: ‘Privacy policy’,
privacy_link: ‘https://www.nbcuniversal.com/privacy’,
breaking_news: ‘Sign up for breaking news alerts from NBC News’
},
spanish: {
header: ‘Regístrate para recibir alertas cuando haya actualizaciones de vacunación en tu estado:’,
email: ‘Ingresa tu email’,
submit: ‘Enviar’,
select: ‘Selecciona uno o varios estados’,
success: ‘Gracias por suscribirte para recibir alertas de Planifica tu vacuna cuando haya cambios en tu estado o los estados que hayas seleccionado.’,
privacy: ‘Política de privacidad’,
privacy_link: ‘https://www.nbcuniversal.com/privacy/spanish’,
breaking_news: ‘Suscríbete para recibir alertas de última hora de NBC News.’
},
mandarin: {
header: ‘请在下方订阅疫苗信息的更新推送:’,
state: ‘选择州名’,
email: ‘输入你的邮箱’,
submit: ‘提交’,
select: ‘选择一个或多个州’,
success: ‘感谢订阅,我们将会推送你已选的州的最新信息。’,
privacy: ‘隐私政策’,
privacy_link: ‘https://www.nbcuniversal.com/privacy-policy/%E9%9A%90%E7%A7%81%E6%94%BF%E7%AD%96’,
breaking_news: ‘订阅NBC News的突发新闻更新’
}
};
}, {}],
7: [function(require, module, exports) {
“use strict”;
Object.defineProperty(exports, “__esModule”, {
value: true
});
exports.addEmbed = void 0;
var _constants = require(“../../constants.js”);
function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
}
function _nonIterableRest() {
throw new TypeError(“Invalid attempt to destructure non-iterable instance”);
}
function _iterableToArrayLimit(arr, i) {
var _arr = [];
var _n = true;
var _d = false;
var _e = undefined;
try {
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i[“return”] != null) _i[“return”]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
/**
* getLocation function
* @param {string} id to append the script embed to
* @param {object} appState xxx
*/
var addEmbed = function addEmbed(divId, appState, graphicName, index) {
var graphic = d3.select(“#embed-“.concat(divId)).append(‘script’).attr(‘src’, ‘https://nodeassets.nbcnews.com/cdnassets/pym/1.3.2/pym.min.js’);
var state = appState.state,
loc = appState.loc,
zip = appState.zip,
language = appState.language,
age = appState.age;
var queryOptions = {
state: _constants.stateAbbr[state],
loc: loc,
// coords
zip: zip,
// zipcode
job: jobGroupKeys(appState[‘jobGroup’]),
age: groupAges(age),
highRisk: appState[‘high-risk’],
// true/false
longTerm: appState[‘long-term’],
// true/false
language: language,
url: window.location.href
};
var queryString = Object.entries(queryOptions).filter(function(_ref) {
var _ref2 = _slicedToArray(_ref, 2),
_ = _ref2[0],
value = _ref2[1];
return value;
}).map(function(_ref3, i) {
var _ref4 = _slicedToArray(_ref3, 2),
key = _ref4[0],
value = _ref4[1];
return “”.concat(i === 0 ? ‘?’ : ‘&’).concat(key, “=”).concat(value);
}).join(”);
var url = “https://dataviz.nbcnews.com/projects/”.concat(graphicName || divId, “/”).concat(index || ‘index.html’).concat(queryString);
graphic.append(‘script’).html(“var pymParent = new pym.Parent(’embed-“.concat(divId, “‘, ‘”).concat(url, “‘, {title: ”});”));
};
exports.addEmbed = addEmbed;
var groupAges = function groupAges(age) {
if (age === ’75older’) return ‘over75′;
if (age === ’65-69′ || age === ’70-74′) return ’65to74’;
else return ‘else’;
};
var jobGroupKeys = function jobGroupKeys(jobGroup) {
if (jobGroup === ‘health-care’) return ‘healthcarepersonnel’;
if (jobGroup === ‘front-line’) return ‘frontline’;
if (jobGroup === ‘other-essential’) return ‘otheressentialworkers’;
if (jobGroup === undefined) return undefined;
return ‘generalpublic’;
};
}, {
“../../constants.js”: 10
}],
8: [function(require, module, exports) {
“use strict”;
Object.defineProperty(exports, “__esModule”, {
value: true
});
exports.enableShare = exports.changeLanguage = exports.filterMenu = void 0;
var _geolocate = require(“./geolocate”);
// Filter menu
var filterMenu = function filterMenu(setAppState) {
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this,
args = arguments;
var later = function later() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
}
var stickyWrap = document.querySelectorAll(‘#sticky__wrap, #sticky__wrap .filter__bar, #sticky__wrap .filter__form-wrap’);
var filterBttn = document.querySelector(‘#sticky__open’);
var filterBttnIcon = document.querySelector(‘#filter__icon’);
var filterFormWrap = document.querySelector(‘#sticky__wrap .filter__object .filter__form-wrap’);
var shareMobile = document.querySelector(‘#share__mobile’);
var navMap = document.querySelector(‘.navMap’);
var footerSection = document.querySelector(‘.footer__section’);
var scrolling = function scrolling() {
if (window.scrollY > navMap.offsetTop + 300 && !filterBttn.classList.contains(‘clicked’) && !navMap.classList.contains(‘awaitingForm’)) {
stickyWrap.forEach(function(el) {
return el.classList.add(‘filter-sticky’);
});
filterBttn.classList.add(‘show’);
} else if (window.scrollY = +row[‘Zip Min’] && +zip {
// setAppState({
// // check comments in `geolocate.js` for data structure
// state: d[‘state_data’][‘state’],
// zip: d[‘city_data’][‘postal_code’],
// loc: [
// d[‘location_data’][‘latitude’],
// d[‘location_data’][‘longitude’]
// ]
// })
// })
// )
// }
Promise.all(promises).then(function(_ref) {
var _ref2 = _slicedToArray(_ref, 4),
questions = _ref2[0],
news = _ref2[1],
jobs = _ref2[2],
states = _ref2[3];
if (APPSTATE.dev) printTimestamps(questions, news, jobs);
makeGraphic(d3.select(‘.info-card__container’), questions, news, jobs, states);
});
});
})();
function makeGraphic(element, questions, news, jobs, states) {
/** if the state is not in our list of 51 state names
* then we will fail later, so reset to selection */
if (!states.map(function(d) {
return d[‘english’];
}).includes(APPSTATE.state)) {
setAppState({
state: undefined,
zip: undefined,
loc: undefined
});
}
app = new _App.default(element, questions, news, jobs, states, APPSTATE, setAppState); // create an instance of app
(0, _addEmbed.addEmbed)(‘20210112-plan-your-shot-phase-lead’, APPSTATE, ‘20210112-plan-your-shot-phase’, ‘index-lead.html’);
if (APPSTATE.dev) setAppState({
state: ‘New York’,
job: ‘non-essential’,
jobGroup: ‘non-essential’,
age: ‘under65’
});
}
function setAppState(obj) {
/* save previous state for specific triggers when key changes */
PREVSTATE = APPSTATE;
/* update current app state for passing to children */
APPSTATE = _objectSpread({}, APPSTATE, obj);
var checkIfValueChanged = function checkIfValueChanged(key) {
return PREVSTATE[key] !== APPSTATE[key];
};
if (app) {
if (checkIfValueChanged(‘language’)) {
updateSearchQuery(APPSTATE);
app.updateLanguage(APPSTATE[‘language’]);
app.updateLeadMap(APPSTATE);
}
if (checkIfValueChanged(‘state’)) {
app.updateState(APPSTATE[‘state’]);
/* don’t rerender on state change, we’re seing message instead */
// app.updateLeadMap(APPSTATE)
}
if (checkIfValueChanged(‘age’)) app.updateAge(APPSTATE[‘age’]);
if (checkIfValueChanged(‘job’)) app.updateJob(APPSTATE[‘job’]);
if (checkIfValueChanged(‘high-risk’)) app.updateCheck(‘high-risk’, APPSTATE[‘high-risk’]);
if (checkIfValueChanged(‘long-term’)) app.updateCheck(‘long-term’, APPSTATE[‘long-term’]);
/**
* This makes the rest of the app visible, and ensures that
* we aren’t running the card update until we’re inside the app.
*/
if (!APPSTATE.open && (APPSTATE.state && APPSTATE.age && APPSTATE.job || APPSTATE.dev)) {
// remove `display: none` from divs beyond opening page
d3.selectAll(‘section,article,div.arrow__wrap’).classed(‘awaitingForm’, false);
d3.select(‘div.arrow__wrap’).classed(‘teal’, true); // change the open value to true and re-run this to trigger update
setAppState({
open: true
});
}
/* once open is set, then we run update on every app update */
if (APPSTATE.open) {
app.update(APPSTATE); // trigger the app class to update
}
updateSearchQuery(APPSTATE);
}
}
function updateSearchQuery(appState) {
var keysToAlwaysInclude = [‘staging’, ‘dev’, ‘language’, ‘state’ // ‘age’,
// ‘job’,
// ‘high-risk’,
// ‘long-term’
];
var filteredAppState = Object.entries(appState).filter(function(_ref3) {
var _ref4 = _slicedToArray(_ref3, 2),
key = _ref4[0],
value = _ref4[1];
return keysToAlwaysInclude.includes(key) && value !== undefined && value;
});
var queryString = filteredAppState.map(function(_ref5, i) {
var _ref6 = _slicedToArray(_ref5, 2),
key = _ref6[0],
value = _ref6[1];
if (key === ‘state’) return “”.concat(i === 0 ? ‘?’ : ‘&’).concat(key, “=”).concat(_constants.stateAbbr[value]);
return “”.concat(i === 0 ? ‘?’ : ‘&’).concat(key, “=”).concat(value);
}).join(”);
var newurl = window.location.protocol + ‘//’ + window.location.host + window.location.pathname + queryString;
window.history.pushState({
path: newurl
}, ”, newurl);
}
function printTimestamps(questions, news, jobs) {
console.table({
questions: questions.timestamp,
news: news.timestamp,
jobs: jobs.timestamp
});
}
}, {
“./components/App”: 1,
“./components/helpers/addEmbed”: 7,
“./components/helpers/filterelements”: 8,
“./components/helpers/geolocate”: 9,
“./constants”: 10
}]
}, {}, [11])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvZ3JhcGhpY3MvMjAyMTAxMDYtcGxhbi15b3VyLXNob3Qtc2hvcnRoYW5kL2pzL2NvbXBvbmVudHMvQXBwLmpzIiwic3JjL2dyYXBoaWNzLzIwMjEwMTA2LXBsYW4teW91ci1zaG90LXNob3J0aGFuZC9qcy9jb21wb25lbnRzL0NhcmQuanMiLCJzcmMvZ3JhcGhpY3MvMjAyMTAxMDYtcGxhbi15b3VyLXNob3Qtc2hvcnRoYW5kL2pzL2NvbXBvbmVudHMvRmlsdGVyLmpzIiwic3JjL2dyYXBoaWNzLzIwMjEwMTA2LXBsYW4teW91ci1zaG90LXNob3J0aGFuZC9qcy9jb21wb25lbnRzL05ld3MuanMiLCJzcmMvZ3JhcGhpY3MvMjAyMTAxMDYtcGxhbi15b3VyLXNob3Qtc2hvcnRoYW5kL2pzL2NvbXBvbmVudHMvUXVlc3Rpb24uanMiLCJzcmMvZ3JhcGhpY3MvMjAyMTAxMDYtcGxhbi15b3VyLXNob3Qtc2hvcnRoYW5kL2pzL2NvbXBvbmVudHMvU2lnbnVwLmpzIiwic3JjL2dyYXBoaWNzLzIwMjEwMTA2LXBsYW4teW91ci1zaG90LXNob3J0aGFuZC9qcy9jb21wb25lbnRzL2hlbHBlcnMvYWRkRW1iZWQuanMiLCJzcmMvZ3JhcGhpY3MvMjAyMTAxMDYtcGxhbi15b3VyLXNob3Qtc2hvcnRoYW5kL2pzL2NvbXBvbmVudHMvaGVscGVycy9maWx0ZXJlbGVtZW50cy5qcyIsInNyYy9ncmFwaGljcy8yMDIxMDEwNi1wbGFuLXlvdXItc2hvdC1zaG9ydGhhbmQvanMvY29tcG9uZW50cy9oZWxwZXJzL2dlb2xvY2F0ZS5qcyIsInNyYy9ncmFwaGljcy8yMDIxMDEwNi1wbGFuLXlvdXItc2hvdC1zaG9ydGhhbmQvanMvY29uc3RhbnRzLmpzIiwic3JjL2dyYXBoaWNzLzIwMjEwMTA2LXBsYW4teW91ci1zaG90LXNob3J0aGFuZC9qcy9ncmFwaGljLmpzIl0sIm5hbWVzIjpbXSwibWFwcGlu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QUFJLEVBQUUsSUFBSSxDQUFDLFNBRkM7QUFHWixJQUFBLElBQUksRUFBRSxJQUFJLENBQUM7QUFIQyxHQUFkO0FBS0QiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJpbXBvcnQgQ2FyZCBmcm9tICcuL0NhcmQnXG5pbXBvcnQgRmlsdGVyIGZyb20gJy4vRmlsdGVyJ1xuaW1wb3J0IFNpZ251cCBmcm9tICcuL1NpZ251cCdcbmltcG9ydCB7IGFkZEVtYmVkIH0gZnJvbSAnLi9oZWxwZXJzL2FkZEVtYmVkJ1xuaW1wb3J0IHsgQ09OU1RBTlRTIGFzIEMgfSBmcm9tICcuLy4uL2NvbnN0YW50cydcblxuLyoqXG4gKiBDQVJEIE5VTUJFUlNcbiAqIDFcdFdoYXQgaXMgdGhlIHZhY2NpbmUgZGlzdHJpYnV0aW9uIHRpbWVsaW5lIGluIExPQ0FUSU9OP1xuICogMlx0SW4gdGhlIG5ld3M6IE9uZ29pbmcgdmFjY2luYXRpb24gaXNzdWVzIGluIExPQ0FUSU9OOlxuICogM1x0V2hhdCBhcmUgdGhlIHJlcXVpcmVtZW50cyBpbiBMT0NBVElPTj9cbiAqIDRcdFdoZXJlIGNhbiBJIGdldCB0aGUgdmFjY2luZSBpbiBMT0NBVElPTj9cbiAqIDVcdEhvdyBtdWNoIGRvZXMgdGhlIHZhY2NpbmUgY29zdCBpbiBMT0NBVElPTj9cbiAqL1xuXG5jbGFzcyBBcHAge1xuICAvKipcbiAgICogTUFJTiBBUFAuXG4gICAqIEFsbG93cyB1cyB0byBjb29yZGluYXRlIHRoZSBjcmVhdGlvbi9kZWxldGlvbiBvZiBjYXJkcyB0aHJvdWdoXG4gICAqIG1ldGhvZHMgd2l0aCBhbiBhcHAgc3RhdGUuXG4gICAqIEBwYXJhbSB7Kn0gZWwgcGFyZW50IGNvbnRhaW5lciB0byBhcHBlbmQgYXBwXG4gICAqIEBwYXJhbSB7Kn0gcXVlc3Rpb25zIHVuZ3JvdXBlZCByYXcgZGF0YSBmcm9tIHRoZSBzaGVldCBwYXJzZXJcbiAgICogQHBhcmFtIHsqfSBuZXdzIHVuZ3JvdXBlZCByYXcgZGF0YSBmcm9tIHRoZSBzaGVldCBwYXJzZXJcbiAgICogQHBhcmFtIHsqfSBzdGF0ZXMgbGlzdCBvZiBzdGF0ZSBuYW1lcyBmb3Igc2VsZWN0XG4gICAqIEBwYXJhbSB7Kn0gYXBwU3RhdGUgY3VycmVudCBhcHAgc3RhdGUgaW5jbHVkaW5nIHN0YXRlLCB6aXAsIGFuZCBsYW5ndWFnZSBzZWxlY3Rpb25cbiAgICovXG5cbiAgY29uc3RydWN0b3IoZWwsIHF1ZXN0aW9ucywgbmV3cywgam9icywgc3RhdGVzLCBhcHBTdGF0ZSwgc2V0QXBwU3RhdGUpIHtcbiAgICB0aGlzLmVsID0gZWxcbiAgICB0aGlzLnN0YXRlcyA9IHN0YXRlc1xuXG4gICAgLyoqIGNvbnZlcnRzIG5lc3RlZCBhcnJheXMgdG8gYSB0d28gbGV2ZWwgbmVzdGVkIG1hcCwgYnkgbGFuZ3VhZ2UgdGhlbiBieSBzdGF0ZSAqL1xuICAgIHRoaXMucXVlc3Rpb25zID0gbmV3IE1hcChcbiAgICAgIHF1ZXN0aW9ucy5yZWR1Y2UoKHQsIFtsYW5nLCBhcnJheV0pID0+IFsuLi50LCBbbGFuZywgbmV3IE1hcChhcnJheSldXSwgW10pXG4gICAgKVxuICAgIHRoaXMubmV3cyA9IG5ldyBNYXAoXG4gICAgICBuZXdzLnJlZHVjZSgodCwgW2xhbmcsIGFycmF5XSkgPT4gWy4uLnQsIFtsYW5nLCBuZXcgTWFwKGFycmF5KV1dLCBbXSlcbiAgICApXG4gICAgdGhpcy5qb2JzID0gbmV3IE1hcChcbiAgICAgIGpvYnMucmVkdWNlKCh0LCBbbGFuZywgYXJyYXldKSA9PiBbLi4udCwgW2xhbmcsIG5ldyBNYXAoYXJyYXkpXV0sIFtdKVxuICAgIClcblxuICAgIC8qIHVwZGF0ZSBhbGwgZmlsdGVycyB0byBhcHBzdGF0ZSAqL1xuICAgIHRoaXMuRmlsdGVyID0gbmV3IEZpbHRlcihcbiAgICAgIHN0YXRlcy5tYXAoZCA9PiAoe1xuICAgICAgICBrZXk6IGRbJ2VuZ2xpc2gnXSxcbiAgICAgICAgbGFuZ3VhZ2VzOiBkXG4gICAgICB9KSksXG4gICAgICB0aGlzLmpvYnMsXG4gICAgICBhcHBTdGF0ZSxcbiAgICAgIHNldEFwcFN0YXRlXG4gICAgKVxuXG4gICAgLyogaW1tZWRpYXRlbHkgc2V0IG9wZW5lciB0byB0aGUgY29ycmVjdCBsYW5ndWFnZSAqL1xuICAgIHRoaXMudXBkYXRlTGFuZ3VhZ2UoYXBwU3RhdGUubGFuZ3VhZ2UsIHRydWUpXG5cbiAgICBpZiAoYXBwU3RhdGUuc3RhdGUpIHtcbiAgICAgIC8qIGltbWVkaWF0ZWx5IHNldCBmaWx0ZXIgdG8gY29ycmVjdCBzdGF0ZSBuYW1lIGFuZCBqb2IgbGlzdCAqL1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZShhcHBTdGF0ZS5zdGF0ZSwgdHJ1ZSlcbiAgICAgIHRoaXMudXBkYXRlSm9iKGFwcFN0YXRlLmpvYilcbiAgICB9XG5cbiAgICAvKiBzZXQgdGhlIGFycm93IGNsaWNrIGZ1bmN0aW9uICovXG4gICAgZDMuc2VsZWN0KCcuYXJyb3dfX3dyYXAnKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICBsb2NhdGlvbi5oYXNoID0gJydcbiAgICAgIGxvY2F0aW9uLmhhc2ggPSAnI3BsYW4nXG4gICAgfSlcblxuICAgIC8qIHppcHBlcnMgdXAgdGhlIHF1ZXN0aW9ucyBhbmQgbmV3cyBkYXRhIHNvIHRoZXkgYXJlIGFsbCBhdmFpbGFibGUgaW4gdGhlIHNhbWUgTWFwICovXG4gICAgdGhpcy5kYXRhTWFwID0gbmV3IE1hcChcbiAgICAgIHF1ZXN0aW9ucy5yZWR1Y2UoKHQsIFtsYW5nLCBhcnJheV0pID0+IHtcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlbid0IHN0b3JpZXMgZm9yIHRoaXMgbGFuZ3VhZ2UgKGkuZS4gbWFuZGFyaW4pLCByZXR1cm4gZW5nbGlzaCBuZXdzIHN0b3JpZXNcbiAgICAgICAgY29uc3QgdGhpc0xhbmd1YWdlTmV3cyA9IHRoaXMubmV3cy5oYXMobGFuZylcbiAgICAgICAgICA/IHRoaXMubmV3cy5nZXQobGFuZylcbiAgICAgICAgICA6IHRoaXMubmV3cy5nZXQoJ2VuZ2xpc2gnKVxuICAgICAgICAvKiogYWxzbyByZXR1cm4gbmF0aW9uYWwgc3RvcmllcyB3aGljaCBzaG91bGQgYXBwZWFyIGF0IHRoZSB0b3Agb2YgZXZlcnkgc3RhdGUuXG4gICAgICAgICAqIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgdHJlYXRzIFwiTmF0aW9uYWxcIiBsaWtlIGEgc3RhdGUsIHNvIGl0cyBnb3QgdGhlIHNhbWUgZm9ybSBhczpcbiAgICAgICAgICogW1wiT25nb2luZyBuZXdzIGluIE5hdGlvbmFsXCIsIFt7Li4ufSwgey4uLn1dXVxuICAgICAgICAgKiBzbyB3ZSBjYW4gc2F2ZSB0aGlzIG5hdGlvbmFsIGhlYWRsaW5lIHNpbmNlIGl0cyBpbiB0aGUgYXBwcm9wcm9pYXRlIGxhbmd1YWdlLiAqL1xuXG4gICAgICAgIGNvbnN0IFtbbmF0aW9uYWxIZWFkbGluZSwgbmF0aW9uYWxTdG9yaWVzXV0gPSB0aGlzTGFuZ3VhZ2VOZXdzLmdldChcbiAgICAgICAgICAnTmF0aW9uYWwnXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAuLi50LFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIGxhbmcsXG4gICAgICAgICAgICBuZXcgTWFwKFxuICAgICAgICAgICAgICBhcnJheS5tYXAoKFtzdGF0ZSwgZGF0YV0pID0+IHtcbiAgICAgICAgICAgICAgICAvKiogZ2V0IHRoaXMgc3RhdGUncyBuZXdzIGluIHRoaXMgbGFuZ3VhZ2UsIGFuZCBpZiB0aGlzIHN0YXRlIGRvZXNuJ3QgaGF2ZSBhbnkgbmV3cyxcbiAgICAgICAgICAgICAgICAgKiBqdXN0IHJldHVybiB0aGUgbmF0aW9uYWwgbmV3cy4gKi9cbiAgICAgICAgICAgICAgICBjb25zdCBbW2hlYWRsaW5lLCBzdGF0ZU5ld3NdXSA9IHRoaXNMYW5ndWFnZU5ld3MuaGFzKHN0YXRlKVxuICAgICAgICAgICAgICAgICAgPyB0aGlzTGFuZ3VhZ2VOZXdzLmdldChzdGF0ZSlcbiAgICAgICAgICAgICAgICAgIDogW1tuYXRpb25hbEhlYWRsaW5lLCBbXV1dXG4gICAgICAgICAgICAgICAgLyoqIHRoZSBvcmRlciBzaG91bGQgYWx3YXlzIGJlIG5hdGlvbmFsIHN0b3JpZXMgZmlyc3QsIHRoZW4gc3RhdGUgbmV3cy4gVGhpcyBpcyBhbHNvXG4gICAgICAgICAgICAgICAgICogbWl0aWdhdGVkIHdoZW4gdGhlIGRhdGEgaXMgYXBwZW5kZWQgYnkgYSBzb3J0IGZ1bmN0aW9uLiAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbE5ld3MgPSBbLi4ubmF0aW9uYWxTdG9yaWVzLCAuLi5zdGF0ZU5ld3NdXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICAgICAgLyoqIHNvcnQgYnkgdGhlIElEcyBmb3IgdGhlc2UgY2FyZCBxdWVzdGlvbnMvbmV3cyBzdG9yaWVzLiBUaGUgSUQgaXMgc2V0IGluIHRoZSBnb29nbGVcbiAgICAgICAgICAgICAgICAgICAqIHNoZWV0cyBwcm9jZXNzIGluIGNvbXBpbGF0aW9uLiAqL1xuICAgICAgICAgICAgICAgICAgWy4uLmRhdGEsIFtoZWFkbGluZSwgYWxsTmV3c11dLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICAgIGQzLmFzY2VuZGluZyhnZXRJRChhKSwgZ2V0SUQoYikpXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgICAgfSwgW10pXG4gICAgKVxuICAgIHRoaXMudXBkYXRlRGF0YShhcHBTdGF0ZSlcbiAgICB0aGlzLmZvb3RlciA9IGQzLnNlbGVjdCgnLmZvb3Rlcl9fd3JhcCcpXG4gICAgdGhpcy5mb290ZXJTaWdudXAgPSBuZXcgU2lnbnVwKFxuICAgICAgdGhpcy5mb290ZXIsXG4gICAgICBhcHBTdGF0ZS5sYW5ndWFnZSxcbiAgICAgIHRoaXMuc3RhdGVzLFxuICAgICAgJ2Zvb3RlcidcbiAgICApXG4gIH1cblxuICB1cGRhdGVEYXRhKGFwcFN0YXRlKSB7XG4gICAgLy8gVE9ETzogYWRkIGEgZmFsbGJhY2sgaWYgc3RhdGUgbm90IGZvdW5kXG4gICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhTWFwLmdldChhcHBTdGF0ZS5sYW5ndWFnZSkuZ2V0KGFwcFN0YXRlLnN0YXRlKVxuICAgIHRoaXMuYXBwU3RhdGUgPSBhcHBTdGF0ZVxuICB9XG5cbiAgYWRkQ2FyZHMoKSB7XG4gICAgdGhpcy5jYXJkcyA9IHRoaXMuZGF0YS5tYXAoKFtoZWFkZXIsIGRhdGFdLCBpKSA9PiB7XG4gICAgICAvLyBza2lwIG92ZXIgdGhlIG5ld3MgY2FyZCBmb3IgdGhlIG1hbmRhcmluIGxhbmd1YWdlXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuYXBwU3RhdGUubGFuZ3VhZ2UgPT09ICdtYW5kYXJpbicgJiZcbiAgICAgICAgTWF0aC5mbG9vcigrZGF0YVswXVtDLklEXSkgPT09IDJcbiAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICByZXR1cm4gbmV3IENhcmQodGhpcy5lbCwgaGVhZGVyLCBkYXRhLCB0aGlzLmFwcFN0YXRlLCB0aGlzLnN0YXRlcylcbiAgICB9KVxuICB9XG5cbiAgcmVtb3ZlQ2FyZHMoKSB7XG4gICAgdGhpcy5lbC5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKVxuICB9XG5cbiAgdXBkYXRlKGFwcFN0YXRlKSB7XG4gICAgLy8gdGhpcyBtZXRob2QgYWxsb3dzIGZvciBlYXN5IHVwZGF0ZXMgZnJvbSBncmFwaGljLmpzXG4gICAgaWYgKHRoaXMuY2FyZHMpIHRoaXMucmVtb3ZlQ2FyZHMoKVxuICAgIHRoaXMudXBkYXRlRGF0YShhcHBTdGF0ZSlcbiAgICB0aGlzLmFkZENhcmRzKClcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKHN0YXRlLCBpbml0aWFsTG9hZCA9IGZhbHNlKSB7XG4gICAgdGhpcy5GaWx0ZXIudXBkYXRlU3RhdGUoc3RhdGUsIGluaXRpYWxMb2FkKVxuICB9XG5cbiAgdXBkYXRlTGFuZ3VhZ2UobmV3TGFuZ3VhZ2UsIGluaXRpYWxMb2FkID0gZmFsc2UpIHtcbiAgICBkMy5zZWxlY3QoJy5tZXRob2RvbG9neV9fd3JhcCcpXG4gICAgICAuYXR0cignY2xhc3MnLCBgbWV0aG9kb2xvZ3lfX3dyYXAgJHtuZXdMYW5ndWFnZX1gKVxuICAgICAgLmh0bWwobWV0aG9kb2xvZ3lMYW5ndWFhZ2VzW25ld0xhbmd1YWdlXSlcblxuICAgIGlmICh0aGlzLmZvb3Rlcikge1xuICAgICAgdGhpcy5mb290ZXIuc2VsZWN0KCcuc2lnbnVwJykucmVtb3ZlKClcbiAgICAgIHRoaXMuZm9vdGVyU2lnbnVwID0gbmV3IFNpZ251cChcbiAgICAgICAgdGhpcy5mb290ZXIsXG4gICAgICAgIG5ld0xhbmd1YWdlLFxuICAgICAgICB0aGlzLnN0YXRlcyxcbiAgICAgICAgJ2Zvb3RlcidcbiAgICAgIClcbiAgICB9XG5cbiAgICBkMy5zZWxlY3QoJy5jb250YWN0ID4gcCcpLmh0bWwoY29udGFjdExhbmd1YWdlc1tuZXdMYW5ndWFnZV0pXG5cbiAgICB0aGlzLkZpbHRlci5zZXRPcHRpb25zQnlMYW5ndWFnZShuZXdMYW5ndWFnZSwgaW5pdGlhbExvYWQpXG5cbiAgICBkMy5zZWxlY3QoJyNsZWFkX19kZXNrdG9wLWltZycpXG4gICAgICAuYXR0cihcbiAgICAgICAgJ3NyYycsXG4gICAgICAgIGBodHRwczovL2RhdGF2aXoubmJjbmV3cy5jb20vcHJvamVjdHMvMjAyMTAxMDYtcGxhbi15b3VyLXNob3Qtc2hvcnRoYW5kL2Fzc2V0cy9wbGFuLXlvdXItdmFjY2luZS0ke25ld0xhbmd1YWdlfS1sb2dvLnBuZ2BcbiAgICAgIClcbiAgICAgIC5hdHRyKCdjbGFzcycsIGBsZWFkX19sb2dvICR7bmV3TGFuZ3VhZ2V9YClcblxuICAgIGQzLnNlbGVjdCgnLmxlYWRfX3RleHQtaW50cm8nKS50ZXh0KGRla0xhbmd1YWdlc1tuZXdMYW5ndWFnZV0pXG4gIH1cblxuICB1cGRhdGVMZWFkTWFwKGFwcFN0YXRlKSB7XG4gICAgLyogcmVwbGFjZSBhbiBlbWJlZCB3aXRoIG5ldyBsYW5ndWFnZSAqL1xuICAgIGFkZEVtYmVkKFxuICAgICAgJzIwMjEwMTEyLXBsYW4teW91ci1zaG90LXBoYXNlLWxlYWQnLFxuICAgICAgYXBwU3RhdGUsXG4gICAgICAnMjAyMTAxMTItcGxhbi15b3VyLXNob3QtcGhhc2UnLFxuICAgICAgJ2luZGV4LWxlYWQuaHRtbCdcbiAgICApXG4gIH1cblxuICB1cGRhdGVBZ2UoYWdlKSB7XG4gICAgdGhpcy5GaWx0ZXIudXBkYXRlQWdlKGFnZSlcbiAgfVxuXG4gIHVwZGF0ZUpvYihqb2IpIHtcbiAgICB0aGlzLkZpbHRlci51cGRhdGVKb2Ioam9iKVxuICB9XG5cbiAgdXBkYXRlQ2hlY2soaWQsIGJvb2wpIHtcbiAgICB0aGlzLkZpbHRlci51cGRhdGVDaGVjayhpZCwgYm9vbClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBcHBcblxuLyoqXG4gKiBnZXRJRFxuICogQHBhcmFtIHtbc3RyaW5nLCBvYmplY3RbXV19IGNhcmQgdGhpcyBpbmNsdWRlcyB0aGUgY2FyZCBkYXRhLCBpbiB0aGUgc3RydWN0dXJlIFtoZWFkZXIsIFt7Li4ufSwgey4uLn1dXS4gVGhlIElEIGlzIG5vdCBtYWludGFpbmVkIG9uIHRoZSBoZWFkZXIgbGV2ZWwsIHNvIHdlIGhhdmUgdG8gZXhwb3NlIGl0IHRocm91Z2ggdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHF1ZXN0aW9ucy5cbiAqL1xuY29uc3QgZ2V0SUQgPSAoW2hlYWRlciwgcXVlc3Rpb25zXSkgPT4gK3F1ZXN0aW9uc1swXVtDLklEXVxuXG5jb25zdCBkZWtMYW5ndWFnZXMgPSB7XG4gIGVuZ2xpc2g6XG4gICAgJ0V2ZXJ5dGhpbmcgeW91IG5lZWQgdG8ga25vdyBhYm91dCBnZXR0aW5nIGEgQ292aWQtMTkgdmFjY2luYXRpb24gYXMgdGhlIHJvbGxvdXQgZXh0ZW5kcyBhY3Jvc3MgdGhlIFUuUy4nLFxuICBzcGFuaXNoOlxuICAgICdUb2RvIGxvIHF1ZSBuZWNlc2l0YXMgc2FiZXIgc29icmUgbGEgdmFjdW5hIGNvbnRyYSBlbCBDT1ZJRC0xOSwgYSBtZWRpZGEgcXVlIGVsIHByb2dyYW1hIGRlIGlubXVuaXphY2nDs24gYXZhbnphIGVuIEVzdGFkb3MgVW5pZG9zLicsXG4gIG1hbmRhcmluOiAn6L+Z6YeM5piv5omA5pyJ5L2g6ZyA6KaB5LqG6Kej55qE5pyJ5YWz5paw5Yag55ar6IuX5o6l56eN55qE5L+h5oGv44CCJ1xufVxuXG5jb25zdCBtZXRob2RvbG9neUxhbmd1YWFnZXMgPSB7XG4gIGVuZ2xpc2g6IGBcbiAgPGgzPk1ldGhvZG9sb2d5PC9oMz5cbiAgPGRpdiBjbGFzcz1cIm1ldGhvZG9sb2d5XCI+XG4gICAgPHA+TkJDIE5ld3MgYmFzZWQgaXRzIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWNjaW5lLWVsaWdpYmxlIHBvcHVsYXRpb24gZ3JvdXBzIG9uIGVzdGltYXRlcyBwcm92aWRlZCBieSA8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly9zdXJnb3ZlbnR1cmVzLm9yZy9hYm91dC1zdXJnby12ZW50dXJlc1wiPlN1cmdvIFZlbnR1cmVzPC9hPiwgYSBub25wcm9maXQgd2l0aCBhIGZvY3VzIG9uIGhlYWx0aCBwcm9ibGVtcywgYW5kIDxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL3d3dy5hcmlhZG5lbGFicy5vcmcvYWJvdXQtdXMvXCI+QXJpYWRuZSBMYWJzPC9hPiwgYSBqb2ludCBjZW50ZXIgZm9yIGhlYWx0aCBzeXN0ZW1zLCB3aGljaCB3ZXJlIGluIHR1cm4gYmFzZWQgb24gYSB2YXJpZXR5IG9mIGdvdmVybm1lbnQgZGF0YSBzb3VyY2VzLiA8c3Bhbj48L3NwYW4+XG4gICAgVGhlc2UgZXN0aW1hdGVzLCA8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly9jb3ZpZDE5dmFjY2luZWFsbG9jYXRpb24ub3JnL2Fzc2V0cy9WYWNjaW5lX0FsbG9jYXRpb25fUGxhbm5lcl9mb3JfQ09WSUQxOV9NZXRob2RzLnBkZlwiPmRlc2NyaWJlZCBoZXJlPC9hPiBpbiBncmVhdGVyIGRldGFpbCwgdGFrZSBzb21lIGdyb3Vwcywgc3VjaCBhcyBoaWdoLXJpc2sgd29ya2VycywgYW5kIGNsYXNzaWZ5IHRoZW0gaW50byBzdWJncm91cHMsIHN1Y2ggYXMgZG9jdG9ycyBhbmQgbnVyc2VzLiBUaGUgZ3JvdXBzIGFyZSB0aGVuIGFzc2lnbmVkIHRvIGEgc3RhdGUncyB2YWNjaW5hdGlvbiBwaGFzZS4gRm9yIGV4YW1wbGU6IHRoZSBncm91cCBkZXNpZ25hdGVkIGFzIGZpcnN0IHJlc3BvbmRlcnMgKHBvbGljZSBhbmQgZmlyZWZpZ2h0ZXJzKSB3ZXJlIHBsYWNlZCB3aXRoaW4gYW4gZXNzZW50aWFsIGdyb3VwLiA8c3Bhbj48L3NwYW4+XG4gICAgVGhlIGVzdGltYXRlcyB0YWtlIGludG8gYWNjb3VudCBvdmVybGFwIGJldHdlZW4gZ3JvdXBzLCBhbmQgZm9sbG93IHRoZSBDZW50ZXJzIGZvciBEaXNlYXNlIENvbnRyb2wgYW5kIFByZXZlbnRpb27igJlzIEFkdmlzb3J5IENvbW1pdHRlZSBvbiBJbW11bml6YXRpb24gUHJhY3RpY2VzIChBQ0lQKSBndWlkZWxpbmVzLiA8c3Bhbj48L3NwYW4+XG4gICAgVGhlIGR5bmFtaWMgdmFjY2luYXRpb24gbWFwIHNob3dpbmcgdGhlIG51bWJlciBvZiBmdWxseSB2YWNjaW5hdGVkIHBlb3BsZSBhY3Jvc3MgdGhlIFUuUy4gYW5kIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIHZhY2NpbmVzIHRoYXQgaGF2ZSBiZWVuIHVzZWQgaXMgYmFzZWQgb24gZGF0YSBmcm9tIHRoZSBDREMuIE5CQyBOZXdzIHJhbmtzIGVhY2ggcGxhY2XigJlzIHByb2dyZXNzIG9uIHZhY2NpbmUgZGlzdHJpYnV0aW9uIGJhc2VkIG9uIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBkaXN0cmlidXRlZCB2YWNjaW5lIHVzZWQuIDxzcGFuPjwvc3Bhbj5cbiAgICBUaGUgaW5mb3JtYXRpb24gb24gdmFjY2luZSBkaXN0cmlidXRpb24gaW4gc3RhdGVzLCBXYXNoaW5ndG9uLCBELkMuIGFuZCBQdWVydG8gUmljbyBjYW1lIGZyb20gTkJDIE5ld3MgcmVzZWFyY2ggZWZmb3J0cy4gTkJDIE5ld3MgcmVzZWFyY2hlcnMgcmVhY2hlZCBvdXQgdG8gc3RhdGUgaGVhbHRoIGRlcGFydG1lbnQgb2ZmaWNpYWxzIGFuZCBleGFtaW5lZCB0aGVpciB3ZWIgc2l0ZXMsIGFuZCB0aGV5IGdhdGhlcmVkIGluZm9ybWF0aW9uIGZyb20gc3RhdGUgYW5kIGhlYWx0aCBkZXBhcnRtZW50IHByZXNzIGNvbmZlcmVuY2VzLiBPZmZpY2lhbCBzb2NpYWwgbWVkaWEgY29tbXVuaWNhdGlvbnMgd2VyZSBhbHNvIHVzZWQuIDxzcGFuPjwvc3Bhbj5cbiAgICBDb3ZpZC0xOSB2YWNjaW5hdGlvbiBsb2NhdGlvbnMgd2VyZSBzb3VyY2VkIGZyb20gc3RhdGUsIGNvdW50eSwgZGlzdHJpY3QsIGhlYWx0aCBkaXN0cmljdCBhbmQgdGVycml0b3J5IGhlYWx0aCBkZXBhcnRtZW50cywgZnJvbSBpbmZvcm1hdGlvbiBzdXBwbGllZCBmcm9tIHBoYXJtYWN5IGNoYWlucyBhbmQgZnJvbSBkYXRhIHByb3ZpZGVkIGJ5IFJ4IE9wZW4sIHdoaWNoIHByb3ZpZGVzIHRoZSBvcGVyYXRpbmcgc3RhdHVzIG9mIGhlYWx0aC1jYXJlIGZhY2lsaXRpZXMgaW4gYXJlYXMgYWZmZWN0ZWQgYnkgYSBkaXNhc3RlciwgaW5jbHVkaW5nIHRoZSBDb3ZpZC0xOSBvdXRicmVhay4gVGhpcyBkYXRhIHdhcyBjb2xsYXRlZCBhbmQgdGhlbiBtYXBwZWQuPC9wPlxuICA8L2Rpdj5gLFxuICBzcGFuaXNoOiBgXG4gIDxoMz5NZXRvZG9sb2fDrWE8L2gzPlxuICA8ZGl2IGNsYXNzPVwibWV0aG9kb2xvZ3lcIj5cbiAgICA8cD5OQkMgTmV3cyBiYXNhIGxhIGRlc2NyaXBjacOzbiBkZSBsb3MgZ3J1cG9zIGVsZWdpYmxlcyBwYXJhIGxhIHZhY3VuYWNpw7NuIGVuIGxvcyBlc3RpbWFkb3MgcXVlIHByb3ZlZW4gPGEgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cImh0dHBzOi8vc3VyZ292ZW50dXJlcy5vcmcvYWJvdXQtc3VyZ28tdmVudHVyZXNcIj5TdXJnbyBWZW50dXJlczwvYT4sIHVuYSBvcmdhbml6YWNpw7NuIHNpbiDDoW5pbW8gZGUgbHVjcm8gZW5mb2NhZGEgZW4gcHJvYmxlbWFzIGRlIHNhbHVkOyB5IDxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL3d3dy5hcmlhZG5lbGFicy5vcmcvYWJvdXQtdXMvXCI+QXJpYWRuZSBMYWJzPC9hPiwgdW4gY2VudHJvIGNvbmp1bnRvIGRlIHNpc3RlbWFzIGRlIHNhbHVkLCBsb3MgY3VhbGVzIHV0aWxpemFuIHVuYSB2YXJpZWRhZCBkZSBmdWVudGVzIGRlIGRhdG9zIGd1YmVybmFtZW50YWxlcy4gPHNwYW4+PC9zcGFuPlxuICAgIEVzdG9zIGVzdGltYWRvcywgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cImh0dHBzOi8vY292aWQxOXZhY2NpbmVhbGxvY2F0aW9uLm9yZy9hc3NldHMvVmFjY2luZV9BbGxvY2F0aW9uX1BsYW5uZXJfZm9yX0NPVklEMTlfTWV0aG9kcy5wZGZcIj5kZXNjcmliZWQgaGVyZTwvYT4gY29uc2lkZXJhbiBhIGFsZ3Vub3MgZ3J1cG9zIOKAk2NvbW8gbG9zIHRyYWJhamFkb3JlcyBkZSBhbHRvIHJpZXNnb+KAkyB5IGxvcyBjbGFzaWZpY2FuIGVuIHN1YmdydXBvcywgY29tbyBkb2N0b3JlcyB5IHBlcnNvbmFsIGRlIGVuZmVybWVyw61hLiBMdWVnbyBlc3RvcyBncnVwb3Mgc29uIGFzaWduYWRvcyBhIHVuYSBmYXNlIGRlIHZhY3VuYWNpw7NuIGRlbCBlc3RhZG8gbyBsb2NhbGlkYWQuIFBvciBlamVtcGxvOiBlbCBncnVwbyBkZXNpZ25hZG8gY29tbyBzZXJ2aWNpb3MgZGUgZW1lcmdlbmNpYSAocG9saWPDrWFzIHkgYm9tYmVyb3MpIGZ1ZXJvbiB1YmljYWRvcyBlbiB1biBncnVwbyBlc2VuY2lhbC4gPHNwYW4+PC9zcGFuPlxuICAgIExvcyBlc3RpbWFkb3MgdG9tYW4gZW4gY3VlbnRhIGxhIGNvaW5jaWRlbmNpYSBlbnRyZSBncnVwb3MgeSBzZSBndcOtYW4gcG9yIGxvcyBsaW5lYW1pZW50b3MgcmVjb21lbmRhZG9zIHBvciBlbCBDb21pdMOpIEFzZXNvciBlbiBQcsOhY3RpY2FzIGRlIElubXVuaXphY2nDs24gKEFDSVApIGRlIGxvcyBDZW50cm9zIHBhcmEgZWwgQ29udHJvbCB5IGxhIFByZXZlbmNpw7NuIGRlIEVuZmVybWVkYWRlcyAoQ0RDKS4gPHNwYW4+PC9zcGFuPlxuICAgIEVsIG1hcGEgZGluw6FtaWNvIGRlIHZhY3VuYWNpw7NuIHF1ZSBtdWVzdHJhIGVsIG7Dum1lcm8gZGUgcGVyc29uYXMgaW5tdW5pemFkYXMgcG9yIGNvbXBsZXRvIGVuIEVzdGFkb3MgVW5pZG9zIHkgZWwgbsO6bWVybyBkZSB2YWN1bmFzIGFzaWduYWRhcyBxdWUgc2UgaGFuIHV0aWxpemFkbyBlc3TDoSBiYXNhZG8gZW4gZGF0b3MgZGUgbG9zIENEQy4gTkJDIE5ld3MgY2xhc2lmaWNhIGVsIHByb2dyZXNvIGRlIGRpc3RyaWJ1Y2nDs24gZGUgdmFjdW5hcyBlbiBjYWRhIGxvY2FsaWRhZCBiYXPDoW5kb3NlIGVuIGVsIHBvcmNlbnRhamUgZGUgdXNvIGRlIGxhcyB2YWN1bmFzIGRpc3RyaWJ1aWRhcy4gPHNwYW4+PC9zcGFuPlxuICAgIExhIGluZm9ybWFjacOzbiBzb2JyZSBjw7NtbyBldm9sdWNpb25hIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGFzIHZhY3VuYXMgZW4gbG9zIGVzdGFkb3MsIFdhc2hpbmd0b24gRC5DLiB5IFB1ZXJ0byBSaWNvIHNlIG9idHV2byBjb24gbG9zIGVzZnVlcnpvcyBkZSBpbnZlc3RpZ2FjacOzbiBkZSBOQkMgTmV3cy4gSW52ZXN0aWdhZG9yZXMgZGUgTkJDIE5ld3MgY29udGFjdGFyb24gYSBmdW5jaW9uYXJpb3MgZGVsIERlcGFydGFtZW50byBkZSBTYWx1ZCBlc3RhdGFsIHkgZXhhbWluYXJvbiBzdXMgcMOhZ2luYXMgd2ViLCBhZGVtw6FzIGRlIHJlY29sZWN0YXIgZGF0b3Mgb2ZyZWNpZG9zIGR1cmFudGUgY29uZmVyZW5jaWFzIGRlIHByZW5zYSBlc3RhdGFsZXMuIExhcyBjb211bmljYWNpb25lcyBlbiBjdWVudGFzIG9maWNpYWxlcyBkZSByZWRlcyBzb2NpYWxlcyB0YW1iacOpbiBzZSB1dGlsaXphcm9uLiA8c3Bhbj48L3NwYW4+XG4gICAgTGEgaW5mb3JtYWNpw7NuIHNvYnJlIGxvcyBzaXRpb3MgZGUgdmFjdW5hY2nDs24gY29udHJhIGVsIENPVklELTE5IGZ1ZSBjb25zZWd1aWRhIGVuIGxvcyBkZXBhcnRhbWVudG9zIGRlIHNhbHVkIGVzdGF0YWxlcywgZGVsIGNvbmRhZG8sIGRlbCBkaXN0cml0bywgZGVsIGRpc3RyaXRvIHNhbml0YXJpbyB5IGRlIGxvcyB0ZXJyaXRvcmlvczsgZGUgaW5mb3JtYWNpw7NuIHByb3BvcmNpb25hZGEgcG9yIGNhZGVuYXMgZGUgZmFybWFjaWFzIHkgZGF0b3MgZGUgUnggT3BlbiwgcXVlIG9mcmVjZSBlbCBlc3RhdHVzIG9wZXJhdGl2byBkZSBsb3MgY2VudHJvcyBkZSBzYWx1ZCBlbiDDoXJlYXMgYWZlY3RhZGFzIHBvciB1biBkZXNhc3RyZSwgaW5jbHV5ZW5kbyBlbCBicm90ZSBkZSBjb3JvbmF2aXJ1cy4gRXN0b3MgZGF0b3MgZnVlcm9uIHJlY29waWxhZG9zIHkgbHVlZ28gZXNxdWVtYXRpemFkb3MuPC9wPlxuICA8L2Rpdj5gLFxuICBtYW5kYXJpbjogYFxuICA8aDM+5pa55rOVPC9oMz5cbiAgPGRpdiBjbGFzcz1cIm1ldGhvZG9sb2d5XCI+XG4gICAgPHA+TkJDIE5ld3Plr7nnrKblkIjnlqvoi5fms6jlsITnmoTkurrnvqTliIbnu4TmmK/ln7rkuo48YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly9zdXJnb3ZlbnR1cmVzLm9yZy9hYm91dC1zdXJnby12ZW50dXJlc1wiPlN1cmdvIFZlbnR1cmVzPC9hPu+8iOS4gOWutuS4k+azqOS6juWBpeW6t+mXrumimOeahOmdnuiQpeWIqee7hOe7h++8ieWSjDxhIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJodHRwczovL3d3dy5hcmlhZG5lbGFicy5vcmcvYWJvdXQtdXMvXCI+QXJpYWRuZSBMYWJzPC9hPu+8iOS4gOWutuWNq+eUn+ezu+e7n+iBlOWQiOS4reW/g++8ieaPkOS+m+eahOS8sOeul+WAvO+8jOivpeS8sOiuoeWAvOaYr+WfuuS6juWQhOaUv+W6nOaVsOaNrui1hOaWmeadpea6kOOAgjxzcGFuPjwvc3Bhbj5cbiAgICDov5nkupvkvLDnrpflgLzvvIg8YSB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPVwiaHR0cHM6Ly9jb3ZpZDE5dmFjY2luZWFsbG9jYXRpb24ub3JnL2Fzc2V0cy9WYWNjaW5lX0FsbG9jYXRpb25fUGxhbm5lcl9mb3JfQ09WSUQxOV9NZXRob2RzLnBkZlwiPuWcqOatpOi/m+ihjOS6huabtOivpue7hueahOaPj+i/sDwvYT4g77yJ5bCG5LiA5Lqb5Lq6576k77yI5L6L5aaC6auY6aOO6Zmp5bel5L2c5Lq65ZGY77yJ5YiG5oiQ57uG5YiG57uE77yI5L6L5aaC5Yy755Sf44CB5oqk5aOr77yJ44CC54S25ZCO5bCG6L+Z5Lqb5Lq6576k57uE5YiG57G75Yiw5ZCE5Liq5bee55qE5LiN5ZCM55ar6IuX5o6l56eN6Zi25q6144CCIOS+i+Wmgu+8muaMh+WumuS4uuesrOS4gOWTjeW6lOiAheeahOS6uue+pO+8iOitpuWvn+WSjOa2iOmYsuWRmO+8ieiiq+aUvue9ruWcqOWvueekvuS8mui/kOihjOiHs+WFs+mHjeimgeeahOS6uue+pOS4reOAgjxzcGFuPjwvc3Bhbj5cbiAgICDov5nkuKrkvLDnrpflgLzogIPomZHkuoblkITnu4TkurrnvqTkuYvpl7Tlj6/og73nmoTmlbDmja7kuqTpm4bvvIzkuJTpgbXlvqrnlr7nl4XmjqfliLblkozpooTpmLLkuK3lv4PvvIhDREPvvInlr7nkuLTluorlhY3nlqvlu7rorq7kurrnvqTvvIhBZHZpc29yeSBDb21taXR0ZWUgb24gSW1tdW5pemF0aW9uIFByYWN0aWNlc++8ieeahOWumuS5ieOAgjxzcGFuPjwvc3Bhbj5cbiAgICDliqjmgIHmm7TmlrDnmoTnlqvoi5fmjqXnp43lnLDlm77kuIrmmL7npLrkuoblhajnvo7lm73lt7LlrozmiJDnlqvoi5fmjqXnp43nmoTkurrmlbDjgIHkvb/nlKjnmoTlt7LliIblj5Hnlqvoi5fmlbDph4/vvIzmraTmlbDmja7mnaXmupDkuo7nlr7nl4XmjqfliLblkozpooTpmLLkuK3lv4PjgILlkIzml7bvvIxOQkMgTmV3c+agueaNruS9v+eUqOW3suWIhuWPkeeWq+iLl+eahOavlOS+i+WvueWQhOS4quW3nuOAgeWNjuebm+mhv+eJueWMuuWSjOazouWkmum7juWQhOi/m+ihjOS6huaOkuWQjeOAgjxzcGFuPjwvc3Bhbj5cbiAgICDmnInlhbPlkITlt57jgIHljY7nm5vpob/nibnljLrlkozms6LlpJrpu47lkITlpoLkvZXov5vooYznlqvoi5fliIbphY3nmoTkv6Hmga/mnaXoh6rkuo5OQkMgTmV3c+eahOeglOeptuWboumYn++8jOaIkeS7rOiBlOezu+S6huWQhOW3nuWNq+eUn+mDqOmXqOWumOWRmOOAgeafpeiuv+S6huWNq+eUn+mDqOe9keerme+8jOWQjOaXtuaIkeS7rOS5n+S7juWQhOW3nuWNq+eUn+mDqOmXqOeahOaWsOmXu+WPkeW4g+S8muOAgeWSjOWNq+eUn+mDqOmXqOWumOaWueekvuS6pOWqkuS9k+S4iuaUtumbhuS6huS/oeaBr+OAgjxzcGFuPjwvc3Bhbj5cbiAgICDmnInlhbPmlrDlhqDnlqvoi5fmjqXnp43ngrnnmoTmlbDmja7mnaXoh6rlkITlt57jgIHljr/jgIHljLrjgIHljavnlJ/ljLrlkozpooblnLDnmoTljavnlJ/pg6jpl6jvvIzku6Xlj4rov57plIHoja/miL/mj5DkvpvnmoTkv6Hmga/jgILmraTlpJbvvIxSeCBPcGVu5Lmf5o+Q5L6b5LqG5Y+X5paw5Yag55ar5oOF5b2x5ZON5Lil6YeN5Zyw5Yy655qE5Yy755aX5py65p6E6L+Q6KGM54q25oCB55qE5pWw5o2u44CC5oiR5Lus5pW055CG57u85ZCI5Lul5LiK5pWw5o2u5p2l5rqQ77yM54S25ZCO5Zyo5Zyw5Zu+5LiK5qCH5rOo5LqG5Ye65p2l44CCPC9wPlxuICA8L2Rpdj5gXG59XG5cbmNvbnN0IGNvbnRhY3RMYW5ndWFnZXMgPSB7XG4gIGVuZ2xpc2g6IGBUaGUgUGxhbiBZb3VyIFZhY2NpbmUgcGFnZSB3aWxsIGJlIHVwZGF0ZWQgYXMgbmV3IGluZm9ybWF0aW9uIGlzIHJlbGVhc2VkIGZyb20gc3RhdGUgaGVhbHRoIGRlcGFydG1lbnRzLiBQbGVhc2UgZW1haWwgPGEgaHJlZj1cIm1haWx0bzpwbGFueW91cnZhY2NpbmVAbmJjdW5pLmNvbVwiPnBsYW55b3VydmFjY2luZUBuYmN1bmkuY29tPC9hPiB3aXRoIGFueSBjb25jZXJucy5gLFxuICBzcGFuaXNoOiBgTGEgcMOhZ2luYSBkZSBQbGFuaWZpY2EgdHUgdmFjdW5hIHNlcsOhIGFjdHVhbGl6YWRhIGNvbiBudWV2YSBpbmZvcm1hY2nDs24gcXVlIHZheWFuIHB1YmxpY2FuZG8gbG9zIGRlcGFydGFtZW50b3MgZGUgc2FsdWQgZXN0YXRhbGVzLiBFbnbDrWEgdHVzIGR1ZGFzIGEgPGEgaHJlZj1cIm1haWx0bzpwbGFueW91cnZhY2NpbmVAbmJjdW5pLmNvbVwiPnBsYW55b3VydmFjY2luZUBuYmN1bmkuY29tPC9hPi5gLFxuICBtYW5kYXJpbjogYOmaj+edgOW3nuWNq+eUn+mDqOmXqOWPkeW4g+aWsOS/oeaBr++8jOKAnOeWq+iLl+iuoeWIkuKAnemhtemdouWwhumaj+aXtuabtOaWsOOAguWmguacieS7u+S9leeWkemXru+8jOivt+WPkemAgeeUteWtkOmCruS7tuiHszxhIGhyZWY9XCJtYWlsdG86cGxhbnlvdXJ2YWNjaW5lQG5iY3VuaS5jb21cIj5wbGFueW91cnZhY2NpbmVAbmJjdW5pLmNvbTwvYT7jgIJgXG59XG4iLCJpbXBvcnQgUXVlc3Rpb24gZnJvbSAnLi9RdWVzdGlvbidcbmltcG9ydCBOZXdzIGZyb20gJy4vTmV3cydcbmltcG9ydCBTaWdudXAgZnJvbSAnLi9TaWdudXAnXG5pbXBvcnQgeyBDT05TVEFOVFMgYXMgQyB9IGZyb20gJy4uL2NvbnN0YW50cy5qcydcblxuLyoqXG4gKiBDQVJEIE5VTUJFUlNcbiAqIDFcdFdoYXQgaXMgdGhlIHZhY2NpbmUgZGlzdHJpYnV0aW9uIHRpbWVsaW5lIGluIExPQ0FUSU9OP1xuICogMlx0SW4gdGhlIG5ld3M6IE9uZ29pbmcgdmFjY2luYXRpb24gaXNzdWVzIGluIExPQ0FUSU9OOlxuICogM1x0V2hhdCBhcmUgdGhlIHJlcXVpcmVtZW50cyBpbiBMT0NBVElPTj9cbiAqIDRcdFdoZXJlIGNhbiBJIGdldCB0aGUgdmFjY2luZSBpbiBMT0NBVElPTj9cbiAqIDVcdEhvdyBtdWNoIGRvZXMgdGhlIHZhY2NpbmUgY29zdCBpbiBMT0NBVElPTj9cbiAqL1xuXG5jbGFzcyBDYXJkIHtcbiAgLyoqXG4gICAqIFJFLVVTQUJMRSBDQVJEIENMQVNTXG4gICAqIEBwYXJhbSB7Kn0gZWwgcGFyZW50IGNvbnRhaW5lciB0byBhcHBlbmQgY2FyZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyIGNhcmQgdGl0bGUvY2F0ZWdvcnlcbiAgICogQHBhcmFtIHtvYmplY3RbXX0gcXVlc3Rpb25zIHF1ZXN0aW9ucywgYW5zd2VycywgZm9vdG5vdGVzLCBldGMgYmFzZWQgb24gdGhpcyBzdGF0ZSBhbmQgbGFuZ3VhZ2VcbiAgICovXG5cbiAgY29uc3RydWN0b3IoZWwsIGhlYWRlciwgZGF0YSwgYXBwU3RhdGUsIHN0YXRlcykge1xuICAgIHRoaXMuZWwgPSBlbFxuICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyXG4gICAgdGhpcy5kYXRhID0gZGF0YVxuXG4gICAgLy8gd3JhcHBlclxuICAgIHRoaXMuY2FyZEVsID0gdGhpcy5lbC5hcHBlbmQoJ2RpdicpLmF0dHIoJ2NsYXNzJywgJ2luZm8tY2FyZF9fd3JhcCcpXG5cbiAgICAvLyBoZWFkZXJcbiAgICB0aGlzLmNhcmRFbFxuICAgICAgLmFwcGVuZCgnaDInKVxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2luZm8tY2FyZF9fY2F0ZWdvcnknKVxuICAgICAgLnRleHQoXG4gICAgICAgIHRoaXMuaGVhZGVyLnJlcGxhY2UoXG4gICAgICAgICAgJ0xPQ0FUSU9OJyxcbiAgICAgICAgICB0aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aCAtIDFdW0MuTE9DQUxTVEFURV1cbiAgICAgICAgKVxuICAgICAgKVxuXG4gICAgLy8gVE9ETzogdGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBuZXdzIGlzIHRoZSBzZWNvbmQgY2FyZCwgdGhpcyBzaG91bGQgbm90IGJlIHNvIGZsaW1zeVxuICAgIGlmIChNYXRoLmZsb29yKCt0aGlzLmRhdGFbMF1bQy5JRF0pID09PSAyKSB7XG4gICAgICBjb25zdCBjb250ZW50cyA9IHRoaXMuY2FyZEVsXG4gICAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdpbmZvLWNhcmRfX25ld3MnKVxuICAgICAgICAudGV4dChsYXRlc3ROZXdzVHJhbnNsYXRpb25zW2FwcFN0YXRlLmxhbmd1YWdlXSlcbiAgICAgICAgLmFwcGVuZCgnZGl2JylcblxuICAgICAgdGhpcy5kYXRhXG4gICAgICAgIC5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PlxuICAgICAgICAgICAgKGJbQy5CUkVBS10gPT09ICdUUlVFJykgLSAoYVtDLkJSRUFLXSA9PT0gJ1RSVUUnKSB8fCAvLyBicmVha2luZyBjb21lcyBmaXJzdCxcbiAgICAgICAgICAgIChiW0MuTE9DQUxTVEFURV0gPT09ICdOYXRpb25hbCcpIC1cbiAgICAgICAgICAgICAgKGFbQy5MT0NBTFNUQVRFXSA9PT0gJ05hdGlvbmFsJykgfHxcbiAgICAgICAgICAgIGFbQy5JRF0gLSBiW0MuSURdXG4gICAgICAgICkgLy8gdGhlbiBuYXRpb25hbCBuZXdzLCB0aGVuIHN0YXRlIHNwZWNpZmljXG4gICAgICAgIC5maWx0ZXIoKF8sIGkpID0+IGkgPCA1KVxuICAgICAgICAubWFwKG4gPT4gbmV3IE5ld3MoY29udGVudHMsIG4sIGFwcFN0YXRlLmxhbmd1YWdlKSlcbiAgICB9XG5cbiAgICAvLyBxdWVzdGlvbnMsIGFuc3dlcnMsIGZvb3Rub3RlcywgZXRjLlxuICAgIHRoaXMuZGF0YVxuICAgICAgLmZpbHRlcihxID0+IHFbQy5BTlNXRVJdIHx8IHFbQy5HUkFQSF0pIC8vIG9ubHkgc2hvdyBxdWVzdGlvbnMgd2l0aCBhbiBhbnN3ZXIgb3IgYSBncmFwaGljIHNwYWNlXG4gICAgICAubWFwKHEgPT4gbmV3IFF1ZXN0aW9uKHRoaXMuY2FyZEVsLCBxLCBhcHBTdGF0ZSkpXG5cbiAgICAvLyBDYXJkIHNwZWNpZmljIGRldGFpbHNcbiAgICAvLyBUT0RPOiB0aGlzIGlzIGFsc28gcHJldHR5IGZsaW1zeSwganVzdCBjaGVja3MgdGhlIGNhcmQgSUQgbnVtYmVyc3NcblxuICAgIGlmIChNYXRoLmZsb29yKCt0aGlzLmRhdGFbMF1bQy5JRF0pICE9PSAyKSB7XG4gICAgICAvLyBjYXJkIHNvdXJjZVxuICAgICAgdGhpcy5jYXJkRWxcbiAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2luZm8tY2FyZF9fc291cmNlJylcbiAgICAgICAgLnRleHQoXG4gICAgICAgICAgc291cmNlTGFuZ3VhZ2VzW2FwcFN0YXRlLmxhbmd1YWdlXVtNYXRoLmZsb29yKCt0aGlzLmRhdGFbMF1bQy5JRF0pXVxuICAgICAgICApXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgYXBwU3RhdGUubGFuZ3VhZ2UgPT09ICdlbmdsaXNoJyAmJlxuICAgICAgTWF0aC5mbG9vcigrdGhpcy5kYXRhWzBdW0MuSURdKSA9PT0gNVxuICAgICkge1xuICAgICAgdGhpcy5jYXJkRWxcbiAgICAgICAgLmFwcGVuZCgnYScpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdpbmZvLWNhcmRfX3JlYWQtbW9yZS1OQkMnKVxuICAgICAgICAuYXR0cigndGFyZ2V0JywgJ19ibGFuaycpXG4gICAgICAgIC5hdHRyKCdocmVmJywgJ2h0dHBzOi8vd3d3Lm5iY25ld3MuY29tL2hlYWx0aC9jb3JvbmF2aXJ1cycpXG4gICAgICAgIC5odG1sKFxuICAgICAgICAgICc8c3BhbiBjbGFzcz1cInBlYWNvY2sgYmx1ZVwiPjwvc3Bhbj5JcyB0aGUgQ292aWQtMTkgdmFjY2luYXRpb24gc2FmZT8gV2hlcmUgYXJlIHRoZSBvdGhlciBDb3ZpZC0xOSB2YXJpYW50cyBzcHJlYWRpbmcgYWNyb3NzIHRoZSBjb3VudHJ5PyBSZWFkIG1vcmUgZnJvbSBOQkMgTmV3cy4nXG4gICAgICAgIClcbiAgICB9XG4gICAgaWYgKE1hdGguZmxvb3IoK3RoaXMuZGF0YVswXVtDLklEXSkgPT09IDEpIHtcbiAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLmNhcmRFbFxuICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnaW5mby1jYXJkX19zaWdudXAnKVxuICAgICAgICAudGV4dChcbiAgICAgICAgICAnU2lnbiB1cCB0byBiZSBhbGVydGVkIHdoZW4gdGhlcmUgYXJlIHZhY2NpbmF0aW9uIHVwZGF0ZXMgaW4geW91ciBzdGF0ZTonXG4gICAgICAgIClcblxuICAgICAgbmV3IFNpZ251cCh3cmFwcGVyLCBhcHBTdGF0ZS5sYW5ndWFnZSwgc3RhdGVzLCAnaW5DYXJkJylcbiAgICB9XG4gICAgaWYgKE1hdGguZmxvb3IoK3RoaXMuZGF0YVswXVtDLklEXSkgPT09IDIpIHtcbiAgICAgIGNvbnN0IHsgZGVrLCB1cmwgfSA9IE5CQ05ld3NMaW5rRGVrW2FwcFN0YXRlLmxhbmd1YWdlXVxuICAgICAgdGhpcy5jYXJkRWxcbiAgICAgICAgLmFwcGVuZCgnYScpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdpbmZvLWNhcmRfX3JlYWQtbW9yZS1OQkMnKVxuICAgICAgICAuYXR0cigndGFyZ2V0JywgJ19ibGFuaycpXG4gICAgICAgIC5hdHRyKCdocmVmJywgdXJsKVxuICAgICAgICAuaHRtbChgPHNwYW4gY2xhc3M9XCJwZWFjb2NrIGJsdWUgJHthcHBTdGF0ZS5sYW5ndWFnZX1cIj48L3NwYW4+JHtkZWt9YClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2FyZFxuXG5jb25zdCBOQkNOZXdzTGlua0RlayA9IHtcbiAgZW5nbGlzaDoge1xuICAgIGRlazpcbiAgICAgICdSZWFkIG1vcmUgb24gQ292aWQtMTkgZnJvbSBOQkMgTmV3cywgaW5jbHVkaW5nIGNvdmVyYWdlIG9mIHZhY2NpbmUgbWlzaW5mb3JtYXRpb24gY2FtcGFpZ25zLicsXG4gICAgdXJsOiAnaHR0cHM6Ly93d3cubmJjbmV3cy5jb20vaGVhbHRoL2Nvcm9uYXZpcnVzJ1xuICB9LFxuICBzcGFuaXNoOiB7XG4gICAgZGVrOlxuICAgICAgJ0xlZSBtw6FzIHNvYnJlIGVsIENPVklELTE5IGVuIE5vdGljaWFzIFRlbGVtdW5kbywgaW5jbHV5ZW5kbyBsYSBjb2JlcnR1cmEgZGUgY2FtcGHDsWFzIGRlIGRlc2luZm9ybWFjacOzbiBzb2JyZSBsYSB2YWN1bmEuJyxcbiAgICB1cmw6ICdodHRwczovL3d3dy50ZWxlbXVuZG8uY29tL25vdGljaWFzL3NhbHVkJ1xuICB9LFxuICBtYW5kYXJpbjoge1xuICAgIGRlazpcbiAgICAgICfngrnlh7vpmIXor7vmm7TlpJpOQkMgTmV3c+WFs+S6juaWsOWGoOeWq+aDheeahOacgOaWsOaKpemBk++8jOWMheaLrOaguOafpemUmeivr+eWq+iLl+S/oeaBr+eahOaKpemBk+OAgicsXG4gICAgdXJsOiAnaHR0cHM6Ly93d3cubmJjbmV3cy5jb20vaGVhbHRoL2Nvcm9uYXZpcnVzJ1xuICB9XG59XG5cbmNvbnN0IHNvdXJjZUxhbmd1YWdlcyA9IHtcbiAgZW5nbGlzaDoge1xuICAgIDE6ICdTb3VyY2VzOiBQdWJsaWMgaGVhbHRoIHdlYnNpdGVzLCBzdGF0ZSBwcmVzcyBicmllZmluZ3MsIHB1YmxpYyBoZWFsdGggb2ZmaWNpYWxzLCBoZWFsdGggZGVwYXJ0bWVudCBzb2NpYWwgbWVkaWEgcGFnZXMnLFxuICAgIDM6ICdTb3VyY2VzOiBQdWJsaWMgaGVhbHRoIHdlYnNpdGVzLCBzdGF0ZSBwcmVzcyBicmllZmluZ3MsIHB1YmxpYyBoZWFsdGggb2ZmaWNpYWxzLCBoZWFsdGggZGVwYXJ0bWVudCBzb2NpYWwgbWVkaWEgcGFnZXMnLFxuICAgIDQ6ICdTb3VyY2VzOiBTdGF0ZSwgY291bnR5IGFuZCBoZWFsdGggZGlzdHJpY3QgaGVhbHRoIGRlcGFydG1lbnRzLCBSeCBPcGVuJyxcbiAgICA1OiAnU291cmNlczogUHVibGljIGhlYWx0aCB3ZWJzaXRlcywgc3RhdGUgcHJlc3MgYnJpZWZpbmdzLCBwdWJsaWMgaGVhbHRoIG9mZmljaWFscywgaGVhbHRoIGRlcGFydG1lbnQgc29jaWFsIG1lZGlhIHBhZ2VzJ1xuICB9LFxuICBzcGFuaXNoOiB7XG4gICAgMTogJ0Z1ZW50ZXM6IFNpdGlvcyB3ZWIgZGUgc2FsdWQgcMO6YmxpY2EsIGNvbmZlcmVuY2lhcyBkZSBwcmVuc2EgZXN0YXRhbGVzIHkgcmVkZXMgc29jaWFsZXMgZGVsIERlcGFydGFtZW50byBkZSBTYWx1ZC4nLFxuICAgIDM6ICdGdWVudGVzOiBTaXRpb3Mgd2ViIGRlIHNhbHVkIHDDumJsaWNhLCBjb25mZXJlbmNpYXMgZGUgcHJlbnNhIGVzdGF0YWxlcyB5IHJlZGVzIHNvY2lhbGVzIGRlbCBEZXBhcnRhbWVudG8gZGUgU2FsdWQuJyxcbiAgICA0OiAnRnVlbnRlczogRGVwYXJ0YW1lbnRvcyBkZSBzYWx1ZCBlc3RhdGFsZXMsIGRlbCBjb25kYWRvIHkgZGVsIGRpc3RyaXRvOyB5IFJ4IE9wZW4uJyxcbiAgICA1OiAnRnVlbnRlczogU2l0aW9zIHdlYiBkZSBzYWx1ZCBww7pibGljYSwgY29uZmVyZW5jaWFzIGRlIHByZW5zYSBlc3RhdGFsZXMgeSByZWRlcyBzb2NpYWxlcyBkZWwgRGVwYXJ0YW1lbnRvIGRlIFNhbHVkLidcbiAgfSxcbiAgbWFuZGFyaW46IHtcbiAgICAxOiAn5pWw5o2u5p2l5rqQ77ya5YWs5YWx5Y2r55Sf572R56uZ44CB5ZCE5bee5paw6Ze75Y+R5biD5Lya44CB5YWs5YWx5Y2r55Sf6YOo6Zeo5a6Y5pa55ZKM5YW256S+5Lqk5aqS5L2T572R56uZ44CCJyxcbiAgICAzOiAn5pWw5o2u5p2l5rqQ77ya5YWs5YWx5Y2r55Sf572R56uZ44CB5ZCE5bee5paw6Ze75Y+R5biD5Lya44CB5YWs5YWx5Y2r55Sf6YOo6Zeo5a6Y5pa55ZKM5YW256S+5Lqk5aqS5L2T572R56uZ44CCJyxcbiAgICA0OiAn5pWw5o2u5p2l5rqQ77ya5bee44CB5Y6/5ZKM5Y2r55Sf5Yy655qE5Y2r55Sf6YOo6Zeo77yMUnggT3BlbuOAgicsXG4gICAgNTogJ+aVsOaNruadpea6kO+8muWFrOWFseWNq+eUn+e9keermeOAgeWQhOW3nuaWsOmXu+WPkeW4g+S8muOAgeWFrOWFseWNq+eUn+mDqOmXqOWumOaWueWSjOWFtuekvuS6pOWqkuS9k+e9keermeOAgidcbiAgfVxufVxuXG5jb25zdCBsYXRlc3ROZXdzVHJhbnNsYXRpb25zID0ge1xuICBlbmdsaXNoOiAnTGF0ZXN0IE5ld3MnLFxuICBzcGFuaXNoOiAnw5psdGltYXMgbm90aWNpYXMnLFxuICBtYW5kYXJpbjogJ0xhdGVzdCBOZXdzJ1xufVxuIiwiY2xhc3MgRmlsdGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZXMgb2JqZWN0IG9mIHN0YXRlcyBieSBsYW5ndWFnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gam9icyBvYmplY3Qgb2Ygam9icyBieSBzdGF0ZSBieSBsYW5ndWFnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgdGhlIGxhbmd1YWdlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2V0QXBwU3RhdGUgZnVuY3Rpb24gdG8gc2V0IGFwcCBzdGF0ZVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihzdGF0ZXMsIGpvYnMsIGFwcFN0YXRlLCBzZXRBcHBTdGF0ZSkge1xuICAgIHRoaXMuc3RhdGVzID0gc3RhdGVzXG4gICAgdGhpcy5zdGF0ZVRvSm9ic01hcCA9IGpvYnNcbiAgICB0aGlzLnN0YXRlID0gYXBwU3RhdGUuc3RhdGVcbiAgICB0aGlzLmxhbmd1YWdlID0gYXBwU3RhdGUubGFuZ3VhZ2VcbiAgICB0aGlzLnNldEFwcFN0YXRlID0gc2V0QXBwU3RhdGVcblxuICAgIC8qIGdyYWIgYW5kIHNhdmUgdGhlIGZpbHRlciBoZWFkZXIgKi9cbiAgICB0aGlzLmZpbHRlckhlYWRlciA9IGQzLnNlbGVjdCgnI2ZpbHRlcl9fZGlyLXAnKVxuXG4gICAgLyogZ3JhYiBhbmQgc2F2ZSB0aGUgZmlsdGVyIGhlYWRlciAqL1xuICAgIHRoaXMuc3RpY2t5SGVhZGVyID0gZDMuc2VsZWN0KCcjc3RpY2t5X19kaXItcCcpXG5cbiAgICAvKiBncmFiIGFuZCBzYXZlIGFkZGl0aW9uYWwgZmFjdG9ycyBoZWFkZXIgKi9cbiAgICB0aGlzLmZhY3RvcnNIZWFkZXIgPSBkMy5zZWxlY3QoJyNmaWx0ZXJfX2ZhY3RvcnMtcCcpXG5cbiAgICAvKiBncmFiIGFuZCBzYXZlIHRoZSBzdGF0ZSBmaWx0ZXJzICovXG4gICAgdGhpcy5zdGF0ZVNlbGVjdGlvbnMgPSBkM1xuICAgICAgLnNlbGVjdEFsbCgnI2ZpbHRlcl9fc3RhdGUsICNzdGlja3lfX3N0YXRlJylcbiAgICAgIC5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldEFwcFN0YXRlKHtcbiAgICAgICAgICBzdGF0ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgICB6aXA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBsb2M6IHVuZGVmaW5lZFxuICAgICAgICB9KVxuXG4gICAgICAgIC8qIGdldCBvcGVuZXIgaWZyYW1lIGFuZCBzZW5kIG5vdGlmaWNhdGlvbiBhYm91dCBuZXcgc3RhdGUgc2VsZWN0aW9uICovXG4gICAgICAgIGRvY3VtZW50XG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJyNlbWJlZC0yMDIxMDExMi1wbGFuLXlvdXItc2hvdC1waGFzZS1sZWFkIGlmcmFtZScpXG4gICAgICAgICAgLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICB7IHN0YXRlOiB0aGlzLnZhbHVlLCB0eXBlOiAnc3RhdGUtY2hhbmdlJyB9LFxuICAgICAgICAgICAgJyonXG4gICAgICAgICAgKVxuICAgICAgfSlcblxuICAgIC8qIHN0YXRlIHRpdGxlcyBlaXRoZXIgc2l0IGFib3ZlIHRoZSBpbnB1dCAob3BlbmVyKSBvciBpbnNpZGUgdGhlIGlucHV0IGFzIHRoZSBkZWZhdWx0IHZhbHVlIChzdGlja3kpICovXG4gICAgdGhpcy5zdGF0ZVRpdGxlcyA9IGQzLnNlbGVjdEFsbChcbiAgICAgICcuZmlsdGVyX19zdGF0ZS1wLCBvcHRpb24uZmlsdGVyX19zdGF0ZS10aXRsZSdcbiAgICApXG5cbiAgICAvKiBhZ2UgdGl0bGVzIGVpdGhlciBzaXQgYWJvdmUgdGhlIGlucHV0IChvcGVuZXIpIG9yIG9yIGluc2lkZSB0aGUgaW5wdXQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgKHN0aWNreSkgKi9cbiAgICB0aGlzLmFnZVRpdGxlcyA9IGQzLnNlbGVjdEFsbCgnLmZpbHRlcl9fYWdlLXAsIG9wdGlvbi5maWx0ZXJfX2FnZS10aXRsZScpXG5cbiAgICAvKiBqb2I7IGluc2lkZSB0aGUgaW5wdXQgYXMgdGhlIGRlZmF1bHQgdmFsdWUgKG9wZW5lcikgKi9cbiAgICB0aGlzLmpvYkRlZmF1bHQgPSBkMy5zZWxlY3RBbGwoJyNmaWx0ZXJfX2pvYiA+IG9wdGlvbi5maWx0ZXJfX2pvYi10aXRsZScpXG5cbiAgICAvKiBncmFiIGFuZCBzYXZlIHRoZSBhZ2UgZmlsdGVycyAqL1xuICAgIHRoaXMuYWdlU2VsZWN0aW9ucyA9IGQzXG4gICAgICAuc2VsZWN0QWxsKCcjZmlsdGVyX19hZ2UsICNzdGlja3lfX2FnZScpXG4gICAgICAub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRBcHBTdGF0ZSh7XG4gICAgICAgICAgYWdlOiB0aGlzLnZhbHVlXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgLyogZ3JhYiBhbmQgc2F2ZSB0aGUgbm9uLWVzc2VudGlhbCBjaGVja2JveCAqL1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzIC8vIGV4cG9zZSBjbGFzcyBlbGVtZW5kcyBpbnNpZGUgdGhlIGV2ZW50IGZ1bmN0aW9uKClzXG4gICAgdGhpcy5ub25Fc3NlbnRpYWxDaGVja3MgPSBkM1xuICAgICAgLnNlbGVjdEFsbCgnaW5wdXQjZmlsdGVyX19ub24tZXNzZW50aWFsLCBpbnB1dCNzdGlja3lfX25vbi1lc3NlbnRpYWwnKVxuICAgICAgLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhhdC5yZXNldE9jY3VwYXRpb25TZWxlY3Rpb25zKHRoaXMuY2hlY2tlZClcbiAgICAgICAgdGhhdC5ub25Fc3NlbnRpYWxDaGVja3MucHJvcGVydHkoJ2NoZWNrZWQnLCB0aGlzLmNoZWNrZWQpXG4gICAgICB9KVxuICAgIC8qIGdyYWIgYW5kIHNhdmUgdGhlIGpvYiBmaWx0ZXJzICovXG4gICAgdGhpcy5qb2JTZWxlY3Rpb25zID0gZDNcbiAgICAgIC5zZWxlY3RBbGwoJyNmaWx0ZXJfX2pvYiwgI3N0aWNreV9fam9iJylcbiAgICAgIC5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoYXQubm9uRXNzZW50aWFsQ2hlY2tzLnByb3BlcnR5KCdjaGVja2VkJywgZmFsc2UpXG4gICAgICAgIC8vIEJVRyBGSVg6IHRoaXMgd2FzIHNlbGVjdGVkIGJvdGggZmlsdGVycyBhbmQgbm90IGFwcHJvcHJpYXRlbHkgc2V0dGluZyB0aGUgam9iIHRpdGxlXG4gICAgICAgIGNvbnN0IHRoaXNGaWx0ZXJTZWxjdGlvbiA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKClcbiAgICAgICAgc2V0QXBwU3RhdGUoe1xuICAgICAgICAgIGpvYkdyb3VwOiB0aGlzRmlsdGVyU2VsY3Rpb24udmFsdWUsXG4gICAgICAgICAgam9iOiB0aGlzRmlsdGVyU2VsY3Rpb24ub3B0aW9uc1t0aGlzRmlsdGVyU2VsY3Rpb24uc2VsZWN0ZWRJbmRleF0udGV4dFxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgIC8qIGFkZCBvbiBjbGljayBmdW5jdGlvbmFsaXR5IHRvIHRoZSBsb25nIHRlcm0gaGVhbHRoIGNoZWNrYm94IHNlbGVjdGlvbiAqL1xuICAgIGQzLnNlbGVjdEFsbCgnI2ZpbHRlcl9fbG9uZy10ZXJtLCAjc3RpY2t5X19sb25nLXRlcm0nKS5vbihcbiAgICAgICdjaGFuZ2UnLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNldEFwcFN0YXRlKHtcbiAgICAgICAgICBbJ2xvbmctdGVybSddOiB0aGlzLmNoZWNrZWRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICApXG5cbiAgICAvKiBhZGQgb24gY2xpY2sgZnVuY3Rpb25hbGl0eSB0byB0aGUgaGlnaHQgcmlzayBoZWFsdGggY2hlY2tib3ggc2VsZWN0aW9uICovXG4gICAgZDMuc2VsZWN0QWxsKCcjZmlsdGVyX19oaWdoLXJpc2ssICNzdGlja3lfX2hpZ2gtcmlzaycpLm9uKFxuICAgICAgJ2NoYW5nZScsXG4gICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0QXBwU3RhdGUoe1xuICAgICAgICAgIFsnaGlnaC1yaXNrJ106IHRoaXMuY2hlY2tlZFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIClcblxuICAgIC8qIGdyYWIgYW5kIHNhdmUgdGhlIGxvbmcgdGVybSBoZWFsdGggY2hlY2tib3ggbGFiZWwgKi9cbiAgICB0aGlzLm5vbkVzc2VudGlhbExhYmVsID0gZDMuc2VsZWN0QWxsKCcjbGFiZWxfX25vbi1lc3NlbnRpYWwnKVxuXG4gICAgLyogZ3JhYiBhbmQgc2F2ZSB0aGUgbG9uZyB0ZXJtIGhlYWx0aCBjaGVja2JveCBsYWJlbCAqL1xuICAgIHRoaXMubG9uZ1Rlcm1MYWJlbCA9IGQzLnNlbGVjdEFsbCgnI2xhYmVsX19sb25nLXRlcm0nKVxuXG4gICAgLyogZ3JhYiBhbmQgc2F2ZSB0aGUgaGlnaHQgcmlzayBoZWFsdGggY2hlY2tib3ggbGFiZWwgKi9cbiAgICB0aGlzLmhpZ2hSaXNrTGFiZWwgPSBkMy5zZWxlY3RBbGwoJyNsYWJlbF9faGlnaC1yaXNrJylcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKHN0YXRlLCBpbml0aWFsTG9hZCA9IGZhbHNlKSB7XG4gICAgLy8gdXBkYXRlIGxvY2FsIHN0YXRlIG9iamVjdHNcbiAgICB0aGlzLnN0YXRlID0gc3RhdGVcbiAgICB0aGlzLmpvYnMgPSB0aGlzLnN0YXRlVG9Kb2JzTWFwLmdldCh0aGlzLmxhbmd1YWdlKS5nZXQodGhpcy5zdGF0ZSlcbiAgICB0aGlzLmpvYnNGb3JUaGlzU3RhdGUgPSBnZXRKb2JzTGlzdCh0aGlzLmpvYnMpXG5cbiAgICBjb25zdCBzdGF0ZVRyYW5zbGF0ZWQgPSB0aGlzLnN0YXRlcy5maW5kKGQgPT4gZC5rZXkgPT09IHRoaXMuc3RhdGUpXG4gICAgICAubGFuZ3VhZ2VzW3RoaXMubGFuZ3VhZ2VdXG4gICAgLyogdXBkYXRlIHRoZSBmaWx0ZXIgaGVhZGVyIGluc3RydWN0aW9ucyAqL1xuICAgIHRoaXMuZmlsdGVySGVhZGVyLmh0bWwoXG4gICAgICB0cmFuc2xhdGlvbnNbdGhpcy5sYW5ndWFnZV1bJ2ZpbHRlckhlYWRlciddKHN0YXRlVHJhbnNsYXRlZClcbiAgICApXG4gICAgLyogdXBkYXRlIHRoZSBzdGlja3kgaGVhZGVyIGluc3RydWN0aW9ucyAqL1xuICAgIHRoaXMuc3RpY2t5SGVhZGVyLmh0bWwoXG4gICAgICB0cmFuc2xhdGlvbnNbdGhpcy5sYW5ndWFnZV1bJ3N0aWNreUhlYWRlciddKHN0YXRlVHJhbnNsYXRlZClcbiAgICApXG4gICAgLyogc2V0IHNlbGVjdGVkIHRvIHNob3cgdGhlIHN0YXRlIG5hbWUgKi9cbiAgICBkMy5zZWxlY3RBbGwoJ29wdGlvbi5zdGF0ZScpLnByb3BlcnR5KFxuICAgICAgJ3NlbGVjdGVkJyxcbiAgICAgIGQgPT4gZC5sYW5ndWFnZXNbJ2VuZ2xpc2gnXSA9PT0gc3RhdGVcbiAgICApXG5cbiAgICAvKiBwb3B1bGF0ZSBqb2Igb3B0aW9ucyBieSBzdGF0ZS9sYW5ndWFnZSAqL1xuICAgIHRoaXMuc2V0T2NjdXBhdGlvbk9wdGlvbnModGhpcy5sYW5ndWFnZSwgc3RhdGUsIGluaXRpYWxMb2FkKVxuXG4gICAgLyogYWxsb3cgam9icyBzZWxlY3Rpb24gKi9cbiAgICB0aGlzLmFsbG93Sm9iU2VsZWN0aW9uKClcblxuICAgIC8qIHVwZGF0ZSBpbnB1dCBqb2IgdGl0bGUgYnkgbGFuZ2F1Z2UgYW5kIHN0YXRlICovXG4gICAgdGhpcy51cGRhdGVKb2JUaXRsZVRleHQodGhpcy5sYW5ndWFnZSwgc3RhdGVUcmFuc2xhdGVkKVxuICB9XG5cbiAgdXBkYXRlQWdlKGFnZSkge1xuICAgIC8qIHNldCBzZWxlY3RlZCB0byBzaG93IHRoZSBzdGF0ZSBuYW1lICovXG4gICAgZDMuc2VsZWN0QWxsKCdvcHRpb24uYWdlJykucHJvcGVydHkoJ3NlbGVjdGVkJywgZCA9PiBkLnZhbHVlID09PSBhZ2UpXG4gIH1cblxuICB1cGRhdGVKb2Ioam9iKSB7XG4gICAgLyogc2V0IHNlbGVjdGVkIHRvIHNob3cgdGhlIHN0YXRlIG5hbWUgKi9cbiAgICBkMy5zZWxlY3RBbGwoJ29wdGlvbi5vY2N1cGF0aW9uJykucHJvcGVydHkoXG4gICAgICAnc2VsZWN0ZWQnLFxuICAgICAgZCA9PiBkLnRleHQudHJpbSgpID09IGpvYlxuICAgIClcbiAgfVxuXG4gIHVwZGF0ZUNoZWNrKGlkLCBib29sKSB7XG4gICAgLyogdXBkYXRlIGJvdGggY2hlY2tzIGlmIG9uZSBpcyBjaGFuZ2VkICovXG4gICAgZDMuc2VsZWN0QWxsKGAjZmlsdGVyX18ke2lkfSwgI3N0aWNreV9fJHtpZH1gKS5wcm9wZXJ0eSgnY2hlY2tlZCcsIGJvb2wpXG4gIH1cblxuICBzZXRPY2N1cGF0aW9uT3B0aW9ucyhsYW5ndWFnZSwgc3RhdGUsIGluaXRpYWxMb2FkID0gZmFsc2UpIHtcbiAgICAvKiB1cGRhdGUgbG9jYWwgY2xhc3MgdmFsdWVzICovXG4gICAgdGhpcy5qb2JzID0gdGhpcy5zdGF0ZVRvSm9ic01hcC5nZXQobGFuZ3VhZ2UpLmdldChzdGF0ZSlcbiAgICB0aGlzLmpvYnNGb3JUaGlzU3RhdGUgPSBnZXRKb2JzTGlzdCh0aGlzLmpvYnMpXG5cbiAgICAvKiBwcmV2ZW50IHRoaXMgcmVzZXQgYmVoYXZpb3Igd2hlbiB0aGUgcGFnZSBpcyBmaXJzdCBsb2FkaW5nICovXG4gICAgaWYgKCFpbml0aWFsTG9hZCkge1xuICAgICAgdGhpcy5yZXNldE9jY3VwYXRpb25TZWxlY3Rpb25zKClcbiAgICB9XG5cbiAgICAvKiBwb3B1bGF0ZSBqb2Igb3B0aW9ucyBieSBzdGF0ZS9sYW5ndWFnZSAqL1xuICAgIHRoaXMuam9iU2VsZWN0aW9uc1xuICAgICAgLnNlbGVjdEFsbCgnb3B0aW9uLm9jY3VwYXRpb24nKVxuICAgICAgLmRhdGEodGhpcy5qb2JzRm9yVGhpc1N0YXRlKVxuICAgICAgLmpvaW4oJ29wdGlvbicpXG4gICAgICAuYXR0cignY2xhc3MnLCAnb2NjdXBhdGlvbicpXG4gICAgICAuYXR0cigndmFsdWUnLCBkID0+IGQudmFsdWUpXG4gICAgICAuaHRtbChkID0+IGQudGV4dClcbiAgfVxuXG4gIHJlc2V0T2NjdXBhdGlvblNlbGVjdGlvbnMobm9uZXNzZW50aWFsID0gZmFsc2UpIHtcbiAgICAvKiByZXNldCBzZWxlY3Rpb24gdG8gdGhlIGRlZmF1bHQgKi9cbiAgICB0aGlzLmpvYlNlbGVjdGlvbnMucHJvcGVydHkoJ3NlbGVjdGVkSW5kZXgnLCAwKVxuICAgIC8qIGlmIHRoaXMgaXMgYmVpbmcgdHJpZ2dlcmVkIGJ5IGNsaWNraW5nIG5vbmVzc2VudGlhbCwgc2V0IGl0XG4gICAgKiBhcyBub25lc3NlbnRpYWwgdG8gYXZvaWQgZG91YmxlIHN0YXRlIHNldHRpbmcuIE90aGVyd2lzZSwgcmVtb3ZlLiAqL1xuICAgIGlmIChub25lc3NlbnRpYWwpIHtcbiAgICAgIHRoaXMuc2V0QXBwU3RhdGUoeyBqb2JHcm91cDogJ25vbi1lc3NlbnRpYWwnLCBqb2I6ICdub24tZXNzZW50aWFsJyB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEFwcFN0YXRlKHsgam9iOiB1bmRlZmluZWQsIGpvYkdyb3VwOiB1bmRlZmluZWQgfSlcbiAgICB9XG4gIH1cblxuICBzZXRPcHRpb25zQnlMYW5ndWFnZShsYW5ndWFnZSwgaW5pdGlhbExvYWQgPSBmYWxzZSkge1xuICAgIC8qIHVwZGF0ZSBsb2NhbCBjbGFzcyB2YWx1ZXMgKi9cbiAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2VcblxuICAgIGNvbnN0IHRyYW5zbGF0aW9uT2JqZWN0ID0gdHJhbnNsYXRpb25zW2xhbmd1YWdlXVxuXG4gICAgdGhpcy5mYWN0b3JzSGVhZGVyLnRleHQodHJhbnNsYXRpb25PYmplY3RbJ2ZhY3RvcnNIZWFkZXInXSlcblxuICAgIC8qIHVwZGF0ZSBhZ2UgdGl0bGUgYmFzZWQgb24gbGFuZ3VhZ2UgKi9cbiAgICB0aGlzLmFnZVRpdGxlcy50ZXh0KHRyYW5zbGF0aW9uT2JqZWN0WydhZ2VUaXRsZSddKVxuXG4gICAgLyogcG9wdWxhdGUgc3RhdGUgb3B0aW9ucyBieSBsYW5nYXVnZSAqL1xuICAgIHRoaXMuc3RhdGVTZWxlY3Rpb25zXG4gICAgICAuc2VsZWN0QWxsKCdvcHRpb24uc3RhdGUnKVxuICAgICAgLmRhdGEodGhpcy5zdGF0ZXMpXG4gICAgICAuam9pbignb3B0aW9uJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdzdGF0ZScpXG4gICAgICAuYXR0cigndmFsdWUnLCBkID0+IGQua2V5KVxuICAgICAgLmh0bWwoZCA9PiBkLmxhbmd1YWdlc1tsYW5ndWFnZV0pIC8vIHRoaXMgaXMgaW4gdGhpcy5zdGF0ZXNcblxuICAgIC8qIHBvcHVsYXRlIGFnZSBvcHRpb25zIGJ5IGxhbmdhdWdlICovXG4gICAgdGhpcy5hZ2VTZWxlY3Rpb25zXG4gICAgICAuc2VsZWN0QWxsKCdvcHRpb24uYWdlJylcbiAgICAgIC5kYXRhKHRyYW5zbGF0aW9uT2JqZWN0WydhZ2VPcHRpb25zJ10pXG4gICAgICAuam9pbignb3B0aW9uJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdhZ2UnKVxuICAgICAgLmF0dHIoJ3ZhbHVlJywgZCA9PiBkLnZhbHVlKVxuICAgICAgLmh0bWwoZCA9PiBkLnRleHQpXG5cbiAgICAvKiB1cGRhdGUgbm9uLWVzc2VudGlhbCBjaGVjayAqL1xuICAgIHRoaXMubm9uRXNzZW50aWFsTGFiZWwudGV4dCh0cmFuc2xhdGlvbk9iamVjdFsnbm9uZXNzZW50aWFsJ10pXG5cbiAgICAvKiB1cGRhdGUgbG9uZyB0ZXJtIGNvcHkgYnkgbGFuZ2F1Z2UgKi9cbiAgICB0aGlzLmxvbmdUZXJtTGFiZWwuaHRtbCh0cmFuc2xhdGlvbk9iamVjdFsnbG9uZ3Rlcm0nXSlcblxuICAgIC8qIHVwZGF0ZSBoaWdoIHJpc2sgY29weSBieSBsYW5nYXVnZSAqL1xuICAgIHRoaXMuaGlnaFJpc2tMYWJlbC5odG1sKHRyYW5zbGF0aW9uT2JqZWN0WydoaWdocmlzayddKVxuXG4gICAgLyogdXBkYXRlIGlucHV0IGFnZSB0aXRsZSBmb3IgdGhlIHN0aWNreSBieSBsYW5nYXVnZSAqL1xuICAgIHRoaXMuYWdlU2VsZWN0aW9uc1xuICAgICAgLnNlbGVjdCgnb3B0aW9uLmZpbHRlcl9fYWdlLXRpdGxlJylcbiAgICAgIC5odG1sKHRyYW5zbGF0aW9uT2JqZWN0WydhZ2VUaXRsZSddKVxuXG4gICAgLyoqIFNUQVRFIFNQRUNJRkMgSU5GT1xuICAgICAqIHN0YXRlIGNhbiBiZSB1bmRlZmluZWQgZm9yIG1vc3Qgb2YgdGhlc2UgLS0gaXQgcmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgZm9yIG5vIHN0YXRlXG4gICAgICogYnV0IHRoaXMuc2V0T2NjdXBhdGlvbk9wdGlvbnMgcmVxdWlyZXMgYSBzdGF0ZSBmcm9tIG91ciBsaXN0XG4gICAgICogICovXG4gICAgbGV0IHN0YXRlVHJhbnNsYXRlZFxuICAgIGlmICh0aGlzLnN0YXRlcy5tYXAoZCA9PiBkLmtleSkuaW5jbHVkZXModGhpcy5zdGF0ZSkpIHtcbiAgICAgIHN0YXRlVHJhbnNsYXRlZCA9IHRoaXMuc3RhdGVzLmZpbHRlcihkID0+IGQua2V5ID09PSB0aGlzLnN0YXRlKVswXVxuICAgICAgICAubGFuZ3VhZ2VzW2xhbmd1YWdlXVxuICAgIH1cblxuICAgIC8qIHVwZGF0ZSB0aGUgZmlsdGVyIGhlYWRlciBpbnN0cnVjdGlvbnMgKi9cbiAgICB0aGlzLmZpbHRlckhlYWRlci5odG1sKHRyYW5zbGF0aW9uT2JqZWN0WydmaWx0ZXJIZWFkZXInXShzdGF0ZVRyYW5zbGF0ZWQpKVxuXG4gICAgdGhpcy5zdGlja3lIZWFkZXIuaHRtbCh0cmFuc2xhdGlvbk9iamVjdFsnc3RpY2t5SGVhZGVyJ10oc3RhdGVUcmFuc2xhdGVkKSlcbiAgICAvKiB1cGRhdGUgdGhlIHN0YXRlIHRpdGxlLCB3aGljaCBpcyBlaXRoZXIgYWJvdmUgdGhlIGlucHV0IG9yIGluc2lkZSB0aGUgaW5wdXQgKi9cbiAgICB0aGlzLnN0YXRlVGl0bGVzLmh0bWwodHJhbnNsYXRpb25PYmplY3RbJ3N0YXRlVGl0bGUnXShzdGF0ZVRyYW5zbGF0ZWQpKVxuXG4gICAgLyogdXBkYXRlIGlucHV0IGpvYiB0aXRsZSBieSBsYW5nYXVnZSBhbmQgc3RhdGUgKi9cbiAgICB0aGlzLnVwZGF0ZUpvYlRpdGxlVGV4dChsYW5ndWFnZSwgc3RhdGVUcmFuc2xhdGVkKVxuXG4gICAgLyogdGhpcyBNVVNUIGhhdmUgYSBtYXRjaGluZyBzdGF0ZSB0byBydW4gKi9cbiAgICBpZiAodGhpcy5zdGF0ZSkge1xuICAgICAgLyogcG9wdWxhdGUgam9iIG9wdGlvbnMgYnkgc3RhdGUvbGFuZ3VhZ2UgKi9cbiAgICAgIHRoaXMuc2V0T2NjdXBhdGlvbk9wdGlvbnMobGFuZ3VhZ2UsIHRoaXMuc3RhdGUsIGluaXRpYWxMb2FkKVxuICAgIH1cbiAgfVxuXG4gIGFsbG93Sm9iU2VsZWN0aW9uKCkge1xuICAgIGQzLnNlbGVjdEFsbCgnLmZpbHRlcl9fam9iLXAnKS5jbGFzc2VkKCdkaXNhYmxlZCcsIGZhbHNlKVxuICAgIGQzLnNlbGVjdEFsbCgnI2ZpbHRlcl9fam9iJykucHJvcGVydHkoJ2Rpc2FibGVkJywgZmFsc2UpXG4gIH1cblxuICB1cGRhdGVKb2JUaXRsZVRleHQobGFuZ3VhZ2UsIHN0YXRlKSB7XG4gICAgdGhpcy5qb2JEZWZhdWx0Lmh0bWwodHJhbnNsYXRpb25zW2xhbmd1YWdlXVsnam9iRGVmYXVsdCddKVxuICAgIGQzLnNlbGVjdEFsbChcbiAgICAgICcuZmlsdGVyX19qb2ItcCwgI3N0aWNreV9fam9iID4gb3B0aW9uLmZpbHRlcl9fam9iLXRpdGxlJ1xuICAgICkuaHRtbCh0cmFuc2xhdGlvbnNbbGFuZ3VhZ2VdWydqb2JUaXRsZSddKHN0YXRlKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRKb2JzTGlzdChqb2JzKSB7XG4gIHJldHVybiBqb2JzXG4gICAgLnJlZHVjZShcbiAgICAgIChhZ2csIFtncm91cCwgam9ic10pID0+IFtcbiAgICAgICAgLi4uYWdnLFxuICAgICAgICAuLi5qb2JzLm1hcChqb2IgPT4gKHsgdGV4dDogam9iLCB2YWx1ZTogZ3JvdXAgfSkpXG4gICAgICBdLFxuICAgICAgW11cbiAgICApXG4gICAgLnNvcnQoKGEsIGIpID0+IGQzLmFzY2VuZGluZyhhLnRleHQsIGIudGV4dCkpXG59XG5cbmNvbnN0IHRyYW5zbGF0aW9ucyA9IHtcbiAgZW5nbGlzaDoge1xuICAgIGZpbHRlckhlYWRlcjogc3RhdGUgPT4ge1xuICAgICAgaWYgKHN0YXRlKVxuICAgICAgICByZXR1cm4gYFlvdXIgcGxhbiBmb3IgZ2V0dGluZyB0aGUgdmFjY2luYXRpb24gaXMgY3VycmVudGx5IHNldCBmb3IgPHNwYW4gY2xhc3M9XCJmaWx0ZXJfX2Rpci1zdGF0ZVwiPiR7c3RhdGV9PC9zcGFuPiBydWxlcy4gPGJyLz48YnIvPlxuICAgICAgICBDb21wbGV0ZSB0aGUgZm9ybSBiZWxvdyB0byBzZWUgeW91ciBjdXN0b21pemVkIHZhY2NpbmF0aW9uIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgeW91ciBlbGlnaWJpbGl0eSBzdGF0dXMgYW5kIHdoZXJlIHRvIGdldCB0aGUgdmFjY2luZS5cbiAgICAgICAgWW91IGNhbiBjaGFuZ2UgdGhlIHN0YXRlIGlucHV0IGJlbG93IHRvIHZpZXcgYSB2YWNjaW5hdGlvbiBwbGFuIGluIGFub3RoZXIgc3RhdGUuIGBcbiAgICAgIHJldHVybiAnU2VsZWN0IHlvdXIgYWdlLCBvY2N1cGF0aW9uIGFuZCBvdGhlciBhcHBsaWNhYmxlIGZhY3RvcnMgdG8gc2VlIGlmIHlvdSBhcmUgZWxpZ2libGUgbm93LidcbiAgICB9LFxuICAgIHN0aWNreUhlYWRlcjogc3RhdGUgPT4ge1xuICAgICAgaWYgKHN0YXRlKVxuICAgICAgICByZXR1cm4gYFlvdSBhcmUgdmlld2luZyA8c3BhbiBjbGFzcz1cImZpbHRlcl9fZGlyLXN0YXRlXCI+JHtzdGF0ZX08L3NwYW4+LiBDbGljayB0aGUgaWNvbiB0byBtYWtlIHNlbGVjdGlvbnMgZm9yIGFub3RoZXIgcGxhbi5gXG4gICAgICByZXR1cm4gJ1NlbGVjdCB5b3VyIGFnZSwgb2NjdXBhdGlvbiBhbmQgb3RoZXIgYXBwbGljYWJsZSBmYWN0b3JzIHRvIHNlZSBpZiB5b3UgYXJlIGVsaWdpYmxlIG5vdy4nXG4gICAgfSxcbiAgICBmYWN0b3JzSGVhZGVyOiAnQWRkaXRpb25hbCBmYWN0b3JzJyxcbiAgICBzdGF0ZVRpdGxlOiBzdGF0ZSA9PiB7XG4gICAgICBpZiAoc3RhdGUpIHJldHVybiAnU2VsZWN0IGFub3RoZXIgc3RhdGUnXG4gICAgICByZXR1cm4gJ1NlbGVjdCBhIHN0YXRlJ1xuICAgIH0sXG4gICAgYWdlVGl0bGU6ICdBZ2UgZ3JvdXAnLFxuICAgIGpvYlRpdGxlOiBzdGF0ZSA9PiB7XG4gICAgICBpZiAoc3RhdGUpXG4gICAgICAgIHJldHVybiBgU2VsZWN0IGFuIGVzc2VudGlhbCBvY2N1cGF0aW9uIGZvciA8c3BhbiBjbGFzcz1cImZpbHRlcl9fZGlyLXN0YXRlXCI+JHtzdGF0ZX08L3NwYW4+LiBPciBjaGVjayB0aGUgYm94IGJlbG93LmBcbiAgICAgIHJldHVybiAnU3RhdGUgc3BlY2lmaWMgb2NjdXBhdGlvbnMnXG4gICAgfSxcbiAgICBqb2JEZWZhdWx0OiAnRXNzZW50aWFsIG9jY3VwYXRpb24nLFxuICAgIGFnZU9wdGlvbnM6IFtcbiAgICAgIHsgdmFsdWU6ICd1bmRlcjY0JywgdGV4dDogJ1VuZGVyIDY1JyB9LFxuICAgICAgeyB2YWx1ZTogJzY1LTY5JywgdGV4dDogJzY1LTY5JyB9LFxuICAgICAgeyB2YWx1ZTogJzcwLTc0JywgdGV4dDogJzcwLTc0JyB9LFxuICAgICAgeyB2YWx1ZTogJzc1b2xkZXInLCB0ZXh0OiAnNzUgb3Igb2xkZXInIH1cbiAgICBdLFxuICAgIG5vbmVzc2VudGlhbDogJ090aGVyIChub24tZXNzZW50aWFsKSBvY2N1cGF0aW9uJyxcbiAgICBsb25ndGVybTogJ0xvbmctdGVybSBjYXJlIHJlc2lkZW50JyxcbiAgICBoaWdocmlzazogJ0hpZ2gtcmlzayBoZWFsdGggY29uY2VybnMnXG4gIH0sXG4gIHNwYW5pc2g6IHtcbiAgICBmaWx0ZXJIZWFkZXI6IHN0YXRlID0+IHtcbiAgICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIGBUdSBwbGFuIHBhcmEgcmVjaWJpciBsYSB2YWN1bmEgZXN0w6EgZXN0YWJsZWNpZG8gYWN0dWFsbWVudGUgY29uIGxhcyBub3JtYXMgZGUgPHNwYW4gY2xhc3M9XCJmaWx0ZXJfX2Rpci1zdGF0ZVwiPiR7c3RhdGV9PC9zcGFuPi4gPGJyLz48YnIvPiBDb21wbGV0YSBlbCBmb3JtdWxhcmlvIGEgY29udGludWFjacOzbiBwYXJhIHZlciB0dSBpbmZvcm1hY2nDs24gZGUgdmFjdW5hY2nDs24gcGVyc29uYWxpemFkYSwgaW5jbHV5ZW5kbyB0dSBlc3RhdHVzIGRlIGVsZWdpYmlsaWRhZCB5IGTDs25kZSBvYnRlbmVyIGxhIHZhY3VuYS4gQWJham8gcHVlZGVzIHNlbGVjY2lvbmFyIG90cm8gZXN0YWRvIHBhcmEgdmVyIHN1IHBsYW4gZGUgdmFjdW5hY2nDs24uYFxuICAgICAgcmV0dXJuICdDb25zdWx0YSB0dSBwbGFuIHNlbGVjY2lvbmFuZG8gdWJpY2FjacOzbiwgZ3J1cG8gZGUgZWRhZCwgb2N1cGFjacOzbiB5IG90cm9zIGZhY3RvcmVzIGFwbGljYWJsZXMuJ1xuICAgIH0sXG4gICAgc3RpY2t5SGVhZGVyOiBzdGF0ZSA9PiB7XG4gICAgICBpZiAoc3RhdGUpXG4gICAgICAgIHJldHVybiBgRXN0w6FzIHZpZW5kbyBlbCBlc3RhZG8gZGUgPHNwYW4gY2xhc3M9XCJmaWx0ZXJfX2Rpci1zdGF0ZVwiPiR7c3RhdGV9PC9zcGFuPi4gQ2FtYmlhIGxhcyBzZWxlY2Npb25lcyBhYmFqbyBwYXJhIHZlciBvdHJvIHBsYW4uYFxuICAgICAgcmV0dXJuICdTZWxlY2Npb25hIHR1IGVkYWQsIG9jdXBhY2nDs24geSBvdHJvcyBmYWN0b3JlcyBhcGxpY2FibGVzIHBhcmEgdmVyIHNpIGVyZXMgZWxlZ2libGUgYWhvcmEuJ1xuICAgIH0sXG4gICAgZmFjdG9yc0hlYWRlcjogJ090cm9zIGZhY3RvcmVzJyxcbiAgICBzdGF0ZVRpdGxlOiBzdGF0ZSA9PiB7XG4gICAgICBpZiAoc3RhdGUpIHJldHVybiAnU2VsZWNjaW9uYSBvdHJvIGVzdGFkbydcbiAgICAgIHJldHVybiAnU2VsZWNjaW9uYSB1biBlc3RhZG8nXG4gICAgfSxcbiAgICBhZ2VUaXRsZTogJ1NlbGVjY2lvbmEgdW4gcmFuZ28gZGUgZWRhZCcsXG4gICAgam9iVGl0bGU6IHN0YXRlID0+IHtcbiAgICAgIGlmIChzdGF0ZSlcbiAgICAgICAgcmV0dXJuIGBTZWxlY2Npb25hIHVuIHRyYWJham8gZXNlbmNpYWwgcGFyYSA8c3BhbiBjbGFzcz1cImZpbHRlcl9fZGlyLXN0YXRlXCI+JHtzdGF0ZX08L3NwYW4+LiBPIG1hcmNhIGxhIGNhc2lsbGEgZGUgYWJham8uYFxuICAgICAgcmV0dXJuICdUcmFiYWpvcyBlc2VuY2lhbGVzIGVzcGVjw61maWNvcyBlbiBlc3RlIGVzdGFkbydcbiAgICB9LFxuICAgIGpvYkRlZmF1bHQ6ICdUcmFiYWpvIGVzZW5jaWFsJyxcbiAgICBhZ2VPcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAndW5kZXI2NCcsIHRleHQ6ICdNZW5vcmVzIGRlIDY1IGHDsW9zJyB9LFxuICAgICAgeyB2YWx1ZTogJzY1LTY5JywgdGV4dDogJzY1LTY5JyB9LFxuICAgICAgeyB2YWx1ZTogJzcwLTc0JywgdGV4dDogJzcwLTc0JyB9LFxuICAgICAgeyB2YWx1ZTogJzc1b2xkZXInLCB0ZXh0OiAnTWF5b3JlcyBkZSA3NSBhw7FvcycgfVxuICAgIF0sXG4gICAgbm9uZXNzZW50aWFsOiAnT3RyYXMgb2N1cGFjaW9uZXMgKG5vIGVzZW5jaWFsZXMpJyxcbiAgICBsb25ndGVybTogJ1Jlc2lkZW50ZXMgZGUgY2VudHJvcyBkZSBjdWlkYWRvIGEgbGFyZ28gcGxhem8nLFxuICAgIGhpZ2hyaXNrOiAnUHJvYmxlbWFzIGRlIHNhbHVkIGRlIGFsdG8gcmllc2dvJ1xuICB9LFxuICBtYW5kYXJpbjoge1xuICAgIGZpbHRlckhlYWRlcjogc3RhdGUgPT4ge1xuICAgICAgaWYgKHN0YXRlKVxuICAgICAgICByZXR1cm4gYOebruWJjeS9oOeci+WIsOeahOaYrzxzcGFuIGNsYXNzPVwiZmlsdGVyX19kaXItc3RhdGVcIj4ke3N0YXRlfTwvc3Bhbj7nmoTnlqvoi5fmjqXnp43orqHliJLjgII8YnIvPjxici8+IOWujOaIkOS4i+mdouWHoOS4qumAiemhue+8jOWPr+iHquWumuS5ieafpeeci+acieWFs+eWq+iLl+aOpeenjeeahOS/oeaBr++8jOWMheaLrOS9oOaJgOWcqOS6uue+pOaYr+WQpuW3suW8gOWni+aOpeenjeOAgeWcqOWTqumHjOaOpeenjeOAguS9oOWPr+S7pemAmui/h+mAieaLqeS4jeWQjOeahOW3nu+8jOafpeeci+WFtuS7luW3nueahOeWq+iLl+aOpeenjeiuoeWIkuOAgmBcbiAgICAgIHJldHVybiAn5a6M5oiQ5LiL6Z2i5Yeg5Liq6YCJ6aG577yM5Y+v6Ieq5a6a5LmJ5p+l55yL5pyJ5YWz55ar6IuX5o6l56eN55qE5L+h5oGv77yM5YyF5ous5L2g5omA5Zyo5Lq6576k5piv5ZCm5bey5byA5aeL5o6l56eN44CB5Zyo5ZOq6YeM5o6l56eN44CCJ1xuICAgIH0sXG4gICAgc3RpY2t5SGVhZGVyOiBzdGF0ZSA9PiB7XG4gICAgICBpZiAoc3RhdGUpXG4gICAgICAgIHJldHVybiBg55uu5YmN5L2g55yL5Yiw55qE5pivPHNwYW4gY2xhc3M9XCJmaWx0ZXJfX2Rpci1zdGF0ZVwiPiR7c3RhdGV9PC9zcGFuPueahOS/oeaBr++8jOeCueWHu+WPs+mdoumAiemhueafpeeci+WFtuS7luW3nmBcbiAgICAgIHJldHVybiAn5a6M5oiQ5LiL6Z2i5Yeg5Liq6YCJ6aG577yM5Y+v6Ieq5a6a5LmJ5p+l55yL5pyJ5YWz55ar6IuX5o6l56eN55qE5L+h5oGv77yM5YyF5ous5L2g5omA5Zyo5Lq6576k5piv5ZCm5bey5byA5aeL5o6l56eN44CB5Zyo5ZOq6YeM5o6l56eN44CCJ1xuICAgIH0sXG4gICAgZmFjdG9yc0hlYWRlcjogJ+WFtuS7luWboOe0oCcsXG4gICAgc3RhdGVUaXRsZTogc3RhdGUgPT4ge1xuICAgICAgaWYgKHN0YXRlKSByZXR1cm4gJ+mAieaLqeWFtuS7luW3nidcbiAgICAgIHJldHVybiAn6YCJ5oup5beeJ1xuICAgIH0sXG4gICAgYWdlVGl0bGU6ICflubTpvoQnLFxuICAgIGpvYlRpdGxlOiBzdGF0ZSA9PiB7XG4gICAgICBpZiAoc3RhdGUpXG4gICAgICAgIHJldHVybiBg6YCJ5oupPHNwYW4gY2xhc3M9XCJmaWx0ZXJfX2Rpci1zdGF0ZVwiPiR7c3RhdGV9PC9zcGFuPueahOmHjeimgeiBjOS4mu+8jOaIluWLvumAieS4i+mdoueahOmAiemhuWBcbiAgICAgIHJldHVybiAn5a+556S+5Lya6L+Q6KGM6Iez5YWz6YeN6KaB55qE6IGM5LiaJ1xuICAgIH0sXG4gICAgam9iRGVmYXVsdDogJ+WvueekvuS8mui/kOihjOiHs+WFs+mHjeimgeeahOiBjOS4micsXG4gICAgYWdlT3B0aW9uczogW1xuICAgICAgeyB2YWx1ZTogJ3VuZGVyNjQnLCB0ZXh0OiAnNjXlsoHku6XkuIsnIH0sXG4gICAgICB7IHZhbHVlOiAnNjUtNjknLCB0ZXh0OiAnNjXoh7M2OScgfSxcbiAgICAgIHsgdmFsdWU6ICc3MC03NCcsIHRleHQ6ICc3MOiHszc0JyB9LFxuICAgICAgeyB2YWx1ZTogJzc1b2xkZXInLCB0ZXh0OiAnNzXlsoHlj4rku6XkuIonIH1cbiAgICBdLFxuICAgIG5vbmVzc2VudGlhbDogJ+WFtuS7luiBjOS4micsXG4gICAgbG9uZ3Rlcm06ICfplb/mnJ/mjqXlj5fmiqTnkIbnmoTkurrlkZgnLFxuICAgIGhpZ2hyaXNrOiAn5oKj5pyJ55a+55eF55qE6auY6aOO6Zmp5Lq6576kJ1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbHRlclxuIiwiaW1wb3J0IHsgQ09OU1RBTlRTIGFzIEMgfSBmcm9tICcuLi9jb25zdGFudHMuanMnXG5cbmNvbnN0IHRlbXBsYXRlID0gKGJyZWFraW5nID0gZmFsc2UsIGhlYWQsIHVybCwgbGFuZ3VhZ2UpID0+IGBcbiAgJHticmVha2luZyA/ICc8c3BhbiBjbGFzcz1cImJyZWFraW5nXCI+QlJFQUtJTkc8L3NwYW4+JyA6ICcnfVxuICAke2hlYWR9XG4gIDxhIGNsYXNzPVwiaW5mby1jYXJkX19yZWFkLW1vcmVcIiB0YXJnZXQ9XCJfYmxhbmtcIiBocmVmPSR7dXJsfT4ke1xuICB0cmFuc2xhdGlvbnNbbGFuZ3VhZ2VdXG59PC9hPlxuYFxuXG5jbGFzcyBOZXdzIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gY29udGVudHMgcGFyZW50IGNvbnRhaW5lciB0byBhcHBlbmQgcXVlc3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IG5ld3MgdGhlIG9iamVjdCB3aXRoIGFsbCBpbmZvIGZvciB0aGlzIHF1ZXN0aW9uXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRlbnRzLCBuZXdzLCBsYW5ndWFnZSkge1xuICAgIGlmIChuZXdzW0MuSEVBRF0gJiYgbmV3c1tDLkFSQ0hdICE9PSAnVFJVRScpIHtcbiAgICAgIGNvbnRlbnRzXG4gICAgICAgIC5hcHBlbmQoJ3VsJylcbiAgICAgICAgLmFwcGVuZCgnbGknKVxuICAgICAgICAuaHRtbChcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIG5ld3NbQy5CUkVBS10gPT09ICdUUlVFJyxcbiAgICAgICAgICAgIG5ld3NbQy5IRUFEXSxcbiAgICAgICAgICAgIG5ld3NbQy5VUkxdLFxuICAgICAgICAgICAgbGFuZ3VhZ2VcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTmV3c1xuXG5jb25zdCB0cmFuc2xhdGlvbnMgPSB7XG4gIGVuZ2xpc2g6ICdSZWFkIG1vcmUnLFxuICBzcGFuaXNoOiAnTGVlIG3DoXMnLFxuICBtYW5kYXJpbjogJ+mYheivu+abtOWkmidcbn1cbiIsImltcG9ydCB7IENPTlNUQU5UUyBhcyBDIH0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJ1xuaW1wb3J0IHsgYWRkRW1iZWQgfSBmcm9tICcuL2hlbHBlcnMvYWRkRW1iZWQuanMnXG5cbmNsYXNzIFF1ZXN0aW9uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gY2FyZCBwYXJlbnQgY29udGFpbmVyIHRvIGFwcGVuZCBxdWVzdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gcXVlc3Rpb24gdGhlIG9iamVjdCB3aXRoIGFsbCBpbmZvIGZvciB0aGlzIHF1ZXN0aW9uXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKGNhcmQsIHF1ZXN0aW9uLCBhcHBTdGF0ZSkge1xuICAgIHRoaXMucXVlc3Rpb25FeHBhbmRlZCA9IGZhbHNlXG5cbiAgICBjb25zdCBjb250ZW50cyA9IGNhcmQuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdpbmZvLWNhcmRfX2NvbnRlbnRzJylcbiAgICAvKipcbiAgICAgKiBmb3IgcXVlc3Rpb25zLCBhbnN3ZXJzLCBhbmQgZm9vdG5vdGVzLCB3ZSB3aWxsIGFwcGVuZFxuICAgICAqIGEgZm9ybWF0dGVkIHBhcmFncmFwaCAtLSB0aGUgcHJvY2Vlc3MgaXMgdGhlIHNhbWUsIHNvXG4gICAgICogaXQgY2FuIGJlIGV4dHJhcG9sYXRlZCB0byB0aGUgbWFrZUZvcm1hdHRlZERpdiBmdW5jdGlvblxuICAgICAqL1xuICAgIGlmIChxdWVzdGlvbltDLkFOU1dFUl0pIHtcbiAgICAgIC8vIGFkZCBhbiBvZmZzZXQgYW5jaG9yIGZvciAnaGlkZSdcbiAgICAgIGNvbnRlbnRzXG4gICAgICAgIC5hcHBlbmQoJ2EnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnYW5jaG9yJylcbiAgICAgICAgLmF0dHIoJ2lkJywgcXVlc3Rpb25bQy5JRF0ucmVwbGFjZSgnLicsICctJykpXG5cbiAgICAgIC8vIGFkZCB0aGUgcXVlc3Rpb24gd2l0aG91dCBjaGVja2luZyBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgICBjb250ZW50c1xuICAgICAgICAuYXBwZW5kKCdwJylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2luZm8tY2FyZF9fcXVlc3Rpb24nKVxuICAgICAgICAudGV4dChxdWVzdGlvbltDLlFVRVNUSU9OXSlcblxuICAgICAgdGhpcy5hbnN3ZXJXcmFwcGVyID0gY29udGVudHNcbiAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2luZm8tY2FyZF9fYW5zd2VyLXdyYXAnKVxuXG4gICAgICB0aGlzLmFuc3dlckRpdiA9IHRoaXMuYW5zd2VyV3JhcHBlclxuICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnaW5mby1jYXJkX19hbnN3ZXInKVxuXG4gICAgICB0aGlzLmFuc3dlclAgPSB0aGlzLmFuc3dlckRpdlxuICAgICAgICAuYXBwZW5kKCdwJylcbiAgICAgICAgLmh0bWwoaHRtbFRlbXBsYXRpbmcocXVlc3Rpb25bQy5BTlNXRVJdLCBxdWVzdGlvbltDLkxJTktTXSkpXG5cbiAgICAgIHRoaXMuZXhwYW5kZXJGYWRlID0gdGhpcy5hbnN3ZXJXcmFwcGVyXG4gICAgICAgIC5hcHBlbmQoJ2RpdicpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdleHBhbmRlci1mYWRlJylcblxuICAgICAgdGhpcy5leHBhbmRlckRpdiA9IHRoaXMuYW5zd2VyV3JhcHBlclxuICAgICAgICAuYXBwZW5kKCdkaXYnKVxuICAgICAgICAuYXR0cignaWQnLCAnZXhwYW5kZXInKVxuICAgICAgICAuYXR0cignY2xhc3MnLCAnZXhwYW5kZXItZGl2JylcblxuICAgICAgdGhpcy5leHBhbmRlciA9IHRoaXMuZXhwYW5kZXJEaXZcbiAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2V4cGFuZGVyJylcbiAgICAgICAgLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNsaWNrRXhwYW5kZXIoXG4gICAgICAgICAgICBxdWVzdGlvbltDLklEXS5yZXBsYWNlKCcuJywgJy0nKSxcbiAgICAgICAgICAgIGFwcFN0YXRlLmxhbmd1YWdlXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgICAudGV4dCh0cmFuc2xhdGlvbnNbYXBwU3RhdGUubGFuZ3VhZ2VdWzBdKVxuXG4gICAgICB0aGlzLmNoZWNrRm9yT3ZlcmZsb3coKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGZvciBmb290bm90ZXMsIHdlIG5lZWQgdG8gYXBwZW5kIHRoZSB0ZXh0IGFzIGh0bWwgYW5kXG4gICAgICogaW5jbHVkZSB0aGUgbGluayBhcyB0aGUgaHJlZiB2YWx1ZS4gSWYgdGhlcmUgaXMgYSBsaW5rLFxuICAgICAqIG1ha2UgaXQgYSBoeXBlcmxpbmssIGlmIG5vdCB0aGVuIGl0IHNob3VsZCBiZSBqdXN0IGEgdGV4dCB2YWx1ZS5cbiAgICAgKi9cbiAgICBpZiAocXVlc3Rpb25bQy5GT09UX1RFWFRdKSB7XG4gICAgICBjb25zdCBmb290ID0gY29udGVudHMuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdpbmZvLWNhcmRfX3JlYWQtbW9yZScpXG5cbiAgICAgIGlmIChxdWVzdGlvbltDLkZPT1RfTElOS10pIHtcbiAgICAgICAgZm9vdFxuICAgICAgICAgIC5hcHBlbmQoJ2EnKVxuICAgICAgICAgIC5hdHRyKCd0YXJnZXQnLCAnX2JsYW5rJylcbiAgICAgICAgICAuYXR0cignaHJlZicsIHF1ZXN0aW9uW0MuRk9PVF9MSU5LXSlcbiAgICAgICAgICAuaHRtbChxdWVzdGlvbltDLkZPT1RfVEVYVF0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb290LnRleHQocXVlc3Rpb25bQy5GT09UX1RFWFRdKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGZvciBncmFwaGljcywgd2UgZG9uJ3QgYXBwZW5kIGEgcGFyYWdyYXBoIGVsZW1lbnQsIGJ1dFxuICAgICAqIHJhdGhlciBhIGRpdiB3aXRoIHRoZSBxdWVzdGlvbi5ncmFwaGljIHByb2plY3QgbmFtZVxuICAgICAqIGFzIHRoZSB1cmwgdG8gcm91dGUgdGhlIGlmcmFtZSB0b1xuICAgICAqL1xuICAgIGlmIChxdWVzdGlvbltDLkdSQVBIXSkge1xuICAgICAgY29udGVudHNcbiAgICAgICAgLmFwcGVuZCgnZGl2JylcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2luZm8tY2FyZF9fZ3JhcGhpYycpXG4gICAgICAgIC5hdHRyKCdpZCcsIGBlbWJlZC0ke3F1ZXN0aW9uW0MuR1JBUEhdfWApXG5cbiAgICAgIGFkZEVtYmVkKHF1ZXN0aW9uW0MuR1JBUEhdLCBhcHBTdGF0ZSlcbiAgICB9XG4gIH1cblxuICBjbGlja0V4cGFuZGVyKGhyZWYsIGxhbmd1YWdlKSB7XG4gICAgLy8gZmxpcCB0aGUgcXVlc3Rpb24gc3RhdHVzXG4gICAgdGhpcy5xdWVzdGlvbkV4cGFuZGVkID0gIXRoaXMucXVlc3Rpb25FeHBhbmRlZFxuICAgIGNvbnN0IHRleHQgPSB0aGlzLnF1ZXN0aW9uRXhwYW5kZWRcbiAgICAgID8gdHJhbnNsYXRpb25zW2xhbmd1YWdlXVsxXSAvLyAncmVhZCBtb3JlJ1xuICAgICAgOiB0cmFuc2xhdGlvbnNbbGFuZ3VhZ2VdWzBdIC8vICdoaWRlJ1xuICAgIHRoaXMuZXhwYW5kZXIudGV4dCh0ZXh0KVxuICAgIC8vIGlmIHdlIGFyZSBjbG9zaW5nIHRoZSBxdWVzdGlvbiwganVtcCB0byB0aGUgYW5jaG9yXG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uRXhwYW5kZWQpIHtcbiAgICAgIGxvY2F0aW9uLmhhc2ggPSAnJ1xuICAgICAgbG9jYXRpb24uaGFzaCA9IGAjJHtocmVmfWAgLy8gc2Nyb2xsIHRvIHRoZSBxdWVzdGlvblxuICAgIH1cbiAgICB0aGlzLmFuc3dlcldyYXBwZXIuY2xhc3NlZCgnZXhwYW5kZWQnLCB0aGlzLnF1ZXN0aW9uRXhwYW5kZWQpXG4gICAgLy8gdXBkYXRlIHRoZSBjbGFzcyBpZiBvcGVuIG9yIGNsb3NlZFxuICAgIHRoaXMuZXhwYW5kZXIuY2xhc3NlZCgnc2hvd2luZycsIHRoaXMucXVlc3Rpb25FeHBhbmRlZClcbiAgICB0aGlzLmV4cGFuZGVyRGl2LmNsYXNzZWQoJ3Nob3dpbmcnLCB0aGlzLnF1ZXN0aW9uRXhwYW5kZWQpXG4gICAgdGhpcy5leHBhbmRlckZhZGUuY2xhc3NlZCgnc2hvd2luZycsIHRoaXMucXVlc3Rpb25FeHBhbmRlZClcbiAgfVxuXG4gIGNoZWNrRm9yT3ZlcmZsb3coKSB7XG4gICAgLy8gdGhpcyBjaGVja3MgaWYgdGhlIHAgZWxlbWVudCBvdmVyZmxvd3MgdGhlIGRpdiBtYXgtaGVpZ2h0IGFuZCB3ZSBuZWVkIHRoZSBcInJlYWQgbW9yZVwiIGJ1dHRvblxuICAgIGlmIChcbiAgICAgIHRoaXMuYW5zd2VyUC5ub2RlKCkuY2xpZW50SGVpZ2h0ID4gdGhpcy5hbnN3ZXJXcmFwcGVyLm5vZGUoKS5jbGllbnRIZWlnaHRcbiAgICApIHtcbiAgICAgIHRoaXMuZXhwYW5kZXIuY2xhc3NlZCgnaW5saW5lJywgdHJ1ZSlcbiAgICAgIHRoaXMuZXhwYW5kZXJEaXYuY2xhc3NlZCgndmlzaWJsZScsIHRydWUpXG4gICAgICB0aGlzLmV4cGFuZGVyRmFkZS5jbGFzc2VkKCd2aXNpYmxlJywgdHJ1ZSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUXVlc3Rpb25cbi8qKlxuICogc3BlY2lhbCBjaGFyYWN0ZXJzIHVzZWQgZm9yIGxvb2sgdXAgYW5kIHJlc3VsdGluZyBodG1sIHRlbXBsYXRlLlxuICogYGNoYXJgID0gdGhlIGNoYXJhY3RlciB3ZSB1c2VkIHRvIHNpZ25pZnkgZm9ybWF0dGluZy5cbiAqIGBzaW5nbGVgID0gYm9vbGVhbiBpZiB0aGlzIGlzIGEgc2luZ2xlIGluc3RhbmNlIG9yIGJvdW5kaW5nIHRleHQsXG4gKiB3aXRoIGEgc3RhcnQgYW5kIGVuZGluZyBpbmRpY2F0aW9uLlxuICogYGh0bWxgID0gdGVtcGxhdGluZyBmdW5jdGlvbi5cbiAqL1xuY29uc3QgY2hhcmFjdGVycyA9IFtcbiAgeyBjaGFyOiAnKycsIHNpbmdsZTogdHJ1ZSwgaHRtbDogKCkgPT4gYDwvYnI+YCB9LFxuICB7IGNoYXI6ICdeJywgc2luZ2xlOiBmYWxzZSwgaHRtbDogdGV4dCA9PiBgPHN0cm9uZz4ke3RleHR9PC9zdHJvbmc+YCB9LFxuICB7IGNoYXI6ICcjJywgc2luZ2xlOiBmYWxzZSwgaHRtbDogdGV4dCA9PiBgPHVsPjxsaT4ke3RleHR9PC9saT48L3VsPmAgfSxcbiAge1xuICAgIGNoYXI6ICdfJyxcbiAgICBzaW5nbGU6IGZhbHNlLFxuICAgIGh0bWw6ICh0ZXh0LCBsaW5rKSA9PiBgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj0ke2xpbmt9PiR7dGV4dH08L2E+YFxuICB9XG5dXG5cbi8qKlxuICogZ2VuZXJhdGVzIGFuIGFycmF5IG9mIFtzdGFydCwgZW5kXSBmb3JcbiAqIGVhY2ggZW1waGFzaXplZCBzZWN0aW9uIGluIGFuIGFubm90YXRpb24uXG4gKi9cbmNvbnN0IGdldFNpbmdsZUluZGljaWVzT2YgPSAoY2hhciwgc3RyKSA9PlxuICBBcnJheS5mcm9tKHN0cilcbiAgICAubWFwKChzdHJDaGFyLCBpKSA9PiAoc3RyQ2hhciA9PT0gY2hhciA/IGkgOiBmYWxzZSkpXG4gICAgLmZpbHRlcihkID0+IGQpXG5cbi8qKlxuICogZ2VuZXJhdGVzIGFuIGFycmF5IG9mIFtzdGFydCwgZW5kXSBmb3JcbiAqIGVhY2ggZW1waGFzaXplZCBzZWN0aW9uIGluIGFuIGFubm90YXRpb24uXG4gKi9cbmNvbnN0IGdldFBhaXJlZEluZGljaWVzT2YgPSAoY2hhciwgc3RyKSA9PlxuICBBcnJheS5mcm9tKHN0cilcbiAgICAucmVkdWNlKChhLCBjLCBpKSA9PiAoYyA9PT0gY2hhciA/IFsuLi5hLCBpXSA6IGEpLCBbXSlcbiAgICAucmVkdWNlKFxuICAgICAgLy8gZ3JvdXAgaW50byBwYWlycyBvZiBbc3RhcnQsIGVuZF1cbiAgICAgIChhLCBjLCBpLCBhcnJheSkgPT4gKGkgJSAyID09PSAwID8gWy4uLmEsIFthcnJheVtpXSwgYXJyYXlbaSArIDFdXV0gOiBhKSxcbiAgICAgIFtdXG4gICAgKVxuXG4vKipcbiAqIGh0bWxUZW1wbGF0aW5nIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gYW5zd2VyIHRoZSBzdHJpbmcgYW5zd2VyIHRoYXQgc2hvdWxkIGJlIHBhcnNlZCBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzXG4gKi9cbmNvbnN0IGh0bWxUZW1wbGF0aW5nID0gKGFuc3dlciwgbGlua3MpID0+XG4gIGNoYXJhY3RlcnMucmVkdWNlKChzdHJpbmcsIG9iaikgPT4ge1xuICAgIC8vIGlmIHRoZXJlIGFyZSBubyBzcGVjaWFsIGNoYXJhY3RlcnMsIGp1c3QgcmV0dXJuIHRoZSB0ZXh0IGFzIGlzLlxuICAgIGlmIChzdHJpbmcuaW5kZXhPZihvYmouY2hhcikgPT09IC0xKSByZXR1cm4gc3RyaW5nXG4gICAgLy8gb3RoZXJ3aXNlLCBpdGVyYXRlIG92ZXIgdGhlIGluZGljaWVzIGFuZCBpbmplY3QgdGhlIGFwcHJvcHJpYXRlIGh0bWwgdGVtcGxhdGUgd2l0aCB0aGUgZGVzaWduYXRlZCB0ZXh0IGluIGJldHdlZW4uIGV4OiA8c3Ryb25nPiwgPGl0YWxpY3M+LCA8L2JyPi5cbiAgICBpZiAob2JqLnNpbmdsZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaW5kaWNpZXMgPSBnZXRTaW5nbGVJbmRpY2llc09mKG9iai5jaGFyLCBzdHJpbmcpXG4gICAgICByZXR1cm4gW1xuICAgICAgICAvLyAxLiBhbnkgdGV4dCBwcmlvciB0byB0aGUgZmlyc3Qgc3BlY2lhbCBjaGFyYWN0ZXJcbiAgICAgICAgc3RyaW5nLnNsaWNlKDAsIGluZGljaWVzWzBdKSxcbiAgICAgICAgLy8gMi4gcmVkdWNlIGFsbCBpbmRpY2llcyB0b1xuICAgICAgICAuLi5pbmRpY2llcy5yZWR1Y2UoXG4gICAgICAgICAgKHQsIGlkeCwgaSkgPT4gW1xuICAgICAgICAgICAgLi4udCwgLy8gYWxsIHByZXZpb3VzIGN1c3RvbSBodG1sIHRlbXBsYXRlcyBhbHJlYWR5IHJldHVybmVkLFxuICAgICAgICAgICAgaSA+IDAgPyBzdHJpbmcuc2xpY2UoaW5kaWNpZXNbaSAtIDFdICsgMSwgaWR4KSA6IFtdLCAvLyBhbnkgdGV4dCBiZXR3ZWVuIHRoZSBsYXN0IHRlbXBsYXRlIGFuZCB0aGlzIG9uZVxuICAgICAgICAgICAgb2JqLmh0bWwoc3RyaW5nLnNsaWNlKGlkeCArIDEsIGlkeCArIDIpKSAvLyB0aGlzIGN1c3RvbSBodG1sIHRlbXBsYXRlXG4gICAgICAgICAgXSxcbiAgICAgICAgICBbXVxuICAgICAgICApLFxuICAgICAgICAvLyAzLiB0ZXh0IGFmdGVyIHRoZSBsYXN0IGluZGV4XG4gICAgICAgIHN0cmluZy5zbGljZShpbmRpY2llc1tpbmRpY2llcy5sZW5ndGggLSAxXSArIDEsIHN0cmluZy5sZW5ndGgpXG4gICAgICBdLmpvaW4oJycpIC8vIGpvaW4gYWxsIHRoZXNlIHNlZ21lbnRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGljaWVzID0gZ2V0UGFpcmVkSW5kaWNpZXNPZihvYmouY2hhciwgc3RyaW5nKVxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLy8gMS4gYW55IHRleHQgcHJpb3IgdG8gdGhlIGZpcnN0IHNwZWNpYWwgY2hhcmFjdGVyXG4gICAgICAgIHN0cmluZy5zbGljZSgwLCBpbmRpY2llc1swXVswXSksXG4gICAgICAgIC8vIDIuIHJlZHVjZSBhbGwgaW5kaWNpZXMgdG9cbiAgICAgICAgLi4uaW5kaWNpZXMucmVkdWNlKFxuICAgICAgICAgICh0LCBbc3RhcnQsIGVuZF0sIGkpID0+IFtcbiAgICAgICAgICAgIC4uLnQsIC8vIGFsbCBwcmV2aW91cyBjdXN0b20gaHRtbCB0ZW1wbGF0ZXMgYWxyZWFkeSByZXR1cm5lZCxcbiAgICAgICAgICAgIGkgPiAwID8gc3RyaW5nLnNsaWNlKGluZGljaWVzW2kgLSAxXVsxXSArIDEsIHN0YXJ0KSA6IFtdLCAvLyBhbnkgdGV4dCBiZXR3ZWVuIHRoZSBsYXN0IHRlbXBsYXRlIGFuZCB0aGlzIG9uZVxuICAgICAgICAgICAgb2JqLmh0bWwoc3RyaW5nLnNsaWNlKHN0YXJ0ICsgMSwgZW5kKSwgbGlua3MgJiYgbGlua3NbaV0pIC8vIHRoaXMgY3VzdG9tIGh0bWwgdGVtcGxhdGVcbiAgICAgICAgICBdLFxuICAgICAgICAgIFtdXG4gICAgICAgICksXG4gICAgICAgIC8vIDMuIHRleHQgYWZ0ZXIgdGhlIGxhc3QgaW5kZXhcbiAgICAgICAgc3RyaW5nLnNsaWNlKGluZGljaWVzW2luZGljaWVzLmxlbmd0aCAtIDFdWzFdICsgMSwgc3RyaW5nLmxlbmd0aClcbiAgICAgIF0uam9pbignJykgLy8gam9pbiBhbGwgdGhlc2Ugc2VnbWVudHNcbiAgICB9XG4gIH0sIGFuc3dlcilcblxuY29uc3QgdHJhbnNsYXRpb25zID0ge1xuICBlbmdsaXNoOiBbJ1JlYWQgbW9yZScsICdIaWRlJ10sXG4gIHNwYW5pc2g6IFsnTGVlIG3DoXMnLCAnT2N1bHRhciddLFxuICBtYW5kYXJpbjogWyfpmIXor7vmm7TlpJonLCAn6ZqQ6JePJ11cbn1cbiIsImNsYXNzIFNpZ251cCB7XG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IGVsZW1lbnQgZDMgc2VsZWN0aW9uIG9mIHRoZSBlbGVtZW50IHRvIGFwcGVuZCB0aGUgZm9ybSB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgbGFuZ3VhZ2Ugc2VsZWN0aW9uIGZvciBmb3JtIHRleHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc3RhdGVzIHN0YXRlIG5hbWVzIGJ5IGxhbmd1YWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtS2V5IHVuaXF1ZSBzdHJpbmcgZm9yIGZvcm0gSURcbiAgICovXG5cbiAgY29uc3RydWN0b3IoZWxlbWVudCwgbGFuZ3VhZ2UsIHN0YXRlcywgZm9ybUtleSkge1xuICAgIGNvbnN0IHN0YXRlTGlzdEluTGFuZ3VhZ2UgPSBzdGF0ZXMubWFwKGQgPT4gKHtcbiAgICAgIHZhbHVlOiBkWydlbmdsaXNoJ10sXG4gICAgICBsYWJlbDogZFtsYW5ndWFnZV1cbiAgICB9KSlcblxuICAgIGVsZW1lbnQuaHRtbChgPGRpdiBjbGFzcz1cInNpZ251cFwiIGlkPVwiJHtmb3JtS2V5fVwiPlxuICAgICAgICA8cCBjbGFzcz1cImhlYWRlclwiPjxzcGFuIGNsYXNzPVwicGVhY29jayBibGFjayAke2xhbmd1YWdlfVwiPjwvc3Bhbj4ke1xuICAgICAgdHJhbnNsYXRpb25zW2xhbmd1YWdlXVsnaGVhZGVyJ11cbiAgICB9PC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2lnbnVwX193cmFwXCI+XG4gICAgICAgICAgPGZvcm0gY2xhc3M9XCJzaWdudXBfX2Zvcm1cIiBpZD1cImZvcm1fXyR7Zm9ybUtleX1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaWdudXBfX2Zvcm0taXRlbVwiPlxuICAgICAgICAgICAgICA8c2VsZWN0IG11bHRpcGxlIGNsYXNzPVwic2lnbnVwX19zdGF0ZVwiIGlkPVwic2lnbnVwX19zdGF0ZV9fJHtmb3JtS2V5fVwiIG5hbWU9XCJzdGF0ZVwiIGRhdGEtdHlwZT1cInNlbGVjdC1tdWx0aXBsZVwiPjwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2lnbnVwX19mb3JtLWl0ZW1cIj5cbiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwic2lnbnVwX19lbWFpbFwiIGlkPVwic2lnbnVwX19lbWFpbF9fJHtmb3JtS2V5fVwiIG5hbWU9XCJlbWFpbFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCIke1xuICAgICAgdHJhbnNsYXRpb25zW2xhbmd1YWdlXVsnZW1haWwnXVxuICAgIH1cIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJzaWdudXBfX2Zvcm0taXRlbSBzaWdudXBfX2J0dG5cIj4ke1xuICAgICAgICAgICAgICB0cmFuc2xhdGlvbnNbbGFuZ3VhZ2VdWydzdWJtaXQnXVxuICAgICAgICAgICAgfTwvYnV0dG9uPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8Zm9ybSBjbGFzcz1cInNpZ251cF9fZm9ybS1jaGVja2JveFwiPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwiYnJlYWtpbmdcIiBuYW1lPVwiYnJlYWtpbmdfY2hlY2tib3hcIiB0eXBlPVwiY2hlY2tib3hcIj48L2lucHV0PlxuICAgICAgICAgICAgPGxhYmVsPiR7dHJhbnNsYXRpb25zW2xhbmd1YWdlXVsnYnJlYWtpbmdfbmV3cyddfTwvbGFiZWw+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInByaXZhY3lfX3dyYXBcIj5cbiAgICAgICAgICA8YSBocmVmPVwiJHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uc1tsYW5ndWFnZV0ucHJpdmFjeV9saW5rXG4gICAgICAgICAgfVwiIHRhcmdldD1cIl9ibGFua1wiIGlkPVwicHJpdmFjeV9fbGlua1wiPiR7XG4gICAgICB0cmFuc2xhdGlvbnNbbGFuZ3VhZ2VdLnByaXZhY3lcbiAgICB9PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmApXG5cbiAgICBjb25zdCBjaG9pY2VzID0gbmV3IENob2ljZXMoXG4gICAgICBlbGVtZW50LnNlbGVjdChgI3NpZ251cF9fc3RhdGVfXyR7Zm9ybUtleX1gKS5ub2RlKCksXG4gICAgICB7XG4gICAgICAgIGNob2ljZXM6IHN0YXRlTGlzdEluTGFuZ3VhZ2UubWFwKCh7IHZhbHVlLCBsYWJlbCB9KSA9PiAoe1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIGxhYmVsXG4gICAgICAgIH0pKVxuICAgICAgfVxuICAgIClcblxuICAgIGQzLnNlbGVjdChgIyR7Zm9ybUtleX0gLmNob2ljZXNfX2lucHV0LmNob2ljZXNfX2lucHV0LS1jbG9uZWRgKS5hdHRyKFxuICAgICAgJ3BsYWNlaG9sZGVyJyxcbiAgICAgIHRyYW5zbGF0aW9uc1tsYW5ndWFnZV0uc2VsZWN0XG4gICAgKVxuXG4gICAgdHJ5IHtcbiAgICAgIFNhaWx0aHJ1LmluaXQoe1xuICAgICAgICBjdXN0b21lcklkOiAnYTgzOWU4ODI0YjNjZGQ4NjRhOWJhMzA1MjIwNWQ3MGInXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGFuZ2VGb3JtVG9TdWNjZXNzKCkge1xuICAgICAgZDMuc2VsZWN0KGAjJHtmb3JtS2V5fSAuc2lnbnVwX193cmFwYClcbiAgICAgICAgLmF0dHIoXG4gICAgICAgICAgJ3N0eWxlJyxcbiAgICAgICAgICAnZm9udC1mYW1pbHk6IFB1YmxpY29UZXh0LEdlb3JnaWEsVGltZXMgTmV3IFJvbWFuLHNlcmlmOyBmb250LXNpemU6IDE2cHg7IG1hcmdpbi1ib3R0b206IDEycHg7J1xuICAgICAgICApXG4gICAgICAgIC50ZXh0KGAke3RyYW5zbGF0aW9uc1tsYW5ndWFnZV0uc3VjY2Vzc31gKVxuICAgIH1cblxuICAgIGxldCBjaGVja2VkID0gZmFsc2VcblxuICAgIGZ1bmN0aW9uIGhhbmRsZUNoZWNrKCkge1xuICAgICAgY2hlY2tlZCA9ICFjaGVja2VkXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3VibWl0KGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzaWdudXBfX2VtYWlsX18ke2Zvcm1LZXl9YCkudmFsdWVcblxuICAgICAgY29uc3Qgc2lnbnVwVmFsdWVzID0ge1xuICAgICAgICBlbWFpbCxcbiAgICAgICAgbGlzdHM6IHsgTWFzdGVyOiAxIH0sXG4gICAgICAgIHZhcnM6IHtcbiAgICAgICAgICBzdWJfdmFjY2luZXByb2plY3Q6IDEsXG4gICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgc3RhdGVzOiBjaG9pY2VzLl9jdXJyZW50U3RhdGUuaXRlbXMubWFwKGNob2ljZSA9PiBjaG9pY2UudmFsdWUpXG4gICAgICAgIH0sXG4gICAgICAgIG9uU3VjY2VzczogKHsgZW1haWwgfSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVtYWlsLCAnZW1haWwgc3VjY2Vzcz8nKVxuXG4gICAgICAgICAgY2hhbmdlRm9ybVRvU3VjY2VzcygpXG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGUgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGUsICdlbWFpbCBlcnJvcj8nKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIHNpZ251cFZhbHVlcy52YXJzLmJyZWFraW5nX25ld3MgPSAxXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIFNhaWx0aHJ1LmludGVncmF0aW9uKCd1c2VyU2lnblVwJywgc2lnbnVwVmFsdWVzKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JyZWFraW5nJykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaGFuZGxlQ2hlY2spXG5cbiAgICBkb2N1bWVudFxuICAgICAgLmdldEVsZW1lbnRCeUlkKGBmb3JtX18ke2Zvcm1LZXl9YClcbiAgICAgIC5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCBoYW5kbGVTdWJtaXQpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lnbnVwXG5cbmNvbnN0IHRyYW5zbGF0aW9ucyA9IHtcbiAgZW5nbGlzaDoge1xuICAgIGhlYWRlcjpcbiAgICAgICdTaWduIHVwIGZvciBOQkMgTmV3cyBhbGVydHMgYXMgY2hhbmdlcyBhcmUgbWFkZSB0byB5b3VyIHZhY2NpbmF0aW9uIHBsYW4gaW4geW91ciBzdGF0ZSBhbmQvb3IgYW5vdGhlciBzdGF0ZTonLFxuICAgIGVtYWlsOiAnRW50ZXIgeW91ciBlbWFpbCcsXG4gICAgc3VibWl0OiAnU3VibWl0JyxcbiAgICBzZWxlY3Q6ICdTZWxlY3Qgb25lIG9yIG11bHRpcGxlIHN0YXRlcycsXG4gICAgc3VjY2VzczpcbiAgICAgICdUaGFuayB5b3UgZm9yIHNpZ25pbmcgdXAgdG8gcmVjZWl2ZSBQbGFuIFlvdXIgVmFjY2luZSBhbGVydHMgd2hlbiB0aGVyZSBhcmUgY2hhbmdlcyBpbiB0aGUgc3RhdGUgb3Igc3RhdGVzIHlvdSBzZWxlY3RlZC4nLFxuICAgIHByaXZhY3k6ICdQcml2YWN5IHBvbGljeScsXG4gICAgcHJpdmFjeV9saW5rOiAnaHR0cHM6Ly93d3cubmJjdW5pdmVyc2FsLmNvbS9wcml2YWN5JyxcbiAgICBicmVha2luZ19uZXdzOiAnU2lnbiB1cCBmb3IgYnJlYWtpbmcgbmV3cyBhbGVydHMgZnJvbSBOQkMgTmV3cydcbiAgfSxcbiAgc3BhbmlzaDoge1xuICAgIGhlYWRlcjpcbiAgICAgICdSZWfDrXN0cmF0ZSBwYXJhIHJlY2liaXIgYWxlcnRhcyBjdWFuZG8gaGF5YSBhY3R1YWxpemFjaW9uZXMgZGUgdmFjdW5hY2nDs24gZW4gdHUgZXN0YWRvOicsXG4gICAgZW1haWw6ICdJbmdyZXNhIHR1IGVtYWlsJyxcbiAgICBzdWJtaXQ6ICdFbnZpYXInLFxuICAgIHNlbGVjdDogJ1NlbGVjY2lvbmEgdW5vIG8gdmFyaW9zIGVzdGFkb3MnLFxuICAgIHN1Y2Nlc3M6XG4gICAgICAnR3JhY2lhcyBwb3Igc3VzY3JpYmlydGUgcGFyYSByZWNpYmlyIGFsZXJ0YXMgZGUgUGxhbmlmaWNhIHR1IHZhY3VuYSBjdWFuZG8gaGF5YSBjYW1iaW9zIGVuIHR1IGVzdGFkbyBvIGxvcyBlc3RhZG9zIHF1ZSBoYXlhcyBzZWxlY2Npb25hZG8uJyxcbiAgICBwcml2YWN5OiAnUG9sw610aWNhIGRlIHByaXZhY2lkYWQnLFxuICAgIHByaXZhY3lfbGluazogJ2h0dHBzOi8vd3d3Lm5iY3VuaXZlcnNhbC5jb20vcHJpdmFjeS9zcGFuaXNoJyxcbiAgICBicmVha2luZ19uZXdzOiAnU3VzY3LDrWJldGUgcGFyYSByZWNpYmlyIGFsZXJ0YXMgZGUgw7psdGltYSBob3JhIGRlIE5CQyBOZXdzLidcbiAgfSxcbiAgbWFuZGFyaW46IHtcbiAgICBoZWFkZXI6ICfor7flnKjkuIvmlrnorqLpmIXnlqvoi5fkv6Hmga/nmoTmm7TmlrDmjqjpgIHvvJonLFxuICAgIHN0YXRlOiAn6YCJ5oup5bee5ZCNJyxcbiAgICBlbWFpbDogJ+i+k+WFpeS9oOeahOmCrueusScsXG4gICAgc3VibWl0OiAn5o+Q5LqkJyxcbiAgICBzZWxlY3Q6ICfpgInmi6nkuIDkuKrmiJblpJrkuKrlt54nLFxuICAgIHN1Y2Nlc3M6ICfmhJ/osKLorqLpmIXvvIzmiJHku6zlsIbkvJrmjqjpgIHkvaDlt7LpgInnmoTlt57nmoTmnIDmlrDkv6Hmga/jgIInLFxuICAgIHByaXZhY3k6ICfpmpDnp4HmlL/nrZYnLFxuICAgIHByaXZhY3lfbGluazpcbiAgICAgICdodHRwczovL3d3dy5uYmN1bml2ZXJzYWwuY29tL3ByaXZhY3ktcG9saWN5LyVFOSU5QSU5MCVFNyVBNyU4MSVFNiU5NCVCRiVFNyVBRCU5NicsXG4gICAgYnJlYWtpbmdfbmV3czogJ+iuoumYhU5CQyBOZXdz55qE56qB5Y+R5paw6Ze75pu05pawJ1xuICB9XG59XG4iLCJpbXBvcnQgeyBzdGF0ZUFiYnIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMuanMnXG5cbi8qKlxuICogZ2V0TG9jYXRpb24gZnVuY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCB0byBhcHBlbmQgdGhlIHNjcmlwdCBlbWJlZCB0b1xuICogQHBhcmFtIHtvYmplY3R9IGFwcFN0YXRlIHh4eFxuICovXG5cbmNvbnN0IGFkZEVtYmVkID0gKGRpdklkLCBhcHBTdGF0ZSwgZ3JhcGhpY05hbWUsIGluZGV4KSA9PiB7XG4gIGNvbnN0IGdyYXBoaWMgPSBkM1xuICAgIC5zZWxlY3QoYCNlbWJlZC0ke2RpdklkfWApXG4gICAgLmFwcGVuZCgnc2NyaXB0JylcbiAgICAuYXR0cihcbiAgICAgICdzcmMnLFxuICAgICAgJ2h0dHBzOi8vbm9kZWFzc2V0cy5uYmNuZXdzLmNvbS9jZG5hc3NldHMvcHltLzEuMy4yL3B5bS5taW4uanMnXG4gICAgKVxuXG4gIGNvbnN0IHsgc3RhdGUsIGxvYywgemlwLCBsYW5ndWFnZSwgYWdlIH0gPSBhcHBTdGF0ZVxuICBjb25zdCBxdWVyeU9wdGlvbnMgPSB7XG4gICAgc3RhdGU6IHN0YXRlQWJicltzdGF0ZV0sXG4gICAgbG9jLCAvLyBjb29yZHNcbiAgICB6aXAsIC8vIHppcGNvZGVcbiAgICBqb2I6IGpvYkdyb3VwS2V5cyhhcHBTdGF0ZVsnam9iR3JvdXAnXSksXG4gICAgYWdlOiBncm91cEFnZXMoYWdlKSxcbiAgICBoaWdoUmlzazogYXBwU3RhdGVbJ2hpZ2gtcmlzayddLCAvLyB0cnVlL2ZhbHNlXG4gICAgbG9uZ1Rlcm06IGFwcFN0YXRlWydsb25nLXRlcm0nXSwgLy8gdHJ1ZS9mYWxzZVxuICAgIGxhbmd1YWdlLFxuICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmVudHJpZXMocXVlcnlPcHRpb25zKVxuICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlKVxuICAgIC5tYXAoKFtrZXksIHZhbHVlXSwgaSkgPT4gYCR7aSA9PT0gMCA/ICc/JyA6ICcmJ30ke2tleX09JHt2YWx1ZX1gKVxuICAgIC5qb2luKCcnKVxuXG4gIGNvbnN0IHVybCA9IGBodHRwczovL2RhdGF2aXoubmJjbmV3cy5jb20vcHJvamVjdHMvJHtncmFwaGljTmFtZSB8fFxuICAgIGRpdklkfS8ke2luZGV4IHx8ICdpbmRleC5odG1sJ30ke3F1ZXJ5U3RyaW5nfWBcblxuICBncmFwaGljXG4gICAgLmFwcGVuZCgnc2NyaXB0JylcbiAgICAuaHRtbChcbiAgICAgIGB2YXIgcHltUGFyZW50ID0gbmV3IHB5bS5QYXJlbnQoJ2VtYmVkLSR7ZGl2SWR9JywgJyR7dXJsfScsIHt0aXRsZTogJyd9KTtgXG4gICAgKVxufVxuXG5leHBvcnQgeyBhZGRFbWJlZCB9XG5cbmNvbnN0IGdyb3VwQWdlcyA9IGFnZSA9PiB7XG4gIGlmIChhZ2UgPT09ICc3NW9sZGVyJykgcmV0dXJuICdvdmVyNzUnXG4gIGlmIChhZ2UgPT09ICc2NS02OScgfHwgYWdlID09PSAnNzAtNzQnKSByZXR1cm4gJzY1dG83NCdcbiAgZWxzZSByZXR1cm4gJ2Vsc2UnXG59XG5cbmNvbnN0IGpvYkdyb3VwS2V5cyA9IGpvYkdyb3VwID0+IHtcbiAgaWYgKGpvYkdyb3VwID09PSAnaGVhbHRoLWNhcmUnKSByZXR1cm4gJ2hlYWx0aGNhcmVwZXJzb25uZWwnXG4gIGlmIChqb2JHcm91cCA9PT0gJ2Zyb250LWxpbmUnKSByZXR1cm4gJ2Zyb250bGluZSdcbiAgaWYgKGpvYkdyb3VwID09PSAnb3RoZXItZXNzZW50aWFsJykgcmV0dXJuICdvdGhlcmVzc2VudGlhbHdvcmtlcnMnXG4gIGlmIChqb2JHcm91cCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiAnZ2VuZXJhbHB1YmxpYydcbn1cbiIsImltcG9ydCB7IGdldFN0YXRlRnJvbVppcCB9IGZyb20gJy4vZ2VvbG9jYXRlJ1xuXG4vLyBGaWx0ZXIgbWVudVxuXG5jb25zdCBmaWx0ZXJNZW51ID0gc2V0QXBwU3RhdGUgPT4ge1xuICBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgdGltZW91dFxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50c1xuICAgICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRpbWVvdXQgPSBudWxsXG4gICAgICAgIGlmICghaW1tZWRpYXRlKSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgICB9XG4gICAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dFxuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdClcbiAgICAgIGlmIChjYWxsTm93KSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RpY2t5V3JhcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgJyNzdGlja3lfX3dyYXAsICNzdGlja3lfX3dyYXAgLmZpbHRlcl9fYmFyLCAjc3RpY2t5X193cmFwIC5maWx0ZXJfX2Zvcm0td3JhcCdcbiAgKVxuICBjb25zdCBmaWx0ZXJCdHRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N0aWNreV9fb3BlbicpXG4gIGNvbnN0IGZpbHRlckJ0dG5JY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZpbHRlcl9faWNvbicpXG4gIGNvbnN0IGZpbHRlckZvcm1XcmFwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAnI3N0aWNreV9fd3JhcCAuZmlsdGVyX19vYmplY3QgLmZpbHRlcl9fZm9ybS13cmFwJ1xuICApXG4gIGNvbnN0IHNoYXJlTW9iaWxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NoYXJlX19tb2JpbGUnKVxuICBjb25zdCBuYXZNYXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubmF2TWFwJylcbiAgY29uc3QgZm9vdGVyU2VjdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mb290ZXJfX3NlY3Rpb24nKVxuXG4gIGNvbnN0IHNjcm9sbGluZyA9ICgpID0+IHtcbiAgICBpZiAoXG4gICAgICB3aW5kb3cuc2Nyb2xsWSA+IG5hdk1hcC5vZmZzZXRUb3AgKyAzMDAgJiZcbiAgICAgICFmaWx0ZXJCdHRuLmNsYXNzTGlzdC5jb250YWlucygnY2xpY2tlZCcpICYmXG4gICAgICAhbmF2TWFwLmNsYXNzTGlzdC5jb250YWlucygnYXdhaXRpbmdGb3JtJylcbiAgICApIHtcbiAgICAgIHN0aWNreVdyYXAuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QuYWRkKCdmaWx0ZXItc3RpY2t5JykpXG4gICAgICBmaWx0ZXJCdHRuLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKVxuICAgIH0gZWxzZSBpZiAod2luZG93LnNjcm9sbFkgPCBuYXZNYXAub2Zmc2V0VG9wICsgMzEwKSB7XG4gICAgICBzdGlja3lXcmFwLmZvckVhY2goZWwgPT4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnZmlsdGVyLXN0aWNreScpKVxuICAgICAgZmlsdGVyQnR0bi5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JywgJ2NsaWNrZWQnKVxuICAgICAgZmlsdGVyRm9ybVdyYXAuY2xhc3NMaXN0LmFkZCgnZm9ybS1oaWRlJylcbiAgICAgIGZpbHRlckJ0dG5JY29uLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKVxuICAgIH1cbiAgfVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZGVib3VuY2Uoc2Nyb2xsaW5nKSlcblxuICBjb25zdCBtb2JpbGVGaWx0ID0gKCkgPT4ge1xuICAgIGZpbHRlckJ0dG4uY2xhc3NMaXN0LnRvZ2dsZSgnY2xpY2tlZCcpXG4gICAgZmlsdGVyRm9ybVdyYXAuY2xhc3NMaXN0LnRvZ2dsZSgnZm9ybS1oaWRlJylcbiAgICBmaWx0ZXJCdHRuSWNvbi5jbGFzc0xpc3QudG9nZ2xlKCdzaG93JylcbiAgfVxuICBmaWx0ZXJCdHRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGVib3VuY2UobW9iaWxlRmlsdCkpXG59XG5cbmNvbnN0IGNoYW5nZUxhbmd1YWdlID0gKGxhbmd1YWdlLCBzZXRBcHBTdGF0ZSkgPT4ge1xuICBjb25zdCBsYW5ndWFnZUJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubGVhZF9fYnR0bicpXG5cbiAgbGFuZ3VhZ2VCdXR0b25zLmZvckVhY2goZWwgPT4ge1xuICAgIGlmIChlbC5pZCA9PT0gbGFuZ3VhZ2UpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZS1idHRuJylcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH1cbiAgfSlcblxuICBsYW5ndWFnZUJ1dHRvbnMuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBsYW5ndWFnZUJ1dHRvbnMuZm9yRWFjaChlbGVtID0+IHtcbiAgICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUtYnR0bicpXG4gICAgICAgIGVsZW0ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICB9KVxuXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUtYnR0bicpXG4gICAgICBlbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgIHNldEFwcFN0YXRlKGVsLmlkKVxuICAgIH0pXG4gIH0pXG59XG5cbmNvbnN0IGVuYWJsZVNoYXJlID0gKCkgPT4ge1xuICBjb25zdCBzaGFyZVRvb2wgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtdG9vbCcpXG4gIGNvbnN0IHNoYXJlUGxhbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGFyZS1wbGFuJylcblxuICBzaGFyZVRvb2wuZm9yRWFjaChlbCA9PiB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb3B5VG9DbGlwYm9hcmQoYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0ke3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX1gKVxuICAgIH0pXG4gIH0pXG5cbiAgc2hhcmVQbGFuLmZvckVhY2goZWwgPT4ge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29weVRvQ2xpcGJvYXJkKHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICAgIH0pXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGNvcHlUb0NsaXBib2FyZCh0ZXh0KSB7XG4gIHZhciBpbnB1dCA9IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKSlcbiAgaW5wdXQudmFsdWUgPSB0ZXh0XG4gIGlucHV0LmZvY3VzKClcbiAgaW5wdXQuc2VsZWN0KClcbiAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKVxuICBpbnB1dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGlucHV0KVxufVxuXG5leHBvcnQgeyBmaWx0ZXJNZW51LCBjaGFuZ2VMYW5ndWFnZSwgZW5hYmxlU2hhcmUgfVxuIiwiLyoqXG4gKiBnZXRMb2NhdGlvbiBmdW5jdGlvbiBcbiAqIEBwYXJhbSB7Kn0gY2FsbGJhY2sgdG8gYmUgcnVuIG9uIHRoZSByZXR1cm5lZCBsb2NhdGlvbiBkYXRhIFxuICogc3RydWN0dXJlIGZyb20gdGhlIEFQSTpcbntcbiAgY2l0eV9kYXRhOiB7XG4gICAgY2l0eTogXCJCZWF2ZXJ0b25cIiwgXG4gICAgcG9zdGFsX2NvZGU6IFwiOTcwMDVcIiwgXG4gICAgdGltZV96b25lOiAtOFxuICB9LFxuICBjb3VudHJ5X2RhdGE6IHtcbiAgICBjb3VudHJ5OiBcIlVuaXRlZCBTdGF0ZXNcIiwgXG4gICAgY291bnRyeV9jb2RlOiBcIlVTXCJcbiAgfSxcbiAgbG9jYXRpb25fZGF0YToge1xuICAgIGxvbmdpdHVkZTogLTEyMi43OTk4OCwgXG4gICAgbGF0aXR1ZGU6IDQ1LjQ5NjQ1XG4gIH0sXG4gIHN0YXRlX2RhdGE6IHtcbiAgICBzdGF0ZTogXCJPcmVnb25cIiwgXG4gICAgc3RhdGVfY29kZTogXCJPUlwiXG4gIH1cbn1cbiAqL1xuY29uc3QgZ2V0TG9jYXRpb24gPSBjYWxsYmFjayA9PlxuICAvLyBwcm9taXNlIGFsbG93cyB1cyB0byB1c2UgYC50aGVuYCBhbmQgYC5jYXRjaGBcbiAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgLy8gZmlyc3Qgc2V0IHRoZSBfX2pwMCBzY3JpcHRcbiAgICB3aW5kb3cuX19qcDAgPSBkID0+IHtcbiAgICAgIC8vIHJ1biB0aGUgY2FsbGJhY2sgb24gdGhlIHJldHVybmVkIGxvY2F0aW9uIGRhdGEsIG9ubHkgaWYgdGhlIHVzZXIgaXMgYWN0dWFsbHkgaW4gdGhlIFVTXG4gICAgICBpZiAoZFsnY291bnRyeV9kYXRhJ11bJ2NvdW50cnlfY29kZSddID09PSAnVVMnKSBjYWxsYmFjayhkKVxuICAgICAgLy8gb25seSB0aGVuIHNob3VsZCB3ZSAncmVzb2x2ZSdcbiAgICAgIHJlc29sdmUoKVxuICAgIH1cblxuICAgIC8vIHRoZW4gYXBwZW5kIGEgc2NyaXB0IHJlZmVyZW5jaW5nIHRoZSBnZW9sb2NhdG9yXG4gICAgLy8gdG8gY2FsbCB0aGUgd2luZG93Ll9fanAwIHNjcmlwdCB3aGVuIHJ1blxuICAgIGxldCBzY3JpcHRFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgc2NyaXB0RWwuc3JjID0gJ2h0dHBzOi8vZ2VvaXAubmJjbmV3cy5jb20vYXBpL2lwaW5mbz9jYWxsYmFjaz1fX2pwMCdcbiAgICAvLyBzY3JpcHQgaXMgZXhlY3V0ZWQgd2hlbiBhcHBlbmRlZFxuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpXG4gIH0pXG5cbmNvbnN0IGdldFN0YXRlRnJvbVppcCA9IHppcCA9PiB7XG4gIGNvbnN0IHBhcnNlZCA9IGQzLmNzdlBhcnNlKHppcFRvU3RhdGUpXG4gIHJldHVybiBwYXJzZWQuZmluZChyb3cgPT4gK3ppcCA+PSArcm93WydaaXAgTWluJ10gJiYgK3ppcCA8PSArcm93WydaaXAgTWF4J10pW1xuICAgICdTdGF0ZSBOYW1lJ1xuICBdXG59XG5cbmV4cG9ydCB7IGdldExvY2F0aW9uLCBnZXRTdGF0ZUZyb21aaXAgfVxuXG5jb25zdCB6aXBUb1N0YXRlID0gYFN0YXRlIE5hbWUsWmlwIE1pbixaaXAgTWF4XG5BbGFza2EsOTk1MDEsOTk5NTBcbkFsYWJhbWEsMzUwMDQsMzY5MjVcbkFya2Fuc2FzLDcxNjAxLDcyOTU5XG5BcmthbnNhcyAoVGV4YXJrYW5hKSw3NTUwMiw3NTUwMlxuQXJpem9uYSw4NTAwMSw4NjU1NlxuQ2FsaWZvcm5pYSw5MDAwMSw5NjE2MlxuQ29sb3JhZG8sODAwMDEsODE2NThcbkNvbm5lY3RpY3V0LDYwMDEsNjM4OVxuQ29ubmVjdGljdXQsNjQwMSw2OTI4XG5EaXN0IG9mIENvbHVtYmlhLDIwMDAxLDIwMDM5XG5EaXN0IG9mIENvbHVtYmlhLDIwMDQyLDIwNTk5XG5EaXN0IG9mIENvbHVtYmlhLDIwNzk5LDIwNzk5XG5EZWxhd2FyZSwxOTcwMSwxOTk4MFxuRmxvcmlkYSwzMjAwNCwzNDk5N1xuR2VvcmdpYSwzMDAwMSwzMTk5OVxuR2VvcmdhIChBdGxhbnRhKSwzOTkwMSwzOTkwMVxuSGF3YWlpLDk2NzAxLDk2ODk4XG5Jb3dhLDUwMDAxLDUyODA5XG5Jb3dhIChPTUFIQSksNjgxMTksNjgxMjBcbklkYWhvLDgzMjAxLDgzODc2XG5JbGxpbm9pcyw2MDAwMSw2Mjk5OVxuSW5kaWFuYSw0NjAwMSw0Nzk5N1xuS2Fuc2FzLDY2MDAyLDY3OTU0XG5LZW50dWNreSw0MDAwMyw0Mjc4OFxuTG91aXNpYW5hLDcwMDAxLDcxMjMyXG5Mb3Vpc2lhbmEsNzEyMzQsNzE0OTdcbk1hc3NhY2h1c2V0dHMsMTAwMSwyNzkxXG5NYXNzYWNodXNldHRzIChBbmRvdmVyKSw1NTAxLDU1NDRcbk1hcnlsYW5kLDIwMzMxLDIwMzMxXG5NYXJ5bGFuZCwyMDMzNSwyMDc5N1xuTWFyeWxhbmQsMjA4MTIsMjE5MzBcbk1haW5lLDM5MDEsNDk5MlxuTWljaGlnYW4sNDgwMDEsNDk5NzFcbk1pbm5lc290YSw1NTAwMSw1Njc2M1xua2M5NiBEYXRhTU8sNjMwMDEsNjU4OTlcbk1pc3Npc3NpcHBpLDM4NjAxLDM5Nzc2XG5NaXNzaXNzaXBwaShXYXJyZW4pLDcxMjMzLDcxMjMzXG5Nb250YW5hLDU5MDAxLDU5OTM3XG5Ob3J0aCBDYXJvbGluYSwyNzAwNiwyODkwOVxuTm9ydGggRGFrb3RhLDU4MDAxLDU4ODU2XG5OZWJyYXNrYSw2ODAwMSw2ODExOFxuTmVicmFza2EsNjgxMjIsNjkzNjdcbk5ldyBIYW1wc2hpcmUsMzAzMSwzODk3XG5OZXcgSmVyc2V5LDcwMDEsODk4OVxuTmV3IE1leGljbyw4NzAwMSw4ODQ0MVxuTmV2YWRhLDg4OTAxLDg5ODgzXG5OZXcgWW9yayAoRmlzaGVycyBJcyksNjM5MCw2MzkwXG5OZXcgWW9yaywxMDAwMSwxNDk3NVxuT2hpbyw0MzAwMSw0NTk5OVxuT2tsYWhvbWEsNzMwMDEsNzMxOTlcbk9rbGFob21hLDczNDAxLDc0OTY2XG5PcmVnb24sOTcwMDEsOTc5MjBcblBlbm5zeWx2YW5pYSwxNTAwMSwxOTY0MFxuUHVlcnRvIFJpY28sNjAwLDc5OVxuUHVlcnRvIFJpY28sOTAwLDk5OVxuUmhvZGUgSXNsYW5kLDI4MDEsMjk0MFxuU291dGggQ2Fyb2xpbmEsMjkwMDEsMjk5NDhcblNvdXRoIERha290YSw1NzAwMSw1Nzc5OVxuVGVubmVzc2VlLDM3MDEwLDM4NTg5XG5UZXhhcyAoQXVzdGluKSw3MzMwMSw3MzMwMVxuVGV4YXMsNzUwMDEsNzU1MDFcblRleGFzLDc1NTAzLDc5OTk5XG5UZXhhcyAoRWwgUGFzbyksODg1MTAsODg1ODlcblV0YWgsODQwMDEsODQ3ODRcblZpcmdpbmlhLDIwMDQwLDIwMDQxXG5WaXJnaW5pYSwyMDA0MCwyMDE2N1xuVmlyZ2luaWEsMjAwNDIsMjAwNDJcblZpcmdpbmlhLDIyMDAxLDI0NjU4XG5WZXJtb250LDUwMDEsNTQ5NVxuVmVybW9udCw1NjAxLDU5MDdcbldhc2hpbmd0b24sOTgwMDEsOTk0MDNcbldpc2NvbnNpbiw1MzAwMSw1NDk5MFxuV2VzdCBWaXJnaW5pYSwyNDcwMSwyNjg4NlxuV3lvbWluZyw4MjAwMSw4MzEyOFxuYFxuIiwiY29uc3QgQ09OU1RBTlRTID0ge1xuICAvLyBxdWVzdGlvbnMgYW5kIGFuc3dlcnNcbiAgTEFORzogJ0xhbmd1YWdlJyxcbiAgSUQ6ICdJRCcsXG4gIENBUkQ6ICdDYXJkJyxcbiAgU1RBVEU6ICdncm91cC1zdGF0ZScsXG4gIExPQ0FMU1RBVEU6ICdTdGF0ZScsXG4gIFFVRVNUSU9OOiAnUXVlc3Rpb24nLFxuICBBTlNXRVI6ICdBbnN3ZXInLFxuICBMSU5LUzogJ0h5cGVybGlua3MnLFxuICBGT09UX1RFWFQ6ICdGb290bm90ZSBUZXh0JyxcbiAgRk9PVF9MSU5LOiAnRm9vdG5vdGUgTGluaycsXG4gIEdSQVBIOiAnR3JhcGgnLFxuICAvLyBuZXdzIGFydGljbGVzXG4gIEhFQUQ6ICdIZWFkbGluZScsXG4gIFVSTDogJ1VSTCcsXG4gIEJSRUFLOiAnQnJlYWtpbmcnLFxuICBBUkNIOiAnQXJjaGl2ZWQnXG59XG5cbmNvbnN0IHN0YXRlQWJiciA9IHtcbiAgQWxhYmFtYTogJ0FMJyxcbiAgQWxhc2thOiAnQUsnLFxuICBBcml6b25hOiAnQVonLFxuICBBcmthbnNhczogJ0FSJyxcbiAgQ2FsaWZvcm5pYTogJ0NBJyxcbiAgQ29sb3JhZG86ICdDTycsXG4gIENvbm5lY3RpY3V0OiAnQ1QnLFxuICBEZWxhd2FyZTogJ0RFJyxcbiAgJ0Rpc3RyaWN0IG9mIENvbHVtYmlhJzogJ0RDJyxcbiAgRmxvcmlkYTogJ0ZMJyxcbiAgR2VvcmdpYTogJ0dBJyxcbiAgSGF3YWlpOiAnSEknLFxuICBJZGFobzogJ0lEJyxcbiAgSWxsaW5vaXM6ICdJTCcsXG4gIEluZGlhbmE6ICdJTicsXG4gIElvd2E6ICdJQScsXG4gIEthbnNhczogJ0tTJyxcbiAgS2VudHVja3k6ICdLWScsXG4gIExvdWlzaWFuYTogJ0xBJyxcbiAgTWFpbmU6ICdNRScsXG4gIE1hcnlsYW5kOiAnTUQnLFxuICBNYXNzYWNodXNldHRzOiAnTUEnLFxuICBNaWNoaWdhbjogJ01JJyxcbiAgTWlubmVzb3RhOiAnTU4nLFxuICBNaXNzaXNzaXBwaTogJ01TJyxcbiAgTWlzc291cmk6ICdNTycsXG4gIE1vbnRhbmE6ICdNVCcsXG4gIE5lYnJhc2thOiAnTkUnLFxuICBOZXZhZGE6ICdOVicsXG4gICdOZXcgSGFtcHNoaXJlJzogJ05IJyxcbiAgJ05ldyBKZXJzZXknOiAnTkonLFxuICAnTmV3IE1leGljbyc6ICdOTScsXG4gICdOZXcgWW9yayc6ICdOWScsXG4gICdOb3J0aCBDYXJvbGluYSc6ICdOQycsXG4gICdOb3J0aCBEYWtvdGEnOiAnTkQnLFxuICBPaGlvOiAnT0gnLFxuICBPa2xhaG9tYTogJ09LJyxcbiAgT3JlZ29uOiAnT1InLFxuICBQZW5uc3lsdmFuaWE6ICdQQScsXG4gICdQdWVydG8gUmljbyc6ICdQUicsXG4gICdSaG9kZSBJc2xhbmQnOiAnUkknLFxuICAnU291dGggQ2Fyb2xpbmEnOiAnU0MnLFxuICAnU291dGggRGFrb3RhJzogJ1NEJyxcbiAgVGVubmVzc2VlOiAnVE4nLFxuICBUZXhhczogJ1RYJyxcbiAgVXRhaDogJ1VUJyxcbiAgVmVybW9udDogJ1ZUJyxcbiAgVmlyZ2luaWE6ICdWQScsXG4gIFdhc2hpbmd0b246ICdXQScsXG4gICdXZXN0IFZpcmdpbmlhJzogJ1dWJyxcbiAgV2lzY29uc2luOiAnV0knLFxuICBXeW9taW5nOiAnV1knXG59XG5cbmNvbnN0IGZ1bGxTdGF0ZU5hbWUgPSBPYmplY3QuYXNzaWduKFxuICB7fSxcbiAgLi4uT2JqZWN0LmVudHJpZXMoc3RhdGVBYmJyKS5tYXAoKFtzdGF0ZSwgYWJicl0pID0+ICh7IFthYmJyXTogc3RhdGUgfSkpXG4pXG5cbm1vZHVsZS5leHBvcnRzID0geyBDT05TVEFOVFMsIHN0YXRlQWJiciwgZnVsbFN0YXRlTmFtZSB9XG4iLCJpbXBvcnQge1xuICBmaWx0ZXJNZW51LFxuICBjaGFuZ2VMYW5ndWFnZSxcbiAgZW5hYmxlU2hhcmVcbn0gZnJvbSAnLi9jb21wb25lbnRzL2hlbHBlcnMvZmlsdGVyZWxlbWVudHMnXG5pbXBvcnQgeyBnZXRMb2NhdGlvbiwgZ2V0U3RhdGVGcm9tWmlwIH0gZnJvbSAnLi9jb21wb25lbnRzL2hlbHBlcnMvZ2VvbG9jYXRlJ1xuaW1wb3J0IHsgYWRkRW1iZWQgfSBmcm9tICcuL2NvbXBvbmVudHMvaGVscGVycy9hZGRFbWJlZCdcbmltcG9ydCBBcHAgZnJvbSAnLi9jb21wb25lbnRzL0FwcCdcbmltcG9ydCB7IGZ1bGxTdGF0ZU5hbWUsIHN0YXRlQWJiciB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5jb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpXG5jb25zdCB6aXAgPSB1cmxQYXJhbXMuZ2V0KCd6aXAnKSB8fCB1bmRlZmluZWRcbmNvbnN0IGxhbmd1YWdlID0gdXJsUGFyYW1zLmdldCgnbGFuZ3VhZ2UnKSB8fCB1bmRlZmluZWRcbmNvbnN0IHN0YXRlID0gdXJsUGFyYW1zLmdldCgnc3RhdGUnKSB8fCB1bmRlZmluZWRcbmNvbnN0IGFnZSA9IHVybFBhcmFtcy5nZXQoJ2FnZScpIHx8IHVuZGVmaW5lZFxuY29uc3Qgam9iID0gdXJsUGFyYW1zLmdldCgnam9iJykgfHwgdW5kZWZpbmVkXG5cbi8vIERFViBIRUxQRVJTXG5jb25zdCBzdGFnaW5nID0gdXJsUGFyYW1zLmdldCgnc3RhZ2luZycpID09ICd0cnVlJ1xuY29uc3QgZGV2ID0gdXJsUGFyYW1zLmdldCgnZGV2JykgPT0gJ3RydWUnXG5cbi8vIGNvbnN0IHVybEhlYWQgPVxuLy8gICAnaHR0cHM6Ly9kYXRhdml6Lm5iY25ld3MuY29tL3Byb2plY3RzLzIwMjEwMTA2LXBsYW4teW91ci1zaG90LXNob3J0aGFuZC8nXG4vLyBjb25zdCBzM0ZvbGRlciA9IHN0YWdpbmcgPyAnc3RhZ2luZycgOiAnZGF0YSdcblxuY29uc3QgY2FjaGVJc3N1ZVVybCA9ICdodHRwczovL3d3dy5uYmNuZXdzLmNvbS9zcGVjaWFscy9wbGFuLXlvdXItdmFjY2luZS9kYXRhJ1xuXG4vLyBERUZBVUxUUyBhbmQgQ09OU1RBTlRTXG5sZXQgUFJFVlNUQVRFLFxuICBBUFBTVEFURSA9IHtcbiAgICBzdGFnaW5nLFxuICAgIGRldixcbiAgICBvcGVuOiBmYWxzZSxcbiAgICBsYW5ndWFnZTogbGFuZ3VhZ2UgfHwgJ2VuZ2xpc2gnLCAvLyBkZWZhdWx0IHZhbHVlXG4gICAgemlwLFxuICAgIHN0YXRlOiBmdWxsU3RhdGVOYW1lW3N0YXRlXSB8fCAoemlwICYmIGdldFN0YXRlRnJvbVppcCh6aXApKSxcbiAgICBhZ2UsXG4gICAgam9iXG4gIH1cblxuLy8gbmVlZHMgZ2xvYmFsIHN0YXR1cyB0byBjYWxsIGluIHNldEFwcFN0YXRlXG5sZXQgYXBwXG47KGZ1bmN0aW9uKCkge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgLy8gZm9yIGJvdGggZmlsdGVyIGFuZCBsYW5ndWFnZSBjaGFuZ2UsIHBhc3MgaW4gdGhlIGFiaWxpdHkgdG8gdXBkYXRlIHRoZSBzdGF0ZSBzbyB0aGUgYXBwIGNhbiByZXNwb25kXG4gICAgZmlsdGVyTWVudShzZXRBcHBTdGF0ZSlcbiAgICBjaGFuZ2VMYW5ndWFnZShBUFBTVEFURS5sYW5ndWFnZSwgbGFuZ3VhZ2UgPT4gc2V0QXBwU3RhdGUoeyBsYW5ndWFnZSB9KSlcbiAgICBlbmFibGVTaGFyZSgpXG5cbiAgICAvLyBsb2FkIHN0YXRlIGRhdGEgYW5kIGdldCB1c2VycyBsb2NhdGlvblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgLy8gZDMuanNvbihgJHt1cmxIZWFkfSR7czNGb2xkZXJ9L3F1ZXN0aW9ucy5qc29uYCksIC8vIHF1ZXN0aW9uIGRhdGFcbiAgICAgIC8vIGQzLmpzb24oYCR7dXJsSGVhZH0ke3MzRm9sZGVyfS9uZXdzLmpzb25gKSwgLy8gbmV3cyBkYXRhXG4gICAgICAvLyBkMy5qc29uKGAke3VybEhlYWR9JHtzM0ZvbGRlcn0vam9icy5qc29uYCksIC8vIGpvYnMgZGF0YVxuICAgICAgLy8gZDMuY3N2KGAke3VybEhlYWR9L2RhdGEvc3RhdGVzLmNzdmApIC8vIHN0YXRlIG5hbWVzXG4gICAgICBkMy5qc29uKGAke2NhY2hlSXNzdWVVcmx9L3F1ZXN0aW9ucy5qc29uYCksIC8vIHF1ZXN0aW9uIGRhdGFcbiAgICAgIGQzLmpzb24oYCR7Y2FjaGVJc3N1ZVVybH0vbmV3cy5qc29uYCksIC8vIG5ld3MgZGF0YVxuICAgICAgZDMuanNvbihgJHtjYWNoZUlzc3VlVXJsfS9qb2JzLmpzb25gKSwgLy8gam9icyBkYXRhXG4gICAgICBkMy5jc3YoYCR7Y2FjaGVJc3N1ZVVybH0vc3RhdGVzLmNzdmApIC8vIHN0YXRlIG5hbWVzXG4gICAgXVxuICAgIC8qKiB3ZSBvbmx5IHJ1biB0aGUgZ2VvbG9jYXRvciBpZiB0aGVyZSB3YXNuJ3Qgb25lIHNldCBmcm9tIHRoZSB1cmwgcGFyYW1zICovXG4gICAgLy8gaWYgKCFBUFBTVEFURS56aXAgJiYgIUFQUFNUQVRFLnN0YXRlKSB7XG4gICAgLy8gICBwcm9taXNlcy5wdXNoKFxuICAgIC8vICAgICBnZXRMb2NhdGlvbihkID0+IHtcbiAgICAvLyAgICAgICBzZXRBcHBTdGF0ZSh7XG4gICAgLy8gICAgICAgICAvLyBjaGVjayBjb21tZW50cyBpbiBgZ2VvbG9jYXRlLmpzYCBmb3IgZGF0YSBzdHJ1Y3R1cmVcbiAgICAvLyAgICAgICAgIHN0YXRlOiBkWydzdGF0ZV9kYXRhJ11bJ3N0YXRlJ10sXG4gICAgLy8gICAgICAgICB6aXA6IGRbJ2NpdHlfZGF0YSddWydwb3N0YWxfY29kZSddLFxuICAgIC8vICAgICAgICAgbG9jOiBbXG4gICAgLy8gICAgICAgICAgIGRbJ2xvY2F0aW9uX2RhdGEnXVsnbGF0aXR1ZGUnXSxcbiAgICAvLyAgICAgICAgICAgZFsnbG9jYXRpb25fZGF0YSddWydsb25naXR1ZGUnXVxuICAgIC8vICAgICAgICAgXVxuICAgIC8vICAgICAgIH0pXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICApXG4gICAgLy8gfVxuICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChbcXVlc3Rpb25zLCBuZXdzLCBqb2JzLCBzdGF0ZXNdKSA9PiB7XG4gICAgICBpZiAoQVBQU1RBVEUuZGV2KSBwcmludFRpbWVzdGFtcHMocXVlc3Rpb25zLCBuZXdzLCBqb2JzKVxuICAgICAgbWFrZUdyYXBoaWMoXG4gICAgICAgIGQzLnNlbGVjdCgnLmluZm8tY2FyZF9fY29udGFpbmVyJyksXG4gICAgICAgIHF1ZXN0aW9ucyxcbiAgICAgICAgbmV3cyxcbiAgICAgICAgam9icyxcbiAgICAgICAgc3RhdGVzXG4gICAgICApXG4gICAgfSlcbiAgfSlcbn0pKClcblxuZnVuY3Rpb24gbWFrZUdyYXBoaWMoZWxlbWVudCwgcXVlc3Rpb25zLCBuZXdzLCBqb2JzLCBzdGF0ZXMpIHtcbiAgLyoqIGlmIHRoZSBzdGF0ZSBpcyBub3QgaW4gb3VyIGxpc3Qgb2YgNTEgc3RhdGUgbmFtZXNcbiAgICogdGhlbiB3ZSB3aWxsIGZhaWwgbGF0ZXIsIHNvIHJlc2V0IHRvIHNlbGVjdGlvbiAqL1xuXG4gIGlmICghc3RhdGVzLm1hcChkID0+IGRbJ2VuZ2xpc2gnXSkuaW5jbHVkZXMoQVBQU1RBVEUuc3RhdGUpKSB7XG4gICAgc2V0QXBwU3RhdGUoeyBzdGF0ZTogdW5kZWZpbmVkLCB6aXA6IHVuZGVmaW5lZCwgbG9jOiB1bmRlZmluZWQgfSlcbiAgfVxuICBhcHAgPSBuZXcgQXBwKGVsZW1lbnQsIHF1ZXN0aW9ucywgbmV3cywgam9icywgc3RhdGVzLCBBUFBTVEFURSwgc2V0QXBwU3RhdGUpIC8vIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhcHBcbiAgYWRkRW1iZWQoXG4gICAgJzIwMjEwMTEyLXBsYW4teW91ci1zaG90LXBoYXNlLWxlYWQnLFxuICAgIEFQUFNUQVRFLFxuICAgICcyMDIxMDExMi1wbGFuLXlvdXItc2hvdC1waGFzZScsXG4gICAgJ2luZGV4LWxlYWQuaHRtbCdcbiAgKVxuICBpZiAoQVBQU1RBVEUuZGV2KVxuICAgIHNldEFwcFN0YXRlKHtcbiAgICAgIHN0YXRlOiAnTmV3IFlvcmsnLFxuICAgICAgam9iOiAnbm9uLWVzc2VudGlhbCcsXG4gICAgICBqb2JHcm91cDogJ25vbi1lc3NlbnRpYWwnLFxuICAgICAgYWdlOiAndW5kZXI2NSdcbiAgICB9KVxufVxuXG5mdW5jdGlvbiBzZXRBcHBTdGF0ZShvYmopIHtcbiAgLyogc2F2ZSBwcmV2aW91cyBzdGF0ZSBmb3Igc3BlY2lmaWMgdHJpZ2dlcnMgd2hlbiBrZXkgY2hhbmdlcyAqL1xuICBQUkVWU1RBVEUgPSBBUFBTVEFURVxuICAvKiB1cGRhdGUgY3VycmVudCBhcHAgc3RhdGUgZm9yIHBhc3NpbmcgdG8gY2hpbGRyZW4gKi9cbiAgQVBQU1RBVEUgPSB7XG4gICAgLi4uQVBQU1RBVEUsIC8vIHByZXNlcnZlIG90aGVyIHN0YXRlIGl0ZW1zIG5vdCB1cGRhdGluZ1xuICAgIC4uLm9iaiAvLyByZXBsYWNlIG9sZCBzdGF0ZSBrZXkvdmFsdWVzIHdpdGggdGhlIG5ldyBpdGVtc1xuICB9XG5cbiAgY29uc3QgY2hlY2tJZlZhbHVlQ2hhbmdlZCA9IGtleSA9PiBQUkVWU1RBVEVba2V5XSAhPT0gQVBQU1RBVEVba2V5XVxuICBpZiAoYXBwKSB7XG4gICAgaWYgKGNoZWNrSWZWYWx1ZUNoYW5nZWQoJ2xhbmd1YWdlJykpIHtcbiAgICAgIHVwZGF0ZVNlYXJjaFF1ZXJ5KEFQUFNUQVRFKVxuICAgICAgYXBwLnVwZGF0ZUxhbmd1YWdlKEFQUFNUQVRFWydsYW5ndWFnZSddKVxuICAgICAgYXBwLnVwZGF0ZUxlYWRNYXAoQVBQU1RBVEUpXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrSWZWYWx1ZUNoYW5nZWQoJ3N0YXRlJykpIHtcbiAgICAgIGFwcC51cGRhdGVTdGF0ZShBUFBTVEFURVsnc3RhdGUnXSlcbiAgICAgIC8qIGRvbid0IHJlcmVuZGVyIG9uIHN0YXRlIGNoYW5nZSwgd2UncmUgc2VpbmcgbWVzc2FnZSBpbnN0ZWFkICovXG4gICAgICAvLyBhcHAudXBkYXRlTGVhZE1hcChBUFBTVEFURSlcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJZlZhbHVlQ2hhbmdlZCgnYWdlJykpIGFwcC51cGRhdGVBZ2UoQVBQU1RBVEVbJ2FnZSddKVxuICAgIGlmIChjaGVja0lmVmFsdWVDaGFuZ2VkKCdqb2InKSkgYXBwLnVwZGF0ZUpvYihBUFBTVEFURVsnam9iJ10pXG4gICAgaWYgKGNoZWNrSWZWYWx1ZUNoYW5nZWQoJ2hpZ2gtcmlzaycpKVxuICAgICAgYXBwLnVwZGF0ZUNoZWNrKCdoaWdoLXJpc2snLCBBUFBTVEFURVsnaGlnaC1yaXNrJ10pXG4gICAgaWYgKGNoZWNrSWZWYWx1ZUNoYW5nZWQoJ2xvbmctdGVybScpKVxuICAgICAgYXBwLnVwZGF0ZUNoZWNrKCdsb25nLXRlcm0nLCBBUFBTVEFURVsnbG9uZy10ZXJtJ10pXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ha2VzIHRoZSByZXN0IG9mIHRoZSBhcHAgdmlzaWJsZSwgYW5kIGVuc3VyZXMgdGhhdFxuICAgICAqIHdlIGFyZW4ndCBydW5uaW5nIHRoZSBjYXJkIHVwZGF0ZSB1bnRpbCB3ZSdyZSBpbnNpZGUgdGhlIGFwcC5cbiAgICAgKi9cbiAgICBpZiAoXG4gICAgICAhQVBQU1RBVEUub3BlbiAmJlxuICAgICAgKChBUFBTVEFURS5zdGF0ZSAmJiBBUFBTVEFURS5hZ2UgJiYgQVBQU1RBVEUuam9iKSB8fCBBUFBTVEFURS5kZXYpXG4gICAgKSB7XG4gICAgICAvLyByZW1vdmUgYGRpc3BsYXk6IG5vbmVgIGZyb20gZGl2cyBiZXlvbmQgb3BlbmluZyBwYWdlXG4gICAgICBkMy5zZWxlY3RBbGwoJ3NlY3Rpb24sYXJ0aWNsZSxkaXYuYXJyb3dfX3dyYXAnKS5jbGFzc2VkKFxuICAgICAgICAnYXdhaXRpbmdGb3JtJyxcbiAgICAgICAgZmFsc2VcbiAgICAgIClcbiAgICAgIGQzLnNlbGVjdCgnZGl2LmFycm93X193cmFwJykuY2xhc3NlZCgndGVhbCcsIHRydWUpXG4gICAgICAvLyBjaGFuZ2UgdGhlIG9wZW4gdmFsdWUgdG8gdHJ1ZSBhbmQgcmUtcnVuIHRoaXMgdG8gdHJpZ2dlciB1cGRhdGVcbiAgICAgIHNldEFwcFN0YXRlKHsgb3BlbjogdHJ1ZSB9KVxuICAgIH1cbiAgICAvKiBvbmNlIG9wZW4gaXMgc2V0LCB0aGVuIHdlIHJ1biB1cGRhdGUgb24gZXZlcnkgYXBwIHVwZGF0ZSAqL1xuICAgIGlmIChBUFBTVEFURS5vcGVuKSB7XG4gICAgICBhcHAudXBkYXRlKEFQUFNUQVRFKSAvLyB0cmlnZ2VyIHRoZSBhcHAgY2xhc3MgdG8gdXBkYXRlXG4gICAgfVxuICAgIHVwZGF0ZVNlYXJjaFF1ZXJ5KEFQUFNUQVRFKVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNlYXJjaFF1ZXJ5KGFwcFN0YXRlKSB7XG4gIGNvbnN0IGtleXNUb0Fsd2F5c0luY2x1ZGUgPSBbXG4gICAgJ3N0YWdpbmcnLFxuICAgICdkZXYnLFxuICAgICdsYW5ndWFnZScsXG4gICAgJ3N0YXRlJ1xuICAgIC8vICdhZ2UnLFxuICAgIC8vICdqb2InLFxuICAgIC8vICdoaWdoLXJpc2snLFxuICAgIC8vICdsb25nLXRlcm0nXG4gIF1cblxuICBjb25zdCBmaWx0ZXJlZEFwcFN0YXRlID0gT2JqZWN0LmVudHJpZXMoYXBwU3RhdGUpLmZpbHRlcihcbiAgICAoW2tleSwgdmFsdWVdKSA9PlxuICAgICAga2V5c1RvQWx3YXlzSW5jbHVkZS5pbmNsdWRlcyhrZXkpICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWVcbiAgKVxuXG4gIGNvbnN0IHF1ZXJ5U3RyaW5nID0gZmlsdGVyZWRBcHBTdGF0ZVxuICAgIC5tYXAoKFtrZXksIHZhbHVlXSwgaSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gJ3N0YXRlJylcbiAgICAgICAgcmV0dXJuIGAke2kgPT09IDAgPyAnPycgOiAnJid9JHtrZXl9PSR7c3RhdGVBYmJyW3ZhbHVlXX1gXG4gICAgICByZXR1cm4gYCR7aSA9PT0gMCA/ICc/JyA6ICcmJ30ke2tleX09JHt2YWx1ZX1gXG4gICAgfSlcbiAgICAuam9pbignJylcblxuICBjb25zdCBuZXd1cmwgPVxuICAgIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArXG4gICAgJy8vJyArXG4gICAgd2luZG93LmxvY2F0aW9uLmhvc3QgK1xuICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArXG4gICAgcXVlcnlTdHJpbmdcblxuICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyBwYXRoOiBuZXd1cmwgfSwgJycsIG5ld3VybClcbn1cblxuZnVuY3Rpb24gcHJpbnRUaW1lc3RhbXBzKHF1ZXN0aW9ucywgbmV3cywgam9icykge1xuICBjb25zb2xlLnRhYmxlKHtcbiAgICBxdWVzdGlvbnM6IHF1ZXN0aW9ucy50aW1lc3RhbXAsXG4gICAgbmV3czogbmV3cy50aW1lc3RhbXAsXG4gICAgam9iczogam9icy50aW1lc3RhbXBcbiAgfSlcbn1cbiJdfQ==
window.PARSELY = {
autotrack: false,
config: {
eventUrl: document.referrer,
heartbeat_should_honor_autotrack: false
},
getWindow: function() {
return window;
}
};
(function(d) {
var b = d.body;
var e = d.createElement(‘script’);
e.id = ‘parsely-cfg’;
e.src = ‘https://cdn.parsely.com/keys/nbcnews.com/p.js’;
e.setAttribute(‘data-parsely-site’, ‘http://nbcnews.com’);
b.appendChild(e);
})(document);
CDC director is 'very concerned' that Covid cases have stopped falling
The third Covid-19 spike may be leveling off...
White House plans messaging campaign to stress Johnson & Johnson vaccine's benefits
With the first shipments of Johnson & Johnson’s...
Data on pregnancy and the Covid vaccine is sparse. These women are changing that.
When Caitlynn Ott of Silver Bow County, Montana, found out...
Once a darling of the pandemic, Germany now has more than 1 million vaccines unused in storage
At a time when vaccines are in such...