webcodecs-utils 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +21 -21
- package/dist/index.js +683 -651
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ function G1(t, e, i = 30, n = "good") {
|
|
|
9
9
|
}, m = o[n] || o.good;
|
|
10
10
|
return d * i * m;
|
|
11
11
|
}
|
|
12
|
-
function
|
|
12
|
+
function v1(t, e, i, n) {
|
|
13
13
|
const d = [
|
|
14
14
|
{ maxMacroblocks: 99, maxBitrate: 64e3, level: 10 },
|
|
15
15
|
// Level 1
|
|
@@ -171,18 +171,18 @@ function S1(t, e, i, n) {
|
|
|
171
171
|
{ maxPictureSize: 35651584, maxBitrate: 8e8, tier: "H", level: 19 }
|
|
172
172
|
// Level 6.3 (High Tier)
|
|
173
173
|
];
|
|
174
|
-
function
|
|
174
|
+
function S(W) {
|
|
175
175
|
return W ? W[W.length - 1] : void 0;
|
|
176
176
|
}
|
|
177
177
|
if (t === "avc") {
|
|
178
178
|
const v = Math.ceil(e / 16) * Math.ceil(i / 16), Z = d.find(
|
|
179
179
|
(U) => v <= U.maxMacroblocks && n <= U.maxBitrate
|
|
180
|
-
) ??
|
|
180
|
+
) ?? S(d), O = Z ? Z.level : 0, w = "64".padStart(2, "0"), N = "00", J = O.toString(16).padStart(2, "0");
|
|
181
181
|
return `avc1.${w}${N}${J}`;
|
|
182
182
|
} else if (t === "hevc") {
|
|
183
183
|
const W = "", Z = "6", O = e * i, w = o.find(
|
|
184
184
|
(J) => O <= J.maxPictureSize && n <= J.maxBitrate
|
|
185
|
-
) ??
|
|
185
|
+
) ?? S(o);
|
|
186
186
|
return `hev1.${W}1.${Z}.${w.tier}${w.level}.B0`;
|
|
187
187
|
} else {
|
|
188
188
|
if (t === "vp8")
|
|
@@ -190,18 +190,18 @@ function S1(t, e, i, n) {
|
|
|
190
190
|
if (t === "vp9") {
|
|
191
191
|
const W = "00", v = e * i, Z = m.find(
|
|
192
192
|
(w) => v <= w.maxPictureSize && n <= w.maxBitrate
|
|
193
|
-
) ??
|
|
193
|
+
) ?? S(m);
|
|
194
194
|
return `vp09.${W}.${Z.level.toString().padStart(2, "0")}.08`;
|
|
195
195
|
} else if (t === "av1") {
|
|
196
196
|
const v = e * i, Z = h.find(
|
|
197
197
|
(N) => v <= N.maxPictureSize && n <= N.maxBitrate
|
|
198
|
-
) ??
|
|
198
|
+
) ?? S(h);
|
|
199
199
|
return `av01.0.${Z.level.toString().padStart(2, "0")}${Z.tier}.08`;
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
throw new TypeError(`Unhandled codec '${t}'.`);
|
|
203
203
|
}
|
|
204
|
-
class
|
|
204
|
+
class I1 {
|
|
205
205
|
/**
|
|
206
206
|
* Create a new GPUFrameRenderer.
|
|
207
207
|
*
|
|
@@ -420,7 +420,7 @@ class v1 {
|
|
|
420
420
|
const o = this.device.createBindGroup({
|
|
421
421
|
layout: i.getBindGroupLayout(0),
|
|
422
422
|
entries: d
|
|
423
|
-
}), m = this.device.createCommandEncoder(), h = this.context.getCurrentTexture().createView(),
|
|
423
|
+
}), m = this.device.createCommandEncoder(), h = this.context.getCurrentTexture().createView(), S = m.beginRenderPass({
|
|
424
424
|
colorAttachments: [{
|
|
425
425
|
view: h,
|
|
426
426
|
clearValue: { r: 0, g: 0, b: 0, a: 1 },
|
|
@@ -428,7 +428,7 @@ class v1 {
|
|
|
428
428
|
storeOp: "store"
|
|
429
429
|
}]
|
|
430
430
|
});
|
|
431
|
-
|
|
431
|
+
S.setPipeline(i), S.setBindGroup(0, o), S.draw(6), S.end(), this.device.queue.submit([m.finish()]);
|
|
432
432
|
}
|
|
433
433
|
async drawImageBitmap(e) {
|
|
434
434
|
const i = await createImageBitmap(e);
|
|
@@ -929,7 +929,7 @@ function An() {
|
|
|
929
929
|
9.000838926174497,
|
|
930
930
|
-29.20218120805369
|
|
931
931
|
/* 2.384e-06/2.384e-06 */
|
|
932
|
-
],
|
|
932
|
+
], S = [
|
|
933
933
|
[
|
|
934
934
|
2382191739347913e-28,
|
|
935
935
|
6423305872147834e-28,
|
|
@@ -1087,7 +1087,7 @@ function An() {
|
|
|
1087
1087
|
-6423305872147841e-28,
|
|
1088
1088
|
-2382191739347918e-28
|
|
1089
1089
|
]
|
|
1090
|
-
], W =
|
|
1090
|
+
], W = S[o.SHORT_TYPE], v = S[o.SHORT_TYPE], Z = S[o.SHORT_TYPE], O = S[o.SHORT_TYPE], w = [
|
|
1091
1091
|
0,
|
|
1092
1092
|
1,
|
|
1093
1093
|
16,
|
|
@@ -1138,7 +1138,7 @@ function An() {
|
|
|
1138
1138
|
function J(k, I) {
|
|
1139
1139
|
for (var r = 0; r < 3; r++) {
|
|
1140
1140
|
var K, X, A, T, H, p;
|
|
1141
|
-
T = k[I + 2 * 3] *
|
|
1141
|
+
T = k[I + 2 * 3] * S[o.SHORT_TYPE][0] - k[I + 5 * 3], K = k[I + 0 * 3] * S[o.SHORT_TYPE][2] - k[I + 3 * 3], X = T + K, A = T - K, T = k[I + 5 * 3] * S[o.SHORT_TYPE][0] + k[I + 2 * 3], K = k[I + 3 * 3] * S[o.SHORT_TYPE][2] + k[I + 0 * 3], H = T + K, p = -T + K, K = (k[I + 1 * 3] * S[o.SHORT_TYPE][1] - k[I + 4 * 3]) * 2069978111953089e-26, T = (k[I + 4 * 3] * S[o.SHORT_TYPE][1] + k[I + 1 * 3]) * 2069978111953089e-26, k[I + 3 * 0] = X * 190752519173728e-25 + K, k[I + 3 * 5] = -H * 190752519173728e-25 + T, A = A * 0.8660254037844387 * 1907525191737281e-26, H = H * 0.5 * 1907525191737281e-26 + T, k[I + 3 * 1] = A - H, k[I + 3 * 2] = A + H, X = X * 0.5 * 1907525191737281e-26 - K, p = p * 0.8660254037844387 * 1907525191737281e-26, k[I + 3 * 3] = X + p, k[I + 3 * 4] = X - p, I++;
|
|
1142
1142
|
}
|
|
1143
1143
|
}
|
|
1144
1144
|
function U(k, I, r) {
|
|
@@ -1173,14 +1173,14 @@ function An() {
|
|
|
1173
1173
|
j[_][w[H]] *= k.amp_filter[H];
|
|
1174
1174
|
if (R == o.SHORT_TYPE) {
|
|
1175
1175
|
for (var _ = -12 / 4; _ < 0; _++) {
|
|
1176
|
-
var g =
|
|
1176
|
+
var g = S[o.SHORT_TYPE][_ + 3];
|
|
1177
1177
|
u[l + _ * 3 + 9] = f[9 + _][w[H]] * g - f[8 - _][w[H]], u[l + _ * 3 + 18] = f[14 - _][w[H]] * g + f[15 + _][w[H]], u[l + _ * 3 + 10] = f[15 + _][w[H]] * g - f[14 - _][w[H]], u[l + _ * 3 + 19] = j[2 - _][w[H]] * g + j[3 + _][w[H]], u[l + _ * 3 + 11] = j[3 + _][w[H]] * g - j[2 - _][w[H]], u[l + _ * 3 + 20] = j[8 - _][w[H]] * g + j[9 + _][w[H]];
|
|
1178
1178
|
}
|
|
1179
1179
|
J(u, l);
|
|
1180
1180
|
} else {
|
|
1181
1181
|
for (var P = d(18), _ = -36 / 4; _ < 0; _++) {
|
|
1182
1182
|
var a, c;
|
|
1183
|
-
a =
|
|
1183
|
+
a = S[R][_ + 27] * j[_ + 9][w[H]] + S[R][_ + 36] * j[8 - _][w[H]], c = S[R][_ + 9] * f[_ + 9][w[H]] - S[R][_ + 18] * f[8 - _][w[H]], P[_ + 9] = a - c * W[3 + _ + 9], P[_ + 18] = a * W[3 + _ + 9] + c;
|
|
1184
1184
|
}
|
|
1185
1185
|
U(u, l, P);
|
|
1186
1186
|
}
|
|
@@ -1219,9 +1219,9 @@ function sn() {
|
|
|
1219
1219
|
var m = this;
|
|
1220
1220
|
this.assign = function(h) {
|
|
1221
1221
|
i.arraycopy(h.l, 0, m.l, 0, t.SBMAX_l);
|
|
1222
|
-
for (var
|
|
1222
|
+
for (var S = 0; S < t.SBMAX_s; S++)
|
|
1223
1223
|
for (var W = 0; W < 3; W++)
|
|
1224
|
-
m.s[
|
|
1224
|
+
m.s[S][W] = h.s[S][W];
|
|
1225
1225
|
};
|
|
1226
1226
|
}
|
|
1227
1227
|
return Li = o, Li;
|
|
@@ -1247,7 +1247,7 @@ function bt() {
|
|
|
1247
1247
|
var d = t.new_float, o = t.new_float_n, m = t.new_int;
|
|
1248
1248
|
t.new_int_n;
|
|
1249
1249
|
var h = t.assert;
|
|
1250
|
-
|
|
1250
|
+
S.ENCDELAY = 576, S.POSTDELAY = 1152, S.MDCTDELAY = 48, S.FFTOFFSET = 224 + S.MDCTDELAY, S.DECDELAY = 528, S.SBLIMIT = 32, S.CBANDS = 64, S.SBPSY_l = 21, S.SBPSY_s = 12, S.SBMAX_l = 22, S.SBMAX_s = 13, S.PSFB21 = 6, S.PSFB12 = 6, S.BLKSIZE = 1024, S.HBLKSIZE = S.BLKSIZE / 2 + 1, S.BLKSIZE_s = 256, S.HBLKSIZE_s = S.BLKSIZE_s / 2 + 1, S.NORM_TYPE = 0, S.START_TYPE = 1, S.SHORT_TYPE = 2, S.STOP_TYPE = 3, S.MPG_MD_LR_LR = 0, S.MPG_MD_LR_I = 1, S.MPG_MD_MS_LR = 2, S.MPG_MD_MS_I = 3, S.fircoef = [
|
|
1251
1251
|
-0.0207887 * 5,
|
|
1252
1252
|
-0.0378413 * 5,
|
|
1253
1253
|
-0.0432472 * 5,
|
|
@@ -1258,8 +1258,8 @@ function bt() {
|
|
|
1258
1258
|
0.151365 * 5,
|
|
1259
1259
|
0.187098 * 5
|
|
1260
1260
|
];
|
|
1261
|
-
function
|
|
1262
|
-
var W = An(), v = On(), Z =
|
|
1261
|
+
function S() {
|
|
1262
|
+
var W = An(), v = On(), Z = S.FFTOFFSET, O = S.MPG_MD_MS_LR, w = null;
|
|
1263
1263
|
this.psy = null;
|
|
1264
1264
|
var N = null, J = null, U = null;
|
|
1265
1265
|
this.setModules = function(X, A, T, H) {
|
|
@@ -1295,8 +1295,8 @@ function bt() {
|
|
|
1295
1295
|
u < 576 * T.mode_gr ? (s[u] = 0, T.channels_out == 2 && (V[u] = 0)) : (s[u] = A[0][l], T.channels_out == 2 && (V[u] = A[1][l]), ++l);
|
|
1296
1296
|
for (p = 0; p < T.mode_gr; p++)
|
|
1297
1297
|
for (H = 0; H < T.channels_out; H++)
|
|
1298
|
-
T.l3_side.tt[p][H].block_type =
|
|
1299
|
-
k.mdct_sub48(T, s, V), h(576 >=
|
|
1298
|
+
T.l3_side.tt[p][H].block_type = S.SHORT_TYPE;
|
|
1299
|
+
k.mdct_sub48(T, s, V), h(576 >= S.FFTOFFSET), h(T.mf_size >= S.BLKSIZE + X.framesize - S.FFTOFFSET), h(T.mf_size >= 512 + X.framesize - 32);
|
|
1300
1300
|
}
|
|
1301
1301
|
}
|
|
1302
1302
|
this.lame_encode_mp3_frame = function(X, A, T, H, p, u) {
|
|
@@ -1309,7 +1309,7 @@ function bt() {
|
|
|
1309
1309
|
var ee, ae = [null, null], le = 0, re = m(2);
|
|
1310
1310
|
for (L = 0; L < f.mode_gr; L++) {
|
|
1311
1311
|
for (M = 0; M < f.channels_out; M++)
|
|
1312
|
-
ae[M] = R[M], le = 576 + L * 576 -
|
|
1312
|
+
ae[M] = R[M], le = 576 + L * 576 - S.FFTOFFSET;
|
|
1313
1313
|
if (X.VBR == i.vbr_mtrh || X.VBR == i.vbr_mt ? ee = N.L3psycho_anal_vbr(
|
|
1314
1314
|
X,
|
|
1315
1315
|
ae,
|
|
@@ -1342,9 +1342,9 @@ function bt() {
|
|
|
1342
1342
|
} else
|
|
1343
1343
|
for (L = 0; L < f.mode_gr; L++)
|
|
1344
1344
|
for (M = 0; M < f.channels_out; M++)
|
|
1345
|
-
f.l3_side.tt[L][M].block_type =
|
|
1346
|
-
if (I(f), k.mdct_sub48(f, R[0], R[1]), f.mode_ext =
|
|
1347
|
-
f.mode_ext =
|
|
1345
|
+
f.l3_side.tt[L][M].block_type = S.NORM_TYPE, f.l3_side.tt[L][M].mixed_block_flag = 0, a[L][M] = P[L][M] = 700;
|
|
1346
|
+
if (I(f), k.mdct_sub48(f, R[0], R[1]), f.mode_ext = S.MPG_MD_LR_LR, X.force_ms)
|
|
1347
|
+
f.mode_ext = S.MPG_MD_MS_LR;
|
|
1348
1348
|
else if (X.mode == MPEGMode.JOINT_STEREO) {
|
|
1349
1349
|
var he = 0, oe = 0;
|
|
1350
1350
|
for (L = 0; L < f.mode_gr; L++)
|
|
@@ -1352,7 +1352,7 @@ function bt() {
|
|
|
1352
1352
|
he += a[L][M], oe += P[L][M];
|
|
1353
1353
|
if (he <= 1 * oe) {
|
|
1354
1354
|
var Le = f.l3_side.tt[0], ze = f.l3_side.tt[f.mode_gr - 1];
|
|
1355
|
-
Le[0].block_type == Le[1].block_type && ze[0].block_type == ze[1].block_type && (f.mode_ext =
|
|
1355
|
+
Le[0].block_type == Le[1].block_type && ze[0].block_type == ze[1].block_type && (f.mode_ext = S.MPG_MD_MS_LR);
|
|
1356
1356
|
}
|
|
1357
1357
|
}
|
|
1358
1358
|
if (f.mode_ext == O ? (_ = V, c = a) : (_ = s, c = P), X.analysis && f.pinfo != null)
|
|
@@ -1379,7 +1379,7 @@ function bt() {
|
|
|
1379
1379
|
for (M = 0; M < f.channels_out; M++)
|
|
1380
1380
|
we += c[L][M];
|
|
1381
1381
|
for (f.nsPsy.pefirbuf[18] = we, we = f.nsPsy.pefirbuf[9], We = 0; We < 9; We++)
|
|
1382
|
-
we += (f.nsPsy.pefirbuf[We] + f.nsPsy.pefirbuf[18 - We]) *
|
|
1382
|
+
we += (f.nsPsy.pefirbuf[We] + f.nsPsy.pefirbuf[18 - We]) * S.fircoef[We];
|
|
1383
1383
|
for (we = 670 * 5 * f.mode_gr * f.channels_out / we, L = 0; L < f.mode_gr; L++)
|
|
1384
1384
|
for (M = 0; M < f.channels_out; M++)
|
|
1385
1385
|
c[L][M] *= we;
|
|
@@ -1397,7 +1397,7 @@ function bt() {
|
|
|
1397
1397
|
return r(f), l;
|
|
1398
1398
|
};
|
|
1399
1399
|
}
|
|
1400
|
-
return Hi =
|
|
1400
|
+
return Hi = S, Hi;
|
|
1401
1401
|
}
|
|
1402
1402
|
var pt = it;
|
|
1403
1403
|
pt.System;
|
|
@@ -1427,7 +1427,7 @@ function jn() {
|
|
|
1427
1427
|
0.006135884649154475
|
|
1428
1428
|
];
|
|
1429
1429
|
function n(o, m, h) {
|
|
1430
|
-
var
|
|
1430
|
+
var S = 0, W, v, Z;
|
|
1431
1431
|
h <<= 1;
|
|
1432
1432
|
var O = m + h;
|
|
1433
1433
|
W = 4;
|
|
@@ -1438,16 +1438,16 @@ function jn() {
|
|
|
1438
1438
|
var K, X, A, T;
|
|
1439
1439
|
X = o[v + 0] - o[v + U], K = o[v + 0] + o[v + U], T = o[v + k] - o[v + I], A = o[v + k] + o[v + I], o[v + k] = K - A, o[v + 0] = K + A, o[v + I] = X - T, o[v + U] = X + T, X = o[Z + 0] - o[Z + U], K = o[Z + 0] + o[Z + U], T = Xs.SQRT2 * o[Z + I], A = Xs.SQRT2 * o[Z + k], o[Z + k] = K - A, o[Z + 0] = K + A, o[Z + I] = X - T, o[Z + U] = X + T, Z += W, v += W;
|
|
1440
1440
|
} while (v < O);
|
|
1441
|
-
for (N = i[
|
|
1441
|
+
for (N = i[S + 0], w = i[S + 1], J = 1; J < r; J++) {
|
|
1442
1442
|
var H, p;
|
|
1443
1443
|
H = 1 - 2 * w * w, p = 2 * w * N, v = m + J, Z = m + U - J;
|
|
1444
1444
|
do {
|
|
1445
1445
|
var u, l, s, K, X, V, A, _, T, R;
|
|
1446
1446
|
l = p * o[v + U] - H * o[Z + U], u = H * o[v + U] + p * o[Z + U], X = o[v + 0] - u, K = o[v + 0] + u, V = o[Z + 0] - l, s = o[Z + 0] + l, l = p * o[v + I] - H * o[Z + I], u = H * o[v + I] + p * o[Z + I], T = o[v + k] - u, A = o[v + k] + u, R = o[Z + k] - l, _ = o[Z + k] + l, l = w * A - N * R, u = N * A + w * R, o[v + k] = K - u, o[v + 0] = K + u, o[Z + I] = V - l, o[Z + U] = V + l, l = N * _ - w * T, u = w * _ + N * T, o[Z + k] = s - u, o[Z + 0] = s + u, o[v + I] = X - l, o[v + U] = X + l, Z += W, v += W;
|
|
1447
1447
|
} while (v < O);
|
|
1448
|
-
H = N, N = H * i[
|
|
1448
|
+
H = N, N = H * i[S + 0] - w * i[S + 1], w = H * i[S + 1] + w * i[S + 0];
|
|
1449
1449
|
}
|
|
1450
|
-
|
|
1450
|
+
S += 2;
|
|
1451
1451
|
} while (W < h);
|
|
1452
1452
|
}
|
|
1453
1453
|
var d = [
|
|
@@ -1580,20 +1580,20 @@ function jn() {
|
|
|
1580
1580
|
126,
|
|
1581
1581
|
254
|
|
1582
1582
|
];
|
|
1583
|
-
this.fft_short = function(o, m, h,
|
|
1583
|
+
this.fft_short = function(o, m, h, S, W) {
|
|
1584
1584
|
for (var v = 0; v < 3; v++) {
|
|
1585
1585
|
var Z = Oe.BLKSIZE_s / 2, O = 65535 & 576 / 3 * (v + 1), w = Oe.BLKSIZE_s / 8 - 1;
|
|
1586
1586
|
do {
|
|
1587
1587
|
var N, J, U, k, I, r = d[w << 2] & 255;
|
|
1588
|
-
N = e[r] *
|
|
1588
|
+
N = e[r] * S[h][W + r + O], I = e[127 - r] * S[h][W + r + O + 128], J = N - I, N = N + I, U = e[r + 64] * S[h][W + r + O + 64], I = e[63 - r] * S[h][W + r + O + 192], k = U - I, U = U + I, Z -= 4, m[v][Z + 0] = N + U, m[v][Z + 2] = N - U, m[v][Z + 1] = J + k, m[v][Z + 3] = J - k, N = e[r + 1] * S[h][W + r + O + 1], I = e[126 - r] * S[h][W + r + O + 129], J = N - I, N = N + I, U = e[r + 65] * S[h][W + r + O + 65], I = e[62 - r] * S[h][W + r + O + 193], k = U - I, U = U + I, m[v][Z + Oe.BLKSIZE_s / 2 + 0] = N + U, m[v][Z + Oe.BLKSIZE_s / 2 + 2] = N - U, m[v][Z + Oe.BLKSIZE_s / 2 + 1] = J + k, m[v][Z + Oe.BLKSIZE_s / 2 + 3] = J - k;
|
|
1589
1589
|
} while (--w >= 0);
|
|
1590
1590
|
n(m[v], Z, Oe.BLKSIZE_s / 2);
|
|
1591
1591
|
}
|
|
1592
|
-
}, this.fft_long = function(o, m, h,
|
|
1592
|
+
}, this.fft_long = function(o, m, h, S, W) {
|
|
1593
1593
|
var v = Oe.BLKSIZE / 8 - 1, Z = Oe.BLKSIZE / 2;
|
|
1594
1594
|
do {
|
|
1595
1595
|
var O, w, N, J, U, k = d[v] & 255;
|
|
1596
|
-
O = t[k] *
|
|
1596
|
+
O = t[k] * S[h][W + k], U = t[k + 512] * S[h][W + k + 512], w = O - U, O = O + U, N = t[k + 256] * S[h][W + k + 256], U = t[k + 768] * S[h][W + k + 768], J = N - U, N = N + U, Z -= 4, m[Z + 0] = O + N, m[Z + 2] = O - N, m[Z + 1] = w + J, m[Z + 3] = w - J, O = t[k + 1] * S[h][W + k + 1], U = t[k + 513] * S[h][W + k + 513], w = O - U, O = O + U, N = t[k + 257] * S[h][W + k + 257], U = t[k + 769] * S[h][W + k + 769], J = N - U, N = N + U, m[Z + Oe.BLKSIZE / 2 + 0] = O + N, m[Z + Oe.BLKSIZE / 2 + 2] = O - N, m[Z + Oe.BLKSIZE / 2 + 1] = w + J, m[Z + Oe.BLKSIZE / 2 + 3] = w - J;
|
|
1597
1597
|
} while (--v >= 0);
|
|
1598
1598
|
n(m, Z, Oe.BLKSIZE / 2);
|
|
1599
1599
|
}, this.init_fft = function(o) {
|
|
@@ -1605,7 +1605,7 @@ function jn() {
|
|
|
1605
1605
|
}
|
|
1606
1606
|
var Qn = jn, yt = it;
|
|
1607
1607
|
yt.System;
|
|
1608
|
-
var W0 = yt.VbrMode,
|
|
1608
|
+
var W0 = yt.VbrMode, Ss = yt.Float, L0 = yt.ShortBlock, mt = yt.Util, Dn = yt.Arrays;
|
|
1609
1609
|
yt.new_array_n;
|
|
1610
1610
|
yt.new_byte;
|
|
1611
1611
|
yt.new_double;
|
|
@@ -1613,7 +1613,7 @@ var je = yt.new_float, kt = yt.new_float_n, h0 = yt.new_int;
|
|
|
1613
1613
|
yt.new_int_n;
|
|
1614
1614
|
var ue = yt.assert, $n = Qn, D = bt();
|
|
1615
1615
|
function qn() {
|
|
1616
|
-
var t = new $n(), e = 2.302585092994046, i = 2, n = 16, d = 2, o = 16, m = 0.34, h = 1 / (14752 * 14752) / (D.BLKSIZE / 2),
|
|
1616
|
+
var t = new $n(), e = 2.302585092994046, i = 2, n = 16, d = 2, o = 16, m = 0.34, h = 1 / (14752 * 14752) / (D.BLKSIZE / 2), S = 0.01, W = 0.8, v = 0.6, Z = 0.3, O = 3.5, w = 21, N = 0.2302585093;
|
|
1617
1617
|
function J(b) {
|
|
1618
1618
|
return b;
|
|
1619
1619
|
}
|
|
@@ -1622,10 +1622,10 @@ function qn() {
|
|
|
1622
1622
|
x += b[Y] * y.ATH.eql_w[Y];
|
|
1623
1623
|
return x *= h, x;
|
|
1624
1624
|
}
|
|
1625
|
-
function k(b, y, x, Y, F,
|
|
1625
|
+
function k(b, y, x, Y, F, G, C, E, B, $, z) {
|
|
1626
1626
|
var q = b.internal_flags;
|
|
1627
1627
|
if (B < 2)
|
|
1628
|
-
t.fft_long(q, Y[F], B, $, z), t.fft_short(q,
|
|
1628
|
+
t.fft_long(q, Y[F], B, $, z), t.fft_short(q, G[C], B, $, z);
|
|
1629
1629
|
else if (B == 2) {
|
|
1630
1630
|
for (var ce = D.BLKSIZE - 1; ce >= 0; --ce) {
|
|
1631
1631
|
var Ze = Y[F + 0][ce], ie = Y[F + 1][ce];
|
|
@@ -1633,8 +1633,8 @@ function qn() {
|
|
|
1633
1633
|
}
|
|
1634
1634
|
for (var fe = 2; fe >= 0; --fe)
|
|
1635
1635
|
for (var ce = D.BLKSIZE_s - 1; ce >= 0; --ce) {
|
|
1636
|
-
var Ze =
|
|
1637
|
-
|
|
1636
|
+
var Ze = G[C + 0][fe][ce], ie = G[C + 1][fe][ce];
|
|
1637
|
+
G[C + 0][fe][ce] = (Ze + ie) * mt.SQRT2 * 0.5, G[C + 1][fe][ce] = (Ze - ie) * mt.SQRT2 * 0.5;
|
|
1638
1638
|
}
|
|
1639
1639
|
}
|
|
1640
1640
|
y[0] = Y[F + 0][0], y[0] *= y[0];
|
|
@@ -1643,9 +1643,9 @@ function qn() {
|
|
|
1643
1643
|
y[D.BLKSIZE / 2 - ce] = (Q * Q + be * be) * 0.5;
|
|
1644
1644
|
}
|
|
1645
1645
|
for (var fe = 2; fe >= 0; --fe) {
|
|
1646
|
-
x[fe][0] =
|
|
1646
|
+
x[fe][0] = G[C + 0][fe][0], x[fe][0] *= x[fe][0];
|
|
1647
1647
|
for (var ce = D.BLKSIZE_s / 2 - 1; ce >= 0; --ce) {
|
|
1648
|
-
var Q =
|
|
1648
|
+
var Q = G[C + 0][fe][D.BLKSIZE_s / 2 - ce], be = G[C + 0][fe][D.BLKSIZE_s / 2 + ce];
|
|
1649
1649
|
x[fe][D.BLKSIZE_s / 2 - ce] = (Q * Q + be * be) * 0.5;
|
|
1650
1650
|
}
|
|
1651
1651
|
}
|
|
@@ -1728,7 +1728,7 @@ function qn() {
|
|
|
1728
1728
|
1.11084 * 1.11084,
|
|
1729
1729
|
1.03826 * 1.03826
|
|
1730
1730
|
];
|
|
1731
|
-
function V(b, y, x, Y, F,
|
|
1731
|
+
function V(b, y, x, Y, F, G) {
|
|
1732
1732
|
var C;
|
|
1733
1733
|
if (y > b)
|
|
1734
1734
|
if (y < b * A)
|
|
@@ -1786,13 +1786,13 @@ function qn() {
|
|
|
1786
1786
|
var x = b.internal_flags;
|
|
1787
1787
|
if (x.channels_out > 1) {
|
|
1788
1788
|
for (var Y = 0; Y < D.SBMAX_l; Y++) {
|
|
1789
|
-
var F = x.thm[0].l[Y],
|
|
1790
|
-
x.thm[0].l[Y] +=
|
|
1789
|
+
var F = x.thm[0].l[Y], G = x.thm[1].l[Y];
|
|
1790
|
+
x.thm[0].l[Y] += G * y, x.thm[1].l[Y] += F * y;
|
|
1791
1791
|
}
|
|
1792
1792
|
for (var Y = 0; Y < D.SBMAX_s; Y++)
|
|
1793
1793
|
for (var C = 0; C < 3; C++) {
|
|
1794
|
-
var F = x.thm[0].s[Y][C],
|
|
1795
|
-
x.thm[0].s[Y][C] +=
|
|
1794
|
+
var F = x.thm[0].s[Y][C], G = x.thm[1].s[Y][C];
|
|
1795
|
+
x.thm[0].s[Y][C] += G * y, x.thm[1].s[Y][C] += F * y;
|
|
1796
1796
|
}
|
|
1797
1797
|
}
|
|
1798
1798
|
}
|
|
@@ -1811,95 +1811,95 @@ function qn() {
|
|
|
1811
1811
|
b.thm[2].l[y] = Y, b.thm[3].l[y] = F;
|
|
1812
1812
|
}
|
|
1813
1813
|
for (var y = 0; y < D.SBMAX_s; y++)
|
|
1814
|
-
for (var
|
|
1815
|
-
if (!(b.thm[0].s[y][
|
|
1816
|
-
var x = b.mld_s[y] * b.en[3].s[y][
|
|
1817
|
-
b.thm[2].s[y][
|
|
1818
|
-
Math.min(b.thm[3].s[y][
|
|
1814
|
+
for (var G = 0; G < 3; G++)
|
|
1815
|
+
if (!(b.thm[0].s[y][G] > 1.58 * b.thm[1].s[y][G] || b.thm[1].s[y][G] > 1.58 * b.thm[0].s[y][G])) {
|
|
1816
|
+
var x = b.mld_s[y] * b.en[3].s[y][G], Y = Math.max(
|
|
1817
|
+
b.thm[2].s[y][G],
|
|
1818
|
+
Math.min(b.thm[3].s[y][G], x)
|
|
1819
1819
|
);
|
|
1820
|
-
x = b.mld_s[y] * b.en[2].s[y][
|
|
1820
|
+
x = b.mld_s[y] * b.en[2].s[y][G];
|
|
1821
1821
|
var F = Math.max(
|
|
1822
|
-
b.thm[3].s[y][
|
|
1823
|
-
Math.min(b.thm[2].s[y][
|
|
1822
|
+
b.thm[3].s[y][G],
|
|
1823
|
+
Math.min(b.thm[2].s[y][G], x)
|
|
1824
1824
|
);
|
|
1825
|
-
b.thm[2].s[y][
|
|
1825
|
+
b.thm[2].s[y][G] = Y, b.thm[3].s[y][G] = F;
|
|
1826
1826
|
}
|
|
1827
1827
|
}
|
|
1828
1828
|
function g(b, y, x) {
|
|
1829
1829
|
var Y = y, F = Math.pow(10, x);
|
|
1830
1830
|
y *= 2, Y *= 2;
|
|
1831
|
-
for (var
|
|
1831
|
+
for (var G = 0; G < D.SBMAX_l; G++) {
|
|
1832
1832
|
var C, E, B, $;
|
|
1833
|
-
if ($ = b.ATH.cb_l[b.bm_l[
|
|
1834
|
-
Math.max(b.thm[0].l[
|
|
1835
|
-
Math.max(b.thm[1].l[
|
|
1836
|
-
), E = Math.max(b.thm[2].l[
|
|
1833
|
+
if ($ = b.ATH.cb_l[b.bm_l[G]] * F, C = Math.min(
|
|
1834
|
+
Math.max(b.thm[0].l[G], $),
|
|
1835
|
+
Math.max(b.thm[1].l[G], $)
|
|
1836
|
+
), E = Math.max(b.thm[2].l[G], $), B = Math.max(b.thm[3].l[G], $), C * y < E + B) {
|
|
1837
1837
|
var z = C * Y / (E + B);
|
|
1838
1838
|
E *= z, B *= z, ue(E + B > 0);
|
|
1839
1839
|
}
|
|
1840
|
-
b.thm[2].l[
|
|
1840
|
+
b.thm[2].l[G] = Math.min(E, b.thm[2].l[G]), b.thm[3].l[G] = Math.min(B, b.thm[3].l[G]);
|
|
1841
1841
|
}
|
|
1842
1842
|
F *= D.BLKSIZE_s / D.BLKSIZE;
|
|
1843
|
-
for (var
|
|
1843
|
+
for (var G = 0; G < D.SBMAX_s; G++)
|
|
1844
1844
|
for (var q = 0; q < 3; q++) {
|
|
1845
1845
|
var C, E, B, $;
|
|
1846
|
-
if ($ = b.ATH.cb_s[b.bm_s[
|
|
1847
|
-
Math.max(b.thm[0].s[
|
|
1848
|
-
Math.max(b.thm[1].s[
|
|
1849
|
-
), E = Math.max(b.thm[2].s[
|
|
1846
|
+
if ($ = b.ATH.cb_s[b.bm_s[G]] * F, C = Math.min(
|
|
1847
|
+
Math.max(b.thm[0].s[G][q], $),
|
|
1848
|
+
Math.max(b.thm[1].s[G][q], $)
|
|
1849
|
+
), E = Math.max(b.thm[2].s[G][q], $), B = Math.max(b.thm[3].s[G][q], $), C * y < E + B) {
|
|
1850
1850
|
var z = C * y / (E + B);
|
|
1851
1851
|
E *= z, B *= z, ue(E + B > 0);
|
|
1852
1852
|
}
|
|
1853
|
-
b.thm[2].s[
|
|
1854
|
-
b.thm[2].s[
|
|
1853
|
+
b.thm[2].s[G][q] = Math.min(
|
|
1854
|
+
b.thm[2].s[G][q],
|
|
1855
1855
|
E
|
|
1856
|
-
), b.thm[3].s[
|
|
1857
|
-
b.thm[3].s[
|
|
1856
|
+
), b.thm[3].s[G][q] = Math.min(
|
|
1857
|
+
b.thm[3].s[G][q],
|
|
1858
1858
|
B
|
|
1859
1859
|
);
|
|
1860
1860
|
}
|
|
1861
1861
|
}
|
|
1862
1862
|
function P(b, y, x, Y, F) {
|
|
1863
|
-
var
|
|
1864
|
-
for (
|
|
1865
|
-
for (var $ = b.bo_s[
|
|
1863
|
+
var G, C, E = 0, B = 0;
|
|
1864
|
+
for (G = C = 0; G < D.SBMAX_s; ++C, ++G) {
|
|
1865
|
+
for (var $ = b.bo_s[G], z = b.npart_s, q = $ < z ? $ : z; C < q; )
|
|
1866
1866
|
ue(y[C] >= 0), ue(x[C] >= 0), E += y[C], B += x[C], C++;
|
|
1867
|
-
if (b.en[Y].s[
|
|
1868
|
-
++
|
|
1867
|
+
if (b.en[Y].s[G][F] = E, b.thm[Y].s[G][F] = B, C >= z) {
|
|
1868
|
+
++G;
|
|
1869
1869
|
break;
|
|
1870
1870
|
}
|
|
1871
1871
|
ue(y[C] >= 0), ue(x[C] >= 0);
|
|
1872
1872
|
{
|
|
1873
|
-
var ce = b.PSY.bo_s_weight[
|
|
1874
|
-
E = ce * y[C], B = ce * x[C], b.en[Y].s[
|
|
1873
|
+
var ce = b.PSY.bo_s_weight[G], Ze = 1 - ce;
|
|
1874
|
+
E = ce * y[C], B = ce * x[C], b.en[Y].s[G][F] += E, b.thm[Y].s[G][F] += B, E = Ze * y[C], B = Ze * x[C];
|
|
1875
1875
|
}
|
|
1876
1876
|
}
|
|
1877
|
-
for (;
|
|
1878
|
-
b.en[Y].s[
|
|
1877
|
+
for (; G < D.SBMAX_s; ++G)
|
|
1878
|
+
b.en[Y].s[G][F] = 0, b.thm[Y].s[G][F] = 0;
|
|
1879
1879
|
}
|
|
1880
1880
|
function a(b, y, x, Y) {
|
|
1881
|
-
var F,
|
|
1882
|
-
for (F =
|
|
1883
|
-
for (var B = b.bo_l[F], $ = b.npart_l, z = B < $ ? B : $;
|
|
1884
|
-
ue(y[
|
|
1885
|
-
if (b.en[Y].l[F] = C, b.thm[Y].l[F] = E,
|
|
1881
|
+
var F, G, C = 0, E = 0;
|
|
1882
|
+
for (F = G = 0; F < D.SBMAX_l; ++G, ++F) {
|
|
1883
|
+
for (var B = b.bo_l[F], $ = b.npart_l, z = B < $ ? B : $; G < z; )
|
|
1884
|
+
ue(y[G] >= 0), ue(x[G] >= 0), C += y[G], E += x[G], G++;
|
|
1885
|
+
if (b.en[Y].l[F] = C, b.thm[Y].l[F] = E, G >= $) {
|
|
1886
1886
|
++F;
|
|
1887
1887
|
break;
|
|
1888
1888
|
}
|
|
1889
|
-
ue(y[
|
|
1889
|
+
ue(y[G] >= 0), ue(x[G] >= 0);
|
|
1890
1890
|
{
|
|
1891
1891
|
var q = b.PSY.bo_l_weight[F], ce = 1 - q;
|
|
1892
|
-
C = q * y[
|
|
1892
|
+
C = q * y[G], E = q * x[G], b.en[Y].l[F] += C, b.thm[Y].l[F] += E, C = ce * y[G], E = ce * x[G];
|
|
1893
1893
|
}
|
|
1894
1894
|
}
|
|
1895
1895
|
for (; F < D.SBMAX_l; ++F)
|
|
1896
1896
|
b.en[Y].l[F] = 0, b.thm[Y].l[F] = 0;
|
|
1897
1897
|
}
|
|
1898
|
-
function c(b, y, x, Y, F,
|
|
1898
|
+
function c(b, y, x, Y, F, G) {
|
|
1899
1899
|
var C = b.internal_flags, E, B;
|
|
1900
1900
|
for (B = E = 0; B < C.npart_s; ++B) {
|
|
1901
1901
|
for (var $ = 0, z = C.numlines_s[B], q = 0; q < z; ++q, ++E) {
|
|
1902
|
-
var ce = y[
|
|
1902
|
+
var ce = y[G][E];
|
|
1903
1903
|
$ += ce;
|
|
1904
1904
|
}
|
|
1905
1905
|
x[B] = $;
|
|
@@ -1924,8 +1924,8 @@ function qn() {
|
|
|
1924
1924
|
function M(b, y, x, Y) {
|
|
1925
1925
|
var F = b.internal_flags;
|
|
1926
1926
|
b.short_blocks == L0.short_block_coupled && !(y[0] != 0 && y[1] != 0) && (y[0] = y[1] = 0);
|
|
1927
|
-
for (var
|
|
1928
|
-
Y[
|
|
1927
|
+
for (var G = 0; G < F.channels_out; G++)
|
|
1928
|
+
Y[G] = D.NORM_TYPE, b.short_blocks == L0.short_block_dispensed && (y[G] = 1), b.short_blocks == L0.short_block_forced && (y[G] = 0), y[G] != 0 ? (ue(F.blocktype_old[G] != D.START_TYPE), F.blocktype_old[G] == D.SHORT_TYPE && (Y[G] = D.STOP_TYPE)) : (Y[G] = D.SHORT_TYPE, F.blocktype_old[G] == D.NORM_TYPE && (F.blocktype_old[G] = D.START_TYPE), F.blocktype_old[G] == D.STOP_TYPE && (F.blocktype_old[G] = D.SHORT_TYPE)), x[G] = F.blocktype_old[G], F.blocktype_old[G] = Y[G];
|
|
1929
1929
|
}
|
|
1930
1930
|
function L(b, y, x) {
|
|
1931
1931
|
return x >= 1 ? b : x <= 0 ? y : y > 0 ? Math.pow(b / y, x) * y : 0;
|
|
@@ -1948,9 +1948,9 @@ function qn() {
|
|
|
1948
1948
|
function ae(b, y) {
|
|
1949
1949
|
for (var x = 309.07, Y = 0; Y < D.SBMAX_s - 1; Y++)
|
|
1950
1950
|
for (var F = 0; F < 3; F++) {
|
|
1951
|
-
var
|
|
1952
|
-
if (ue(Y < ee.length),
|
|
1953
|
-
var C =
|
|
1951
|
+
var G = b.thm.s[Y][F];
|
|
1952
|
+
if (ue(Y < ee.length), G > 0) {
|
|
1953
|
+
var C = G * y, E = b.en.s[Y][F];
|
|
1954
1954
|
E > C && (E > C * 1e10 ? x += ee[Y] * (10 * e) : (ue(C > 0), x += ee[Y] * mt.FAST_LOG10(E / C)));
|
|
1955
1955
|
}
|
|
1956
1956
|
}
|
|
@@ -1984,48 +1984,48 @@ function qn() {
|
|
|
1984
1984
|
for (var x = 281.0575, Y = 0; Y < D.SBMAX_l - 1; Y++) {
|
|
1985
1985
|
var F = b.thm.l[Y];
|
|
1986
1986
|
if (ue(Y < le.length), F > 0) {
|
|
1987
|
-
var
|
|
1988
|
-
C >
|
|
1987
|
+
var G = F * y, C = b.en.l[Y];
|
|
1988
|
+
C > G && (C > G * 1e10 ? x += le[Y] * (10 * e) : (ue(G > 0), x += le[Y] * mt.FAST_LOG10(C / G)));
|
|
1989
1989
|
}
|
|
1990
1990
|
}
|
|
1991
1991
|
return x;
|
|
1992
1992
|
}
|
|
1993
1993
|
function _e(b, y, x, Y, F) {
|
|
1994
|
-
var
|
|
1995
|
-
for (
|
|
1994
|
+
var G, C;
|
|
1995
|
+
for (G = C = 0; G < b.npart_l; ++G) {
|
|
1996
1996
|
var E = 0, B = 0, $;
|
|
1997
|
-
for ($ = 0; $ < b.numlines_l[
|
|
1997
|
+
for ($ = 0; $ < b.numlines_l[G]; ++$, ++C) {
|
|
1998
1998
|
var z = y[C];
|
|
1999
1999
|
ue(z >= 0), E += z, B < z && (B = z);
|
|
2000
2000
|
}
|
|
2001
|
-
x[
|
|
2001
|
+
x[G] = E, Y[G] = B, F[G] = E * b.rnumlines_l[G], ue(b.rnumlines_l[G] >= 0), ue(E >= 0), ue(x[G] >= 0), ue(Y[G] >= 0), ue(F[G] >= 0);
|
|
2002
2002
|
}
|
|
2003
2003
|
}
|
|
2004
2004
|
function he(b, y, x, Y) {
|
|
2005
|
-
var F = H.length - 1,
|
|
2005
|
+
var F = H.length - 1, G = 0, C = x[G] + x[G + 1];
|
|
2006
2006
|
if (ue(C >= 0), C > 0) {
|
|
2007
|
-
var E = y[
|
|
2008
|
-
E < y[
|
|
2007
|
+
var E = y[G];
|
|
2008
|
+
E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_l[G] + b.numlines_l[G + 1] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_l[G] + b.numlines_l[G + 1] - 1));
|
|
2009
2009
|
var B = 0 | C;
|
|
2010
|
-
B > F && (B = F), Y[
|
|
2010
|
+
B > F && (B = F), Y[G] = B;
|
|
2011
2011
|
} else
|
|
2012
|
-
Y[
|
|
2013
|
-
for (
|
|
2014
|
-
if (C = x[
|
|
2015
|
-
var E = y[
|
|
2016
|
-
E < y[
|
|
2012
|
+
Y[G] = 0;
|
|
2013
|
+
for (G = 1; G < b.npart_l - 1; G++)
|
|
2014
|
+
if (C = x[G - 1] + x[G] + x[G + 1], ue(C >= 0), C > 0) {
|
|
2015
|
+
var E = y[G - 1];
|
|
2016
|
+
E < y[G] && (E = y[G]), E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_l[G - 1] + b.numlines_l[G] + b.numlines_l[G + 1] - 1 > 0), C = 20 * (E * 3 - C) / (C * (b.numlines_l[G - 1] + b.numlines_l[G] + b.numlines_l[G + 1] - 1));
|
|
2017
2017
|
var B = 0 | C;
|
|
2018
|
-
B > F && (B = F), Y[
|
|
2018
|
+
B > F && (B = F), Y[G] = B;
|
|
2019
2019
|
} else
|
|
2020
|
-
Y[
|
|
2021
|
-
if (ue(
|
|
2022
|
-
var E = y[
|
|
2023
|
-
E < y[
|
|
2020
|
+
Y[G] = 0;
|
|
2021
|
+
if (ue(G > 0), ue(G == b.npart_l - 1), C = x[G - 1] + x[G], ue(C >= 0), C > 0) {
|
|
2022
|
+
var E = y[G - 1];
|
|
2023
|
+
E < y[G] && (E = y[G]), ue(b.numlines_l[G - 1] + b.numlines_l[G] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_l[G - 1] + b.numlines_l[G] - 1));
|
|
2024
2024
|
var B = 0 | C;
|
|
2025
|
-
B > F && (B = F), Y[
|
|
2025
|
+
B > F && (B = F), Y[G] = B;
|
|
2026
2026
|
} else
|
|
2027
|
-
Y[
|
|
2028
|
-
ue(
|
|
2027
|
+
Y[G] = 0;
|
|
2028
|
+
ue(G == b.npart_l - 1);
|
|
2029
2029
|
}
|
|
2030
2030
|
var oe = [
|
|
2031
2031
|
-865163e-23 * 2,
|
|
@@ -2039,7 +2039,7 @@ function qn() {
|
|
|
2039
2039
|
-552212e-22 * 2,
|
|
2040
2040
|
-0.313819 * 2
|
|
2041
2041
|
];
|
|
2042
|
-
this.L3psycho_anal_ns = function(b, y, x, Y, F,
|
|
2042
|
+
this.L3psycho_anal_ns = function(b, y, x, Y, F, G, C, E, B, $) {
|
|
2043
2043
|
var z = b.internal_flags, q = kt([2, D.BLKSIZE]), ce = kt([2, 3, D.BLKSIZE_s]), Ze = je(D.CBANDS + 1), ie = je(D.CBANDS + 1), fe = je(D.CBANDS + 2), Q = h0(2), be = h0(2), Re, se, pe, te, Xe, ke, de, Ie, Te = kt([2, 576]), ge, Lt = h0(D.CBANDS + 2), Ae = h0(D.CBANDS + 2);
|
|
2044
2044
|
for (Dn.fill(Ae, 0), Re = z.channels_out, b.mode == MPEGMode.JOINT_STEREO && (Re = 4), b.VBR == W0.vbr_off ? ge = z.ResvMax == 0 ? 0 : z.ResvSize / z.ResvMax * 0.5 : b.VBR == W0.vbr_rh || b.VBR == W0.vbr_mtrh || b.VBR == W0.vbr_mt ? ge = 0.6 : ge = 1, se = 0; se < z.channels_out; se++) {
|
|
2045
2045
|
var Be = y[se], ct = x + 576 - 350 - w + 192;
|
|
@@ -2049,7 +2049,7 @@ function qn() {
|
|
|
2049
2049
|
xt += oe[Xe] * (Be[ct + te + Xe] + Be[ct + te + w - Xe]), Ht += oe[Xe + 1] * (Be[ct + te + Xe + 1] + Be[ct + te + w - Xe - 1]);
|
|
2050
2050
|
Te[se][te] = xt + Ht;
|
|
2051
2051
|
}
|
|
2052
|
-
F[Y][se].en.assign(z.en[se]), F[Y][se].thm.assign(z.thm[se]), Re > 2 && (
|
|
2052
|
+
F[Y][se].en.assign(z.en[se]), F[Y][se].thm.assign(z.thm[se]), Re > 2 && (G[Y][se].en.assign(z.en[se + 2]), G[Y][se].thm.assign(z.thm[se + 2]));
|
|
2053
2053
|
}
|
|
2054
2054
|
for (se = 0; se < Re; se++) {
|
|
2055
2055
|
var Jt, Et, nt = je(12), zt = [0, 0, 0, 0], T0 = je(12), _i = 1, os, cs = je(D.CBANDS), ds = je(D.CBANDS), Fe = [0, 0, 0, 0], ms = je(D.HBLKSIZE), us = kt([3, D.HBLKSIZE_s]);
|
|
@@ -2057,8 +2057,8 @@ function qn() {
|
|
|
2057
2057
|
nt[te] = z.nsPsy.last_en_subshort[se][te + 6], ue(z.nsPsy.last_en_subshort[se][te + 4] > 0), T0[te] = nt[te] / z.nsPsy.last_en_subshort[se][te + 4], zt[0] += nt[te];
|
|
2058
2058
|
if (se == 2)
|
|
2059
2059
|
for (te = 0; te < 576; te++) {
|
|
2060
|
-
var
|
|
2061
|
-
|
|
2060
|
+
var Si, Gi;
|
|
2061
|
+
Si = Te[0][te], Gi = Te[1][te], Te[0][te] = Si + Gi, Te[1][te] = Si - Gi;
|
|
2062
2062
|
}
|
|
2063
2063
|
{
|
|
2064
2064
|
var hs = Te[se & 1], g0 = 0;
|
|
@@ -2146,11 +2146,11 @@ function qn() {
|
|
|
2146
2146
|
}
|
|
2147
2147
|
for (M(b, be, $, Q), se = 0; se < Re; se++) {
|
|
2148
2148
|
var J0, E0 = 0, ei, ti;
|
|
2149
|
-
se > 1 ? (J0 = E, E0 = -2, ei = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (ei = D.SHORT_TYPE), ti =
|
|
2149
|
+
se > 1 ? (J0 = E, E0 = -2, ei = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (ei = D.SHORT_TYPE), ti = G[Y][se - 2]) : (J0 = C, E0 = 0, ei = $[se], ti = F[Y][se]), ei == D.SHORT_TYPE ? J0[E0 + se] = ae(ti, z.masking_lower) : J0[E0 + se] = re(ti, z.masking_lower), b.analysis && (z.pinfo.pe[Y][se] = J0[E0 + se]);
|
|
2150
2150
|
}
|
|
2151
2151
|
return 0;
|
|
2152
2152
|
};
|
|
2153
|
-
function Le(b, y, x, Y, F,
|
|
2153
|
+
function Le(b, y, x, Y, F, G, C, E) {
|
|
2154
2154
|
var B = b.internal_flags;
|
|
2155
2155
|
if (Y < 2)
|
|
2156
2156
|
t.fft_long(B, C[E], Y, y, x);
|
|
@@ -2159,33 +2159,33 @@ function qn() {
|
|
|
2159
2159
|
var z = C[E + 0][$], q = C[E + 1][$];
|
|
2160
2160
|
C[E + 0][$] = (z + q) * mt.SQRT2 * 0.5, C[E + 1][$] = (z - q) * mt.SQRT2 * 0.5;
|
|
2161
2161
|
}
|
|
2162
|
-
|
|
2162
|
+
G[0] = C[E + 0][0], G[0] *= G[0];
|
|
2163
2163
|
for (var $ = D.BLKSIZE / 2 - 1; $ >= 0; --$) {
|
|
2164
2164
|
var ce = C[E + 0][D.BLKSIZE / 2 - $], Ze = C[E + 0][D.BLKSIZE / 2 + $];
|
|
2165
|
-
|
|
2165
|
+
G[D.BLKSIZE / 2 - $] = (ce * ce + Ze * Ze) * 0.5;
|
|
2166
2166
|
}
|
|
2167
2167
|
{
|
|
2168
2168
|
for (var ie = 0, $ = 11; $ < D.HBLKSIZE; $++)
|
|
2169
|
-
ie +=
|
|
2169
|
+
ie += G[$];
|
|
2170
2170
|
B.tot_ener[Y] = ie;
|
|
2171
2171
|
}
|
|
2172
2172
|
if (b.analysis) {
|
|
2173
2173
|
for (var $ = 0; $ < D.HBLKSIZE; $++)
|
|
2174
|
-
B.pinfo.energy[F][Y][$] = B.pinfo.energy_save[Y][$], B.pinfo.energy_save[Y][$] =
|
|
2174
|
+
B.pinfo.energy[F][Y][$] = B.pinfo.energy_save[Y][$], B.pinfo.energy_save[Y][$] = G[$];
|
|
2175
2175
|
B.pinfo.pe[F][Y] = B.pe[Y];
|
|
2176
2176
|
}
|
|
2177
2177
|
}
|
|
2178
|
-
function ze(b, y, x, Y, F,
|
|
2178
|
+
function ze(b, y, x, Y, F, G, C, E) {
|
|
2179
2179
|
var B = b.internal_flags;
|
|
2180
2180
|
if (F == 0 && Y < 2 && t.fft_short(B, C[E], Y, y, x), Y == 2)
|
|
2181
2181
|
for (var $ = D.BLKSIZE_s - 1; $ >= 0; --$) {
|
|
2182
2182
|
var z = C[E + 0][F][$], q = C[E + 1][F][$];
|
|
2183
2183
|
C[E + 0][F][$] = (z + q) * mt.SQRT2 * 0.5, C[E + 1][F][$] = (z - q) * mt.SQRT2 * 0.5;
|
|
2184
2184
|
}
|
|
2185
|
-
|
|
2185
|
+
G[F][0] = C[E + 0][F][0], G[F][0] *= G[F][0];
|
|
2186
2186
|
for (var $ = D.BLKSIZE_s / 2 - 1; $ >= 0; --$) {
|
|
2187
2187
|
var ce = C[E + 0][F][D.BLKSIZE_s / 2 - $], Ze = C[E + 0][F][D.BLKSIZE_s / 2 + $];
|
|
2188
|
-
|
|
2188
|
+
G[F][D.BLKSIZE_s / 2 - $] = (ce * ce + Ze * Ze) * 0.5;
|
|
2189
2189
|
}
|
|
2190
2190
|
}
|
|
2191
2191
|
function We(b, y, x, Y) {
|
|
@@ -2204,7 +2204,7 @@ function qn() {
|
|
|
2204
2204
|
-552212e-22 * 2,
|
|
2205
2205
|
-0.313819 * 2
|
|
2206
2206
|
];
|
|
2207
|
-
function Ke(b, y, x, Y, F,
|
|
2207
|
+
function Ke(b, y, x, Y, F, G, C, E, B, $) {
|
|
2208
2208
|
for (var z = kt([2, 576]), q = b.internal_flags, ce = q.channels_out, Ze = b.mode == MPEGMode.JOINT_STEREO ? 4 : ce, ie = 0; ie < ce; ie++) {
|
|
2209
2209
|
firbuf = y[ie];
|
|
2210
2210
|
var fe = x + 576 - 350 - w + 192;
|
|
@@ -2216,7 +2216,7 @@ function qn() {
|
|
|
2216
2216
|
be += we[se] * (firbuf[fe + Q + se] + firbuf[fe + Q + w - se]), Re += we[se + 1] * (firbuf[fe + Q + se + 1] + firbuf[fe + Q + w - se - 1]);
|
|
2217
2217
|
z[ie][Q] = be + Re;
|
|
2218
2218
|
}
|
|
2219
|
-
F[Y][ie].en.assign(q.en[ie]), F[Y][ie].thm.assign(q.thm[ie]), Ze > 2 && (
|
|
2219
|
+
F[Y][ie].en.assign(q.en[ie]), F[Y][ie].thm.assign(q.thm[ie]), Ze > 2 && (G[Y][ie].en.assign(q.en[ie + 2]), G[Y][ie].thm.assign(q.thm[ie + 2]));
|
|
2220
2220
|
}
|
|
2221
2221
|
for (var ie = 0; ie < Ze; ie++) {
|
|
2222
2222
|
var pe = je(12), te = je(12), Xe = [0, 0, 0, 0], ke = z[ie & 1], de = 0, Ie = ie == 3 ? q.nsPsy.attackthre_s : q.nsPsy.attackthre, Te = 1;
|
|
@@ -2260,37 +2260,37 @@ function qn() {
|
|
|
2260
2260
|
b.nb_2[y][x] = b.nb_1[y][x], b.nb_1[y][x] = 0;
|
|
2261
2261
|
}
|
|
2262
2262
|
function a0(b, y, x, Y) {
|
|
2263
|
-
var F = H.length - 1,
|
|
2263
|
+
var F = H.length - 1, G = 0, C = x[G] + x[G + 1];
|
|
2264
2264
|
if (ue(C >= 0), C > 0) {
|
|
2265
|
-
var E = y[
|
|
2266
|
-
E < y[
|
|
2265
|
+
var E = y[G];
|
|
2266
|
+
E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_s[G] + b.numlines_s[G + 1] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_s[G] + b.numlines_s[G + 1] - 1));
|
|
2267
2267
|
var B = 0 | C;
|
|
2268
|
-
B > F && (B = F), Y[
|
|
2268
|
+
B > F && (B = F), Y[G] = B;
|
|
2269
2269
|
} else
|
|
2270
|
-
Y[
|
|
2271
|
-
for (
|
|
2272
|
-
if (C = x[
|
|
2273
|
-
var E = y[
|
|
2274
|
-
E < y[
|
|
2270
|
+
Y[G] = 0;
|
|
2271
|
+
for (G = 1; G < b.npart_s - 1; G++)
|
|
2272
|
+
if (C = x[G - 1] + x[G] + x[G + 1], ue(G + 1 < b.npart_s), ue(C >= 0), C > 0) {
|
|
2273
|
+
var E = y[G - 1];
|
|
2274
|
+
E < y[G] && (E = y[G]), E < y[G + 1] && (E = y[G + 1]), ue(b.numlines_s[G - 1] + b.numlines_s[G] + b.numlines_s[G + 1] - 1 > 0), C = 20 * (E * 3 - C) / (C * (b.numlines_s[G - 1] + b.numlines_s[G] + b.numlines_s[G + 1] - 1));
|
|
2275
2275
|
var B = 0 | C;
|
|
2276
|
-
B > F && (B = F), Y[
|
|
2276
|
+
B > F && (B = F), Y[G] = B;
|
|
2277
2277
|
} else
|
|
2278
|
-
Y[
|
|
2279
|
-
if (ue(
|
|
2280
|
-
var E = y[
|
|
2281
|
-
E < y[
|
|
2278
|
+
Y[G] = 0;
|
|
2279
|
+
if (ue(G > 0), ue(G == b.npart_s - 1), C = x[G - 1] + x[G], ue(C >= 0), C > 0) {
|
|
2280
|
+
var E = y[G - 1];
|
|
2281
|
+
E < y[G] && (E = y[G]), ue(b.numlines_s[G - 1] + b.numlines_s[G] - 1 > 0), C = 20 * (E * 2 - C) / (C * (b.numlines_s[G - 1] + b.numlines_s[G] - 1));
|
|
2282
2282
|
var B = 0 | C;
|
|
2283
|
-
B > F && (B = F), Y[
|
|
2283
|
+
B > F && (B = F), Y[G] = B;
|
|
2284
2284
|
} else
|
|
2285
|
-
Y[
|
|
2286
|
-
ue(
|
|
2285
|
+
Y[G] = 0;
|
|
2286
|
+
ue(G == b.npart_s - 1);
|
|
2287
2287
|
}
|
|
2288
|
-
function gt(b, y, x, Y, F,
|
|
2288
|
+
function gt(b, y, x, Y, F, G) {
|
|
2289
2289
|
var C = b.internal_flags, E = new float[D.CBANDS](), B = je(D.CBANDS), $, z, q, ce = new int[D.CBANDS]();
|
|
2290
2290
|
for (q = z = 0; q < C.npart_s; ++q) {
|
|
2291
2291
|
var Ze = 0, ie = 0, fe = C.numlines_s[q];
|
|
2292
2292
|
for ($ = 0; $ < fe; ++$, ++z) {
|
|
2293
|
-
var Q = y[
|
|
2293
|
+
var Q = y[G][z];
|
|
2294
2294
|
Ze += Q, ie < Q && (ie = Q);
|
|
2295
2295
|
}
|
|
2296
2296
|
x[q] = Ze, ue(Ze >= 0), E[q] = ie, ue(fe > 0), B[q] = Ze / fe, ue(B[q] >= 0);
|
|
@@ -2307,8 +2307,8 @@ function qn() {
|
|
|
2307
2307
|
x[q] = 0, Y[q] = 0;
|
|
2308
2308
|
}
|
|
2309
2309
|
function Ft(b, y, x, Y, F) {
|
|
2310
|
-
var
|
|
2311
|
-
_e(b, y, x,
|
|
2310
|
+
var G = je(D.CBANDS), C = je(D.CBANDS), E = h0(D.CBANDS + 2), B;
|
|
2311
|
+
_e(b, y, x, G, C), he(b, G, C, E);
|
|
2312
2312
|
var $ = 0;
|
|
2313
2313
|
for (B = 0; B < b.npart_l; B++) {
|
|
2314
2314
|
var z, q, ce, Ze, ie = b.s3ind[B][0], fe = b.s3ind[B][1], Q = 0, be = 0;
|
|
@@ -2321,7 +2321,7 @@ function qn() {
|
|
|
2321
2321
|
var se = n * b.nb_2[F][B], pe = i * b.nb_1[F][B], Re;
|
|
2322
2322
|
se <= 0 && (se = q), pe <= 0 && (pe = q), b.blocktype_old[F & 1] == D.NORM_TYPE ? Re = Math.min(pe, se) : Re = pe, Y[B] = Math.min(q, Re);
|
|
2323
2323
|
}
|
|
2324
|
-
b.nb_2[F][B] = b.nb_1[F][B], b.nb_1[F][B] = q, z =
|
|
2324
|
+
b.nb_2[F][B] = b.nb_1[F][B], b.nb_1[F][B] = q, z = G[B], z *= b.minval_l[B], z *= ce, Y[B] > z && (Y[B] = z), b.masking_lower > 1 && (Y[B] *= b.masking_lower), Y[B] > x[B] && (Y[B] = x[B]), b.masking_lower < 1 && (Y[B] *= b.masking_lower), ue(Y[B] >= 0);
|
|
2325
2325
|
}
|
|
2326
2326
|
for (; B < D.CBANDS; ++B)
|
|
2327
2327
|
x[B] = 0, Y[B] = 0;
|
|
@@ -2334,19 +2334,19 @@ function qn() {
|
|
|
2334
2334
|
}
|
|
2335
2335
|
function $0(b, y, x) {
|
|
2336
2336
|
for (var Y = b.internal_flags, F = 0; F < Y.channels_out; F++) {
|
|
2337
|
-
var
|
|
2338
|
-
y[F] != 0 ? (ue(Y.blocktype_old[F] != D.START_TYPE), Y.blocktype_old[F] == D.SHORT_TYPE && (
|
|
2337
|
+
var G = D.NORM_TYPE;
|
|
2338
|
+
y[F] != 0 ? (ue(Y.blocktype_old[F] != D.START_TYPE), Y.blocktype_old[F] == D.SHORT_TYPE && (G = D.STOP_TYPE)) : (G = D.SHORT_TYPE, Y.blocktype_old[F] == D.NORM_TYPE && (Y.blocktype_old[F] = D.START_TYPE), Y.blocktype_old[F] == D.STOP_TYPE && (Y.blocktype_old[F] = D.SHORT_TYPE)), x[F] = Y.blocktype_old[F], Y.blocktype_old[F] = G;
|
|
2339
2339
|
}
|
|
2340
2340
|
}
|
|
2341
|
-
function C0(b, y, x, Y, F,
|
|
2342
|
-
for (var E =
|
|
2341
|
+
function C0(b, y, x, Y, F, G, C) {
|
|
2342
|
+
for (var E = G * 2, B = G > 0 ? Math.pow(10, F) : 1, $, z, q = 0; q < C; ++q) {
|
|
2343
2343
|
var ce = b[2][q], Ze = b[3][q], ie = y[0][q], fe = y[1][q], Q = y[2][q], be = y[3][q];
|
|
2344
2344
|
if (ie <= 1.58 * fe && fe <= 1.58 * ie) {
|
|
2345
2345
|
var Re = x[q] * Ze, se = x[q] * ce;
|
|
2346
2346
|
z = Math.max(Q, Math.min(be, Re)), $ = Math.max(be, Math.min(Q, se));
|
|
2347
2347
|
} else
|
|
2348
2348
|
z = Q, $ = be;
|
|
2349
|
-
if (
|
|
2349
|
+
if (G > 0) {
|
|
2350
2350
|
var pe, te, Xe = Y[q] * B;
|
|
2351
2351
|
if (pe = Math.min(Math.max(ie, Xe), Math.max(fe, Xe)), Q = Math.max(z, Xe), be = Math.max($, Xe), te = Q + be, te > 0 && pe * E < te) {
|
|
2352
2352
|
var ke = pe * E / te;
|
|
@@ -2357,7 +2357,7 @@ function qn() {
|
|
|
2357
2357
|
z > ce && (z = ce), $ > Ze && ($ = Ze), y[2][q] = z, y[3][q] = $;
|
|
2358
2358
|
}
|
|
2359
2359
|
}
|
|
2360
|
-
this.L3psycho_anal_vbr = function(b, y, x, Y, F,
|
|
2360
|
+
this.L3psycho_anal_vbr = function(b, y, x, Y, F, G, C, E, B, $) {
|
|
2361
2361
|
var z = b.internal_flags, q, ce, Ze = je(D.HBLKSIZE), ie = kt([3, D.HBLKSIZE_s]), fe = kt([2, D.BLKSIZE]), Q = kt([2, 3, D.BLKSIZE_s]), be = kt([4, D.CBANDS]), Re = kt([4, D.CBANDS]), se = kt([4, 3]), pe = 0.6, te = [
|
|
2362
2362
|
[0, 0, 0, 0],
|
|
2363
2363
|
[0, 0, 0, 0],
|
|
@@ -2370,7 +2370,7 @@ function qn() {
|
|
|
2370
2370
|
x,
|
|
2371
2371
|
Y,
|
|
2372
2372
|
F,
|
|
2373
|
-
|
|
2373
|
+
G,
|
|
2374
2374
|
B,
|
|
2375
2375
|
se,
|
|
2376
2376
|
te,
|
|
@@ -2497,7 +2497,7 @@ function qn() {
|
|
|
2497
2497
|
$0(b, Xe, $);
|
|
2498
2498
|
for (var de = 0; de < ke; de++) {
|
|
2499
2499
|
var xt, Ht, Jt, Et;
|
|
2500
|
-
de > 1 ? (xt = E, Ht = -2, Jt = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (Jt = D.SHORT_TYPE), Et =
|
|
2500
|
+
de > 1 ? (xt = E, Ht = -2, Jt = D.NORM_TYPE, ($[0] == D.SHORT_TYPE || $[1] == D.SHORT_TYPE) && (Jt = D.SHORT_TYPE), Et = G[Y][de - 2]) : (xt = C, Ht = 0, Jt = $[de], Et = F[Y][de]), Jt == D.SHORT_TYPE ? xt[Ht + de] = ae(Et, z.masking_lower) : xt[Ht + de] = re(Et, z.masking_lower), b.analysis && (z.pinfo.pe[Y][de] = xt[Ht + de]);
|
|
2501
2501
|
}
|
|
2502
2502
|
return 0;
|
|
2503
2503
|
};
|
|
@@ -2508,20 +2508,20 @@ function qn() {
|
|
|
2508
2508
|
function q0(b) {
|
|
2509
2509
|
var y = 0, x = 0;
|
|
2510
2510
|
{
|
|
2511
|
-
var Y = 0, F,
|
|
2511
|
+
var Y = 0, F, G;
|
|
2512
2512
|
for (Y = 0; Mt(Y, b) > 1e-20; Y -= 1)
|
|
2513
2513
|
;
|
|
2514
|
-
for (F = Y,
|
|
2515
|
-
Y = (
|
|
2514
|
+
for (F = Y, G = 0; Math.abs(G - F) > 1e-12; )
|
|
2515
|
+
Y = (G + F) / 2, Mt(Y, b) > 0 ? G = Y : F = Y;
|
|
2516
2516
|
y = F;
|
|
2517
2517
|
}
|
|
2518
2518
|
{
|
|
2519
|
-
var Y = 0, F,
|
|
2519
|
+
var Y = 0, F, G;
|
|
2520
2520
|
for (Y = 0; Mt(Y, b) > 1e-20; Y += 1)
|
|
2521
2521
|
;
|
|
2522
|
-
for (F = 0,
|
|
2523
|
-
Y = (
|
|
2524
|
-
x =
|
|
2522
|
+
for (F = 0, G = Y; Math.abs(G - F) > 1e-12; )
|
|
2523
|
+
Y = (G + F) / 2, Mt(Y, b) > 0 ? F = Y : G = Y;
|
|
2524
|
+
x = G;
|
|
2525
2525
|
}
|
|
2526
2526
|
{
|
|
2527
2527
|
var C = 0, E = 1e3, B;
|
|
@@ -2542,7 +2542,7 @@ function qn() {
|
|
|
2542
2542
|
function o0(b) {
|
|
2543
2543
|
return b < 0 && (b = 0), b = b * 1e-3, 13 * Math.atan(0.76 * b) + 3.5 * Math.atan(b * b / (7.5 * 7.5));
|
|
2544
2544
|
}
|
|
2545
|
-
function rs(b, y, x, Y, F,
|
|
2545
|
+
function rs(b, y, x, Y, F, G, C, E, B, $, z, q) {
|
|
2546
2546
|
var ce = je(D.CBANDS + 1), Ze = E / (q > 15 ? 2 * 576 : 2 * 192), ie = h0(D.HBLKSIZE), fe;
|
|
2547
2547
|
E /= B;
|
|
2548
2548
|
var Q = 0, be = 0;
|
|
@@ -2562,7 +2562,7 @@ function qn() {
|
|
|
2562
2562
|
var te, Xe, ke, de, Ie;
|
|
2563
2563
|
ke = $[pe], de = $[pe + 1], te = 0 | Math.floor(0.5 + z * (ke - 0.5)), te < 0 && (te = 0), Xe = 0 | Math.floor(0.5 + z * (de - 0.5)), Xe > B / 2 && (Xe = B / 2), x[pe] = (ie[te] + ie[Xe]) / 2, y[pe] = ie[Xe];
|
|
2564
2564
|
var Te = Ze * de;
|
|
2565
|
-
C[pe] = (Te - ce[y[pe]]) / (ce[y[pe] + 1] - ce[y[pe]]), C[pe] < 0 ? C[pe] = 0 : C[pe] > 1 && (C[pe] = 1), Ie = o0(E * $[pe] * z), Ie = Math.min(Ie, 15.5) / 15.5,
|
|
2565
|
+
C[pe] = (Te - ce[y[pe]]) / (ce[y[pe] + 1] - ce[y[pe]]), C[pe] < 0 ? C[pe] = 0 : C[pe] > 1 && (C[pe] = 1), Ie = o0(E * $[pe] * z), Ie = Math.min(Ie, 15.5) / 15.5, G[pe] = Math.pow(
|
|
2566
2566
|
10,
|
|
2567
2567
|
1.25 * (1 - Math.cos(Math.PI * Ie)) - 2.5
|
|
2568
2568
|
);
|
|
@@ -2574,9 +2574,9 @@ function qn() {
|
|
|
2574
2574
|
}
|
|
2575
2575
|
return be;
|
|
2576
2576
|
}
|
|
2577
|
-
function as(b, y, x, Y, F,
|
|
2577
|
+
function as(b, y, x, Y, F, G) {
|
|
2578
2578
|
var C = kt([D.CBANDS, D.CBANDS]), E, B = 0;
|
|
2579
|
-
if (
|
|
2579
|
+
if (G)
|
|
2580
2580
|
for (var $ = 0; $ < y; $++)
|
|
2581
2581
|
for (E = 0; E < y; E++) {
|
|
2582
2582
|
var z = Xi(x[$] - x[E]) * Y[E];
|
|
@@ -2608,7 +2608,7 @@ function qn() {
|
|
|
2608
2608
|
);
|
|
2609
2609
|
}
|
|
2610
2610
|
this.psymodel_init = function(b) {
|
|
2611
|
-
var y = b.internal_flags, x, Y = !0, F = 13,
|
|
2611
|
+
var y = b.internal_flags, x, Y = !0, F = 13, G = 24, C = 0, E = 0, B = -8.25, $ = -4.5, z = je(D.CBANDS), q = je(D.CBANDS), ce = je(D.CBANDS), Ze = b.out_samplerate;
|
|
2612
2612
|
switch (b.experimentalZ) {
|
|
2613
2613
|
default:
|
|
2614
2614
|
case 0:
|
|
@@ -2652,7 +2652,7 @@ function qn() {
|
|
|
2652
2652
|
D.SBMAX_l
|
|
2653
2653
|
), ue(y.npart_l < D.CBANDS), x = 0; x < y.npart_l; x++) {
|
|
2654
2654
|
var fe = C;
|
|
2655
|
-
z[x] >= F && (fe = E * (z[x] - F) / (
|
|
2655
|
+
z[x] >= F && (fe = E * (z[x] - F) / (G - F) + C * (G - z[x]) / (G - F)), ce[x] = Math.pow(10, fe / 10), y.numlines_l[x] > 0 ? y.rnumlines_l[x] = 1 / y.numlines_l[x] : y.rnumlines_l[x] = 0;
|
|
2656
2656
|
}
|
|
2657
2657
|
y.s3_ll = as(
|
|
2658
2658
|
y.s3ind,
|
|
@@ -2665,7 +2665,7 @@ function qn() {
|
|
|
2665
2665
|
var Q = 0;
|
|
2666
2666
|
for (x = 0; x < y.npart_l; x++) {
|
|
2667
2667
|
var be;
|
|
2668
|
-
be =
|
|
2668
|
+
be = Ss.MAX_VALUE;
|
|
2669
2669
|
for (var Re = 0; Re < y.numlines_l[x]; Re++, Q++) {
|
|
2670
2670
|
var se = Ze * Q / (1e3 * D.BLKSIZE), pe;
|
|
2671
2671
|
pe = this.ATHformula(se * 1e3, b) - 20, pe = Math.pow(10, 0.1 * pe), pe *= y.numlines_l[x], be > pe && (be = pe);
|
|
@@ -2687,7 +2687,7 @@ function qn() {
|
|
|
2687
2687
|
D.SBMAX_s
|
|
2688
2688
|
), ue(y.npart_s < D.CBANDS), Q = 0, x = 0; x < y.npart_s; x++) {
|
|
2689
2689
|
var be, fe = B;
|
|
2690
|
-
z[x] >= F && (fe = $ * (z[x] - F) / (
|
|
2690
|
+
z[x] >= F && (fe = $ * (z[x] - F) / (G - F) + B * (G - z[x]) / (G - F)), ce[x] = Math.pow(10, fe / 10), be = Ss.MAX_VALUE;
|
|
2691
2691
|
for (var Re = 0; Re < y.numlines_s[x]; Re++, Q++) {
|
|
2692
2692
|
var se = Ze * Q / (1e3 * D.BLKSIZE_s), pe;
|
|
2693
2693
|
pe = this.ATHformula(se * 1e3, b) - 20, pe = Math.pow(10, 0.1 * pe), pe *= y.numlines_s[x], be > pe && (be = pe);
|
|
@@ -2701,7 +2701,7 @@ function qn() {
|
|
|
2701
2701
|
q,
|
|
2702
2702
|
ce,
|
|
2703
2703
|
Y
|
|
2704
|
-
), p(), t.init_fft(y), y.decay = Math.exp(-1 * e / (
|
|
2704
|
+
), p(), t.init_fft(y), y.decay = Math.exp(-1 * e / (S * Ze / 192));
|
|
2705
2705
|
{
|
|
2706
2706
|
var te;
|
|
2707
2707
|
te = O, b.exp_nspsytune & 2 && (te = 1), Math.abs(b.msfix) > 0 && (te = b.msfix), b.msfix = te;
|
|
@@ -2817,12 +2817,12 @@ Zt.new_byte;
|
|
|
2817
2817
|
Zt.new_double;
|
|
2818
2818
|
Zt.new_float;
|
|
2819
2819
|
Zt.new_float_n;
|
|
2820
|
-
var
|
|
2820
|
+
var Gs = Zt.new_int;
|
|
2821
2821
|
Zt.new_int_n;
|
|
2822
2822
|
Zt.assert;
|
|
2823
2823
|
var lr = rn;
|
|
2824
2824
|
function or() {
|
|
2825
|
-
this.tt = [[null, null], [null, null]], this.main_data_begin = 0, this.private_bits = 0, this.resvDrain_pre = 0, this.resvDrain_post = 0, this.scfsi = [
|
|
2825
|
+
this.tt = [[null, null], [null, null]], this.main_data_begin = 0, this.private_bits = 0, this.resvDrain_pre = 0, this.resvDrain_post = 0, this.scfsi = [Gs(4), Gs(4)];
|
|
2826
2826
|
for (var t = 0; t < 2; t++)
|
|
2827
2827
|
for (var e = 0; e < 2; e++)
|
|
2828
2828
|
this.tt[t][e] = new lr();
|
|
@@ -2868,17 +2868,17 @@ var br = hr;
|
|
|
2868
2868
|
function pr() {
|
|
2869
2869
|
this.sum = 0, this.seen = 0, this.want = 0, this.pos = 0, this.size = 0, this.bag = null, this.nVbrNumFrames = 0, this.nBytesWritten = 0, this.TotalFrameSize = 0;
|
|
2870
2870
|
}
|
|
2871
|
-
var yr = pr,
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
var fr =
|
|
2880
|
-
|
|
2881
|
-
var Xr = cr, _r = an,
|
|
2871
|
+
var yr = pr, St = it;
|
|
2872
|
+
St.System;
|
|
2873
|
+
St.VbrMode;
|
|
2874
|
+
St.Float;
|
|
2875
|
+
St.ShortBlock;
|
|
2876
|
+
St.Util;
|
|
2877
|
+
St.Arrays;
|
|
2878
|
+
St.new_array_n;
|
|
2879
|
+
var fr = St.new_byte, Zr = St.new_double, Bt = St.new_float, p0 = St.new_float_n, Nt = St.new_int, ri = St.new_int_n;
|
|
2880
|
+
St.assert;
|
|
2881
|
+
var Xr = cr, _r = an, Sr = br, Gr = yr, Is = sn(), Pe = bt(), vr = Qi;
|
|
2882
2882
|
n0.MFSIZE = 3 * 1152 + Pe.ENCDELAY - Pe.MDCTDELAY;
|
|
2883
2883
|
n0.MAX_HEADER_BUF = 256;
|
|
2884
2884
|
n0.MAX_BITS_PER_CHANNEL = 4095;
|
|
@@ -2890,7 +2890,7 @@ function n0() {
|
|
|
2890
2890
|
function e() {
|
|
2891
2891
|
this.write_timing = 0, this.ptr = 0, this.buf = fr(t);
|
|
2892
2892
|
}
|
|
2893
|
-
this.header = new Array(n0.MAX_HEADER_BUF), this.h_ptr = 0, this.w_ptr = 0, this.ancillary_flag = 0, this.ResvSize = 0, this.ResvMax = 0, this.scalefac_band = new _r(), this.minval_l = Bt(Pe.CBANDS), this.minval_s = Bt(Pe.CBANDS), this.nb_1 = p0([4, Pe.CBANDS]), this.nb_2 = p0([4, Pe.CBANDS]), this.nb_s1 = p0([4, Pe.CBANDS]), this.nb_s2 = p0([4, Pe.CBANDS]), this.s3_ss = null, this.s3_ll = null, this.decay = 0, this.thm = new Array(4), this.en = new Array(4), this.tot_ener = Bt(4), this.loudness_sq = p0([2, 2]), this.loudness_sq_save = Bt(2), this.mld_l = Bt(Pe.SBMAX_l), this.mld_s = Bt(Pe.SBMAX_s), this.bm_l = Nt(Pe.SBMAX_l), this.bo_l = Nt(Pe.SBMAX_l), this.bm_s = Nt(Pe.SBMAX_s), this.bo_s = Nt(Pe.SBMAX_s), this.npart_l = 0, this.npart_s = 0, this.s3ind = ri([Pe.CBANDS, 2]), this.s3ind_s = ri([Pe.CBANDS, 2]), this.numlines_s = Nt(Pe.CBANDS), this.numlines_l = Nt(Pe.CBANDS), this.rnumlines_l = Bt(Pe.CBANDS), this.mld_cb_l = Bt(Pe.CBANDS), this.mld_cb_s = Bt(Pe.CBANDS), this.numlines_s_num1 = 0, this.numlines_l_num1 = 0, this.pe = Bt(4), this.ms_ratio_s_old = 0, this.ms_ratio_l_old = 0, this.ms_ener_ratio_old = 0, this.blocktype_old = Nt(2), this.nsPsy = new
|
|
2893
|
+
this.header = new Array(n0.MAX_HEADER_BUF), this.h_ptr = 0, this.w_ptr = 0, this.ancillary_flag = 0, this.ResvSize = 0, this.ResvMax = 0, this.scalefac_band = new _r(), this.minval_l = Bt(Pe.CBANDS), this.minval_s = Bt(Pe.CBANDS), this.nb_1 = p0([4, Pe.CBANDS]), this.nb_2 = p0([4, Pe.CBANDS]), this.nb_s1 = p0([4, Pe.CBANDS]), this.nb_s2 = p0([4, Pe.CBANDS]), this.s3_ss = null, this.s3_ll = null, this.decay = 0, this.thm = new Array(4), this.en = new Array(4), this.tot_ener = Bt(4), this.loudness_sq = p0([2, 2]), this.loudness_sq_save = Bt(2), this.mld_l = Bt(Pe.SBMAX_l), this.mld_s = Bt(Pe.SBMAX_s), this.bm_l = Nt(Pe.SBMAX_l), this.bo_l = Nt(Pe.SBMAX_l), this.bm_s = Nt(Pe.SBMAX_s), this.bo_s = Nt(Pe.SBMAX_s), this.npart_l = 0, this.npart_s = 0, this.s3ind = ri([Pe.CBANDS, 2]), this.s3ind_s = ri([Pe.CBANDS, 2]), this.numlines_s = Nt(Pe.CBANDS), this.numlines_l = Nt(Pe.CBANDS), this.rnumlines_l = Bt(Pe.CBANDS), this.mld_cb_l = Bt(Pe.CBANDS), this.mld_cb_s = Bt(Pe.CBANDS), this.numlines_s_num1 = 0, this.numlines_l_num1 = 0, this.pe = Bt(4), this.ms_ratio_s_old = 0, this.ms_ratio_l_old = 0, this.ms_ener_ratio_old = 0, this.blocktype_old = Nt(2), this.nsPsy = new Sr(), this.VBR_seek_table = new Gr(), this.ATH = null, this.PSY = null, this.nogap_total = 0, this.nogap_current = 0, this.decode_on_the_fly = !0, this.findReplayGain = !0, this.findPeakSample = !0, this.PeakSample = 0, this.RadioGain = 0, this.AudiophileGain = 0, this.rgdata = null, this.noclipGainChange = 0, this.noclipScale = 0, this.bitrate_stereoMode_Hist = ri([16, 5]), this.bitrate_blockType_Hist = ri([16, 6]), this.pinfo = null, this.hip = null, this.in_buffer_nsamples = 0, this.in_buffer_0 = null, this.in_buffer_1 = null, this.iteration_loop = null;
|
|
2894
2894
|
for (var i = 0; i < this.en.length; i++)
|
|
2895
2895
|
this.en[i] = new Is();
|
|
2896
2896
|
for (var i = 0; i < this.thm.length; i++)
|
|
@@ -2898,21 +2898,21 @@ function n0() {
|
|
|
2898
2898
|
for (var i = 0; i < this.header.length; i++)
|
|
2899
2899
|
this.header[i] = new e();
|
|
2900
2900
|
}
|
|
2901
|
-
var yi = n0,
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
2910
|
-
|
|
2911
|
-
var y0 =
|
|
2912
|
-
|
|
2913
|
-
|
|
2914
|
-
|
|
2915
|
-
|
|
2901
|
+
var yi = n0, Gt = it;
|
|
2902
|
+
Gt.System;
|
|
2903
|
+
Gt.VbrMode;
|
|
2904
|
+
Gt.Float;
|
|
2905
|
+
Gt.ShortBlock;
|
|
2906
|
+
Gt.Util;
|
|
2907
|
+
Gt.Arrays;
|
|
2908
|
+
Gt.new_array_n;
|
|
2909
|
+
Gt.new_byte;
|
|
2910
|
+
Gt.new_double;
|
|
2911
|
+
var y0 = Gt.new_float;
|
|
2912
|
+
Gt.new_float_n;
|
|
2913
|
+
Gt.new_int;
|
|
2914
|
+
Gt.new_int_n;
|
|
2915
|
+
Gt.assert;
|
|
2916
2916
|
var f0 = bt();
|
|
2917
2917
|
function Ir() {
|
|
2918
2918
|
this.useAdjust = 0, this.aaSensitivityP = 0, this.adjust = 0, this.adjustLimit = 0, this.decay = 0, this.floor = 0, this.l = y0(f0.SBMAX_l), this.s = y0(f0.SBMAX_s), this.psfb21 = y0(f0.PSFB21), this.psfb12 = y0(f0.PSFB12), this.cb_l = y0(f0.CBANDS), this.cb_s = y0(f0.CBANDS), this.eql_w = y0(f0.BLKSIZE / 2);
|
|
@@ -3232,7 +3232,7 @@ function Ce() {
|
|
|
3232
3232
|
for (; J-- != 0; )
|
|
3233
3233
|
w[N] = Z[O + 0] * U[0] - w[N - 1] * U[1] + Z[O - 1] * U[2] - w[N - 2] * U[3] + Z[O - 2] * U[4], ++N, ++O;
|
|
3234
3234
|
}
|
|
3235
|
-
function
|
|
3235
|
+
function S(Z, O) {
|
|
3236
3236
|
for (var w = 0; w < MAX_ORDER; w++)
|
|
3237
3237
|
Z.linprebuf[w] = Z.lstepbuf[w] = Z.loutbuf[w] = Z.rinprebuf[w] = Z.rstepbuf[w] = Z.routbuf[w] = 0;
|
|
3238
3238
|
switch (0 | O) {
|
|
@@ -3269,7 +3269,7 @@ function Ce() {
|
|
|
3269
3269
|
return Z.sampleWindow = 0 | (O * i + n - 1) / n, Z.lsum = 0, Z.rsum = 0, Z.totsamp = 0, Vs.ill(Z.A, 0), INIT_GAIN_ANALYSIS_OK;
|
|
3270
3270
|
}
|
|
3271
3271
|
this.InitGainAnalysis = function(Z, O) {
|
|
3272
|
-
return
|
|
3272
|
+
return S(Z, O) != INIT_GAIN_ANALYSIS_OK ? INIT_GAIN_ANALYSIS_ERROR : (Z.linpre = MAX_ORDER, Z.rinpre = MAX_ORDER, Z.lstep = MAX_ORDER, Z.rstep = MAX_ORDER, Z.lout = MAX_ORDER, Z.rout = MAX_ORDER, Vs.fill(Z.B, 0), INIT_GAIN_ANALYSIS_OK);
|
|
3273
3273
|
};
|
|
3274
3274
|
function W(Z) {
|
|
3275
3275
|
return Z * Z;
|
|
@@ -3448,7 +3448,7 @@ var Ws = Vt.assert, Hr = ln, Ls = bt(), Yr = Qi, wr = yi;
|
|
|
3448
3448
|
function Kr(t) {
|
|
3449
3449
|
var e = t;
|
|
3450
3450
|
this.quantize = e, this.iteration_loop = function(i, n, d, o) {
|
|
3451
|
-
var m = i.internal_flags, h = Ts(Yr.SFBMAX),
|
|
3451
|
+
var m = i.internal_flags, h = Ts(Yr.SFBMAX), S = Ts(576), W = xr(2), v = 0, Z, O = m.l3_side, w = new Hr(v);
|
|
3452
3452
|
this.quantize.rv.ResvFrameBegin(i, w), v = w.bits;
|
|
3453
3453
|
for (var N = 0; N < m.mode_gr; N++) {
|
|
3454
3454
|
Z = this.quantize.qupvt.on_pe(
|
|
@@ -3469,7 +3469,7 @@ function Kr(t) {
|
|
|
3469
3469
|
I.block_type != Ls.SHORT_TYPE ? (U = 0, k = m.PSY.mask_adjust - U) : (U = 0, k = m.PSY.mask_adjust_short - U), m.masking_lower = Math.pow(
|
|
3470
3470
|
10,
|
|
3471
3471
|
k * 0.1
|
|
3472
|
-
), this.quantize.init_outer_loop(m, I), this.quantize.init_xrpow(m, I,
|
|
3472
|
+
), this.quantize.init_outer_loop(m, I), this.quantize.init_xrpow(m, I, S) && (this.quantize.qupvt.calc_xmin(
|
|
3473
3473
|
i,
|
|
3474
3474
|
o[N][J],
|
|
3475
3475
|
I,
|
|
@@ -3478,7 +3478,7 @@ function Kr(t) {
|
|
|
3478
3478
|
i,
|
|
3479
3479
|
I,
|
|
3480
3480
|
h,
|
|
3481
|
-
|
|
3481
|
+
S,
|
|
3482
3482
|
J,
|
|
3483
3483
|
W[J]
|
|
3484
3484
|
)), this.quantize.iteration_finish_one(m, N, J), Ws(I.part2_3_length <= wr.MAX_BITS_PER_CHANNEL), Ws(I.part2_3_length <= W[J]);
|
|
@@ -7007,7 +7007,7 @@ function wt() {
|
|
|
7007
7007
|
this.IPOW20 = function(I) {
|
|
7008
7008
|
return t0(0 <= I && I < wt.Q_MAX), O[I];
|
|
7009
7009
|
};
|
|
7010
|
-
var d = 2220446049250313e-31, o = wt.IXMAX_VAL, m = o + 2, h = wt.Q_MAX,
|
|
7010
|
+
var d = 2220446049250313e-31, o = wt.IXMAX_VAL, m = o + 2, h = wt.Q_MAX, S = wt.Q_MAX2;
|
|
7011
7011
|
wt.LARGE_BITS;
|
|
7012
7012
|
var W = 100;
|
|
7013
7013
|
this.nr_of_sfb_block = [
|
|
@@ -7378,7 +7378,7 @@ function wt() {
|
|
|
7378
7378
|
/* sfb12 pseudo sub bands */
|
|
7379
7379
|
)
|
|
7380
7380
|
];
|
|
7381
|
-
var Z = X0(h +
|
|
7381
|
+
var Z = X0(h + S + 1), O = X0(h), w = X0(m), N = X0(m);
|
|
7382
7382
|
this.adj43 = N;
|
|
7383
7383
|
function J(I, r) {
|
|
7384
7384
|
var K = i.ATHformula(r, I);
|
|
@@ -7443,8 +7443,8 @@ function wt() {
|
|
|
7443
7443
|
);
|
|
7444
7444
|
for (N[X] = 0.5, X = 0; X < h; X++)
|
|
7445
7445
|
O[X] = Math.pow(2, (X - 210) * -0.1875);
|
|
7446
|
-
for (X = 0; X <= h +
|
|
7447
|
-
Z[X] = Math.pow(2, (X - 210 -
|
|
7446
|
+
for (X = 0; X <= h + S; X++)
|
|
7447
|
+
Z[X] = Math.pow(2, (X - 210 - S) * 0.25);
|
|
7448
7448
|
t.huffman_init(r);
|
|
7449
7449
|
{
|
|
7450
7450
|
var A, T, H, p;
|
|
@@ -7793,7 +7793,7 @@ function Ai() {
|
|
|
7793
7793
|
} while (l < s);
|
|
7794
7794
|
return g = j & 65535, j >>= 16, j > g && (j = g, V = _), R.bits += j, V;
|
|
7795
7795
|
}
|
|
7796
|
-
function
|
|
7796
|
+
function S(u, l, s, V) {
|
|
7797
7797
|
var _ = 0, R = Ee.ht[1].hlen;
|
|
7798
7798
|
do {
|
|
7799
7799
|
var f = u[l + 0] * 2 + u[l + 1];
|
|
@@ -7842,7 +7842,7 @@ function Ai() {
|
|
|
7842
7842
|
case 0:
|
|
7843
7843
|
return _;
|
|
7844
7844
|
case 1:
|
|
7845
|
-
return
|
|
7845
|
+
return S(u, l, s, V);
|
|
7846
7846
|
case 2:
|
|
7847
7847
|
case 3:
|
|
7848
7848
|
return W(
|
|
@@ -8244,7 +8244,7 @@ Wt.new_double;
|
|
|
8244
8244
|
Wt.new_float;
|
|
8245
8245
|
var Ur = Wt.new_float_n, zr = Wt.new_int;
|
|
8246
8246
|
Wt.new_int_n;
|
|
8247
|
-
var Ve = Wt.assert, xs = Er, Mi = Di, li = bt(),
|
|
8247
|
+
var Ve = Wt.assert, xs = Er, Mi = Di, li = bt(), S0 = yi;
|
|
8248
8248
|
mi.EQ = function(t, e) {
|
|
8249
8249
|
return Math.abs(t) > Math.abs(e) ? Math.abs(t - e) <= Math.abs(t) * 1e-6 : Math.abs(t - e) <= Math.abs(e) * 1e-6;
|
|
8250
8250
|
};
|
|
@@ -8256,7 +8256,7 @@ function mi() {
|
|
|
8256
8256
|
this.setModules = function(p, u, l, s) {
|
|
8257
8257
|
n = p, d = u, o = l, m = s;
|
|
8258
8258
|
};
|
|
8259
|
-
var h = null,
|
|
8259
|
+
var h = null, S = 0, W = 0, v = 0;
|
|
8260
8260
|
this.getframebits = function(p) {
|
|
8261
8261
|
var u = p.internal_flags, l;
|
|
8262
8262
|
u.bitrate_index != 0 ? l = Mi.bitrate_table[p.version][u.bitrate_index] : l = p.brate, Ve(8 <= l && l <= 640);
|
|
@@ -8264,18 +8264,18 @@ function mi() {
|
|
|
8264
8264
|
return 8 * s;
|
|
8265
8265
|
};
|
|
8266
8266
|
function Z(p) {
|
|
8267
|
-
At.arraycopy(p.header[p.w_ptr].buf, 0, h, W, p.sideinfo_len), W += p.sideinfo_len,
|
|
8267
|
+
At.arraycopy(p.header[p.w_ptr].buf, 0, h, W, p.sideinfo_len), W += p.sideinfo_len, S += p.sideinfo_len * 8, p.w_ptr = p.w_ptr + 1 & S0.MAX_HEADER_BUF - 1;
|
|
8268
8268
|
}
|
|
8269
8269
|
function O(p, u, l) {
|
|
8270
8270
|
for (Ve(l < i - 2); l > 0; ) {
|
|
8271
8271
|
var s;
|
|
8272
|
-
v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), Ve(p.header[p.w_ptr].write_timing >=
|
|
8272
|
+
v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), Ve(p.header[p.w_ptr].write_timing >= S), p.header[p.w_ptr].write_timing == S && Z(p), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v, S += s;
|
|
8273
8273
|
}
|
|
8274
8274
|
}
|
|
8275
8275
|
function w(p, u, l) {
|
|
8276
8276
|
for (Ve(l < i - 2); l > 0; ) {
|
|
8277
8277
|
var s;
|
|
8278
|
-
v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v,
|
|
8278
|
+
v == 0 && (v = 8, W++, Ve(W < Lame.LAME_MAXMP3BUFFER), h[W] = 0), s = Math.min(l, v), l -= s, v -= s, Ve(l < i), Ve(v < i), h[W] |= u >> l << v, S += s;
|
|
8279
8279
|
}
|
|
8280
8280
|
}
|
|
8281
8281
|
function N(p, u) {
|
|
@@ -8331,7 +8331,7 @@ function mi() {
|
|
|
8331
8331
|
p.error_protection && CRC_writeheader(l, l.header[l.h_ptr].buf);
|
|
8332
8332
|
{
|
|
8333
8333
|
var j = l.h_ptr;
|
|
8334
|
-
Ve(l.header[j].ptr == l.sideinfo_len * 8), l.h_ptr = j + 1 &
|
|
8334
|
+
Ve(l.header[j].ptr == l.sideinfo_len * 8), l.h_ptr = j + 1 & S0.MAX_HEADER_BUF - 1, l.header[l.h_ptr].write_timing = l.header[j].write_timing + u, l.h_ptr == l.w_ptr && At.err.println(`Error: MAX_HEADER_BUF too small in bitstream.c
|
|
8335
8335
|
`);
|
|
8336
8336
|
}
|
|
8337
8337
|
}
|
|
@@ -8445,13 +8445,13 @@ function mi() {
|
|
|
8445
8445
|
}
|
|
8446
8446
|
function H(p, u) {
|
|
8447
8447
|
var l = p.internal_flags, s, V, _, R, f;
|
|
8448
|
-
return f = l.w_ptr, R = l.h_ptr - 1, R == -1 && (R =
|
|
8448
|
+
return f = l.w_ptr, R = l.h_ptr - 1, R == -1 && (R = S0.MAX_HEADER_BUF - 1), s = l.header[R].write_timing - S, u.total = s, s >= 0 && (V = 1 + R - f, R < f && (V = 1 + R - f + S0.MAX_HEADER_BUF), s -= V * 8 * l.sideinfo_len), _ = t.getframebits(p), s += _, u.total += _, u.total % 8 != 0 ? u.total = 1 + u.total / 8 : u.total = u.total / 8, u.total += W + 1, s < 0 && At.err.println(`strange error flushing buffer ...
|
|
8449
8449
|
`), s;
|
|
8450
8450
|
}
|
|
8451
8451
|
this.flush_bitstream = function(p) {
|
|
8452
8452
|
var u = p.internal_flags, l, s, V = u.h_ptr - 1;
|
|
8453
|
-
if (V == -1 && (V =
|
|
8454
|
-
if (N(p, s), Ve(u.header[V].write_timing + this.getframebits(p) ==
|
|
8453
|
+
if (V == -1 && (V = S0.MAX_HEADER_BUF - 1), l = u.l3_side, !((s = H(p, new T())) < 0)) {
|
|
8454
|
+
if (N(p, s), Ve(u.header[V].write_timing + this.getframebits(p) == S), u.ResvSize = 0, l.main_data_begin = 0, u.findReplayGain) {
|
|
8455
8455
|
var _ = n.GetTitleGain(u.rgdata);
|
|
8456
8456
|
Ve(NEQ(_, GainAnalysis.GAIN_NOT_ENOUGH_SAMPLES)), u.RadioGain = Math.floor(_ * 10 + 0.5) | 0;
|
|
8457
8457
|
}
|
|
@@ -8459,7 +8459,7 @@ function mi() {
|
|
|
8459
8459
|
}
|
|
8460
8460
|
}, this.add_dummy_byte = function(p, u, l) {
|
|
8461
8461
|
for (var s = p.internal_flags, V; l-- > 0; )
|
|
8462
|
-
for (w(s, u, 8), V = 0; V <
|
|
8462
|
+
for (w(s, u, 8), V = 0; V < S0.MAX_HEADER_BUF; ++V)
|
|
8463
8463
|
s.header[V].write_timing += 8;
|
|
8464
8464
|
}, this.format_bitstream = function(p) {
|
|
8465
8465
|
var u = p.internal_flags, l;
|
|
@@ -8487,11 +8487,11 @@ bitsperframe: %d
|
|
|
8487
8487
|
V,
|
|
8488
8488
|
V % 8,
|
|
8489
8489
|
s
|
|
8490
|
-
), At.err.println("This is a fatal error. It has several possible causes:"), At.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations"), At.err.println(" 9%% Your system is overclocked"), At.err.println(" 1%% bug in LAME encoding library"), u.ResvSize = l.main_data_begin * 8), Ve(
|
|
8490
|
+
), At.err.println("This is a fatal error. It has several possible causes:"), At.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations"), At.err.println(" 9%% Your system is overclocked"), At.err.println(" 1%% bug in LAME encoding library"), u.ResvSize = l.main_data_begin * 8), Ve(S % 8 == 0), S > 1e9) {
|
|
8491
8491
|
var _;
|
|
8492
|
-
for (_ = 0; _ <
|
|
8493
|
-
u.header[_].write_timing -=
|
|
8494
|
-
|
|
8492
|
+
for (_ = 0; _ < S0.MAX_HEADER_BUF; ++_)
|
|
8493
|
+
u.header[_].write_timing -= S;
|
|
8494
|
+
S = 0;
|
|
8495
8495
|
}
|
|
8496
8496
|
return 0;
|
|
8497
8497
|
}, this.copy_buffer = function(p, u, l, s, V) {
|
|
@@ -8534,7 +8534,7 @@ bitsperframe: %d
|
|
|
8534
8534
|
}
|
|
8535
8535
|
return _;
|
|
8536
8536
|
}, this.init_bit_stream_w = function(p) {
|
|
8537
|
-
h = Pr(Lame.LAME_MAXMP3BUFFER), p.h_ptr = p.w_ptr = 0, p.header[p.h_ptr].write_timing = 0, W = -1, v = 0,
|
|
8537
|
+
h = Pr(Lame.LAME_MAXMP3BUFFER), p.h_ptr = p.w_ptr = 0, p.header[p.h_ptr].write_timing = 0, W = -1, v = 0, S = 0;
|
|
8538
8538
|
};
|
|
8539
8539
|
}
|
|
8540
8540
|
var on = mi;
|
|
@@ -8547,7 +8547,7 @@ ot.Arrays;
|
|
|
8547
8547
|
ot.new_array_n;
|
|
8548
8548
|
ot.new_byte;
|
|
8549
8549
|
ot.new_double;
|
|
8550
|
-
var
|
|
8550
|
+
var G0 = ot.new_float;
|
|
8551
8551
|
ot.new_float_n;
|
|
8552
8552
|
ot.new_int;
|
|
8553
8553
|
var Hs = ot.new_int_n, jr = ot.new_short_n, Yt = ot.assert, Bi = er, Qr = sr, P0 = yi, Dr = Vr, $r = Wr, qr = Mr, v0 = on, Ot = Di, Ne = bt();
|
|
@@ -8556,12 +8556,12 @@ function Qe() {
|
|
|
8556
8556
|
Qe.V9 = 410, Qe.V8 = 420, Qe.V7 = 430, Qe.V6 = 440, Qe.V5 = 450, Qe.V4 = 460, Qe.V3 = 470, Qe.V2 = 480, Qe.V1 = 490, Qe.V0 = 500, Qe.R3MIX = 1e3, Qe.STANDARD = 1001, Qe.EXTREME = 1002, Qe.INSANE = 1003, Qe.STANDARD_FAST = 1004, Qe.EXTREME_FAST = 1005, Qe.MEDIUM = 1006, Qe.MEDIUM_FAST = 1007;
|
|
8557
8557
|
var i = 16384 + e;
|
|
8558
8558
|
Qe.LAME_MAXMP3BUFFER = i;
|
|
8559
|
-
var n, d, o, m, h,
|
|
8559
|
+
var n, d, o, m, h, S = new Bi(), W, v, Z;
|
|
8560
8560
|
this.enc = new Ne(), this.setModules = function(a, c, M, L, ee, ae, le, re, _e) {
|
|
8561
|
-
n = a, d = c, o = M, m = L, h = ee, W = ae, v = re, Z = _e, this.enc.setModules(d,
|
|
8561
|
+
n = a, d = c, o = M, m = L, h = ee, W = ae, v = re, Z = _e, this.enc.setModules(d, S, m, W);
|
|
8562
8562
|
};
|
|
8563
8563
|
function O() {
|
|
8564
|
-
this.mask_adjust = 0, this.mask_adjust_short = 0, this.bo_l_weight =
|
|
8564
|
+
this.mask_adjust = 0, this.mask_adjust_short = 0, this.bo_l_weight = G0(Ne.SBMAX_l), this.bo_s_weight = G0(Ne.SBMAX_s);
|
|
8565
8565
|
}
|
|
8566
8566
|
function w() {
|
|
8567
8567
|
this.lowerlimit = 0;
|
|
@@ -8928,10 +8928,10 @@ function Qe() {
|
|
|
8928
8928
|
a.VBR_mean_bitrate_kbps
|
|
8929
8929
|
);
|
|
8930
8930
|
}
|
|
8931
|
-
return a.tune && (c.PSY.mask_adjust += a.tune_value_a, c.PSY.mask_adjust_short += a.tune_value_a), H(a), Yt(a.scale >= 0), a.athaa_type < 0 ? c.ATH.useAdjust = 3 : c.ATH.useAdjust = a.athaa_type, c.ATH.aaSensitivityP = Math.pow(10, a.athaa_sensitivity / -10), a.short_blocks == null && (a.short_blocks = ki.short_block_allowed), a.short_blocks == ki.short_block_allowed && (a.mode == MPEGMode.JOINT_STEREO || a.mode == MPEGMode.STEREO) && (a.short_blocks = ki.short_block_coupled), a.quant_comp < 0 && (a.quant_comp = 1), a.quant_comp_short < 0 && (a.quant_comp_short = 0), a.msfix < 0 && (a.msfix = 0), a.exp_nspsytune = a.exp_nspsytune | 1, a.internal_flags.nsPsy.attackthre < 0 && (a.internal_flags.nsPsy.attackthre = Bi.NSATTACKTHRE), a.internal_flags.nsPsy.attackthre_s < 0 && (a.internal_flags.nsPsy.attackthre_s = Bi.NSATTACKTHRE_S), Yt(a.scale >= 0), a.scale < 0 && (a.scale = 1), a.ATHtype < 0 && (a.ATHtype = 4), a.ATHcurve < 0 && (a.ATHcurve = 4), a.athaa_loudapprox < 0 && (a.athaa_loudapprox = 2), a.interChRatio < 0 && (a.interChRatio = 0), a.useTemporal == null && (a.useTemporal = !0), c.slot_lag = c.frac_SpF = 0, a.VBR == Me.vbr_off && (c.slot_lag = c.frac_SpF = (a.version + 1) * 72e3 * a.brate % a.out_samplerate | 0), m.iteration_init(a),
|
|
8931
|
+
return a.tune && (c.PSY.mask_adjust += a.tune_value_a, c.PSY.mask_adjust_short += a.tune_value_a), H(a), Yt(a.scale >= 0), a.athaa_type < 0 ? c.ATH.useAdjust = 3 : c.ATH.useAdjust = a.athaa_type, c.ATH.aaSensitivityP = Math.pow(10, a.athaa_sensitivity / -10), a.short_blocks == null && (a.short_blocks = ki.short_block_allowed), a.short_blocks == ki.short_block_allowed && (a.mode == MPEGMode.JOINT_STEREO || a.mode == MPEGMode.STEREO) && (a.short_blocks = ki.short_block_coupled), a.quant_comp < 0 && (a.quant_comp = 1), a.quant_comp_short < 0 && (a.quant_comp_short = 0), a.msfix < 0 && (a.msfix = 0), a.exp_nspsytune = a.exp_nspsytune | 1, a.internal_flags.nsPsy.attackthre < 0 && (a.internal_flags.nsPsy.attackthre = Bi.NSATTACKTHRE), a.internal_flags.nsPsy.attackthre_s < 0 && (a.internal_flags.nsPsy.attackthre_s = Bi.NSATTACKTHRE_S), Yt(a.scale >= 0), a.scale < 0 && (a.scale = 1), a.ATHtype < 0 && (a.ATHtype = 4), a.ATHcurve < 0 && (a.ATHcurve = 4), a.athaa_loudapprox < 0 && (a.athaa_loudapprox = 2), a.interChRatio < 0 && (a.interChRatio = 0), a.useTemporal == null && (a.useTemporal = !0), c.slot_lag = c.frac_SpF = 0, a.VBR == Me.vbr_off && (c.slot_lag = c.frac_SpF = (a.version + 1) * 72e3 * a.brate % a.out_samplerate | 0), m.iteration_init(a), S.psymodel_init(a), Yt(a.scale >= 0), 0;
|
|
8932
8932
|
};
|
|
8933
8933
|
function u(a, c) {
|
|
8934
|
-
(a.in_buffer_0 == null || a.in_buffer_nsamples < c) && (a.in_buffer_0 =
|
|
8934
|
+
(a.in_buffer_0 == null || a.in_buffer_nsamples < c) && (a.in_buffer_0 = G0(c), a.in_buffer_1 = G0(c), a.in_buffer_nsamples = c);
|
|
8935
8935
|
}
|
|
8936
8936
|
this.lame_encode_flush = function(a, c, M, L) {
|
|
8937
8937
|
var ee = a.internal_flags, ae = jr([2, 1152]), le = 0, re, _e, he, oe, Le = ee.mf_samples_to_encode - Ne.POSTDELAY, ze = l(a);
|
|
@@ -9087,8 +9087,8 @@ function Qe() {
|
|
|
9087
9087
|
De % 2 == 0 && --De, De += we;
|
|
9088
9088
|
var st = De + 1;
|
|
9089
9089
|
if (he.fill_buffer_resample_init == 0) {
|
|
9090
|
-
for (he.inbuf_old[0] =
|
|
9091
|
-
he.blackfilt[oe] =
|
|
9090
|
+
for (he.inbuf_old[0] = G0(st), he.inbuf_old[1] = G0(st), oe = 0; oe <= 2 * We; ++oe)
|
|
9091
|
+
he.blackfilt[oe] = G0(st);
|
|
9092
9092
|
for (he.itime[0] = 0, he.itime[1] = 0, Le = 0; Le <= 2 * We; Le++) {
|
|
9093
9093
|
var a0 = 0, gt = (Le - We) / (2 * We);
|
|
9094
9094
|
for (oe = 0; oe <= De; oe++)
|
|
@@ -9167,8 +9167,8 @@ const ta = /* @__PURE__ */ bi(ea), ia = (t, e = 4294967295, i = 79764919) => {
|
|
|
9167
9167
|
const i = (U) => new Uint8Array(U.length / 2).map((k, I) => parseInt(U.substring(2 * I, 2 * (I + 1)), 16)), n = (U) => i(U)[0], d = /* @__PURE__ */ new Map();
|
|
9168
9168
|
[, 8364, , 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, , 381, , , 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, , 382, 376].forEach((U, k) => d.set(U, k));
|
|
9169
9169
|
const o = new Uint8Array(t.length);
|
|
9170
|
-
let m, h,
|
|
9171
|
-
O && (w = 11, h = n(t.substring(9, w)), h <= 1 && (w += 2, Z = n(t.substring(11, w))), h === 1 && (w += 8,
|
|
9170
|
+
let m, h, S, W = !1, v = 0, Z = 42, O = t.length > 13 && t.substring(0, 9) === "dynEncode", w = 0;
|
|
9171
|
+
O && (w = 11, h = n(t.substring(9, w)), h <= 1 && (w += 2, Z = n(t.substring(11, w))), h === 1 && (w += 8, S = ((U) => new DataView(i(U).buffer).getInt32(0, !0))(t.substring(13, w))));
|
|
9172
9172
|
const N = 256 - Z;
|
|
9173
9173
|
for (let U = w; U < t.length; U++) if (m = t.charCodeAt(U), m !== 61 || W) {
|
|
9174
9174
|
if (m === 92 && U < t.length - 5 && O) {
|
|
@@ -9184,10 +9184,10 @@ const ta = /* @__PURE__ */ bi(ea), ia = (t, e = 4294967295, i = 79764919) => {
|
|
|
9184
9184
|
const J = o.subarray(0, v);
|
|
9185
9185
|
if (O && h === 1) {
|
|
9186
9186
|
const U = e(J);
|
|
9187
|
-
if (U !==
|
|
9187
|
+
if (U !== S) {
|
|
9188
9188
|
const k = "Decode failed crc32 validation";
|
|
9189
9189
|
throw console.error("`simple-yenc`\n", k + `
|
|
9190
|
-
`, "Expected: " +
|
|
9190
|
+
`, "Expected: " + S + "; Got: " + U + `
|
|
9191
9191
|
`, "Visit https://github.com/eshaz/simple-yenc for more information"), Error(k);
|
|
9192
9192
|
}
|
|
9193
9193
|
}
|
|
@@ -9231,17 +9231,17 @@ function qe() {
|
|
|
9231
9231
|
},
|
|
9232
9232
|
getDecodedAudioMultiChannel: {
|
|
9233
9233
|
value(i, n, d, o, m, h) {
|
|
9234
|
-
let
|
|
9234
|
+
let S = [], W, v;
|
|
9235
9235
|
for (W = 0; W < d; W++) {
|
|
9236
9236
|
const Z = [];
|
|
9237
9237
|
for (v = 0; v < n.length; ) Z.push(n[v++][W] || []);
|
|
9238
|
-
|
|
9238
|
+
S.push(
|
|
9239
9239
|
qe.concatFloat32(Z, o)
|
|
9240
9240
|
);
|
|
9241
9241
|
}
|
|
9242
9242
|
return qe.getDecodedAudio(
|
|
9243
9243
|
i,
|
|
9244
|
-
|
|
9244
|
+
S,
|
|
9245
9245
|
o,
|
|
9246
9246
|
m,
|
|
9247
9247
|
h
|
|
@@ -9258,7 +9258,7 @@ function qe() {
|
|
|
9258
9258
|
return i = Ys(i), new Promise((n) => {
|
|
9259
9259
|
const d = String.raw`dynEncode012804c7886d()((()>+*§§)§,§§§§)§+§§§)§+.-()(*)-+)(.7*§)i¸¸,3§(i¸¸,3/G+.¡*(,(,3+)2å:-),§H(P*DI*H(P*@I++hH)H*r,hH(H(P*<J,i)^*<H,H(P*4U((I-H(H*i0J,^*DH+H-H*I+H,I*4)33H(H*H)^*DH(H+H)^*@H+i§H)i§3æ*).§K(iHI/+§H,iHn,§H+i(H+i(rCJ0I,H*I-+hH,,hH(H-V)(i)J.H.W)(i)c)(H,i)I,H-i*I-4)33i(I.*hH(V)(H+n5(H(i*I-i(I,i)I.+hH,i*J+iHn,hi(I-i*I,+hH,H/H-c)(H,iFn,hi(I,+hH,H0n5-H*V)(J(,hH/H(i)J(H(V)(J(i)c)(H)H(i)H,c)(3H*i*I*H,i)I,4(3(-H(H,W)(H-I-H,i*I,4)3(3(3H,H-I1H+I,H.i)H1V)(J.i(v5(33H.-H(H,i(c)(H,i*I,4)333)-§i*I*+§H*iHn,hi73H,H(i)8(H+J+H)P*(H*V)(J-r,§H)P*,H.i)H+H,i)V)(-H*i*I*H+i)I+H-H.I.H,H-i)I,4)333Ã+)-§iø7i(^*(iü7I,*h+hH+iDn,h*hilI+i)I,+hH+,hH+iô7H,c)(i)H+i´8W)(H,I,H+i*I+4)-+hH(H)8*J-i(p5.*h*h*hH-i')u,hH(P*(J+,hH(P*0J,H(P*,n50H+H,H-b((3H(P*0i)I.4)3H-i¨*n5*H-iÅ*s,hi73H-i)J+V)&+I,H(H+V)æ,8(I.H(H*8*J-i(p51H-i)J+i¸7V)(H(H+iø7V)(8(J/H(P*0J+s,hi73H+H,H.J,I.H(P*(m5(H.H(P*,s5.+hH,m5*H(P*(J.H+H.H+H/U((b((H(H(P*0i)J+^*0H,i)I,4(3(3H(H.^*03H-i¨*o5)33i(73(3(3-H,H+i)c)(H,i*I,H+i)I+4)33i)I-3H-3!2)0§K(i2J,L(H,H(^*(H,H*^*4H,i(^*0H,i(^*DH,j(_*<H,H)P*(^*,H,H+P*(^*8*h*h+hH,i)8(I3i§I**h*h*h*h*h*h*hH,i*8(6+(),03H,j(_*@i*I-H,P*<J.i,J(H,P*8J/s50H,H.i+J0^*<i¦I*H.H,P*4J1J.U(*H.U((J2i')o5/H.U()I.H,H(^*<H0H1U((H.i0J.i§i0i')o5/H/H.H2J*H(J.q50H,P*0J/H*I-H,P*(J0,hH,P*,H-q,hi)I-423+hH*m5+H/H0H(H1U((b((H/i)I/H(i)I(H*i)I*4(3(3H,H.^*<H,H-^*04*3iØ1U((5+i(I(i¨7i1^*(i$6iè1^*(i°7iè6^*(i¬7iÈ6^*(+hH(iÈ*n,hiÈ*I(+hH(i¨,n,hi¨,I(+hH(iØ,n,hiØ,I(+hH(iè,o,hH,i-H(i0c)(H(i*I(4)33iè1i1H,i-iÈ*8)Bi(I(+hH(ido,hH,i-H(i-c)(H(i*I(4)33iÈ6iè6H,i-iF8)BiØ1i)b((41-H,i-H(i/c)(H(i*I(4)3(3(-H,i-H(i1c)(H(i*I(4)3(3(-H,i-H(i0c)(H(i*I(4)3(3(3H,H/^*0H,H(^*<3i(I*4*3H,H,i¸)^*TH,H,iø-^*PH,H,iX^*LH,H,i(^*HH,i-8(I(H,i-8(I-i¥I*H,i,8(I.H(iErH-iEr5)H(i©*I1H-i)I0i(i;H.i,J(i(H(i(rCJ(J*H*i;sCI*i¨1I-H(I/+hH/,hH,i-H-V)(i)H,i+8(c)(H/i)I/H-i*I-H*i)I*4)-H(i)i¨1I/+hH(H*o,hH,i-H/V)(i)i(c)(H/i*I/H(i)I(4)33i¤I*H,iø-H,i¸)H,i-i;8)5+H0H1I2i(I-+hH-H2p,hH,H,iP8*J*i(p5-H*i7u,hH,i-H-i)H*c)(H-i)I-4*3i(I/i+I.i+I(*h*h*hH*i86*(*)3H-m,hi£I*403H-i)H,W)-I/i*I(4)3i3I.i/I(3H2H,H(8(H.J(H-J.p,hi¢I*4.3H,i-H-i)I*+hH(,hH*H/c)(H*i*I*H(i)I(4)-H.I-4+3(3(33H,W)1m,hiI*4,3H,iø-H,i¸)H,i-H18)J(,hi¡I*H(i(p5,H1H,V)ú-H,V)ø-o5,3H,i(H,iXH,i-H1i)H08)J(,hi I*H(i(p5,H0H,V)H,V)o5,3H,H,iPH,iH8+I*4+3(3(3H,i$6i¬78+I*3H*H3m5(3i)I-H*i(r5)3H)H,P*0^*(H+H,P*<^*(H*I-3H,i2L(H-33Á)+(i¨03b+(,(-(.(/(0(1(2(3(5(7(9(;(?(C(G(K(S([(c(k({(((«(Ë(ë((*)(iø03O)()()()(*(*(*(*(+(+(+(+(,(,(,(,(-(-(-(-(i¨13M8(9(:(((0(/(1(.(2(-(3(,(4(+(5(*(6()(7(T7*S7US0U `;
|
|
9260
9260
|
qe.getModule(qe, d).then((o) => WebAssembly.instantiate(o, {})).then(({ exports: o }) => {
|
|
9261
|
-
const m = new Map(Object.entries(o)), h = m.get("puff"),
|
|
9261
|
+
const m = new Map(Object.entries(o)), h = m.get("puff"), S = m.get("memory").buffer, W = new t(S), v = new DataView(S);
|
|
9262
9262
|
let Z = m.get("__heap_base");
|
|
9263
9263
|
const O = i.length, w = Z;
|
|
9264
9264
|
Z += 4, v.setInt32(w, O, !0);
|
|
@@ -9325,7 +9325,7 @@ class aa extends ra() {
|
|
|
9325
9325
|
qe.modules || new qe();
|
|
9326
9326
|
let o = qe.modules.get(n);
|
|
9327
9327
|
if (!o) {
|
|
9328
|
-
let m = "text/javascript", h,
|
|
9328
|
+
let m = "text/javascript", h, S = `'use strict';(${((W, v, Z) => {
|
|
9329
9329
|
let O, w, N = new Promise((J) => {
|
|
9330
9330
|
w = J;
|
|
9331
9331
|
});
|
|
@@ -9351,13 +9351,13 @@ class aa extends ra() {
|
|
|
9351
9351
|
h = typeof process.versions.node < "u";
|
|
9352
9352
|
} catch {
|
|
9353
9353
|
}
|
|
9354
|
-
o = h ? `data:${m};base64,${Buffer.from(
|
|
9354
|
+
o = h ? `data:${m};base64,${Buffer.from(S).toString(
|
|
9355
9355
|
"base64"
|
|
9356
|
-
)}` : URL.createObjectURL(new Blob([
|
|
9356
|
+
)}` : URL.createObjectURL(new Blob([S], { type: m })), qe.modules.set(n, o);
|
|
9357
9357
|
}
|
|
9358
9358
|
super(o, { name: i }), this._id = Number.MIN_SAFE_INTEGER, this._enqueuedOperations = /* @__PURE__ */ new Map(), this.onmessage = ({ data: m }) => {
|
|
9359
|
-
const { id: h, ...
|
|
9360
|
-
this._enqueuedOperations.get(h)(
|
|
9359
|
+
const { id: h, ...S } = m;
|
|
9360
|
+
this._enqueuedOperations.get(h)(S), this._enqueuedOperations.delete(h);
|
|
9361
9361
|
}, new d(qe).getModule().then((m) => {
|
|
9362
9362
|
this.postToDecoder("init", { module: m, options: e });
|
|
9363
9363
|
});
|
|
@@ -9394,7 +9394,7 @@ function w0(t) {
|
|
|
9394
9394
|
throw L;
|
|
9395
9395
|
}
|
|
9396
9396
|
var o, m, h;
|
|
9397
|
-
function
|
|
9397
|
+
function S() {
|
|
9398
9398
|
var L = h.buffer;
|
|
9399
9399
|
o = new Uint8Array(L), m = new Uint32Array(L), new BigInt64Array(L), new BigUint64Array(L);
|
|
9400
9400
|
}
|
|
@@ -9655,7 +9655,7 @@ r÷|ú
|
|
|
9655
9655
|
t.setModule(w0, L);
|
|
9656
9656
|
}, this.getModule = () => t.getModule(w0), this.instantiate = () => (this.getModule().then((L) => WebAssembly.instantiate(L, M)).then((L) => {
|
|
9657
9657
|
const ee = L.exports;
|
|
9658
|
-
V(ee), h = ee.k,
|
|
9658
|
+
V(ee), h = ee.k, S(), c(ee), n();
|
|
9659
9659
|
}), this.ready = new Promise((L) => {
|
|
9660
9660
|
n = L;
|
|
9661
9661
|
}).then(() => {
|
|
@@ -9698,15 +9698,15 @@ function K0(t = {}) {
|
|
|
9698
9698
|
e: for (let o = 0, m = 0; o < e.length; o += m) {
|
|
9699
9699
|
const h = e.subarray(o, this._input.len + o);
|
|
9700
9700
|
m = h.length, this._inputBytes += m, this._input.buf.set(h);
|
|
9701
|
-
let
|
|
9701
|
+
let S = this._common.wasm.mpeg_decoder_feed(
|
|
9702
9702
|
this._decoder,
|
|
9703
9703
|
this._input.ptr,
|
|
9704
9704
|
m
|
|
9705
9705
|
);
|
|
9706
|
-
if (
|
|
9706
|
+
if (S === -10)
|
|
9707
9707
|
continue e;
|
|
9708
9708
|
t: for (; ; ) {
|
|
9709
|
-
this._samplesDecodedPtr.buf[0] = 0,
|
|
9709
|
+
this._samplesDecodedPtr.buf[0] = 0, S = this._common.wasm.mpeg_decoder_read(
|
|
9710
9710
|
this._decoder,
|
|
9711
9711
|
this._output.ptr,
|
|
9712
9712
|
this._output.len,
|
|
@@ -9718,12 +9718,12 @@ function K0(t = {}) {
|
|
|
9718
9718
|
if (this._outputSamples += W, W && (d += W, i.push([
|
|
9719
9719
|
this._output.buf.slice(0, W),
|
|
9720
9720
|
this._output.buf.slice(W, W * 2)
|
|
9721
|
-
])),
|
|
9721
|
+
])), S == -11)
|
|
9722
9722
|
continue t;
|
|
9723
|
-
if (
|
|
9723
|
+
if (S === -10)
|
|
9724
9724
|
continue e;
|
|
9725
|
-
if (
|
|
9726
|
-
const v = this._getErrorMessage(
|
|
9725
|
+
if (S) {
|
|
9726
|
+
const v = this._getErrorMessage(S);
|
|
9727
9727
|
console.error("mpg123-decoder: " + v), this._common.addError(
|
|
9728
9728
|
n,
|
|
9729
9729
|
v,
|
|
@@ -9779,7 +9779,7 @@ cn(dn, "MPEGDecoderWebWorker");
|
|
|
9779
9779
|
globalThis.MPEGMode = En;
|
|
9780
9780
|
globalThis.Lame = ta;
|
|
9781
9781
|
globalThis.BitStream = Ar;
|
|
9782
|
-
class
|
|
9782
|
+
class V1 {
|
|
9783
9783
|
/**
|
|
9784
9784
|
* Create a new MP3Encoder.
|
|
9785
9785
|
*
|
|
@@ -9800,8 +9800,8 @@ class I1 {
|
|
|
9800
9800
|
const i = e.numberOfChannels, n = e.numberOfFrames, d = Jn(e), o = new Int16Array(n * i);
|
|
9801
9801
|
for (let m = 0; m < n; m++)
|
|
9802
9802
|
for (let h = 0; h < i; h++) {
|
|
9803
|
-
const
|
|
9804
|
-
o[m * i + h] =
|
|
9803
|
+
const S = Math.max(-1, Math.min(1, d[h][m]));
|
|
9804
|
+
o[m * i + h] = S * 32767;
|
|
9805
9805
|
}
|
|
9806
9806
|
return o;
|
|
9807
9807
|
}
|
|
@@ -9845,7 +9845,7 @@ class I1 {
|
|
|
9845
9845
|
return this.encodedData.reduce((e, i) => e + i.length, 0);
|
|
9846
9846
|
}
|
|
9847
9847
|
}
|
|
9848
|
-
class
|
|
9848
|
+
class R1 {
|
|
9849
9849
|
/**
|
|
9850
9850
|
* Create a new MP3Decoder.
|
|
9851
9851
|
*
|
|
@@ -9877,10 +9877,10 @@ class V1 {
|
|
|
9877
9877
|
const i = await this.decoder.decode(new Uint8Array(e)), { channelData: n, sampleRate: d } = i, o = n.length;
|
|
9878
9878
|
return {
|
|
9879
9879
|
channels: n.map((h) => {
|
|
9880
|
-
const
|
|
9880
|
+
const S = new Float32Array(h.length);
|
|
9881
9881
|
for (let W = 0; W < h.length; W++)
|
|
9882
|
-
|
|
9883
|
-
return
|
|
9882
|
+
S[W] = h[W];
|
|
9883
|
+
return S;
|
|
9884
9884
|
}),
|
|
9885
9885
|
sampleRate: d,
|
|
9886
9886
|
numberOfChannels: o
|
|
@@ -9913,14 +9913,14 @@ class V1 {
|
|
|
9913
9913
|
async toAudioData(e) {
|
|
9914
9914
|
const { channels: i, sampleRate: n, numberOfChannels: d } = await this.toSamples(e), o = 1024, m = i[0].length, h = [];
|
|
9915
9915
|
console.log("Samples", m);
|
|
9916
|
-
for (let
|
|
9917
|
-
const W = m -
|
|
9918
|
-
(J) => J.slice(
|
|
9916
|
+
for (let S = 0; S < m; S += o) {
|
|
9917
|
+
const W = m - S, v = Math.min(o, W), Z = i.map(
|
|
9918
|
+
(J) => J.slice(S, S + v)
|
|
9919
9919
|
), O = new Float32Array(v * d);
|
|
9920
9920
|
for (let J = 0; J < v; J++)
|
|
9921
9921
|
for (let U = 0; U < d; U++)
|
|
9922
9922
|
O[J * d + U] = Z[U][J];
|
|
9923
|
-
const w =
|
|
9923
|
+
const w = S / n * 1e6, N = new AudioData({
|
|
9924
9924
|
format: "f32",
|
|
9925
9925
|
sampleRate: n,
|
|
9926
9926
|
numberOfFrames: v,
|
|
@@ -9995,7 +9995,7 @@ function ua(t, e) {
|
|
|
9995
9995
|
)
|
|
9996
9996
|
);
|
|
9997
9997
|
};
|
|
9998
|
-
const
|
|
9998
|
+
const S = async () => {
|
|
9999
9999
|
try {
|
|
10000
10000
|
const { done: W, value: v } = await d.read();
|
|
10001
10001
|
if (W) {
|
|
@@ -10010,19 +10010,19 @@ function ua(t, e) {
|
|
|
10010
10010
|
}
|
|
10011
10011
|
const Z = v.buffer;
|
|
10012
10012
|
if (Z.fileStart = o, o += v.length, e && e(o / t.size), m.appendBuffer(Z), o < t.size)
|
|
10013
|
-
return
|
|
10013
|
+
return S();
|
|
10014
10014
|
if (m.flush(), !h)
|
|
10015
10015
|
throw new Error("Invalid MP4 file: metadata not available");
|
|
10016
10016
|
} catch (W) {
|
|
10017
10017
|
n(W);
|
|
10018
10018
|
}
|
|
10019
10019
|
};
|
|
10020
|
-
|
|
10020
|
+
S().catch(n);
|
|
10021
10021
|
});
|
|
10022
10022
|
}
|
|
10023
10023
|
function ha(t, e, i, n, d) {
|
|
10024
10024
|
const { mp4: o, info: m } = e;
|
|
10025
|
-
return new Promise((h,
|
|
10025
|
+
return new Promise((h, S) => {
|
|
10026
10026
|
let W = 0, v = !1, Z = 0;
|
|
10027
10027
|
const O = i === "audio" ? EncodedAudioChunk : EncodedVideoChunk, w = [], N = i === "audio" ? m.audioTracks[0] ?? null : m.videoTracks[0] ?? null;
|
|
10028
10028
|
if (!N) {
|
|
@@ -10054,7 +10054,7 @@ function ha(t, e, i, n, d) {
|
|
|
10054
10054
|
(Math.abs(H - U) < oa || H > U) && (v = !0, o.stop(), o.flush(), h(w));
|
|
10055
10055
|
}
|
|
10056
10056
|
}, o.onError = (K) => {
|
|
10057
|
-
|
|
10057
|
+
S(
|
|
10058
10058
|
new Error(
|
|
10059
10059
|
`Extraction error: ${K instanceof Error ? K.message : String(K)}`
|
|
10060
10060
|
)
|
|
@@ -10072,13 +10072,13 @@ function ha(t, e, i, n, d) {
|
|
|
10072
10072
|
const A = X.buffer;
|
|
10073
10073
|
return A.fileStart = W, W += X.length, o.appendBuffer(A), r();
|
|
10074
10074
|
} catch (K) {
|
|
10075
|
-
|
|
10075
|
+
S(K);
|
|
10076
10076
|
}
|
|
10077
10077
|
};
|
|
10078
|
-
o.start(), r().catch(
|
|
10078
|
+
o.start(), r().catch(S);
|
|
10079
10079
|
});
|
|
10080
10080
|
}
|
|
10081
|
-
class
|
|
10081
|
+
class T1 {
|
|
10082
10082
|
/**
|
|
10083
10083
|
* Create a new MP4Demuxer instance.
|
|
10084
10084
|
* @param file - The MP4 file to demux
|
|
@@ -10150,7 +10150,7 @@ class R1 {
|
|
|
10150
10150
|
return this.mp4Data.info;
|
|
10151
10151
|
}
|
|
10152
10152
|
}
|
|
10153
|
-
class
|
|
10153
|
+
class W1 {
|
|
10154
10154
|
/**
|
|
10155
10155
|
* Create a new InMemoryStorage instance
|
|
10156
10156
|
* @param chunkSize Size of each chunk in bytes (default: 10MB)
|
|
@@ -10167,11 +10167,11 @@ class T1 {
|
|
|
10167
10167
|
this._size = Math.max(this._size, i + e.byteLength);
|
|
10168
10168
|
const n = Math.floor(i / this._chunkSize), d = Math.floor((i + e.byteLength - 1) / this._chunkSize);
|
|
10169
10169
|
for (let o = n; o <= d; o++) {
|
|
10170
|
-
const m = o * this._chunkSize, h = m + this._chunkSize,
|
|
10170
|
+
const m = o * this._chunkSize, h = m + this._chunkSize, S = Math.max(i, m), v = Math.min(i + e.byteLength, h) - S;
|
|
10171
10171
|
if (v <= 0) continue;
|
|
10172
10172
|
let Z;
|
|
10173
10173
|
this.chunks.has(o) ? Z = this.chunks.get(o) : (Z = new Uint8Array(this._chunkSize), this.chunks.set(o, Z));
|
|
10174
|
-
const O =
|
|
10174
|
+
const O = S - m, w = S - i;
|
|
10175
10175
|
for (let N = 0; N < v; N++)
|
|
10176
10176
|
Z[O + N] = e[w + N];
|
|
10177
10177
|
}
|
|
@@ -10193,25 +10193,56 @@ class T1 {
|
|
|
10193
10193
|
for (let o = 0; o < i.length; o++) {
|
|
10194
10194
|
const m = i[o], h = this.chunks.get(m);
|
|
10195
10195
|
if (o === i.length - 1) {
|
|
10196
|
-
const
|
|
10197
|
-
|
|
10196
|
+
const S = this._size - m * this._chunkSize;
|
|
10197
|
+
S < this._chunkSize ? n.push(h.slice(0, S)) : n.push(h);
|
|
10198
10198
|
} else
|
|
10199
10199
|
n.push(h);
|
|
10200
10200
|
}
|
|
10201
10201
|
return new Blob(n, { type: e });
|
|
10202
10202
|
}
|
|
10203
10203
|
}
|
|
10204
|
-
|
|
10205
|
-
|
|
10204
|
+
class ba {
|
|
10205
|
+
constructor({ track: e }) {
|
|
10206
|
+
const i = e.getSettings();
|
|
10207
|
+
if (!i)
|
|
10208
|
+
throw new Error("track has no settings");
|
|
10209
|
+
let n, d;
|
|
10210
|
+
const o = i.frameRate ?? 30;
|
|
10211
|
+
this.readable = new ReadableStream({
|
|
10212
|
+
async start() {
|
|
10213
|
+
n = document.createElement("video"), n.srcObject = new MediaStream([e]), await Promise.all([
|
|
10214
|
+
n.play(),
|
|
10215
|
+
new Promise((m) => {
|
|
10216
|
+
n.onloadedmetadata = m;
|
|
10217
|
+
})
|
|
10218
|
+
]), d = performance.now();
|
|
10219
|
+
},
|
|
10220
|
+
async pull(m) {
|
|
10221
|
+
for (; ; ) {
|
|
10222
|
+
const h = performance.now();
|
|
10223
|
+
if (h - d < 1e3 / o) {
|
|
10224
|
+
await new Promise((S) => requestAnimationFrame(S));
|
|
10225
|
+
continue;
|
|
10226
|
+
}
|
|
10227
|
+
d = h, m.enqueue(new VideoFrame(n, { timestamp: d * 1e3 }));
|
|
10228
|
+
break;
|
|
10229
|
+
}
|
|
10230
|
+
}
|
|
10231
|
+
});
|
|
10232
|
+
}
|
|
10233
|
+
}
|
|
10234
|
+
self.MediaStreamTrackProcessor || (self.MediaStreamTrackProcessor = ba);
|
|
10235
|
+
var pa = Object.defineProperty, ya = (t, e, i) => e in t ? pa(t, e, { enumerable: !0, configurable: !0, writable: !0, value: i }) : t[e] = i, oi = (t, e, i) => (ya(t, typeof e != "symbol" ? e + "" : e, i), i), I0 = /* @__PURE__ */ ((t) => (t[t.AVMEDIA_TYPE_UNKNOWN = -1] = "AVMEDIA_TYPE_UNKNOWN", t[t.AVMEDIA_TYPE_VIDEO = 0] = "AVMEDIA_TYPE_VIDEO", t[t.AVMEDIA_TYPE_AUDIO = 1] = "AVMEDIA_TYPE_AUDIO", t[t.AVMEDIA_TYPE_DATA = 2] = "AVMEDIA_TYPE_DATA", t[t.AVMEDIA_TYPE_SUBTITLE = 3] = "AVMEDIA_TYPE_SUBTITLE", t[t.AVMEDIA_TYPE_ATTACHMENT = 4] = "AVMEDIA_TYPE_ATTACHMENT", t[t.AVMEDIA_TYPE_NB = 5] = "AVMEDIA_TYPE_NB", t))(I0 || {}), di = /* @__PURE__ */ ((t) => (t[t.AVSEEK_FLAG_BACKWARD = 1] = "AVSEEK_FLAG_BACKWARD", t[t.AVSEEK_FLAG_BYTE = 2] = "AVSEEK_FLAG_BYTE", t[t.AVSEEK_FLAG_ANY = 4] = "AVSEEK_FLAG_ANY", t[t.AVSEEK_FLAG_FRAME = 8] = "AVSEEK_FLAG_FRAME", t))(di || {}), rt = /* @__PURE__ */ ((t) => (t.WasmWorkerLoaded = "WasmWorkerLoaded", t.WASMRuntimeInitialized = "WASMRuntimeInitialized", t.LoadWASM = "LoadWASM", t.GetAVPacket = "GetAVPacket", t.GetAVPackets = "GetAVPackets", t.GetAVStream = "GetAVStream", t.GetAVStreams = "GetAVStreams", t.GetMediaInfo = "GetMediaInfo", t.ReadAVPacket = "ReadAVPacket", t.AVPacketStream = "AVPacketStream", t.ReadNextAVPacket = "ReadNextAVPacket", t.StopReadAVPacket = "StopReadAVPacket", t.SetAVLogLevel = "SetAVLogLevel", t))(rt || {});
|
|
10236
|
+
const mn = "video", fa = "audio", Za = "subtitle", ws = {
|
|
10206
10237
|
VIDEO: mn
|
|
10207
10238
|
}, Ci = {
|
|
10208
10239
|
[mn]: I0.AVMEDIA_TYPE_VIDEO,
|
|
10209
|
-
[
|
|
10210
|
-
[
|
|
10211
|
-
}, un = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBZT0oRT0+KEVbRS5BVk1FRElBX1RZUEVfVU5LTk9XTj0tMV09IkFWTUVESUFfVFlQRV9VTktOT1dOIixFW0UuQVZNRURJQV9UWVBFX1ZJREVPPTBdPSJBVk1FRElBX1RZUEVfVklERU8iLEVbRS5BVk1FRElBX1RZUEVfQVVESU89MV09IkFWTUVESUFfVFlQRV9BVURJTyIsRVtFLkFWTUVESUFfVFlQRV9EQVRBPTJdPSJBVk1FRElBX1RZUEVfREFUQSIsRVtFLkFWTUVESUFfVFlQRV9TVUJUSVRMRT0zXT0iQVZNRURJQV9UWVBFX1NVQlRJVExFIixFW0UuQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ9NF09IkFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UIixFW0UuQVZNRURJQV9UWVBFX05CPTVdPSJBVk1FRElBX1RZUEVfTkIiLEUpKShBZXx8e30pLEc9KEU9PihFLldhc21Xb3JrZXJMb2FkZWQ9Ildhc21Xb3JrZXJMb2FkZWQiLEUuV0FTTVJ1bnRpbWVJbml0aWFsaXplZD0iV0FTTVJ1bnRpbWVJbml0aWFsaXplZCIsRS5Mb2FkV0FTTT0iTG9hZFdBU00iLEUuR2V0QVZQYWNrZXQ9IkdldEFWUGFja2V0IixFLkdldEFWUGFja2V0cz0iR2V0QVZQYWNrZXRzIixFLkdldEFWU3RyZWFtPSJHZXRBVlN0cmVhbSIsRS5HZXRBVlN0cmVhbXM9IkdldEFWU3RyZWFtcyIsRS5HZXRNZWRpYUluZm89IkdldE1lZGlhSW5mbyIsRS5SZWFkQVZQYWNrZXQ9IlJlYWRBVlBhY2tldCIsRS5BVlBhY2tldFN0cmVhbT0iQVZQYWNrZXRTdHJlYW0iLEUuUmVhZE5leHRBVlBhY2tldD0iUmVhZE5leHRBVlBhY2tldCIsRS5TdG9wUmVhZEFWUGFja2V0PSJTdG9wUmVhZEFWUGFja2V0IixFLlNldEFWTG9nTGV2ZWw9IlNldEFWTG9nTGV2ZWwiLEUpKShHfHx7fSk7InZpZGVvIisiIixBZS5BVk1FRElBX1RZUEVfVklERU8sImF1ZGlvIisiIixBZS5BVk1FRElBX1RZUEVfQVVESU8sInN1YnRpdGxlIisiIixBZS5BVk1FRElBX1RZUEVfU1VCVElUTEU7dmFyIGl0PSgoKT0+e3ZhciBFPXNlbGYubG9jYXRpb24uaHJlZjtyZXR1cm4gZnVuY3Rpb24oUj17fSl7dmFyIEMsZj1PYmplY3QuYXNzaWduKHt9LFIpLFUsSCxuZT1uZXcgUHJvbWlzZSgoZSxyKT0+e1U9ZSxIPXJ9KSxhZT0hMCxEZT1PYmplY3QuYXNzaWduKHt9LGYpLGhyPSIuL3RoaXMucHJvZ3JhbSIscT0iIjtmdW5jdGlvbiBtdChlKXtyZXR1cm4gZi5sb2NhdGVGaWxlP2YubG9jYXRlRmlsZShlLHEpOnErZX12YXIgWWUsbXIsR2U7cT1zZWxmLmxvY2F0aW9uLmhyZWYsRSYmKHE9RSkscS5zdGFydHNXaXRoKCJibG9iOiIpP3E9IiI6cT1xLnN1YnN0cigwLHEucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxZZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5zZW5kKG51bGwpLHIucmVzcG9uc2VUZXh0fSxHZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoci5yZXNwb25zZSl9LG1yPShlLHIsdCk9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PntpZihuLnN0YXR1cz09MjAwfHxuLnN0YXR1cz09MCYmbi5yZXNwb25zZSl7cihuLnJlc3BvbnNlKTtyZXR1cm59dCgpfSxuLm9uZXJyb3I9dCxuLnNlbmQobnVsbCl9O3ZhciBxZT1mLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGVlPWYucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGYsRGUpLERlPW51bGwsZi5hcmd1bWVudHMmJmYuYXJndW1lbnRzLGYudGhpc1Byb2dyYW0mJihocj1mLnRoaXNQcm9ncmFtKSxmLnF1aXQmJmYucXVpdDt2YXIgX2U7Zi53YXNtQmluYXJ5JiYoX2U9Zi53YXNtQmluYXJ5KTt2YXIgJGUscHI9ITE7ZnVuY3Rpb24gX3IoZSxyKXtlfHxpZShyKX12YXIgSSx4LFksQ2UsZyxBLGdyLHlyO2Z1bmN0aW9uIHdyKCl7dmFyIGU9JGUuYnVmZmVyO2YuSEVBUDg9ST1uZXcgSW50OEFycmF5KGUpLGYuSEVBUDE2PVk9bmV3IEludDE2QXJyYXkoZSksZi5IRUFQVTg9eD1uZXcgVWludDhBcnJheShlKSxmLkhFQVBVMTY9Q2U9bmV3IFVpbnQxNkFycmF5KGUpLGYuSEVBUDMyPWc9bmV3IEludDMyQXJyYXkoZSksZi5IRUFQVTMyPUE9bmV3IFVpbnQzMkFycmF5KGUpLGYuSEVBUEYzMj1ncj1uZXcgRmxvYXQzMkFycmF5KGUpLGYuSEVBUEY2ND15cj1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBFcj1bXSxicj1bXSxrcj1bXTtmdW5jdGlvbiBwdCgpe2lmKGYucHJlUnVuKWZvcih0eXBlb2YgZi5wcmVSdW49PSJmdW5jdGlvbiImJihmLnByZVJ1bj1bZi5wcmVSdW5dKTtmLnByZVJ1bi5sZW5ndGg7KXl0KGYucHJlUnVuLnNoaWZ0KCkpO0tlKEVyKX1mdW5jdGlvbiBfdCgpeyFmLm5vRlNJbml0JiYhby5pbml0LmluaXRpYWxpemVkJiZvLmluaXQoKSxvLmlnbm9yZVBlcm1pc3Npb25zPSExLEtlKGJyKX1mdW5jdGlvbiBndCgpe2lmKGYucG9zdFJ1bilmb3IodHlwZW9mIGYucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKGYucG9zdFJ1bj1bZi5wb3N0UnVuXSk7Zi5wb3N0UnVuLmxlbmd0aDspRXQoZi5wb3N0UnVuLnNoaWZ0KCkpO0tlKGtyKX1mdW5jdGlvbiB5dChlKXtFci51bnNoaWZ0KGUpfWZ1bmN0aW9uIHd0KGUpe2JyLnVuc2hpZnQoZSl9ZnVuY3Rpb24gRXQoZSl7a3IudW5zaGlmdChlKX12YXIgb2U9MCxnZT1udWxsO2Z1bmN0aW9uIEhhKGUpe3JldHVybiBlfWZ1bmN0aW9uIFhlKGUpe3ZhciByO29lKyssKHI9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8ci5jYWxsKGYsb2UpfWZ1bmN0aW9uIEZlKGUpe3ZhciB0O2lmKG9lLS0sKHQ9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8dC5jYWxsKGYsb2UpLG9lPT0wJiZnZSl7dmFyIHI9Z2U7Z2U9bnVsbCxyKCl9fWZ1bmN0aW9uIGllKGUpe3ZhciB0Oyh0PWYub25BYm9ydCk9PW51bGx8fHQuY2FsbChmLGUpLGU9IkFib3J0ZWQoIitlKyIpIixlZShlKSxwcj0hMCxlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIHI9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTt0aHJvdyBIKHIpLHJ9dmFyIGJ0PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIixQcj1lPT5lLnN0YXJ0c1dpdGgoYnQpO2Z1bmN0aW9uIGt0KCl7aWYoZi5sb2NhdGVGaWxlKXt2YXIgZT0id2ViLWRlbXV4ZXIud2FzbSI7cmV0dXJuIFByKGUpP2U6bXQoZSl9cmV0dXJuIG5ldyBVUkwoIndlYi1kZW11eGVyLndhc20iLHNlbGYubG9jYXRpb24uaHJlZikuaHJlZn12YXIgVGU7ZnVuY3Rpb24gQXIoZSl7aWYoZT09VGUmJl9lKXJldHVybiBuZXcgVWludDhBcnJheShfZSk7aWYoR2UpcmV0dXJuIEdlKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBQdChlKXtyZXR1cm4hX2UmJmFlJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyR7ZX0nYDtyZXR1cm4gci5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9PkFyKGUpKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5BcihlKSl9ZnVuY3Rpb24gRHIoZSxyLHQpe3JldHVybiBQdChlKS50aGVuKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4scikpLnRoZW4odCxuPT57ZWUoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7bn1gKSxpZShuKX0pfWZ1bmN0aW9uIEF0KGUscix0LG4pe3JldHVybiFlJiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PSJmdW5jdGlvbiImJiFQcihyKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGE9Pnt2YXIgaT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhhLHQpO3JldHVybiBpLnRoZW4obixmdW5jdGlvbihzKXtyZXR1cm4gZWUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3N9YCksZWUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksRHIocix0LG4pfSl9KTpEcihyLHQsbil9ZnVuY3Rpb24gRHQoKXtyZXR1cm57YTpDYX19ZnVuY3Rpb24gJHQoKXt2YXIgZT1EdCgpO2Z1bmN0aW9uIHIobixhKXtyZXR1cm4gej1uLmV4cG9ydHMsJGU9ei5iYSx3cigpLGpyPXouZWEsd3Qoei5jYSksRmUoKSx6fVhlKCk7ZnVuY3Rpb24gdChuKXtyKG4uaW5zdGFuY2UpfWlmKGYuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gZi5pbnN0YW50aWF0ZVdhc20oZSxyKX1jYXRjaChuKXtlZShgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtufWApLEgobil9cmV0dXJuIFRlfHwoVGU9a3QoKSksQXQoX2UsVGUsZSx0KS5jYXRjaChIKSx7fX12YXIgeSwkLEtlPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKShmKX07Zi5ub0V4aXRSdW50aW1lO3ZhciAkcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxjZT0oZSxyLHQpPT57Zm9yKHZhciBuPXIrdCxhPXI7ZVthXSYmIShhPj1uKTspKythO2lmKGEtcj4xNiYmZS5idWZmZXImJiRyKXJldHVybiAkci5kZWNvZGUoZS5zdWJhcnJheShyLGEpKTtmb3IodmFyIGk9IiI7cjxhOyl7dmFyIHM9ZVtyKytdO2lmKCEocyYxMjgpKXtpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2NvbnRpbnVlfXZhciBsPWVbcisrXSY2MztpZigocyYyMjQpPT0xOTIpe2krPVN0cmluZy5mcm9tQ2hhckNvZGUoKHMmMzEpPDw2fGwpO2NvbnRpbnVlfXZhciB1PWVbcisrXSY2MztpZigocyYyNDApPT0yMjQ/cz0ocyYxNSk8PDEyfGw8PDZ8dTpzPShzJjcpPDwxOHxsPDwxMnx1PDw2fGVbcisrXSY2MyxzPDY1NTM2KWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyk7ZWxzZXt2YXIgYz1zLTY1NTM2O2krPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Yz4+MTAsNTYzMjB8YyYxMDIzKX19cmV0dXJuIGl9LHNlPShlLHIpPT5lP2NlKHgsZSxyKToiIixDdD0oZSxyLHQsbik9PntpZShgQXNzZXJ0aW9uIGZhaWxlZDogJHtzZShlKX0sIGF0OiBgK1tyP3NlKHIpOiJ1bmtub3duIGZpbGVuYW1lIix0LG4/c2Uobik6InVua25vd24gZnVuY3Rpb24iXSl9O2NsYXNzIEZ0e2NvbnN0cnVjdG9yKHIpe3RoaXMuZXhjUHRyPXIsdGhpcy5wdHI9ci0yNH1zZXRfdHlwZShyKXtBW3RoaXMucHRyKzQ+PjJdPXJ9Z2V0X3R5cGUoKXtyZXR1cm4gQVt0aGlzLnB0cis0Pj4yXX1zZXRfZGVzdHJ1Y3RvcihyKXtBW3RoaXMucHRyKzg+PjJdPXJ9Z2V0X2Rlc3RydWN0b3IoKXtyZXR1cm4gQVt0aGlzLnB0cis4Pj4yXX1zZXRfY2F1Z2h0KHIpe3I9cj8xOjAsSVt0aGlzLnB0cisxMl09cn1nZXRfY2F1Z2h0KCl7cmV0dXJuIElbdGhpcy5wdHIrMTJdIT0wfXNldF9yZXRocm93bihyKXtyPXI/MTowLElbdGhpcy5wdHIrMTNdPXJ9Z2V0X3JldGhyb3duKCl7cmV0dXJuIElbdGhpcy5wdHIrMTNdIT0wfWluaXQocix0KXt0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCksdGhpcy5zZXRfdHlwZShyKSx0aGlzLnNldF9kZXN0cnVjdG9yKHQpfXNldF9hZGp1c3RlZF9wdHIocil7QVt0aGlzLnB0cisxNj4+Ml09cn1nZXRfYWRqdXN0ZWRfcHRyKCl7cmV0dXJuIEFbdGhpcy5wdHIrMTY+PjJdfWdldF9leGNlcHRpb25fcHRyKCl7dmFyIHI9cnQodGhpcy5nZXRfdHlwZSgpKTtpZihyKXJldHVybiBBW3RoaXMuZXhjUHRyPj4yXTt2YXIgdD10aGlzLmdldF9hZGp1c3RlZF9wdHIoKTtyZXR1cm4gdCE9PTA/dDp0aGlzLmV4Y1B0cn19dmFyIENyPTAsVHQ9KGUscix0KT0+e3ZhciBuPW5ldyBGdChlKTt0aHJvdyBuLmluaXQocix0KSxDcj1lLENyfSxTPXtpc0FiczplPT5lLmNoYXJBdCgwKT09PSIvIixzcGxpdFBhdGg6ZT0+e3ZhciByPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gci5leGVjKGUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTooZSxyKT0+e2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGE9ZVtuXTthPT09Ii4iP2Uuc3BsaWNlKG4sMSk6YT09PSIuLiI/KGUuc3BsaWNlKG4sMSksdCsrKTp0JiYoZS5zcGxpY2UobiwxKSx0LS0pfWlmKHIpZm9yKDt0O3QtLSllLnVuc2hpZnQoIi4uIik7cmV0dXJuIGV9LG5vcm1hbGl6ZTplPT57dmFyIHI9Uy5pc0FicyhlKSx0PWUuc3Vic3RyKC0xKT09PSIvIjtyZXR1cm4gZT1TLm5vcm1hbGl6ZUFycmF5KGUuc3BsaXQoIi8iKS5maWx0ZXIobj0+ISFuKSwhcikuam9pbigiLyIpLCFlJiYhciYmKGU9Ii4iKSxlJiZ0JiYoZSs9Ii8iKSwocj8iLyI6IiIpK2V9LGRpcm5hbWU6ZT0+e3ZhciByPVMuc3BsaXRQYXRoKGUpLHQ9clswXSxuPXJbMV07cmV0dXJuIXQmJiFuPyIuIjoobiYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksdCtuKX0sYmFzZW5hbWU6ZT0+e2lmKGU9PT0iLyIpcmV0dXJuIi8iO2U9Uy5ub3JtYWxpemUoZSksZT1lLnJlcGxhY2UoL1wvJC8sIiIpO3ZhciByPWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gcj09PS0xP2U6ZS5zdWJzdHIocisxKX0sam9pbjooLi4uZSk9PlMubm9ybWFsaXplKGUuam9pbigiLyIpKSxqb2luMjooZSxyKT0+Uy5ub3JtYWxpemUoZSsiLyIrcil9LFN0PSgpPT57aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2llKCJpbml0UmFuZG9tRGV2aWNlIil9LEZyPWU9PihGcj1TdCgpKShlKSxYPXtyZXNvbHZlOiguLi5lKT0+e2Zvcih2YXIgcj0iIix0PSExLG49ZS5sZW5ndGgtMTtuPj0tMSYmIXQ7bi0tKXt2YXIgYT1uPj0wP2Vbbl06by5jd2QoKTtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtpZighYSlyZXR1cm4iIjtyPWErIi8iK3IsdD1TLmlzQWJzKGEpfXJldHVybiByPVMubm9ybWFsaXplQXJyYXkoci5zcGxpdCgiLyIpLmZpbHRlcihpPT4hIWkpLCF0KS5qb2luKCIvIiksKHQ/Ii8iOiIiKStyfHwiLiJ9LHJlbGF0aXZlOihlLHIpPT57ZT1YLnJlc29sdmUoZSkuc3Vic3RyKDEpLHI9WC5yZXNvbHZlKHIpLnN1YnN0cigxKTtmdW5jdGlvbiB0KGMpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGgmJmNbZF09PT0iIjtkKyspO2Zvcih2YXIgbT1jLmxlbmd0aC0xO20+PTAmJmNbbV09PT0iIjttLS0pO3JldHVybiBkPm0/W106Yy5zbGljZShkLG0tZCsxKX1mb3IodmFyIG49dChlLnNwbGl0KCIvIikpLGE9dChyLnNwbGl0KCIvIikpLGk9TWF0aC5taW4obi5sZW5ndGgsYS5sZW5ndGgpLHM9aSxsPTA7bDxpO2wrKylpZihuW2xdIT09YVtsXSl7cz1sO2JyZWFrfWZvcih2YXIgdT1bXSxsPXM7bDxuLmxlbmd0aDtsKyspdS5wdXNoKCIuLiIpO3JldHVybiB1PXUuY29uY2F0KGEuc2xpY2UocykpLHUuam9pbigiLyIpfX0sSmU9W10sWmU9ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO248PTEyNz9yKys6bjw9MjA0Nz9yKz0yOm4+PTU1Mjk2JiZuPD01NzM0Mz8ocis9NCwrK3QpOnIrPTN9cmV0dXJuIHJ9LFFlPShlLHIsdCxuKT0+e2lmKCEobj4wKSlyZXR1cm4gMDtmb3IodmFyIGE9dCxpPXQrbi0xLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZS5jaGFyQ29kZUF0KHMpO2lmKGw+PTU1Mjk2JiZsPD01NzM0Myl7dmFyIHU9ZS5jaGFyQ29kZUF0KCsrcyk7bD02NTUzNisoKGwmMTAyMyk8PDEwKXx1JjEwMjN9aWYobDw9MTI3KXtpZih0Pj1pKWJyZWFrO3JbdCsrXT1sfWVsc2UgaWYobDw9MjA0Nyl7aWYodCsxPj1pKWJyZWFrO3JbdCsrXT0xOTJ8bD4+NixyW3QrK109MTI4fGwmNjN9ZWxzZSBpZihsPD02NTUzNSl7aWYodCsyPj1pKWJyZWFrO3JbdCsrXT0yMjR8bD4+MTIsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M31lbHNle2lmKHQrMz49aSlicmVhaztyW3QrK109MjQwfGw+PjE4LHJbdCsrXT0xMjh8bD4+MTImNjMsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M319cmV0dXJuIHJbdF09MCx0LWF9O2Z1bmN0aW9uIFNlKGUscix0KXt2YXIgbj1aZShlKSsxLGE9bmV3IEFycmF5KG4pLGk9UWUoZSxhLDAsYS5sZW5ndGgpO3JldHVybiByJiYoYS5sZW5ndGg9aSksYX12YXIgTXQ9KCk9PntpZighSmUubGVuZ3RoKXt2YXIgZT1udWxsO2lmKCFlKXJldHVybiBudWxsO0plPVNlKGUsITApfXJldHVybiBKZS5zaGlmdCgpfSxsZT17dHR5czpbXSxpbml0KCl7fSxzaHV0ZG93bigpe30scmVnaXN0ZXIoZSxyKXtsZS50dHlzW2VdPXtpbnB1dDpbXSxvdXRwdXQ6W10sb3BzOnJ9LG8ucmVnaXN0ZXJEZXZpY2UoZSxsZS5zdHJlYW1fb3BzKX0sc3RyZWFtX29wczp7b3BlbihlKXt2YXIgcj1sZS50dHlzW2Uubm9kZS5yZGV2XTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtlLnR0eT1yLGUuc2Vla2FibGU9ITF9LGNsb3NlKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LGZzeW5jKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LHJlYWQoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMuZ2V0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7Zm9yKHZhciBpPTAscz0wO3M8bjtzKyspe3ZhciBsO3RyeXtsPWUudHR5Lm9wcy5nZXRfY2hhcihlLnR0eSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9aWYobD09PXZvaWQgMCYmaT09PTApdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2KTtpZihsPT1udWxsKWJyZWFrO2krKyxyW3Qrc109bH1yZXR1cm4gaSYmKGUubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaX0sd3JpdGUoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMucHV0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7dHJ5e2Zvcih2YXIgaT0wO2k8bjtpKyspZS50dHkub3BzLnB1dF9jaGFyKGUudHR5LHJbdCtpXSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9cmV0dXJuIG4mJihlLm5vZGUudGltZXN0YW1wPURhdGUubm93KCkpLGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyKGUpe3JldHVybiBNdCgpfSxwdXRfY2hhcihlLHIpe3I9PT1udWxsfHxyPT09MTA/KHFlKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSk6ciE9MCYmZS5vdXRwdXQucHVzaChyKX0sZnN5bmMoZSl7ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aD4wJiYocWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKX0saW9jdGxfdGNnZXRzKGUpe3JldHVybntjX2lmbGFnOjI1ODU2LGNfb2ZsYWc6NSxjX2NmbGFnOjE5MSxjX2xmbGFnOjM1Mzg3LGNfY2M6WzMsMjgsMTI3LDIxLDQsMCwxLDAsMTcsMTksMjYsMCwxOCwxNSwyMywyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXX19LGlvY3RsX3Rjc2V0cyhlLHIsdCl7cmV0dXJuIDB9LGlvY3RsX3Rpb2Nnd2luc3ooZSl7cmV0dXJuWzI0LDgwXX19LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyKGUscil7cj09PW51bGx8fHI9PT0xMD8oZWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKTpyIT0wJiZlLm91dHB1dC5wdXNoKHIpfSxmc3luYyhlKXtlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoPjAmJihlZShjZShlLm91dHB1dCwwKSksZS5vdXRwdXQ9W10pfX19LFRyPWU9PntpZSgpfSxiPXtvcHNfdGFibGU6bnVsbCxtb3VudChlKXtyZXR1cm4gYi5jcmVhdGVOb2RlKG51bGwsIi8iLDE2ODk1LDApfSxjcmVhdGVOb2RlKGUscix0LG4pe2lmKG8uaXNCbGtkZXYodCl8fG8uaXNGSUZPKHQpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Iub3BzX3RhYmxlfHwoYi5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOmIubm9kZV9vcHMubG9va3VwLG1rbm9kOmIubm9kZV9vcHMubWtub2QscmVuYW1lOmIubm9kZV9vcHMucmVuYW1lLHVubGluazpiLm5vZGVfb3BzLnVubGluayxybWRpcjpiLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6Yi5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6Yi5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpiLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOmIuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpiLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpiLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6Yi5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6Yi5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6Yi5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6Yi5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6Yi5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6Yi5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06by5jaHJkZXZfc3RyZWFtX29wc319KTt2YXIgYT1vLmNyZWF0ZU5vZGUoZSxyLHQsbik7cmV0dXJuIG8uaXNEaXIoYS5tb2RlKT8oYS5ub2RlX29wcz1iLm9wc190YWJsZS5kaXIubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZGlyLnN0cmVhbSxhLmNvbnRlbnRzPXt9KTpvLmlzRmlsZShhLm1vZGUpPyhhLm5vZGVfb3BzPWIub3BzX3RhYmxlLmZpbGUubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZmlsZS5zdHJlYW0sYS51c2VkQnl0ZXM9MCxhLmNvbnRlbnRzPW51bGwpOm8uaXNMaW5rKGEubW9kZSk/KGEubm9kZV9vcHM9Yi5vcHNfdGFibGUubGluay5ub2RlLGEuc3RyZWFtX29wcz1iLm9wc190YWJsZS5saW5rLnN0cmVhbSk6by5pc0NocmRldihhLm1vZGUpJiYoYS5ub2RlX29wcz1iLm9wc190YWJsZS5jaHJkZXYubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSksYS50aW1lc3RhbXA9RGF0ZS5ub3coKSxlJiYoZS5jb250ZW50c1tyXT1hLGUudGltZXN0YW1wPWEudGltZXN0YW1wKSxhfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShlKXtyZXR1cm4gZS5jb250ZW50cz9lLmNvbnRlbnRzLnN1YmFycmF5P2UuY29udGVudHMuc3ViYXJyYXkoMCxlLnVzZWRCeXRlcyk6bmV3IFVpbnQ4QXJyYXkoZS5jb250ZW50cyk6bmV3IFVpbnQ4QXJyYXkoMCl9LGV4cGFuZEZpbGVTdG9yYWdlKGUscil7dmFyIHQ9ZS5jb250ZW50cz9lLmNvbnRlbnRzLmxlbmd0aDowO2lmKCEodD49cikpe3ZhciBuPTEwMjQqMTAyNDtyPU1hdGgubWF4KHIsdCoodDxuPzI6MS4xMjUpPj4+MCksdCE9MCYmKHI9TWF0aC5tYXgociwyNTYpKTt2YXIgYT1lLmNvbnRlbnRzO2UuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkociksZS51c2VkQnl0ZXM+MCYmZS5jb250ZW50cy5zZXQoYS5zdWJhcnJheSgwLGUudXNlZEJ5dGVzKSwwKX19LHJlc2l6ZUZpbGVTdG9yYWdlKGUscil7aWYoZS51c2VkQnl0ZXMhPXIpaWYocj09MCllLmNvbnRlbnRzPW51bGwsZS51c2VkQnl0ZXM9MDtlbHNle3ZhciB0PWUuY29udGVudHM7ZS5jb250ZW50cz1uZXcgVWludDhBcnJheShyKSx0JiZlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsTWF0aC5taW4ocixlLnVzZWRCeXRlcykpKSxlLnVzZWRCeXRlcz1yfX0sbm9kZV9vcHM6e2dldGF0dHIoZSl7dmFyIHI9e307cmV0dXJuIHIuZGV2PW8uaXNDaHJkZXYoZS5tb2RlKT9lLmlkOjEsci5pbm89ZS5pZCxyLm1vZGU9ZS5tb2RlLHIubmxpbms9MSxyLnVpZD0wLHIuZ2lkPTAsci5yZGV2PWUucmRldixvLmlzRGlyKGUubW9kZSk/ci5zaXplPTQwOTY6by5pc0ZpbGUoZS5tb2RlKT9yLnNpemU9ZS51c2VkQnl0ZXM6by5pc0xpbmsoZS5tb2RlKT9yLnNpemU9ZS5saW5rLmxlbmd0aDpyLnNpemU9MCxyLmF0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLm10aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmN0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmJsa3NpemU9NDA5NixyLmJsb2Nrcz1NYXRoLmNlaWwoci5zaXplL3IuYmxrc2l6ZSkscn0sc2V0YXR0cihlLHIpe3IubW9kZSE9PXZvaWQgMCYmKGUubW9kZT1yLm1vZGUpLHIudGltZXN0YW1wIT09dm9pZCAwJiYoZS50aW1lc3RhbXA9ci50aW1lc3RhbXApLHIuc2l6ZSE9PXZvaWQgMCYmYi5yZXNpemVGaWxlU3RvcmFnZShlLHIuc2l6ZSl9LGxvb2t1cChlLHIpe3Rocm93IG8uZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kKGUscix0LG4pe3JldHVybiBiLmNyZWF0ZU5vZGUoZSxyLHQsbil9LHJlbmFtZShlLHIsdCl7aWYoby5pc0RpcihlLm1vZGUpKXt2YXIgbjt0cnl7bj1vLmxvb2t1cE5vZGUocix0KX1jYXRjaHt9aWYobilmb3IodmFyIGEgaW4gbi5jb250ZW50cyl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU1KX1kZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSxlLnBhcmVudC50aW1lc3RhbXA9RGF0ZS5ub3coKSxlLm5hbWU9dCxyLmNvbnRlbnRzW3RdPWUsci50aW1lc3RhbXA9ZS5wYXJlbnQudGltZXN0YW1wLGUucGFyZW50PXJ9LHVubGluayhlLHIpe2RlbGV0ZSBlLmNvbnRlbnRzW3JdLGUudGltZXN0YW1wPURhdGUubm93KCl9LHJtZGlyKGUscil7dmFyIHQ9by5sb29rdXBOb2RlKGUscik7Zm9yKHZhciBuIGluIHQuY29udGVudHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NSk7ZGVsZXRlIGUuY29udGVudHNbcl0sZS50aW1lc3RhbXA9RGF0ZS5ub3coKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3ZhciBuPWIuY3JlYXRlTm9kZShlLHIsNDE0NzEsMCk7cmV0dXJuIG4ubGluaz10LG59LHJlYWRsaW5rKGUpe2lmKCFvLmlzTGluayhlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO3JldHVybiBlLmxpbmt9fSxzdHJlYW1fb3BzOntyZWFkKGUscix0LG4sYSl7dmFyIGk9ZS5ub2RlLmNvbnRlbnRzO2lmKGE+PWUubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHM9TWF0aC5taW4oZS5ub2RlLnVzZWRCeXRlcy1hLG4pO2lmKHM+OCYmaS5zdWJhcnJheSlyLnNldChpLnN1YmFycmF5KGEsYStzKSx0KTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspclt0K2xdPWlbYStsXTtyZXR1cm4gc30sd3JpdGUoZSxyLHQsbixhLGkpe2lmKHIuYnVmZmVyPT09SS5idWZmZXImJihpPSExKSwhbilyZXR1cm4gMDt2YXIgcz1lLm5vZGU7aWYocy50aW1lc3RhbXA9RGF0ZS5ub3coKSxyLnN1YmFycmF5JiYoIXMuY29udGVudHN8fHMuY29udGVudHMuc3ViYXJyYXkpKXtpZihpKXJldHVybiBzLmNvbnRlbnRzPXIuc3ViYXJyYXkodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihzLnVzZWRCeXRlcz09PTAmJmE9PT0wKXJldHVybiBzLmNvbnRlbnRzPXIuc2xpY2UodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihhK248PXMudXNlZEJ5dGVzKXJldHVybiBzLmNvbnRlbnRzLnNldChyLnN1YmFycmF5KHQsdCtuKSxhKSxufWlmKGIuZXhwYW5kRmlsZVN0b3JhZ2UocyxhK24pLHMuY29udGVudHMuc3ViYXJyYXkmJnIuc3ViYXJyYXkpcy5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LHQrbiksYSk7ZWxzZSBmb3IodmFyIGw9MDtsPG47bCsrKXMuY29udGVudHNbYStsXT1yW3QrbF07cmV0dXJuIHMudXNlZEJ5dGVzPU1hdGgubWF4KHMudXNlZEJ5dGVzLGErbiksbn0sbGxzZWVrKGUscix0KXt2YXIgbj1yO2lmKHQ9PT0xP24rPWUucG9zaXRpb246dD09PTImJm8uaXNGaWxlKGUubm9kZS5tb2RlKSYmKG4rPWUubm9kZS51c2VkQnl0ZXMpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn0sYWxsb2NhdGUoZSxyLHQpe2IuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLHIrdCksZS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChlLm5vZGUudXNlZEJ5dGVzLHIrdCl9LG1tYXAoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO3ZhciBpLHMsbD1lLm5vZGUuY29udGVudHM7aWYoIShhJjIpJiZsLmJ1ZmZlcj09PUkuYnVmZmVyKXM9ITEsaT1sLmJ5dGVPZmZzZXQ7ZWxzZXtpZigodD4wfHx0K3I8bC5sZW5ndGgpJiYobC5zdWJhcnJheT9sPWwuc3ViYXJyYXkodCx0K3IpOmw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobCx0LHQrcikpLHM9ITAsaT1UcigpLCFpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDgpO0kuc2V0KGwsaSl9cmV0dXJue3B0cjppLGFsbG9jYXRlZDpzfX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gYi5zdHJlYW1fb3BzLndyaXRlKGUsciwwLG4sdCwhMSksMH19fSxSdD0oZSxyLHQsbik9Pnt2YXIgYT1gYWwgJHtlfWA7bXIoZSxpPT57cihuZXcgVWludDhBcnJheShpKSksYSYmRmUoKX0saT0+e2lmKHQpdCgpO2Vsc2UgdGhyb3dgTG9hZGluZyBkYXRhIGZpbGUgIiR7ZX0iIGZhaWxlZC5gfSksYSYmWGUoKX0sT3Q9KGUscix0LG4sYSxpKT0+e28uY3JlYXRlRGF0YUZpbGUoZSxyLHQsbixhLGkpfSxJdD1mLnByZWxvYWRQbHVnaW5zfHxbXSxMdD0oZSxyLHQsbik9Pnt0eXBlb2YgQnJvd3NlcjwidSImJkJyb3dzZXIuaW5pdCgpO3ZhciBhPSExO3JldHVybiBJdC5mb3JFYWNoKGk9PnthfHxpLmNhbkhhbmRsZShyKSYmKGkuaGFuZGxlKGUscix0LG4pLGE9ITApfSksYX0sVnQ9KGUscix0LG4sYSxpLHMsbCx1LGMpPT57dmFyIGQ9cj9YLnJlc29sdmUoUy5qb2luMihlLHIpKTplO2Z1bmN0aW9uIG0oaCl7ZnVuY3Rpb24gcCh3KXtjPT1udWxsfHxjKCksbHx8T3QoZSxyLHcsbixhLHUpLGk9PW51bGx8fGkoKSxGZSgpfUx0KGgsZCxwLCgpPT57cz09bnVsbHx8cygpLEZlKCl9KXx8cChoKX1YZSgpLHR5cGVvZiB0PT0ic3RyaW5nIj9SdCh0LG0scyk6bSh0KX0sVXQ9ZT0+e3ZhciByPXtyOjAsInIrIjoyLHc6NTc3LCJ3KyI6NTc4LGE6MTA4OSwiYSsiOjEwOTB9LHQ9cltlXTtpZih0eXBlb2YgdD4idSIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke2V9YCk7cmV0dXJuIHR9LGVyPShlLHIpPT57dmFyIHQ9MDtyZXR1cm4gZSYmKHR8PTM2NSksciYmKHR8PTE0NiksdH0sVj17RElSX01PREU6MTY4OTUsRklMRV9NT0RFOjMzMjc5LHJlYWRlcjpudWxsLG1vdW50KGUpe19yKGFlKSxWLnJlYWRlcnx8KFYucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYyk7dmFyIHI9Vi5jcmVhdGVOb2RlKG51bGwsIi8iLFYuRElSX01PREUsMCksdD17fTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgcz1pLnNwbGl0KCIvIiksbD1yLHU9MDt1PHMubGVuZ3RoLTE7dSsrKXt2YXIgYz1zLnNsaWNlKDAsdSsxKS5qb2luKCIvIik7dFtjXXx8KHRbY109Vi5jcmVhdGVOb2RlKGwsc1t1XSxWLkRJUl9NT0RFLDApKSxsPXRbY119cmV0dXJuIGx9ZnVuY3Rpb24gYShpKXt2YXIgcz1pLnNwbGl0KCIvIik7cmV0dXJuIHNbcy5sZW5ndGgtMV19cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5vcHRzLmZpbGVzfHxbXSxmdW5jdGlvbihpKXtWLmNyZWF0ZU5vZGUobihpLm5hbWUpLGEoaS5uYW1lKSxWLkZJTEVfTU9ERSwwLGksaS5sYXN0TW9kaWZpZWREYXRlKX0pLChlLm9wdHMuYmxvYnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe1YuY3JlYXRlTm9kZShuKGkubmFtZSksYShpLm5hbWUpLFYuRklMRV9NT0RFLDAsaS5kYXRhKX0pLChlLm9wdHMucGFja2FnZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWV0YWRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgbD1zLmZpbGVuYW1lLnN1YnN0cigxKTtWLmNyZWF0ZU5vZGUobihsKSxhKGwpLFYuRklMRV9NT0RFLDAsaS5ibG9iLnNsaWNlKHMuc3RhcnQscy5lbmQpKX0pfSkscn0sY3JlYXRlTm9kZShlLHIsdCxuLGEsaSl7dmFyIHM9by5jcmVhdGVOb2RlKGUscix0KTtyZXR1cm4gcy5tb2RlPXQscy5ub2RlX29wcz1WLm5vZGVfb3BzLHMuc3RyZWFtX29wcz1WLnN0cmVhbV9vcHMscy50aW1lc3RhbXA9KGl8fG5ldyBEYXRlKS5nZXRUaW1lKCksX3IoVi5GSUxFX01PREUhPT1WLkRJUl9NT0RFKSx0PT09Vi5GSUxFX01PREU/KHMuc2l6ZT1hLnNpemUscy5jb250ZW50cz1hKToocy5zaXplPTQwOTYscy5jb250ZW50cz17fSksZSYmKGUuY29udGVudHNbcl09cyksc30sbm9kZV9vcHM6e2dldGF0dHIoZSl7cmV0dXJue2RldjoxLGlubzplLmlkLG1vZGU6ZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjowLHNpemU6ZS5zaXplLGF0aW1lOm5ldyBEYXRlKGUudGltZXN0YW1wKSxtdGltZTpuZXcgRGF0ZShlLnRpbWVzdGFtcCksY3RpbWU6bmV3IERhdGUoZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKGUuc2l6ZS80MDk2KX19LHNldGF0dHIoZSxyKXtyLm1vZGUhPT12b2lkIDAmJihlLm1vZGU9ci5tb2RlKSxyLnRpbWVzdGFtcCE9PXZvaWQgMCYmKGUudGltZXN0YW1wPXIudGltZXN0YW1wKX0sbG9va3VwKGUscil7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCl9LG1rbm9kKGUscix0LG4pe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSxyZW5hbWUoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSx1bmxpbmsoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scm1kaXIoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfX0sc3RyZWFtX29wczp7cmVhZChlLHIsdCxuLGEpe2lmKGE+PWUubm9kZS5zaXplKXJldHVybiAwO3ZhciBpPWUubm9kZS5jb250ZW50cy5zbGljZShhLGErbikscz1WLnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpKTtyZXR1cm4gci5zZXQobmV3IFVpbnQ4QXJyYXkocyksdCksaS5zaXplfSx3cml0ZShlLHIsdCxuLGEpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoMjkpfSxsbHNlZWsoZSxyLHQpe3ZhciBuPXI7aWYodD09PTE/bis9ZS5wb3NpdGlvbjp0PT09MiYmby5pc0ZpbGUoZS5ub2RlLm1vZGUpJiYobis9ZS5ub2RlLnNpemUpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn19fSxvPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6e30sc3RyZWFtczpbXSxuZXh0SW5vZGU6MSxuYW1lVGFibGU6bnVsbCxjdXJyZW50UGF0aDoiLyIsaW5pdGlhbGl6ZWQ6ITEsaWdub3JlUGVybWlzc2lvbnM6ITAsRXJybm9FcnJvcjpjbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9IkVycm5vRXJyb3IiLHRoaXMuZXJybm89ZX19LGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxzeW5jRlNSZXF1ZXN0czowLEZTU3RyZWFtOmNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFyZWQ9e319Z2V0IG9iamVjdCgpe3JldHVybiB0aGlzLm5vZGV9c2V0IG9iamVjdChlKXt0aGlzLm5vZGU9ZX1nZXQgaXNSZWFkKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfWdldCBpc1dyaXRlKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfWdldCBpc0FwcGVuZCgpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9Z2V0IGZsYWdzKCl7cmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzfXNldCBmbGFncyhlKXt0aGlzLnNoYXJlZC5mbGFncz1lfWdldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbn1zZXQgcG9zaXRpb24oZSl7dGhpcy5zaGFyZWQucG9zaXRpb249ZX19LEZTTm9kZTpjbGFzc3tjb25zdHJ1Y3RvcihlLHIsdCxuKXtlfHwoZT10aGlzKSx0aGlzLnBhcmVudD1lLHRoaXMubW91bnQ9ZS5tb3VudCx0aGlzLm1vdW50ZWQ9bnVsbCx0aGlzLmlkPW8ubmV4dElub2RlKyssdGhpcy5uYW1lPXIsdGhpcy5tb2RlPXQsdGhpcy5ub2RlX29wcz17fSx0aGlzLnN0cmVhbV9vcHM9e30sdGhpcy5yZGV2PW4sdGhpcy5yZWFkTW9kZT0zNjUsdGhpcy53cml0ZU1vZGU9MTQ2fWdldCByZWFkKCl7cmV0dXJuKHRoaXMubW9kZSZ0aGlzLnJlYWRNb2RlKT09PXRoaXMucmVhZE1vZGV9c2V0IHJlYWQoZSl7ZT90aGlzLm1vZGV8PXRoaXMucmVhZE1vZGU6dGhpcy5tb2RlJj1+dGhpcy5yZWFkTW9kZX1nZXQgd3JpdGUoKXtyZXR1cm4odGhpcy5tb2RlJnRoaXMud3JpdGVNb2RlKT09PXRoaXMud3JpdGVNb2RlfXNldCB3cml0ZShlKXtlP3RoaXMubW9kZXw9dGhpcy53cml0ZU1vZGU6dGhpcy5tb2RlJj1+dGhpcy53cml0ZU1vZGV9Z2V0IGlzRm9sZGVyKCl7cmV0dXJuIG8uaXNEaXIodGhpcy5tb2RlKX1nZXQgaXNEZXZpY2UoKXtyZXR1cm4gby5pc0NocmRldih0aGlzLm1vZGUpfX0sbG9va3VwUGF0aChlLHI9e30pe2lmKGU9WC5yZXNvbHZlKGUpLCFlKXJldHVybntwYXRoOiIiLG5vZGU6bnVsbH07dmFyIHQ9e2ZvbGxvd19tb3VudDohMCxyZWN1cnNlX2NvdW50OjB9O2lmKHI9T2JqZWN0LmFzc2lnbih0LHIpLHIucmVjdXJzZV9jb3VudD44KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzIpO2Zvcih2YXIgbj1lLnNwbGl0KCIvIikuZmlsdGVyKG09PiEhbSksYT1vLnJvb3QsaT0iLyIscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbD1zPT09bi5sZW5ndGgtMTtpZihsJiZyLnBhcmVudClicmVhaztpZihhPW8ubG9va3VwTm9kZShhLG5bc10pLGk9Uy5qb2luMihpLG5bc10pLG8uaXNNb3VudHBvaW50KGEpJiYoIWx8fGwmJnIuZm9sbG93X21vdW50KSYmKGE9YS5tb3VudGVkLnJvb3QpLCFsfHxyLmZvbGxvdylmb3IodmFyIHU9MDtvLmlzTGluayhhLm1vZGUpOyl7dmFyIGM9by5yZWFkbGluayhpKTtpPVgucmVzb2x2ZShTLmRpcm5hbWUoaSksYyk7dmFyIGQ9by5sb29rdXBQYXRoKGkse3JlY3Vyc2VfY291bnQ6ci5yZWN1cnNlX2NvdW50KzF9KTtpZihhPWQubm9kZSx1Kys+NDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMil9fXJldHVybntwYXRoOmksbm9kZTphfX0sZ2V0UGF0aChlKXtmb3IodmFyIHI7Oyl7aWYoby5pc1Jvb3QoZSkpe3ZhciB0PWUubW91bnQubW91bnRwb2ludDtyZXR1cm4gcj90W3QubGVuZ3RoLTFdIT09Ii8iP2Ake3R9LyR7cn1gOnQrcjp0fXI9cj9gJHtlLm5hbWV9LyR7cn1gOmUubmFtZSxlPWUucGFyZW50fX0saGFzaE5hbWUoZSxyKXtmb3IodmFyIHQ9MCxuPTA7bjxyLmxlbmd0aDtuKyspdD0odDw8NSktdCtyLmNoYXJDb2RlQXQobil8MDtyZXR1cm4oZSt0Pj4+MCklby5uYW1lVGFibGUubGVuZ3RofSxoYXNoQWRkTm9kZShlKXt2YXIgcj1vLmhhc2hOYW1lKGUucGFyZW50LmlkLGUubmFtZSk7ZS5uYW1lX25leHQ9by5uYW1lVGFibGVbcl0sby5uYW1lVGFibGVbcl09ZX0saGFzaFJlbW92ZU5vZGUoZSl7dmFyIHI9by5oYXNoTmFtZShlLnBhcmVudC5pZCxlLm5hbWUpO2lmKG8ubmFtZVRhYmxlW3JdPT09ZSlvLm5hbWVUYWJsZVtyXT1lLm5hbWVfbmV4dDtlbHNlIGZvcih2YXIgdD1vLm5hbWVUYWJsZVtyXTt0Oyl7aWYodC5uYW1lX25leHQ9PT1lKXt0Lm5hbWVfbmV4dD1lLm5hbWVfbmV4dDticmVha310PXQubmFtZV9uZXh0fX0sbG9va3VwTm9kZShlLHIpe3ZhciB0PW8ubWF5TG9va3VwKGUpO2lmKHQpdGhyb3cgbmV3IG8uRXJybm9FcnJvcih0KTtmb3IodmFyIG49by5oYXNoTmFtZShlLmlkLHIpLGE9by5uYW1lVGFibGVbbl07YTthPWEubmFtZV9uZXh0KXt2YXIgaT1hLm5hbWU7aWYoYS5wYXJlbnQuaWQ9PT1lLmlkJiZpPT09cilyZXR1cm4gYX1yZXR1cm4gby5sb29rdXAoZSxyKX0sY3JlYXRlTm9kZShlLHIsdCxuKXt2YXIgYT1uZXcgby5GU05vZGUoZSxyLHQsbik7cmV0dXJuIG8uaGFzaEFkZE5vZGUoYSksYX0sZGVzdHJveU5vZGUoZSl7by5oYXNoUmVtb3ZlTm9kZShlKX0saXNSb290KGUpe3JldHVybiBlPT09ZS5wYXJlbnR9LGlzTW91bnRwb2ludChlKXtyZXR1cm4hIWUubW91bnRlZH0saXNGaWxlKGUpe3JldHVybihlJjYxNDQwKT09PTMyNzY4fSxpc0RpcihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0xNjM4NH0saXNMaW5rKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTYwfSxpc0NocmRldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT04MTkyfSxpc0Jsa2RldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0yNDU3Nn0saXNGSUZPKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTZ9LGlzU29ja2V0KGUpe3JldHVybihlJjQ5MTUyKT09PTQ5MTUyfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZyhlKXt2YXIgcj1bInIiLCJ3IiwicnciXVtlJjNdO3JldHVybiBlJjUxMiYmKHIrPSJ3Iikscn0sbm9kZVBlcm1pc3Npb25zKGUscil7cmV0dXJuIG8uaWdub3JlUGVybWlzc2lvbnM/MDpyLmluY2x1ZGVzKCJyIikmJiEoZS5tb2RlJjI5Mil8fHIuaW5jbHVkZXMoInciKSYmIShlLm1vZGUmMTQ2KXx8ci5pbmNsdWRlcygieCIpJiYhKGUubW9kZSY3Myk/MjowfSxtYXlMb29rdXAoZSl7aWYoIW8uaXNEaXIoZS5tb2RlKSlyZXR1cm4gNTQ7dmFyIHI9by5ub2RlUGVybWlzc2lvbnMoZSwieCIpO3JldHVybiByfHwoZS5ub2RlX29wcy5sb29rdXA/MDoyKX0sbWF5Q3JlYXRlKGUscil7dHJ5e3ZhciB0PW8ubG9va3VwTm9kZShlLHIpO3JldHVybiAyMH1jYXRjaHt9cmV0dXJuIG8ubm9kZVBlcm1pc3Npb25zKGUsInd4Iil9LG1heURlbGV0ZShlLHIsdCl7dmFyIG47dHJ5e249by5sb29rdXBOb2RlKGUscil9Y2F0Y2goaSl7cmV0dXJuIGkuZXJybm99dmFyIGE9by5ub2RlUGVybWlzc2lvbnMoZSwid3giKTtpZihhKXJldHVybiBhO2lmKHQpe2lmKCFvLmlzRGlyKG4ubW9kZSkpcmV0dXJuIDU0O2lmKG8uaXNSb290KG4pfHxvLmdldFBhdGgobik9PT1vLmN3ZCgpKXJldHVybiAxMH1lbHNlIGlmKG8uaXNEaXIobi5tb2RlKSlyZXR1cm4gMzE7cmV0dXJuIDB9LG1heU9wZW4oZSxyKXtyZXR1cm4gZT9vLmlzTGluayhlLm1vZGUpPzMyOm8uaXNEaXIoZS5tb2RlKSYmKG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikhPT0iciJ8fHImNTEyKT8zMTpvLm5vZGVQZXJtaXNzaW9ucyhlLG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikpOjQ0fSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQoKXtmb3IodmFyIGU9MDtlPD1vLk1BWF9PUEVOX0ZEUztlKyspaWYoIW8uc3RyZWFtc1tlXSlyZXR1cm4gZTt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtQ2hlY2tlZChlKXt2YXIgcj1vLmdldFN0cmVhbShlKTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO3JldHVybiByfSxnZXRTdHJlYW06ZT0+by5zdHJlYW1zW2VdLGNyZWF0ZVN0cmVhbShlLHI9LTEpe3JldHVybiBlPU9iamVjdC5hc3NpZ24obmV3IG8uRlNTdHJlYW0sZSkscj09LTEmJihyPW8ubmV4dGZkKCkpLGUuZmQ9cixvLnN0cmVhbXNbcl09ZSxlfSxjbG9zZVN0cmVhbShlKXtvLnN0cmVhbXNbZV09bnVsbH0sZHVwU3RyZWFtKGUscj0tMSl7dmFyIG4sYTt2YXIgdD1vLmNyZWF0ZVN0cmVhbShlLHIpO3JldHVybihhPShuPXQuc3RyZWFtX29wcyk9PW51bGw/dm9pZCAwOm4uZHVwKT09bnVsbHx8YS5jYWxsKG4sdCksdH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHQsbjt2YXIgcj1vLmdldERldmljZShlLm5vZGUucmRldik7ZS5zdHJlYW1fb3BzPXIuc3RyZWFtX29wcywobj0odD1lLnN0cmVhbV9vcHMpLm9wZW4pPT1udWxsfHxuLmNhbGwodCxlKX0sbGxzZWVrKCl7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCl9fSxtYWpvcjplPT5lPj44LG1pbm9yOmU9PmUmMjU1LG1ha2VkZXY6KGUscik9PmU8PDh8cixyZWdpc3RlckRldmljZShlLHIpe28uZGV2aWNlc1tlXT17c3RyZWFtX29wczpyfX0sZ2V0RGV2aWNlOmU9Pm8uZGV2aWNlc1tlXSxnZXRNb3VudHMoZSl7Zm9yKHZhciByPVtdLHQ9W2VdO3QubGVuZ3RoOyl7dmFyIG49dC5wb3AoKTtyLnB1c2gobiksdC5wdXNoKC4uLm4ubW91bnRzKX1yZXR1cm4gcn0sc3luY2ZzKGUscil7dHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT0hMSksby5zeW5jRlNSZXF1ZXN0cysrLG8uc3luY0ZTUmVxdWVzdHM+MSYmZWUoYHdhcm5pbmc6ICR7by5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApO3ZhciB0PW8uZ2V0TW91bnRzKG8ucm9vdC5tb3VudCksbj0wO2Z1bmN0aW9uIGEocyl7cmV0dXJuIG8uc3luY0ZTUmVxdWVzdHMtLSxyKHMpfWZ1bmN0aW9uIGkocyl7aWYocylyZXR1cm4gaS5lcnJvcmVkP3ZvaWQgMDooaS5lcnJvcmVkPSEwLGEocykpOysrbj49dC5sZW5ndGgmJmEobnVsbCl9dC5mb3JFYWNoKHM9PntpZighcy50eXBlLnN5bmNmcylyZXR1cm4gaShudWxsKTtzLnR5cGUuc3luY2ZzKHMsZSxpKX0pfSxtb3VudChlLHIsdCl7dmFyIG49dD09PSIvIixhPSF0LGk7aWYobiYmby5yb290KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFuJiYhYSl7dmFyIHM9by5sb29rdXBQYXRoKHQse2ZvbGxvd19tb3VudDohMX0pO2lmKHQ9cy5wYXRoLGk9cy5ub2RlLG8uaXNNb3VudHBvaW50KGkpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFvLmlzRGlyKGkubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCl9dmFyIGw9e3R5cGU6ZSxvcHRzOnIsbW91bnRwb2ludDp0LG1vdW50czpbXX0sdT1lLm1vdW50KGwpO3JldHVybiB1Lm1vdW50PWwsbC5yb290PXUsbj9vLnJvb3Q9dTppJiYoaS5tb3VudGVkPWwsaS5tb3VudCYmaS5tb3VudC5tb3VudHMucHVzaChsKSksdX0sdW5tb3VudChlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93X21vdW50OiExfSk7aWYoIW8uaXNNb3VudHBvaW50KHIubm9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7dmFyIHQ9ci5ub2RlLG49dC5tb3VudGVkLGE9by5nZXRNb3VudHMobik7T2JqZWN0LmtleXMoby5uYW1lVGFibGUpLmZvckVhY2gocz0+e2Zvcih2YXIgbD1vLm5hbWVUYWJsZVtzXTtsOyl7dmFyIHU9bC5uYW1lX25leHQ7YS5pbmNsdWRlcyhsLm1vdW50KSYmby5kZXN0cm95Tm9kZShsKSxsPXV9fSksdC5tb3VudGVkPW51bGw7dmFyIGk9dC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTt0Lm1vdW50Lm1vdW50cy5zcGxpY2UoaSwxKX0sbG9va3VwKGUscil7cmV0dXJuIGUubm9kZV9vcHMubG9va3VwKGUscil9LG1rbm9kKGUscix0KXt2YXIgbj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksYT1uLm5vZGUsaT1TLmJhc2VuYW1lKGUpO2lmKCFpfHxpPT09Ii4ifHxpPT09Ii4uIil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgcz1vLm1heUNyZWF0ZShhLGkpO2lmKHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihzKTtpZighYS5ub2RlX29wcy5ta25vZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gYS5ub2RlX29wcy5ta25vZChhLGkscix0KX0sY3JlYXRlKGUscil7cmV0dXJuIHI9ciE9PXZvaWQgMD9yOjQzOCxyJj00MDk1LHJ8PTMyNzY4LG8ubWtub2QoZSxyLDApfSxta2RpcihlLHIpe3JldHVybiByPXIhPT12b2lkIDA/cjo1MTEsciY9MTAyMyxyfD0xNjM4NCxvLm1rbm9kKGUsciwwKX0sbWtkaXJUcmVlKGUscil7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPSIiLGE9MDthPHQubGVuZ3RoOysrYSlpZih0W2FdKXtuKz0iLyIrdFthXTt0cnl7by5ta2RpcihuLHIpfWNhdGNoKGkpe2lmKGkuZXJybm8hPTIwKXRocm93IGl9fX0sbWtkZXYoZSxyLHQpe3JldHVybiB0eXBlb2YgdD4idSImJih0PXIscj00MzgpLHJ8PTgxOTIsby5ta25vZChlLHIsdCl9LHN5bWxpbmsoZSxyKXtpZighWC5yZXNvbHZlKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciB0PW8ubG9va3VwUGF0aChyLHtwYXJlbnQ6ITB9KSxuPXQubm9kZTtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTt2YXIgYT1TLmJhc2VuYW1lKHIpLGk9by5tYXlDcmVhdGUobixhKTtpZihpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoaSk7aWYoIW4ubm9kZV9vcHMuc3ltbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5zeW1saW5rKG4sYSxlKX0scmVuYW1lKGUscil7dmFyIHQ9Uy5kaXJuYW1lKGUpLG49Uy5kaXJuYW1lKHIpLGE9Uy5iYXNlbmFtZShlKSxpPVMuYmFzZW5hbWUocikscyxsLHU7aWYocz1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksbD1zLm5vZGUscz1vLmxvb2t1cFBhdGgocix7cGFyZW50OiEwfSksdT1zLm5vZGUsIWx8fCF1KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO2lmKGwubW91bnQhPT11Lm1vdW50KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzUpO3ZhciBjPW8ubG9va3VwTm9kZShsLGEpLGQ9WC5yZWxhdGl2ZShlLG4pO2lmKGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKGQ9WC5yZWxhdGl2ZShyLHQpLGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTUpO3ZhciBtO3RyeXttPW8ubG9va3VwTm9kZSh1LGkpfWNhdGNoe31pZihjIT09bSl7dmFyIGg9by5pc0RpcihjLm1vZGUpLHA9by5tYXlEZWxldGUobCxhLGgpO2lmKHApdGhyb3cgbmV3IG8uRXJybm9FcnJvcihwKTtpZihwPW0/by5tYXlEZWxldGUodSxpLGgpOm8ubWF5Q3JlYXRlKHUsaSkscCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO2lmKCFsLm5vZGVfb3BzLnJlbmFtZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChjKXx8bSYmby5pc01vdW50cG9pbnQobSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigxMCk7aWYodSE9PWwmJihwPW8ubm9kZVBlcm1pc3Npb25zKGwsInciKSxwKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO28uaGFzaFJlbW92ZU5vZGUoYyk7dHJ5e2wubm9kZV9vcHMucmVuYW1lKGMsdSxpKX1jYXRjaCh3KXt0aHJvdyB3fWZpbmFsbHl7by5oYXNoQWRkTm9kZShjKX19fSxybWRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksdD1yLm5vZGUsbj1TLmJhc2VuYW1lKGUpLGE9by5sb29rdXBOb2RlKHQsbiksaT1vLm1heURlbGV0ZSh0LG4sITApO2lmKGkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihpKTtpZighdC5ub2RlX29wcy5ybWRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnJtZGlyKHQsbiksby5kZXN0cm95Tm9kZShhKX0scmVhZGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSksdD1yLm5vZGU7aWYoIXQubm9kZV9vcHMucmVhZGRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU0KTtyZXR1cm4gdC5ub2RlX29wcy5yZWFkZGlyKHQpfSx1bmxpbmsoZSl7dmFyIHI9by5sb29rdXBQYXRoKGUse3BhcmVudDohMH0pLHQ9ci5ub2RlO2lmKCF0KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciBuPVMuYmFzZW5hbWUoZSksYT1vLmxvb2t1cE5vZGUodCxuKSxpPW8ubWF5RGVsZXRlKHQsbiwhMSk7aWYoaSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGkpO2lmKCF0Lm5vZGVfb3BzLnVubGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnVubGluayh0LG4pLG8uZGVzdHJveU5vZGUoYSl9LHJlYWRsaW5rKGUpe3ZhciByPW8ubG9va3VwUGF0aChlKSx0PXIubm9kZTtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighdC5ub2RlX29wcy5yZWFkbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gWC5yZXNvbHZlKG8uZ2V0UGF0aCh0LnBhcmVudCksdC5ub2RlX29wcy5yZWFkbGluayh0KSl9LHN0YXQoZSxyKXt2YXIgdD1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiFyfSksbj10Lm5vZGU7aWYoIW4pdGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCk7aWYoIW4ubm9kZV9vcHMuZ2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5nZXRhdHRyKG4pfSxsc3RhdChlKXtyZXR1cm4gby5zdGF0KGUsITApfSxjaG1vZChlLHIsdCl7dmFyIG47aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgYT1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiF0fSk7bj1hLm5vZGV9ZWxzZSBuPWU7aWYoIW4ubm9kZV9vcHMuc2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtuLm5vZGVfb3BzLnNldGF0dHIobix7bW9kZTpyJjQwOTV8bi5tb2RlJi00MDk2LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9LGxjaG1vZChlLHIpe28uY2htb2QoZSxyLCEwKX0sZmNobW9kKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO28uY2htb2QodC5ub2RlLHIpfSxjaG93bihlLHIsdCxuKXt2YXIgYTtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBpPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IW59KTthPWkubm9kZX1lbHNlIGE9ZTtpZighYS5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Eubm9kZV9vcHMuc2V0YXR0cihhLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd24oZSxyLHQpe28uY2hvd24oZSxyLHQsITApfSxmY2hvd24oZSxyLHQpe3ZhciBuPW8uZ2V0U3RyZWFtQ2hlY2tlZChlKTtvLmNob3duKG4ubm9kZSxyLHQpfSx0cnVuY2F0ZShlLHIpe2lmKHI8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgdDtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KTt0PW4ubm9kZX1lbHNlIHQ9ZTtpZighdC5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2lmKG8uaXNEaXIodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMxKTtpZighby5pc0ZpbGUodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgYT1vLm5vZGVQZXJtaXNzaW9ucyh0LCJ3Iik7aWYoYSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGEpO3Qubm9kZV9vcHMuc2V0YXR0cih0LHtzaXplOnIsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sZnRydW5jYXRlKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO2lmKCEodC5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtvLnRydW5jYXRlKHQubm9kZSxyKX0sdXRpbWUoZSxyLHQpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KSxhPW4ubm9kZTthLm5vZGVfb3BzLnNldGF0dHIoYSx7dGltZXN0YW1wOk1hdGgubWF4KHIsdCl9KX0sb3BlbihlLHIsdCl7aWYoZT09PSIiKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3I9dHlwZW9mIHI9PSJzdHJpbmciP1V0KHIpOnIsciY2ND8odD10eXBlb2YgdD4idSI/NDM4OnQsdD10JjQwOTV8MzI3NjgpOnQ9MDt2YXIgbjtpZih0eXBlb2YgZT09Im9iamVjdCIpbj1lO2Vsc2V7ZT1TLm5vcm1hbGl6ZShlKTt0cnl7dmFyIGE9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohKHImMTMxMDcyKX0pO249YS5ub2RlfWNhdGNoe319dmFyIGk9ITE7aWYociY2NClpZihuKXtpZihyJjEyOCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIwKX1lbHNlIG49by5ta25vZChlLHQsMCksaT0hMDtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZihvLmlzQ2hyZGV2KG4ubW9kZSkmJihyJj0tNTEzKSxyJjY1NTM2JiYhby5pc0RpcihuLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTQpO2lmKCFpKXt2YXIgcz1vLm1heU9wZW4obixyKTtpZihzKXRocm93IG5ldyBvLkVycm5vRXJyb3Iocyl9ciY1MTImJiFpJiZvLnRydW5jYXRlKG4sMCksciY9LTEzMTcxMzt2YXIgbD1vLmNyZWF0ZVN0cmVhbSh7bm9kZTpuLHBhdGg6by5nZXRQYXRoKG4pLGZsYWdzOnIsc2Vla2FibGU6ITAscG9zaXRpb246MCxzdHJlYW1fb3BzOm4uc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjohMX0pO3JldHVybiBsLnN0cmVhbV9vcHMub3BlbiYmbC5zdHJlYW1fb3BzLm9wZW4obCksZi5sb2dSZWFkRmlsZXMmJiEociYxKSYmKG8ucmVhZEZpbGVzfHwoby5yZWFkRmlsZXM9e30pLGUgaW4gby5yZWFkRmlsZXN8fChvLnJlYWRGaWxlc1tlXT0xKSksbH0sY2xvc2UoZSl7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2UuZ2V0ZGVudHMmJihlLmdldGRlbnRzPW51bGwpO3RyeXtlLnN0cmVhbV9vcHMuY2xvc2UmJmUuc3RyZWFtX29wcy5jbG9zZShlKX1jYXRjaChyKXt0aHJvdyByfWZpbmFsbHl7by5jbG9zZVN0cmVhbShlLmZkKX1lLmZkPW51bGx9LGlzQ2xvc2VkKGUpe3JldHVybiBlLmZkPT09bnVsbH0sbGxzZWVrKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIWUuc2Vla2FibGV8fCFlLnN0cmVhbV9vcHMubGxzZWVrKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzApO2lmKHQhPTAmJnQhPTEmJnQhPTIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7cmV0dXJuIGUucG9zaXRpb249ZS5zdHJlYW1fb3BzLmxsc2VlayhlLHIsdCksZS51bmdvdHRlbj1bXSxlLnBvc2l0aW9ufSxyZWFkKGUscix0LG4sYSl7aWYobjwwfHxhPDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKG8uaXNEaXIoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzEpO2lmKCFlLnN0cmVhbV9vcHMucmVhZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgaT10eXBlb2YgYTwidSI7aWYoIWkpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIHM9ZS5zdHJlYW1fb3BzLnJlYWQoZSxyLHQsbixhKTtyZXR1cm4gaXx8KGUucG9zaXRpb24rPXMpLHN9LHdyaXRlKGUscix0LG4sYSxpKXtpZihuPDB8fGE8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIShlLmZsYWdzJjIwOTcxNTUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoby5pc0RpcihlLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMSk7aWYoIWUuc3RyZWFtX29wcy53cml0ZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtlLnNlZWthYmxlJiZlLmZsYWdzJjEwMjQmJm8ubGxzZWVrKGUsMCwyKTt2YXIgcz10eXBlb2YgYTwidSI7aWYoIXMpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIGw9ZS5zdHJlYW1fb3BzLndyaXRlKGUscix0LG4sYSxpKTtyZXR1cm4gc3x8KGUucG9zaXRpb24rPWwpLGx9LGFsbG9jYXRlKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYocjwwfHx0PD0wKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKCEoZS5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKCFvLmlzRmlsZShlLm5vZGUubW9kZSkmJiFvLmlzRGlyKGUubm9kZS5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtpZighZS5zdHJlYW1fb3BzLmFsbG9jYXRlKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTM4KTtlLnN0cmVhbV9vcHMuYWxsb2NhdGUoZSxyLHQpfSxtbWFwKGUscix0LG4sYSl7aWYobiYyJiYhKGEmMikmJihlLmZsYWdzJjIwOTcxNTUpIT09Mil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKCFlLnN0cmVhbV9vcHMubW1hcCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtyZXR1cm4gZS5zdHJlYW1fb3BzLm1tYXAoZSxyLHQsbixhKX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gZS5zdHJlYW1fb3BzLm1zeW5jP2Uuc3RyZWFtX29wcy5tc3luYyhlLHIsdCxuLGEpOjB9LGlvY3RsKGUscix0KXtpZighZS5zdHJlYW1fb3BzLmlvY3RsKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTkpO3JldHVybiBlLnN0cmVhbV9vcHMuaW9jdGwoZSxyLHQpfSxyZWFkRmlsZShlLHI9e30pe2lmKHIuZmxhZ3M9ci5mbGFnc3x8MCxyLmVuY29kaW5nPXIuZW5jb2Rpbmd8fCJiaW5hcnkiLHIuZW5jb2RpbmchPT0idXRmOCImJnIuZW5jb2RpbmchPT0iYmluYXJ5Iil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2RpbmcgdHlwZSAiJHtyLmVuY29kaW5nfSJgKTt2YXIgdCxuPW8ub3BlbihlLHIuZmxhZ3MpLGE9by5zdGF0KGUpLGk9YS5zaXplLHM9bmV3IFVpbnQ4QXJyYXkoaSk7cmV0dXJuIG8ucmVhZChuLHMsMCxpLDApLHIuZW5jb2Rpbmc9PT0idXRmOCI/dD1jZShzLDApOnIuZW5jb2Rpbmc9PT0iYmluYXJ5IiYmKHQ9cyksby5jbG9zZShuKSx0fSx3cml0ZUZpbGUoZSxyLHQ9e30pe3QuZmxhZ3M9dC5mbGFnc3x8NTc3O3ZhciBuPW8ub3BlbihlLHQuZmxhZ3MsdC5tb2RlKTtpZih0eXBlb2Ygcj09InN0cmluZyIpe3ZhciBhPW5ldyBVaW50OEFycmF5KFplKHIpKzEpLGk9UWUocixhLDAsYS5sZW5ndGgpO28ud3JpdGUobixhLDAsaSx2b2lkIDAsdC5jYW5Pd24pfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKW8ud3JpdGUobixyLDAsci5ieXRlTGVuZ3RoLHZvaWQgMCx0LmNhbk93bik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO28uY2xvc2Uobil9LGN3ZDooKT0+by5jdXJyZW50UGF0aCxjaGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSk7aWYoci5ub2RlPT09bnVsbCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighby5pc0RpcihyLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCk7dmFyIHQ9by5ub2RlUGVybWlzc2lvbnMoci5ub2RlLCJ4Iik7aWYodCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHQpO28uY3VycmVudFBhdGg9ci5wYXRofSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKXtvLm1rZGlyKCIvdG1wIiksby5ta2RpcigiL2hvbWUiKSxvLm1rZGlyKCIvaG9tZS93ZWJfdXNlciIpfSxjcmVhdGVEZWZhdWx0RGV2aWNlcygpe28ubWtkaXIoIi9kZXYiKSxvLnJlZ2lzdGVyRGV2aWNlKG8ubWFrZWRldigxLDMpLHtyZWFkOigpPT4wLHdyaXRlOihuLGEsaSxzLGwpPT5zfSksby5ta2RldigiL2Rldi9udWxsIixvLm1ha2VkZXYoMSwzKSksbGUucmVnaXN0ZXIoby5tYWtlZGV2KDUsMCksbGUuZGVmYXVsdF90dHlfb3BzKSxsZS5yZWdpc3RlcihvLm1ha2VkZXYoNiwwKSxsZS5kZWZhdWx0X3R0eTFfb3BzKSxvLm1rZGV2KCIvZGV2L3R0eSIsby5tYWtlZGV2KDUsMCkpLG8ubWtkZXYoIi9kZXYvdHR5MSIsby5tYWtlZGV2KDYsMCkpO3ZhciBlPW5ldyBVaW50OEFycmF5KDEwMjQpLHI9MCx0PSgpPT4ocj09PTAmJihyPUZyKGUpLmJ5dGVMZW5ndGgpLGVbLS1yXSk7by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJyYW5kb20iLHQpLG8uY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIsdCksby5ta2RpcigiL2Rldi9zaG0iKSxvLm1rZGlyKCIvZGV2L3NobS90bXAiKX0sY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCl7by5ta2RpcigiL3Byb2MiKTt2YXIgZT1vLm1rZGlyKCIvcHJvYy9zZWxmIik7by5ta2RpcigiL3Byb2Mvc2VsZi9mZCIpLG8ubW91bnQoe21vdW50KCl7dmFyIHI9by5jcmVhdGVOb2RlKGUsImZkIiwxNjg5NSw3Myk7cmV0dXJuIHIubm9kZV9vcHM9e2xvb2t1cCh0LG4pe3ZhciBhPStuLGk9by5nZXRTdHJlYW1DaGVja2VkKGEpLHM9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOigpPT5pLnBhdGh9fTtyZXR1cm4gcy5wYXJlbnQ9cyxzfX0scn19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpe2Yuc3RkaW4/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsZi5zdGRpbik6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKSxmLnN0ZG91dD9vLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCxmLnN0ZG91dCk6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0IiksZi5zdGRlcnI/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsZi5zdGRlcnIpOm8uc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKSxvLm9wZW4oIi9kZXYvc3RkaW4iLDApLG8ub3BlbigiL2Rldi9zdGRvdXQiLDEpLG8ub3BlbigiL2Rldi9zdGRlcnIiLDEpfSxzdGF0aWNJbml0KCl7WzQ0XS5mb3JFYWNoKGU9PntvLmdlbmVyaWNFcnJvcnNbZV09bmV3IG8uRXJybm9FcnJvcihlKSxvLmdlbmVyaWNFcnJvcnNbZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSksby5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpLG8ubW91bnQoYix7fSwiLyIpLG8uY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCksby5jcmVhdGVEZWZhdWx0RGV2aWNlcygpLG8uY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksby5maWxlc3lzdGVtcz17TUVNRlM6YixXT1JLRVJGUzpWfX0saW5pdChlLHIsdCl7by5pbml0LmluaXRpYWxpemVkPSEwLGYuc3RkaW49ZXx8Zi5zdGRpbixmLnN0ZG91dD1yfHxmLnN0ZG91dCxmLnN0ZGVycj10fHxmLnN0ZGVycixvLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0KCl7by5pbml0LmluaXRpYWxpemVkPSExO2Zvcih2YXIgZT0wO2U8by5zdHJlYW1zLmxlbmd0aDtlKyspe3ZhciByPW8uc3RyZWFtc1tlXTtyJiZvLmNsb3NlKHIpfX0sZmluZE9iamVjdChlLHIpe3ZhciB0PW8uYW5hbHl6ZVBhdGgoZSxyKTtyZXR1cm4gdC5leGlzdHM/dC5vYmplY3Q6bnVsbH0sYW5hbHl6ZVBhdGgoZSxyKXt0cnl7dmFyIHQ9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohcn0pO2U9dC5wYXRofWNhdGNoe312YXIgbj17aXNSb290OiExLGV4aXN0czohMSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOiExLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciB0PW8ubG9va3VwUGF0aChlLHtwYXJlbnQ6ITB9KTtuLnBhcmVudEV4aXN0cz0hMCxuLnBhcmVudFBhdGg9dC5wYXRoLG4ucGFyZW50T2JqZWN0PXQubm9kZSxuLm5hbWU9Uy5iYXNlbmFtZShlKSx0PW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IXJ9KSxuLmV4aXN0cz0hMCxuLnBhdGg9dC5wYXRoLG4ub2JqZWN0PXQubm9kZSxuLm5hbWU9dC5ub2RlLm5hbWUsbi5pc1Jvb3Q9dC5wYXRoPT09Ii8ifWNhdGNoKGEpe24uZXJyb3I9YS5lcnJub31yZXR1cm4gbn0sY3JlYXRlUGF0aChlLHIsdCxuKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOm8uZ2V0UGF0aChlKTtmb3IodmFyIGE9ci5zcGxpdCgiLyIpLnJldmVyc2UoKTthLmxlbmd0aDspe3ZhciBpPWEucG9wKCk7aWYoaSl7dmFyIHM9Uy5qb2luMihlLGkpO3RyeXtvLm1rZGlyKHMpfWNhdGNoe31lPXN9fXJldHVybiBzfSxjcmVhdGVGaWxlKGUscix0LG4sYSl7dmFyIGk9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscikscz1lcihuLGEpO3JldHVybiBvLmNyZWF0ZShpLHMpfSxjcmVhdGVEYXRhRmlsZShlLHIsdCxuLGEsaSl7dmFyIHM9cjtlJiYoZT10eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscz1yP1Muam9pbjIoZSxyKTplKTt2YXIgbD1lcihuLGEpLHU9by5jcmVhdGUocyxsKTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2Zvcih2YXIgYz1uZXcgQXJyYXkodC5sZW5ndGgpLGQ9MCxtPXQubGVuZ3RoO2Q8bTsrK2QpY1tkXT10LmNoYXJDb2RlQXQoZCk7dD1jfW8uY2htb2QodSxsfDE0Nik7dmFyIGg9by5vcGVuKHUsNTc3KTtvLndyaXRlKGgsdCwwLHQubGVuZ3RoLDAsaSksby5jbG9zZShoKSxvLmNobW9kKHUsbCl9fSxjcmVhdGVEZXZpY2UoZSxyLHQsbil7dmFyIGE9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSksciksaT1lcighIXQsISFuKTtvLmNyZWF0ZURldmljZS5tYWpvcnx8KG8uY3JlYXRlRGV2aWNlLm1ham9yPTY0KTt2YXIgcz1vLm1ha2VkZXYoby5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtyZXR1cm4gby5yZWdpc3RlckRldmljZShzLHtvcGVuKGwpe2wuc2Vla2FibGU9ITF9LGNsb3NlKGwpe3ZhciB1Oyh1PW49PW51bGw/dm9pZCAwOm4uYnVmZmVyKSE9bnVsbCYmdS5sZW5ndGgmJm4oMTApfSxyZWFkKGwsdSxjLGQsbSl7Zm9yKHZhciBoPTAscD0wO3A8ZDtwKyspe3ZhciB3O3RyeXt3PXQoKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1pZih3PT09dm9pZCAwJiZoPT09MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYpO2lmKHc9PW51bGwpYnJlYWs7aCsrLHVbYytwXT13fXJldHVybiBoJiYobC5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxofSx3cml0ZShsLHUsYyxkLG0pe2Zvcih2YXIgaD0wO2g8ZDtoKyspdHJ5e24odVtjK2hdKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1yZXR1cm4gZCYmKGwubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaH19KSxvLm1rZGV2KGEsaSxzKX0sZm9yY2VMb2FkRmlsZShlKXtpZihlLmlzRGV2aWNlfHxlLmlzRm9sZGVyfHxlLmxpbmt8fGUuY29udGVudHMpcmV0dXJuITA7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpO2lmKFllKXRyeXtlLmNvbnRlbnRzPVNlKFllKGUudXJsKSwhMCksZS51c2VkQnl0ZXM9ZS5jb250ZW50cy5sZW5ndGh9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfSxjcmVhdGVMYXp5RmlsZShlLHIsdCxuLGEpe2NsYXNzIGl7Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aEtub3duPSExLHRoaXMuY2h1bmtzPVtdfWdldChwKXtpZighKHA+dGhpcy5sZW5ndGgtMXx8cDwwKSl7dmFyIHc9cCV0aGlzLmNodW5rU2l6ZSxEPXAvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoRClbd119fXNldERhdGFHZXR0ZXIocCl7dGhpcy5nZXR0ZXI9cH1jYWNoZUxlbmd0aCgpe3ZhciBwPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihwLm9wZW4oIkhFQUQiLHQsITEpLHAuc2VuZChudWxsKSwhKHAuc3RhdHVzPj0yMDAmJnAuc3RhdHVzPDMwMHx8cC5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK3Auc3RhdHVzKTt2YXIgdz1OdW1iZXIocC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSksRCxNPShEPXAuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJkQ9PT0iYnl0ZXMiLEY9KEQ9cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSYmRD09PSJnemlwIix2PTEwMjQqMTAyNDtNfHwodj13KTt2YXIgXz0oVCxCKT0+e2lmKFQ+Qil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIrVCsiLCAiK0IrIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKEI+dy0xKXRocm93IG5ldyBFcnJvcigib25seSAiK3crIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKE8ub3BlbigiR0VUIix0LCExKSx3IT09diYmTy5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrVCsiLSIrQiksTy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixPLm92ZXJyaWRlTWltZVR5cGUmJk8ub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpLE8uc2VuZChudWxsKSwhKE8uc3RhdHVzPj0yMDAmJk8uc3RhdHVzPDMwMHx8Ty5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK08uc3RhdHVzKTtyZXR1cm4gTy5yZXNwb25zZSE9PXZvaWQgMD9uZXcgVWludDhBcnJheShPLnJlc3BvbnNlfHxbXSk6U2UoTy5yZXNwb25zZVRleHR8fCIiLCEwKX0sTD10aGlzO0wuc2V0RGF0YUdldHRlcihUPT57dmFyIEI9VCp2LE89KFQrMSkqdi0xO2lmKE89TWF0aC5taW4oTyx3LTEpLHR5cGVvZiBMLmNodW5rc1tUXT4idSImJihMLmNodW5rc1tUXT1fKEIsTykpLHR5cGVvZiBMLmNodW5rc1tUXT4idSIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIEwuY2h1bmtzW1RdfSksKEZ8fCF3KSYmKHY9dz0xLHc9dGhpcy5nZXR0ZXIoMCkubGVuZ3RoLHY9dyxxZSgiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIikpLHRoaXMuX2xlbmd0aD13LHRoaXMuX2NodW5rU2l6ZT12LHRoaXMubGVuZ3RoS25vd249ITB9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxlbmd0aEtub3dufHx0aGlzLmNhY2hlTGVuZ3RoKCksdGhpcy5fbGVuZ3RofWdldCBjaHVua1NpemUoKXtyZXR1cm4gdGhpcy5sZW5ndGhLbm93bnx8dGhpcy5jYWNoZUxlbmd0aCgpLHRoaXMuX2NodW5rU2l6ZX19aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil2YXIgcz1uZXcgaSxsPXtpc0RldmljZTohMSxjb250ZW50czpzfTtlbHNlIHZhciBsPXtpc0RldmljZTohMSx1cmw6dH07dmFyIHU9by5jcmVhdGVGaWxlKGUscixsLG4sYSk7bC5jb250ZW50cz91LmNvbnRlbnRzPWwuY29udGVudHM6bC51cmwmJih1LmNvbnRlbnRzPW51bGwsdS51cmw9bC51cmwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHUse3VzZWRCeXRlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RofX19KTt2YXIgYz17fSxkPU9iamVjdC5rZXlzKHUuc3RyZWFtX29wcyk7ZC5mb3JFYWNoKGg9Pnt2YXIgcD11LnN0cmVhbV9vcHNbaF07Y1toXT0oLi4udyk9PihvLmZvcmNlTG9hZEZpbGUodSkscCguLi53KSl9KTtmdW5jdGlvbiBtKGgscCx3LEQsTSl7dmFyIEY9aC5ub2RlLmNvbnRlbnRzO2lmKE0+PUYubGVuZ3RoKXJldHVybiAwO3ZhciB2PU1hdGgubWluKEYubGVuZ3RoLU0sRCk7aWYoRi5zbGljZSlmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GW00rX107ZWxzZSBmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GLmdldChNK18pO3JldHVybiB2fXJldHVybiBjLnJlYWQ9KGgscCx3LEQsTSk9PihvLmZvcmNlTG9hZEZpbGUodSksbShoLHAsdyxELE0pKSxjLm1tYXA9KGgscCx3LEQsTSk9PntvLmZvcmNlTG9hZEZpbGUodSk7dmFyIEY9VHIoKTtpZighRil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ4KTtyZXR1cm4gbShoLEksRixwLHcpLHtwdHI6RixhbGxvY2F0ZWQ6ITB9fSx1LnN0cmVhbV9vcHM9Yyx1fX0sUD17REVGQVVMVF9QT0xMTUFTSzo1LGNhbGN1bGF0ZUF0KGUscix0KXtpZihTLmlzQWJzKHIpKXJldHVybiByO3ZhciBuO2lmKGU9PT0tMTAwKW49by5jd2QoKTtlbHNle3ZhciBhPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO249YS5wYXRofWlmKHIubGVuZ3RoPT0wKXtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtyZXR1cm4gbn1yZXR1cm4gUy5qb2luMihuLHIpfSxkb1N0YXQoZSxyLHQpe3ZhciBuPWUocik7Z1t0Pj4yXT1uLmRldixnW3QrND4+Ml09bi5tb2RlLEFbdCs4Pj4yXT1uLm5saW5rLGdbdCsxMj4+Ml09bi51aWQsZ1t0KzE2Pj4yXT1uLmdpZCxnW3QrMjA+PjJdPW4ucmRldiwkPVtuLnNpemU+Pj4wLCh5PW4uc2l6ZSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCsyND4+Ml09JFswXSxnW3QrMjg+PjJdPSRbMV0sZ1t0KzMyPj4yXT00MDk2LGdbdCszNj4+Ml09bi5ibG9ja3M7dmFyIGE9bi5hdGltZS5nZXRUaW1lKCksaT1uLm10aW1lLmdldFRpbWUoKSxzPW4uY3RpbWUuZ2V0VGltZSgpO3JldHVybiAkPVtNYXRoLmZsb29yKGEvMWUzKT4+PjAsKHk9TWF0aC5mbG9vcihhLzFlMyksK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrNDA+PjJdPSRbMF0sZ1t0KzQ0Pj4yXT0kWzFdLEFbdCs0OD4+Ml09YSUxZTMqMWUzLCQ9W01hdGguZmxvb3IoaS8xZTMpPj4+MCwoeT1NYXRoLmZsb29yKGkvMWUzKSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCs1Nj4+Ml09JFswXSxnW3QrNjA+PjJdPSRbMV0sQVt0KzY0Pj4yXT1pJTFlMyoxZTMsJD1bTWF0aC5mbG9vcihzLzFlMyk+Pj4wLCh5PU1hdGguZmxvb3Iocy8xZTMpLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1t0KzcyPj4yXT0kWzBdLGdbdCs3Nj4+Ml09JFsxXSxBW3QrODA+PjJdPXMlMWUzKjFlMywkPVtuLmlubz4+PjAsKHk9bi5pbm8sK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrODg+PjJdPSRbMF0sZ1t0KzkyPj4yXT0kWzFdLDB9LGRvTXN5bmMoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoci5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO2lmKG4mMilyZXR1cm4gMDt2YXIgaT14LnNsaWNlKGUsZSt0KTtvLm1zeW5jKHIsaSxhLHQsbil9LGdldFN0cmVhbUZyb21GRChlKXt2YXIgcj1vLmdldFN0cmVhbUNoZWNrZWQoZSk7cmV0dXJuIHJ9LHZhcmFyZ3M6dm9pZCAwLGdldFN0cihlKXt2YXIgcj1zZShlKTtyZXR1cm4gcn19O2Z1bmN0aW9uIGp0KGUscix0LG4pe3RyeXtpZihyPVAuZ2V0U3RyKHIpLHI9UC5jYWxjdWxhdGVBdChlLHIpLHQmLTgpcmV0dXJuLTI4O3ZhciBhPW8ubG9va3VwUGF0aChyLHtmb2xsb3c6ITB9KSxpPWEubm9kZTtpZighaSlyZXR1cm4tNDQ7dmFyIHM9IiI7cmV0dXJuIHQmNCYmKHMrPSJyIiksdCYyJiYocys9InciKSx0JjEmJihzKz0ieCIpLHMmJm8ubm9kZVBlcm1pc3Npb25zKGkscyk/LTI6MH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybi1sLmVycm5vfX1mdW5jdGlvbiBNZSgpe3ZhciBlPWdbK1AudmFyYXJncz4+Ml07cmV0dXJuIFAudmFyYXJncys9NCxlfXZhciBkZT1NZTtmdW5jdGlvbiB6dChlLHIsdCl7UC52YXJhcmdzPXQ7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3N3aXRjaChyKXtjYXNlIDA6e3ZhciBhPU1lKCk7aWYoYTwwKXJldHVybi0yODtmb3IoO28uc3RyZWFtc1thXTspYSsrO3ZhciBpO3JldHVybiBpPW8uZHVwU3RyZWFtKG4sYSksaS5mZH1jYXNlIDE6Y2FzZSAyOnJldHVybiAwO2Nhc2UgMzpyZXR1cm4gbi5mbGFncztjYXNlIDQ6e3ZhciBhPU1lKCk7cmV0dXJuIG4uZmxhZ3N8PWEsMH1jYXNlIDEyOnt2YXIgYT1kZSgpLHM9MDtyZXR1cm4gWVthK3M+PjFdPTIsMH1jYXNlIDEzOmNhc2UgMTQ6cmV0dXJuIDB9cmV0dXJuLTI4fWNhdGNoKGwpe2lmKHR5cGVvZiBvPiJ1Inx8bC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGw7cmV0dXJuLWwuZXJybm99fWZ1bmN0aW9uIHh0KGUscil7dHJ5e3ZhciB0PVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3JldHVybiBQLmRvU3RhdChvLnN0YXQsdC5wYXRoLHIpfWNhdGNoKG4pe2lmKHR5cGVvZiBvPiJ1Inx8bi5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IG47cmV0dXJuLW4uZXJybm99fXZhciB2ZT0oZSxyLHQpPT5RZShlLHgscix0KTtmdW5jdGlvbiBIdChlLHIsdCl7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO24uZ2V0ZGVudHN8fChuLmdldGRlbnRzPW8ucmVhZGRpcihuLnBhdGgpKTtmb3IodmFyIGE9MjgwLGk9MCxzPW8ubGxzZWVrKG4sMCwxKSxsPU1hdGguZmxvb3Iocy9hKTtsPG4uZ2V0ZGVudHMubGVuZ3RoJiZpK2E8PXQ7KXt2YXIgdSxjLGQ9bi5nZXRkZW50c1tsXTtpZihkPT09Ii4iKXU9bi5ub2RlLmlkLGM9NDtlbHNlIGlmKGQ9PT0iLi4iKXt2YXIgbT1vLmxvb2t1cFBhdGgobi5wYXRoLHtwYXJlbnQ6ITB9KTt1PW0ubm9kZS5pZCxjPTR9ZWxzZXt2YXIgaD1vLmxvb2t1cE5vZGUobi5ub2RlLGQpO3U9aC5pZCxjPW8uaXNDaHJkZXYoaC5tb2RlKT8yOm8uaXNEaXIoaC5tb2RlKT80Om8uaXNMaW5rKGgubW9kZSk/MTA6OH0kPVt1Pj4+MCwoeT11LCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2k+PjJdPSRbMF0sZ1tyK2krND4+Ml09JFsxXSwkPVsobCsxKSphPj4+MCwoeT0obCsxKSphLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2krOD4+Ml09JFswXSxnW3IraSsxMj4+Ml09JFsxXSxZW3IraSsxNj4+MV09MjgwLElbcitpKzE4XT1jLHZlKGQscitpKzE5LDI1NiksaSs9YSxsKz0xfXJldHVybiBvLmxsc2VlayhuLGwqYSwwKSxpfWNhdGNoKHApe2lmKHR5cGVvZiBvPiJ1Inx8cC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHA7cmV0dXJuLXAuZXJybm99fWZ1bmN0aW9uIFd0KGUscix0KXtQLnZhcmFyZ3M9dDt0cnl7dmFyIG49UC5nZXRTdHJlYW1Gcm9tRkQoZSk7c3dpdGNoKHIpe2Nhc2UgMjE1MDk6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDU6e2lmKCFuLnR0eSlyZXR1cm4tNTk7aWYobi50dHkub3BzLmlvY3RsX3RjZ2V0cyl7dmFyIGE9bi50dHkub3BzLmlvY3RsX3RjZ2V0cyhuKSxpPWRlKCk7Z1tpPj4yXT1hLmNfaWZsYWd8fDAsZ1tpKzQ+PjJdPWEuY19vZmxhZ3x8MCxnW2krOD4+Ml09YS5jX2NmbGFnfHwwLGdbaSsxMj4+Ml09YS5jX2xmbGFnfHwwO2Zvcih2YXIgcz0wO3M8MzI7cysrKUlbaStzKzE3XT1hLmNfY2Nbc118fDA7cmV0dXJuIDB9cmV0dXJuIDB9Y2FzZSAyMTUxMDpjYXNlIDIxNTExOmNhc2UgMjE1MTI6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDY6Y2FzZSAyMTUwNzpjYXNlIDIxNTA4OntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90Y3NldHMpe2Zvcih2YXIgaT1kZSgpLGw9Z1tpPj4yXSx1PWdbaSs0Pj4yXSxjPWdbaSs4Pj4yXSxkPWdbaSsxMj4+Ml0sbT1bXSxzPTA7czwzMjtzKyspbS5wdXNoKElbaStzKzE3XSk7cmV0dXJuIG4udHR5Lm9wcy5pb2N0bF90Y3NldHMobi50dHkscix7Y19pZmxhZzpsLGNfb2ZsYWc6dSxjX2NmbGFnOmMsY19sZmxhZzpkLGNfY2M6bX0pfXJldHVybiAwfWNhc2UgMjE1MTk6e2lmKCFuLnR0eSlyZXR1cm4tNTk7dmFyIGk9ZGUoKTtyZXR1cm4gZ1tpPj4yXT0wLDB9Y2FzZSAyMTUyMDpyZXR1cm4gbi50dHk/LTI4Oi01OTtjYXNlIDIxNTMxOnt2YXIgaT1kZSgpO3JldHVybiBvLmlvY3RsKG4scixpKX1jYXNlIDIxNTIzOntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90aW9jZ3dpbnN6KXt2YXIgaD1uLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihuLnR0eSksaT1kZSgpO1lbaT4+MV09aFswXSxZW2krMj4+MV09aFsxXX1yZXR1cm4gMH1jYXNlIDIxNTI0OnJldHVybiBuLnR0eT8wOi01OTtjYXNlIDIxNTE1OnJldHVybiBuLnR0eT8wOi01OTtkZWZhdWx0OnJldHVybi0yOH19Y2F0Y2gocCl7aWYodHlwZW9mIG8+InUifHxwLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcDtyZXR1cm4tcC5lcnJub319ZnVuY3Rpb24gQnQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5sc3RhdCxlLHIpfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuLXQuZXJybm99fWZ1bmN0aW9uIE50KGUscix0LG4pe3RyeXtyPVAuZ2V0U3RyKHIpO3ZhciBhPW4mMjU2LGk9biY0MDk2O3JldHVybiBuPW4mLTY0MDEscj1QLmNhbGN1bGF0ZUF0KGUscixpKSxQLmRvU3RhdChhP28ubHN0YXQ6by5zdGF0LHIsdCl9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4tcy5lcnJub319ZnVuY3Rpb24gWXQoZSxyLHQsbil7UC52YXJhcmdzPW47dHJ5e3I9UC5nZXRTdHIocikscj1QLmNhbGN1bGF0ZUF0KGUscik7dmFyIGE9bj9NZSgpOjA7cmV0dXJuIG8ub3BlbihyLHQsYSkuZmR9Y2F0Y2goaSl7aWYodHlwZW9mIG8+InUifHxpLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgaTtyZXR1cm4taS5lcnJub319ZnVuY3Rpb24gR3QoZSxyLHQsbil7dHJ5e3JldHVybiByPVAuZ2V0U3RyKHIpLG49UC5nZXRTdHIobikscj1QLmNhbGN1bGF0ZUF0KGUsciksbj1QLmNhbGN1bGF0ZUF0KHQsbiksby5yZW5hbWUocixuKSwwfWNhdGNoKGEpe2lmKHR5cGVvZiBvPiJ1Inx8YS5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGE7cmV0dXJuLWEuZXJybm99fWZ1bmN0aW9uIHF0KGUpe3RyeXtyZXR1cm4gZT1QLmdldFN0cihlKSxvLnJtZGlyKGUpLDB9Y2F0Y2gocil7aWYodHlwZW9mIG8+InUifHxyLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcjtyZXR1cm4tci5lcnJub319ZnVuY3Rpb24gWHQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5zdGF0LGUscil9Y2F0Y2godCl7aWYodHlwZW9mIG8+InUifHx0Lm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgdDtyZXR1cm4tdC5lcnJub319ZnVuY3Rpb24gS3QoZSxyLHQpe3RyeXtyZXR1cm4gcj1QLmdldFN0cihyKSxyPVAuY2FsY3VsYXRlQXQoZSxyKSx0PT09MD9vLnVubGluayhyKTp0PT09NTEyP28ucm1kaXIocik6aWUoIkludmFsaWQgZmxhZ3MgcGFzc2VkIHRvIHVubGlua2F0IiksMH1jYXRjaChuKXtpZih0eXBlb2Ygbz4idSJ8fG4ubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBuO3JldHVybi1uLmVycm5vfX12YXIgSnQ9KCk9PntpZSgiIil9LFJlPXt9LHJyPWU9Pntmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKSx0PWUucG9wKCk7dChyKX19O2Z1bmN0aW9uIHllKGUpe3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShBW2U+PjJdKX12YXIgaGU9e30sdWU9e30sT2U9e30sU3IsSWU9ZT0+e3Rocm93IG5ldyBTcihlKX0sTj0oZSxyLHQpPT57ZS5mb3JFYWNoKGZ1bmN0aW9uKGwpe09lW2xdPXJ9KTtmdW5jdGlvbiBuKGwpe3ZhciB1PXQobCk7dS5sZW5ndGghPT1lLmxlbmd0aCYmSWUoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKTtmb3IodmFyIGM9MDtjPGUubGVuZ3RoOysrYylLKGVbY10sdVtjXSl9dmFyIGE9bmV3IEFycmF5KHIubGVuZ3RoKSxpPVtdLHM9MDtyLmZvckVhY2goKGwsdSk9Pnt1ZS5oYXNPd25Qcm9wZXJ0eShsKT9hW3VdPXVlW2xdOihpLnB1c2gobCksaGUuaGFzT3duUHJvcGVydHkobCl8fChoZVtsXT1bXSksaGVbbF0ucHVzaCgoKT0+e2FbdV09dWVbbF0sKytzLHM9PT1pLmxlbmd0aCYmbihhKX0pKX0pLGkubGVuZ3RoPT09MCYmbihhKX0sWnQ9ZT0+e3ZhciByPVJlW2VdO2RlbGV0ZSBSZVtlXTt2YXIgdD1yLnJhd0NvbnN0cnVjdG9yLG49ci5yYXdEZXN0cnVjdG9yLGE9ci5maWVsZHMsaT1hLm1hcChzPT5zLmdldHRlclJldHVyblR5cGUpLmNvbmNhdChhLm1hcChzPT5zLnNldHRlckFyZ3VtZW50VHlwZSkpO04oW2VdLGkscz0+e3ZhciBsPXt9O3JldHVybiBhLmZvckVhY2goKHUsYyk9Pnt2YXIgZD11LmZpZWxkTmFtZSxtPXNbY10saD11LmdldHRlcixwPXUuZ2V0dGVyQ29udGV4dCx3PXNbYythLmxlbmd0aF0sRD11LnNldHRlcixNPXUuc2V0dGVyQ29udGV4dDtsW2RdPXtyZWFkOkY9Pm0uZnJvbVdpcmVUeXBlKGgocCxGKSksd3JpdGU6KEYsdik9Pnt2YXIgXz1bXTtEKE0sRix3LnRvV2lyZVR5cGUoXyx2KSkscnIoXyl9fX0pLFt7bmFtZTpyLm5hbWUsZnJvbVdpcmVUeXBlOnU9Pnt2YXIgYz17fTtmb3IodmFyIGQgaW4gbCljW2RdPWxbZF0ucmVhZCh1KTtyZXR1cm4gbih1KSxjfSx0b1dpcmVUeXBlOih1LGMpPT57Zm9yKHZhciBkIGluIGwpaWYoIShkIGluIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgZmllbGQ6ICIke2R9ImApO3ZhciBtPXQoKTtmb3IoZCBpbiBsKWxbZF0ud3JpdGUobSxjW2RdKTtyZXR1cm4gdSE9PW51bGwmJnUucHVzaChuLG0pLG19LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm59XX0pfSxRdD0oZSxyLHQsbixhKT0+e30sZW49KCk9Pntmb3IodmFyIGU9bmV3IEFycmF5KDI1Nikscj0wO3I8MjU2OysrcillW3JdPVN0cmluZy5mcm9tQ2hhckNvZGUocik7TXI9ZX0sTXIsaj1lPT57Zm9yKHZhciByPSIiLHQ9ZTt4W3RdOylyKz1Nclt4W3QrK11dO3JldHVybiByfSxtZSxrPWU9Pnt0aHJvdyBuZXcgbWUoZSl9O2Z1bmN0aW9uIHJuKGUscix0PXt9KXt2YXIgbj1yLm5hbWU7aWYoZXx8ayhgdHlwZSAiJHtufSIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcmApLHVlLmhhc093blByb3BlcnR5KGUpKXtpZih0Lmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpcmV0dXJuO2soYENhbm5vdCByZWdpc3RlciB0eXBlICcke259JyB0d2ljZWApfWlmKHVlW2VdPXIsZGVsZXRlIE9lW2VdLGhlLmhhc093blByb3BlcnR5KGUpKXt2YXIgYT1oZVtlXTtkZWxldGUgaGVbZV0sYS5mb3JFYWNoKGk9PmkoKSl9fWZ1bmN0aW9uIEsoZSxyLHQ9e30pe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKTtyZXR1cm4gcm4oZSxyLHQpfXZhciBKPTgsdG49KGUscix0LG4pPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4hIWF9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oYSxpKXtyZXR1cm4gaT90Om59LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHhbYV0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSxubj1lPT4oe2NvdW50OmUuY291bnQsZGVsZXRlU2NoZWR1bGVkOmUuZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOmUucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOmUucHRyLHB0clR5cGU6ZS5wdHJUeXBlLHNtYXJ0UHRyOmUuc21hcnRQdHIsc21hcnRQdHJUeXBlOmUuc21hcnRQdHJUeXBlfSksdHI9ZT0+e2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MubmFtZX1rKHIoZSkrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX0sbnI9ITEsUnI9ZT0+e30sYW49ZT0+e2Uuc21hcnRQdHI/ZS5zbWFydFB0clR5cGUucmF3RGVzdHJ1Y3RvcihlLnNtYXJ0UHRyKTplLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoZS5wdHIpfSxPcj1lPT57ZS5jb3VudC52YWx1ZS09MTt2YXIgcj1lLmNvdW50LnZhbHVlPT09MDtyJiZhbihlKX0sSXI9KGUscix0KT0+e2lmKHI9PT10KXJldHVybiBlO2lmKHQuYmFzZUNsYXNzPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBuPUlyKGUscix0LmJhc2VDbGFzcyk7cmV0dXJuIG49PT1udWxsP251bGw6dC5kb3duY2FzdChuKX0sTHI9e30sb249KCk9Pk9iamVjdC5rZXlzKGJlKS5sZW5ndGgsc249KCk9Pnt2YXIgZT1bXTtmb3IodmFyIHIgaW4gYmUpYmUuaGFzT3duUHJvcGVydHkocikmJmUucHVzaChiZVtyXSk7cmV0dXJuIGV9LHdlPVtdLGFyPSgpPT57Zm9yKDt3ZS5sZW5ndGg7KXt2YXIgZT13ZS5wb3AoKTtlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlLmRlbGV0ZSgpfX0sRWUsbG49ZT0+e0VlPWUsd2UubGVuZ3RoJiZFZSYmRWUoYXIpfSx1bj0oKT0+e2YuZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudD1vbixmLmdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM9c24sZi5mbHVzaFBlbmRpbmdEZWxldGVzPWFyLGYuc2V0RGVsYXlGdW5jdGlvbj1sbn0sYmU9e30sZm49KGUscik9Pntmb3Iocj09PXZvaWQgMCYmaygicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIik7ZS5iYXNlQ2xhc3M7KXI9ZS51cGNhc3QociksZT1lLmJhc2VDbGFzcztyZXR1cm4gcn0sY249KGUscik9PihyPWZuKGUsciksYmVbcl0pLExlPShlLHIpPT57KCFyLnB0clR5cGV8fCFyLnB0cikmJkllKCJtYWtlQ2xhc3NIYW5kbGUgcmVxdWlyZXMgcHRyIGFuZCBwdHJUeXBlIik7dmFyIHQ9ISFyLnNtYXJ0UHRyVHlwZSxuPSEhci5zbWFydFB0cjtyZXR1cm4gdCE9PW4mJkllKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKSxyLmNvdW50PXt2YWx1ZToxfSxrZShPYmplY3QuY3JlYXRlKGUseyQkOnt2YWx1ZTpyLHdyaXRhYmxlOiEwfX0pKX07ZnVuY3Rpb24gZG4oZSl7dmFyIHI9dGhpcy5nZXRQb2ludGVlKGUpO2lmKCFyKXJldHVybiB0aGlzLmRlc3RydWN0b3IoZSksbnVsbDt2YXIgdD1jbih0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyKTtpZih0IT09dm9pZCAwKXtpZih0LiQkLmNvdW50LnZhbHVlPT09MClyZXR1cm4gdC4kJC5wdHI9cix0LiQkLnNtYXJ0UHRyPWUsdC5jbG9uZSgpO3ZhciBuPXQuY2xvbmUoKTtyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKGUpLG59ZnVuY3Rpb24gYSgpe3JldHVybiB0aGlzLmlzU21hcnRQb2ludGVyP0xlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6ZX0pOkxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOmV9KX12YXIgaT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHIpLHM9THJbaV07aWYoIXMpcmV0dXJuIGEuY2FsbCh0aGlzKTt2YXIgbDt0aGlzLmlzQ29uc3Q/bD1zLmNvbnN0UG9pbnRlclR5cGU6bD1zLnBvaW50ZXJUeXBlO3ZhciB1PUlyKHIsdGhpcy5yZWdpc3RlcmVkQ2xhc3MsbC5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiB1PT09bnVsbD9hLmNhbGwodGhpcyk6dGhpcy5pc1NtYXJ0UG9pbnRlcj9MZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1LHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOmV9KTpMZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1fSl9dmFyIGtlPWU9PnR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT4idSI/KGtlPXI9PnIsZSk6KG5yPW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShyPT57T3Ioci4kJCl9KSxrZT1yPT57dmFyIHQ9ci4kJCxuPSEhdC5zbWFydFB0cjtpZihuKXt2YXIgYT17JCQ6dH07bnIucmVnaXN0ZXIocixhLHIpfXJldHVybiByfSxScj1yPT5uci51bnJlZ2lzdGVyKHIpLGtlKGUpKSx2bj0oKT0+e09iamVjdC5hc3NpZ24oVmUucHJvdG90eXBlLHtpc0FsaWFzT2YoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVmUpfHwhKGUgaW5zdGFuY2VvZiBWZSkpcmV0dXJuITE7dmFyIHI9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyx0PXRoaXMuJCQucHRyO2UuJCQ9ZS4kJDtmb3IodmFyIG49ZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxhPWUuJCQucHRyO3IuYmFzZUNsYXNzOyl0PXIudXBjYXN0KHQpLHI9ci5iYXNlQ2xhc3M7Zm9yKDtuLmJhc2VDbGFzczspYT1uLnVwY2FzdChhKSxuPW4uYmFzZUNsYXNzO3JldHVybiByPT09biYmdD09PWF9LGNsb25lKCl7aWYodGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpcmV0dXJuIHRoaXMuJCQuY291bnQudmFsdWUrPTEsdGhpczt2YXIgZT1rZShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOm5uKHRoaXMuJCQpfX0pKTtyZXR1cm4gZS4kJC5jb3VudC52YWx1ZSs9MSxlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlfSxkZWxldGUoKXt0aGlzLiQkLnB0cnx8dHIodGhpcyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlJiZrKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIiksUnIodGhpcyksT3IodGhpcy4kJCksdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZXx8KHRoaXMuJCQuc21hcnRQdHI9dm9pZCAwLHRoaXMuJCQucHRyPXZvaWQgMCl9LGlzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn0sZGVsZXRlTGF0ZXIoKXtyZXR1cm4gdGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmaygiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpLHdlLnB1c2godGhpcyksd2UubGVuZ3RoPT09MSYmRWUmJkVlKGFyKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMCx0aGlzfX0pfTtmdW5jdGlvbiBWZSgpe312YXIgVWU9KGUscik9Pk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJuYW1lIix7dmFsdWU6ZX0pLG9yPShlLHIsdCk9PntpZihlW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDApe3ZhciBuPWVbcl07ZVtyXT1mdW5jdGlvbiguLi5hKXtyZXR1cm4gZVtyXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGEubGVuZ3RoKXx8ayhgRnVuY3Rpb24gJyR7dH0nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHthLmxlbmd0aH0pIC0gZXhwZWN0cyBvbmUgb2YgKCR7ZVtyXS5vdmVybG9hZFRhYmxlfSkhYCksZVtyXS5vdmVybG9hZFRhYmxlW2EubGVuZ3RoXS5hcHBseSh0aGlzLGEpfSxlW3JdLm92ZXJsb2FkVGFibGU9W10sZVtyXS5vdmVybG9hZFRhYmxlW24uYXJnQ291bnRdPW59fSxWcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKT8oKHQ9PT12b2lkIDB8fGZbZV0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmZltlXS5vdmVybG9hZFRhYmxlW3RdIT09dm9pZCAwKSYmayhgQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICcke2V9JyB0d2ljZWApLG9yKGYsZSxlKSxmLmhhc093blByb3BlcnR5KHQpJiZrKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgb3ZlcmxvYWRzIG9mIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzICgke3R9KSFgKSxmW2VdLm92ZXJsb2FkVGFibGVbdF09cik6KGZbZV09cix0IT09dm9pZCAwJiYoZltlXS5udW1Bcmd1bWVudHM9dCkpfSxobj00OCxtbj01Nyxwbj1lPT57aWYoZT09PXZvaWQgMClyZXR1cm4iX3Vua25vd24iO2U9ZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIiQiKTt2YXIgcj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHI+PWhuJiZyPD1tbj9gXyR7ZX1gOmV9O2Z1bmN0aW9uIF9uKGUscix0LG4sYSxpLHMsbCl7dGhpcy5uYW1lPWUsdGhpcy5jb25zdHJ1Y3Rvcj1yLHRoaXMuaW5zdGFuY2VQcm90b3R5cGU9dCx0aGlzLnJhd0Rlc3RydWN0b3I9bix0aGlzLmJhc2VDbGFzcz1hLHRoaXMuZ2V0QWN0dWFsVHlwZT1pLHRoaXMudXBjYXN0PXMsdGhpcy5kb3duY2FzdD1sLHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119dmFyIGplPShlLHIsdCk9Pntmb3IoO3IhPT10OylyLnVwY2FzdHx8ayhgRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAke3QubmFtZX0sIGdvdCBhbiBpbnN0YW5jZSBvZiAke3IubmFtZX1gKSxlPXIudXBjYXN0KGUpLHI9ci5iYXNlQ2xhc3M7cmV0dXJuIGV9O2Z1bmN0aW9uIGduKGUscil7aWYocj09PW51bGwpcmV0dXJuIHRoaXMuaXNSZWZlcmVuY2UmJmsoYG51bGwgaXMgbm90IGEgdmFsaWQgJHt0aGlzLm5hbWV9YCksMDtyLiQkfHxrKGBDYW5ub3QgcGFzcyAiJHtscihyKX0iIGFzIGEgJHt0aGlzLm5hbWV9YCksci4kJC5wdHJ8fGsoYENhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICR7dGhpcy5uYW1lfWApO3ZhciB0PXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3Msbj1qZShyLiQkLnB0cix0LHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gbn1mdW5jdGlvbiB5bihlLHIpe3ZhciB0O2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLHRoaXMuaXNTbWFydFBvaW50ZXI/KHQ9dGhpcy5yYXdDb25zdHJ1Y3RvcigpLGUhPT1udWxsJiZlLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHQpLHQpOjA7KCFyfHwhci4kJCkmJmsoYENhbm5vdCBwYXNzICIke2xyKHIpfSIgYXMgYSAke3RoaXMubmFtZX1gKSxyLiQkLnB0cnx8ayhgQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgJHt0aGlzLm5hbWV9YCksIXRoaXMuaXNDb25zdCYmci4kJC5wdHJUeXBlLmlzQ29uc3QmJmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgbj1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO2lmKHQ9amUoci4kJC5wdHIsbix0aGlzLnJlZ2lzdGVyZWRDbGFzcyksdGhpcy5pc1NtYXJ0UG9pbnRlcilzd2l0Y2goci4kJC5zbWFydFB0cj09PXZvaWQgMCYmaygiUGFzc2luZyByYXcgcG9pbnRlciB0byBzbWFydCBwb2ludGVyIGlzIGlsbGVnYWwiKSx0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDpyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXM/dD1yLiQkLnNtYXJ0UHRyOmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTticmVhaztjYXNlIDE6dD1yLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXMpdD1yLiQkLnNtYXJ0UHRyO2Vsc2V7dmFyIGE9ci5jbG9uZSgpO3Q9dGhpcy5yYXdTaGFyZSh0LHRlLnRvSGFuZGxlKCgpPT5hLmRlbGV0ZSgpKSksZSE9PW51bGwmJmUucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsdCl9YnJlYWs7ZGVmYXVsdDprKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlLHIpe2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLDA7ci4kJHx8ayhgQ2Fubm90IHBhc3MgIiR7bHIocil9IiBhcyBhICR7dGhpcy5uYW1lfWApLHIuJCQucHRyfHxrKGBDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAke3RoaXMubmFtZX1gKSxyLiQkLnB0clR5cGUuaXNDb25zdCYmayhgQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAke3IuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgdD1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLG49amUoci4kJC5wdHIsdCx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIG59dmFyIEVuPSgpPT57T2JqZWN0LmFzc2lnbih6ZS5wcm90b3R5cGUse2dldFBvaW50ZWUoZSl7cmV0dXJuIHRoaXMucmF3R2V0UG9pbnRlZSYmKGU9dGhpcy5yYXdHZXRQb2ludGVlKGUpKSxlfSxkZXN0cnVjdG9yKGUpe3ZhciByOyhyPXRoaXMucmF3RGVzdHJ1Y3Rvcik9PW51bGx8fHIuY2FsbCh0aGlzLGUpfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGZyb21XaXJlVHlwZTpkbn0pfTtmdW5jdGlvbiB6ZShlLHIsdCxuLGEsaSxzLGwsdSxjLGQpe3RoaXMubmFtZT1lLHRoaXMucmVnaXN0ZXJlZENsYXNzPXIsdGhpcy5pc1JlZmVyZW5jZT10LHRoaXMuaXNDb25zdD1uLHRoaXMuaXNTbWFydFBvaW50ZXI9YSx0aGlzLnBvaW50ZWVUeXBlPWksdGhpcy5zaGFyaW5nUG9saWN5PXMsdGhpcy5yYXdHZXRQb2ludGVlPWwsdGhpcy5yYXdDb25zdHJ1Y3Rvcj11LHRoaXMucmF3U2hhcmU9Yyx0aGlzLnJhd0Rlc3RydWN0b3I9ZCwhYSYmci5iYXNlQ2xhc3M9PT12b2lkIDA/bj8odGhpcy50b1dpcmVUeXBlPWduLHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGwpOih0aGlzLnRvV2lyZVR5cGU9d24sdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6dGhpcy50b1dpcmVUeXBlPXlufXZhciBVcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKXx8SWUoIlJlcGxhY2luZyBub25leGlzdGVudCBwdWJsaWMgc3ltYm9sIiksZltlXS5vdmVybG9hZFRhYmxlIT09dm9pZCAwJiZ0IT09dm9pZCAwP2ZbZV0ub3ZlcmxvYWRUYWJsZVt0XT1yOihmW2VdPXIsZltlXS5hcmdDb3VudD10KX0sYm49KGUscix0KT0+e2U9ZS5yZXBsYWNlKC9wL2csImkiKTt2YXIgbj1mWyJkeW5DYWxsXyIrZV07cmV0dXJuIG4ociwuLi50KX0seGU9W10sanIsenI9ZT0+e3ZhciByPXhlW2VdO3JldHVybiByfHwoZT49eGUubGVuZ3RoJiYoeGUubGVuZ3RoPWUrMSkseGVbZV09cj1qci5nZXQoZSkpLHJ9LGtuPShlLHIsdD1bXSk9PntpZihlLmluY2x1ZGVzKCJqIikpcmV0dXJuIGJuKGUscix0KTt2YXIgbj16cihyKSguLi50KTtyZXR1cm4gbn0sUG49KGUscik9PiguLi50KT0+a24oZSxyLHQpLFc9KGUscik9PntlPWooZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlLmluY2x1ZGVzKCJqIik/UG4oZSxyKTp6cihyKX12YXIgbj10KCk7cmV0dXJuIHR5cGVvZiBuIT0iZnVuY3Rpb24iJiZrKGB1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgJHtlfTogJHtyfWApLG59LEFuPShlLHIpPT57dmFyIHQ9VWUocixmdW5jdGlvbihuKXt0aGlzLm5hbWU9cix0aGlzLm1lc3NhZ2U9bjt2YXIgYT1uZXcgRXJyb3Iobikuc3RhY2s7YSE9PXZvaWQgMCYmKHRoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpK2AKYCthLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpKX0pO3JldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZT09PXZvaWQgMD90aGlzLm5hbWU6YCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9YH0sdH0seHIsSHI9ZT0+e3ZhciByPWV0KGUpLHQ9aihyKTtyZXR1cm4gWihyKSx0fSxmZT0oZSxyKT0+e3ZhciB0PVtdLG49e307ZnVuY3Rpb24gYShpKXtpZighbltpXSYmIXVlW2ldKXtpZihPZVtpXSl7T2VbaV0uZm9yRWFjaChhKTtyZXR1cm59dC5wdXNoKGkpLG5baV09ITB9fXRocm93IHIuZm9yRWFjaChhKSxuZXcgeHIoYCR7ZX06IGArdC5tYXAoSHIpLmpvaW4oWyIsICJdKSl9LERuPShlLHIsdCxuLGEsaSxzLGwsdSxjLGQsbSxoKT0+e2Q9aihkKSxpPVcoYSxpKSxsJiYobD1XKHMsbCkpLGMmJihjPVcodSxjKSksaD1XKG0saCk7dmFyIHA9cG4oZCk7VnIocCxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLFtuXSl9KSxOKFtlLHIsdF0sbj9bbl06W10sdz0+e3ZhciBPO3c9d1swXTt2YXIgRCxNO24/KEQ9dy5yZWdpc3RlcmVkQ2xhc3MsTT1ELmluc3RhbmNlUHJvdG90eXBlKTpNPVZlLnByb3RvdHlwZTt2YXIgRj1VZShkLGZ1bmN0aW9uKC4uLnZyKXtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykhPT12KXRocm93IG5ldyBtZSgiVXNlICduZXcnIHRvIGNvbnN0cnVjdCAiK2QpO2lmKF8uY29uc3RydWN0b3JfYm9keT09PXZvaWQgMCl0aHJvdyBuZXcgbWUoZCsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIik7dmFyIG90PV8uY29uc3RydWN0b3JfYm9keVt2ci5sZW5ndGhdO2lmKG90PT09dm9pZCAwKXRocm93IG5ldyBtZShgVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgJHtkfSB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCR7dnIubGVuZ3RofSkgLSBleHBlY3RlZCAoJHtPYmplY3Qua2V5cyhfLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCl9KSBwYXJhbWV0ZXJzIGluc3RlYWQhYCk7cmV0dXJuIG90LmFwcGx5KHRoaXMsdnIpfSksdj1PYmplY3QuY3JlYXRlKE0se2NvbnN0cnVjdG9yOnt2YWx1ZTpGfX0pO0YucHJvdG90eXBlPXY7dmFyIF89bmV3IF9uKGQsRix2LGgsRCxpLGwsYyk7Xy5iYXNlQ2xhc3MmJigoTz1fLmJhc2VDbGFzcykuX19kZXJpdmVkQ2xhc3Nlcz8/KE8uX19kZXJpdmVkQ2xhc3Nlcz1bXSksXy5iYXNlQ2xhc3MuX19kZXJpdmVkQ2xhc3Nlcy5wdXNoKF8pKTt2YXIgTD1uZXcgemUoZCxfLCEwLCExLCExKSxUPW5ldyB6ZShkKyIqIixfLCExLCExLCExKSxCPW5ldyB6ZShkKyIgY29uc3QqIixfLCExLCEwLCExKTtyZXR1cm4gTHJbZV09e3BvaW50ZXJUeXBlOlQsY29uc3RQb2ludGVyVHlwZTpCfSxVcihwLEYpLFtMLFQsQl19KX07ZnVuY3Rpb24gV3IoZSl7Zm9yKHZhciByPTE7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXSE9PW51bGwmJmVbcl0uZGVzdHJ1Y3RvckZ1bmN0aW9uPT09dm9pZCAwKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uICRuKGUscil7aWYoIShlIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoYG5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAke3R5cGVvZiBlfSB3aGljaCBpcyBub3QgYSBmdW5jdGlvbmApO3ZhciB0PVVlKGUubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU7dmFyIG49bmV3IHQsYT1lLmFwcGx5KG4scik7cmV0dXJuIGEgaW5zdGFuY2VvZiBPYmplY3Q/YTpufWZ1bmN0aW9uIENuKGUscix0LG4pe2Zvcih2YXIgYT1XcihlKSxpPWUubGVuZ3RoLHM9IiIsbD0iIix1PTA7dTxpLTI7Kyt1KXMrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1LGwrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1KyJXaXJlZCI7dmFyIGM9YAogICAgICAgIHJldHVybiBmdW5jdGlvbiAoJHtzfSkgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAke2ktMn0pIHsKICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAnICsgaHVtYW5OYW1lICsgJyBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAke2ktMn0nKTsKICAgICAgICB9YDthJiYoYys9YHZhciBkZXN0cnVjdG9ycyA9IFtdOwpgKTt2YXIgZD1hPyJkZXN0cnVjdG9ycyI6Im51bGwiLG09WyJodW1hbk5hbWUiLCJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTtyJiYoYys9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtWyd0b1dpcmVUeXBlJ10oIitkK2AsIHRoaXMpOwpgKTtmb3IodmFyIHU9MDt1PGktMjsrK3UpYys9InZhciBhcmciK3UrIldpcmVkID0gYXJnVHlwZSIrdSsiWyd0b1dpcmVUeXBlJ10oIitkKyIsIGFyZyIrdStgKTsKYCxtLnB1c2goImFyZ1R5cGUiK3UpO2lmKHImJihsPSJ0aGlzV2lyZWQiKyhsLmxlbmd0aD4wPyIsICI6IiIpK2wpLGMrPSh0fHxuPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGwubGVuZ3RoPjA/IiwgIjoiIikrbCtgKTsKYCxhKWMrPWBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CmA7ZWxzZSBmb3IodmFyIHU9cj8xOjI7dTxlLmxlbmd0aDsrK3Upe3ZhciBoPXU9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyh1LTIpKyJXaXJlZCI7ZVt1XS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiYoYys9YCR7aH1fZHRvcigke2h9KTsKYCxtLnB1c2goYCR7aH1fZHRvcmApKX1yZXR1cm4gdCYmKGMrPWB2YXIgcmV0ID0gcmV0VHlwZVsnZnJvbVdpcmVUeXBlJ10ocnYpOwpyZXR1cm4gcmV0OwpgKSxjKz1gfQpgLFttLGNdfWZ1bmN0aW9uIEhlKGUscix0LG4sYSxpKXt2YXIgcz1yLmxlbmd0aDtzPDImJmsoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpO2Zvcih2YXIgbD1yWzFdIT09bnVsbCYmdCE9PW51bGwsdT1XcihyKSxjPXJbMF0ubmFtZSE9PSJ2b2lkIixkPVtlLGssbixhLHJyLHJbMF0sclsxXV0sbT0wO208cy0yOysrbSlkLnB1c2goclttKzJdKTtpZighdSlmb3IodmFyIG09bD8xOjI7bTxyLmxlbmd0aDsrK20pclttXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiZkLnB1c2goclttXS5kZXN0cnVjdG9yRnVuY3Rpb24pO2xldFtoLHBdPUNuKHIsbCxjLGkpO2gucHVzaChwKTt2YXIgdz0kbihGdW5jdGlvbixoKSguLi5kKTtyZXR1cm4gVWUoZSx3KX12YXIgV2U9KGUscik9Pntmb3IodmFyIHQ9W10sbj0wO248ZTtuKyspdC5wdXNoKEFbcituKjQ+PjJdKTtyZXR1cm4gdH0saXI9ZT0+e2U9ZS50cmltKCk7Y29uc3Qgcj1lLmluZGV4T2YoIigiKTtyZXR1cm4gciE9PS0xP2Uuc3Vic3RyKDAscik6ZX0sRm49KGUscix0LG4sYSxpLHMsbCk9Pnt2YXIgdT1XZSh0LG4pO3I9aihyKSxyPWlyKHIpLGk9VyhhLGkpLE4oW10sW2VdLGM9PntjPWNbMF07dmFyIGQ9YCR7Yy5uYW1lfS4ke3J9YDtmdW5jdGlvbiBtKCl7ZmUoYENhbm5vdCBjYWxsICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLHUpfXIuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSk7dmFyIGg9Yy5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3I7cmV0dXJuIGhbcl09PT12b2lkIDA/KG0uYXJnQ291bnQ9dC0xLGhbcl09bSk6KG9yKGgscixkKSxoW3JdLm92ZXJsb2FkVGFibGVbdC0xXT1tKSxOKFtdLHUscD0+e3ZhciB3PVtwWzBdLG51bGxdLmNvbmNhdChwLnNsaWNlKDEpKSxEPUhlKGQsdyxudWxsLGkscyxsKTtpZihoW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDA/KEQuYXJnQ291bnQ9dC0xLGhbcl09RCk6aFtyXS5vdmVybG9hZFRhYmxlW3QtMV09RCxjLnJlZ2lzdGVyZWRDbGFzcy5fX2Rlcml2ZWRDbGFzc2VzKWZvcihjb25zdCBNIG9mIGMucmVnaXN0ZXJlZENsYXNzLl9fZGVyaXZlZENsYXNzZXMpTS5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShyKXx8KE0uY29uc3RydWN0b3Jbcl09RCk7cmV0dXJuW119KSxbXX0pfSxUbj0oZSxyLHQsbixhLGkpPT57dmFyIHM9V2Uocix0KTthPVcobixhKSxOKFtdLFtlXSxsPT57bD1sWzBdO3ZhciB1PWBjb25zdHJ1Y3RvciAke2wubmFtZX1gO2lmKGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDAmJihsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5PVtdKSxsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W3ItMV0hPT12b2lkIDApdGhyb3cgbmV3IG1lKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgke3ItMX0pIGZvciBjbGFzcyAnJHtsLm5hbWV9JyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hYCk7cmV0dXJuIGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT0oKT0+e2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7bC5uYW1lfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2Ascyl9LE4oW10scyxjPT4oYy5zcGxpY2UoMSwwLG51bGwpLGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT1IZSh1LGMsbnVsbCxhLGkpLFtdKSksW119KX0sU249KGUscix0LG4sYSxpLHMsbCx1KT0+e3ZhciBjPVdlKHQsbik7cj1qKHIpLHI9aXIociksaT1XKGEsaSksTihbXSxbZV0sZD0+e2Q9ZFswXTt2YXIgbT1gJHtkLm5hbWV9LiR7cn1gO3Iuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSksbCYmZC5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChyKTtmdW5jdGlvbiBoKCl7ZmUoYENhbm5vdCBjYWxsICR7bX0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLGMpfXZhciBwPWQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHc9cFtyXTtyZXR1cm4gdz09PXZvaWQgMHx8dy5vdmVybG9hZFRhYmxlPT09dm9pZCAwJiZ3LmNsYXNzTmFtZSE9PWQubmFtZSYmdy5hcmdDb3VudD09PXQtMj8oaC5hcmdDb3VudD10LTIsaC5jbGFzc05hbWU9ZC5uYW1lLHBbcl09aCk6KG9yKHAscixtKSxwW3JdLm92ZXJsb2FkVGFibGVbdC0yXT1oKSxOKFtdLGMsRD0+e3ZhciBNPUhlKG0sRCxkLGkscyx1KTtyZXR1cm4gcFtyXS5vdmVybG9hZFRhYmxlPT09dm9pZCAwPyhNLmFyZ0NvdW50PXQtMixwW3JdPU0pOnBbcl0ub3ZlcmxvYWRUYWJsZVt0LTJdPU0sW119KSxbXX0pfSxCcj0oZSxyLHQpPT4oZSBpbnN0YW5jZW9mIE9iamVjdHx8ayhgJHt0fSB3aXRoIGludmFsaWQgInRoaXMiOiAke2V9YCksZSBpbnN0YW5jZW9mIHIucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yfHxrKGAke3R9IGluY29tcGF0aWJsZSB3aXRoICJ0aGlzIiBvZiB0eXBlICR7ZS5jb25zdHJ1Y3Rvci5uYW1lfWApLGUuJCQucHRyfHxrKGBjYW5ub3QgY2FsbCBlbXNjcmlwdGVuIGJpbmRpbmcgbWV0aG9kICR7dH0gb24gZGVsZXRlZCBvYmplY3RgKSxqZShlLiQkLnB0cixlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLHIucmVnaXN0ZXJlZENsYXNzKSksTW49KGUscix0LG4sYSxpLHMsbCx1LGMpPT57cj1qKHIpLGE9VyhuLGEpLE4oW10sW2VdLGQ9PntkPWRbMF07dmFyIG09YCR7ZC5uYW1lfS4ke3J9YCxoPXtnZXQoKXtmZShgQ2Fubm90IGFjY2VzcyAke219IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxbdCxzXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtyZXR1cm4gdT9oLnNldD0oKT0+ZmUoYENhbm5vdCBhY2Nlc3MgJHttfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2AsW3Qsc10pOmguc2V0PXA9PmsobSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5IiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHIsaCksTihbXSx1P1t0LHNdOlt0XSxwPT57dmFyIHc9cFswXSxEPXtnZXQoKXt2YXIgRj1Ccih0aGlzLGQsbSsiIGdldHRlciIpO3JldHVybiB3LmZyb21XaXJlVHlwZShhKGksRikpfSxlbnVtZXJhYmxlOiEwfTtpZih1KXt1PVcobCx1KTt2YXIgTT1wWzFdO0Quc2V0PWZ1bmN0aW9uKEYpe3ZhciB2PUJyKHRoaXMsZCxtKyIgc2V0dGVyIiksXz1bXTt1KGMsdixNLnRvV2lyZVR5cGUoXyxGKSkscnIoXyl9fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUscixEKSxbXX0pLFtdfSl9LHNyPVtdLHJlPVtdLE5yPWU9PntlPjkmJi0tcmVbZSsxXT09PTAmJihyZVtlXT12b2lkIDAsc3IucHVzaChlKSl9LFJuPSgpPT5yZS5sZW5ndGgvMi01LXNyLmxlbmd0aCxPbj0oKT0+e3JlLnB1c2goMCwxLHZvaWQgMCwxLG51bGwsMSwhMCwxLCExLDEpLGYuY291bnRfZW12YWxfaGFuZGxlcz1Sbn0sdGU9e3RvVmFsdWU6ZT0+KGV8fGsoIkNhbm5vdCB1c2UgZGVsZXRlZCB2YWwuIGhhbmRsZSA9ICIrZSkscmVbZV0pLHRvSGFuZGxlOmU9Pntzd2l0Y2goZSl7Y2FzZSB2b2lkIDA6cmV0dXJuIDI7Y2FzZSBudWxsOnJldHVybiA0O2Nhc2UhMDpyZXR1cm4gNjtjYXNlITE6cmV0dXJuIDg7ZGVmYXVsdDp7Y29uc3Qgcj1zci5wb3AoKXx8cmUubGVuZ3RoO3JldHVybiByZVtyXT1lLHJlW3IrMV09MSxyfX19fSxJbj17bmFtZToiZW1zY3JpcHRlbjo6dmFsIixmcm9tV2lyZVR5cGU6ZT0+e3ZhciByPXRlLnRvVmFsdWUoZSk7cmV0dXJuIE5yKGUpLHJ9LHRvV2lyZVR5cGU6KGUscik9PnRlLnRvSGFuZGxlKHIpLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9LFlyPWU9PksoZSxJbiksbHI9ZT0+e2lmKGU9PT1udWxsKXJldHVybiJudWxsIjt2YXIgcj10eXBlb2YgZTtyZXR1cm4gcj09PSJvYmplY3QifHxyPT09ImFycmF5Inx8cj09PSJmdW5jdGlvbiI/ZS50b1N0cmluZygpOiIiK2V9LExuPShlLHIpPT57c3dpdGNoKHIpe2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGdyW3Q+PjJdKX07Y2FzZSA4OnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUoeXJbdD4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgZmxvYXQgd2lkdGggKCR7cn0pOiAke2V9YCl9fSxWbj0oZSxyLHQpPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpuPT5uLHRvV2lyZVR5cGU6KG4sYSk9PmEsYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjpMbihyLHQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9LFVuPShlLHIsdCxuLGEsaSxzKT0+e3ZhciBsPVdlKHIsdCk7ZT1qKGUpLGU9aXIoZSksYT1XKG4sYSksVnIoZSxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY2FsbCAke2V9IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxsKX0sci0xKSxOKFtdLGwsdT0+e3ZhciBjPVt1WzBdLG51bGxdLmNvbmNhdCh1LnNsaWNlKDEpKTtyZXR1cm4gVXIoZSxIZShlLGMsbnVsbCxhLGkscyksci0xKSxbXX0pfSxqbj0oZSxyLHQpPT57c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gdD9uPT5JW25dOm49Pnhbbl07Y2FzZSAyOnJldHVybiB0P249Pllbbj4+MV06bj0+Q2Vbbj4+MV07Y2FzZSA0OnJldHVybiB0P249Pmdbbj4+Ml06bj0+QVtuPj4yXTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgaW50ZWdlciB3aWR0aCAoJHtyfSk6ICR7ZX1gKX19LHpuPShlLHIsdCxuLGEpPT57cj1qKHIpO3ZhciBpPWQ9PmQ7aWYobj09PTApe3ZhciBzPTMyLTgqdDtpPWQ9PmQ8PHM+Pj5zfXZhciBsPXIuaW5jbHVkZXMoInVuc2lnbmVkIiksdT0oZCxtKT0+e30sYztsP2M9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbT4+PjB9OmM9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbX0sSyhlLHtuYW1lOnIsZnJvbVdpcmVUeXBlOmksdG9XaXJlVHlwZTpjLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6am4ocix0LG4hPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSx4bj0oZSxyLHQpPT57dmFyIG49W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxhPW5bcl07ZnVuY3Rpb24gaShzKXt2YXIgbD1BW3M+PjJdLHU9QVtzKzQ+PjJdO3JldHVybiBuZXcgYShJLmJ1ZmZlcix1LGwpfXQ9aih0KSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6aSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOml9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOiEwfSl9LEhuPShlLHIpPT57WXIoZSl9LFduPShlLHIpPT57cj1qKHIpO3ZhciB0PXI9PT0ic3RkOjpzdHJpbmciO0soZSx7bmFtZTpyLGZyb21XaXJlVHlwZShuKXt2YXIgYT1BW24+PjJdLGk9bis0LHM7aWYodClmb3IodmFyIGw9aSx1PTA7dTw9YTsrK3Upe3ZhciBjPWkrdTtpZih1PT1hfHx4W2NdPT0wKXt2YXIgZD1jLWwsbT1zZShsLGQpO3M9PT12b2lkIDA/cz1tOihzKz0iXDAiLHMrPW0pLGw9YysxfX1lbHNle2Zvcih2YXIgaD1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3UpaFt1XT1TdHJpbmcuZnJvbUNoYXJDb2RlKHhbaSt1XSk7cz1oLmpvaW4oIiIpfXJldHVybiBaKG4pLHN9LHRvV2lyZVR5cGUobixhKXthIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPW5ldyBVaW50OEFycmF5KGEpKTt2YXIgaSxzPXR5cGVvZiBhPT0ic3RyaW5nIjtzfHxhIGluc3RhbmNlb2YgVWludDhBcnJheXx8YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5fHxhIGluc3RhbmNlb2YgSW50OEFycmF5fHxrKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIHN0ZDo6c3RyaW5nIiksdCYmcz9pPVplKGEpOmk9YS5sZW5ndGg7dmFyIGw9ZnIoNCtpKzEpLHU9bCs0O2lmKEFbbD4+Ml09aSx0JiZzKXZlKGEsdSxpKzEpO2Vsc2UgaWYocylmb3IodmFyIGM9MDtjPGk7KytjKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7ZD4yNTUmJihaKHUpLGsoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpKSx4W3UrY109ZH1lbHNlIGZvcih2YXIgYz0wO2M8aTsrK2MpeFt1K2NdPWFbY107cmV0dXJuIG4hPT1udWxsJiZuLnB1c2goWixsKSxsfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGRlc3RydWN0b3JGdW5jdGlvbihuKXtaKG4pfX0pfSxHcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDAsQm49KGUscik9Pntmb3IodmFyIHQ9ZSxuPXQ+PjEsYT1uK3IvMjshKG4+PWEpJiZDZVtuXTspKytuO2lmKHQ9bjw8MSx0LWU+MzImJkdyKXJldHVybiBHci5kZWNvZGUoeC5zdWJhcnJheShlLHQpKTtmb3IodmFyIGk9IiIscz0wOyEocz49ci8yKTsrK3Mpe3ZhciBsPVlbZStzKjI+PjFdO2lmKGw9PTApYnJlYWs7aSs9U3RyaW5nLmZyb21DaGFyQ29kZShsKX1yZXR1cm4gaX0sTm49KGUscix0KT0+e2lmKHQ/Pyh0PTIxNDc0ODM2NDcpLHQ8MilyZXR1cm4gMDt0LT0yO2Zvcih2YXIgbj1yLGE9dDxlLmxlbmd0aCoyP3QvMjplLmxlbmd0aCxpPTA7aTxhOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO1lbcj4+MV09cyxyKz0yfXJldHVybiBZW3I+PjFdPTAsci1ufSxZbj1lPT5lLmxlbmd0aCoyLEduPShlLHIpPT57Zm9yKHZhciB0PTAsbj0iIjshKHQ+PXIvNCk7KXt2YXIgYT1nW2UrdCo0Pj4yXTtpZihhPT0wKWJyZWFrO2lmKCsrdCxhPj02NTUzNil7dmFyIGk9YS02NTUzNjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMyl9ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxxbj0oZSxyLHQpPT57aWYodD8/KHQ9MjE0NzQ4MzY0NyksdDw0KXJldHVybiAwO2Zvcih2YXIgbj1yLGE9bit0LTQsaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYocz49NTUyOTYmJnM8PTU3MzQzKXt2YXIgbD1lLmNoYXJDb2RlQXQoKytpKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfGwmMTAyM31pZihnW3I+PjJdPXMscis9NCxyKzQ+YSlicmVha31yZXR1cm4gZ1tyPj4yXT0wLHItbn0sWG49ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO24+PTU1Mjk2JiZuPD01NzM0MyYmKyt0LHIrPTR9cmV0dXJuIHJ9LEtuPShlLHIsdCk9Pnt0PWoodCk7dmFyIG4sYSxpLHM7cj09PTI/KG49Qm4sYT1ObixzPVluLGk9bD0+Q2VbbD4+MV0pOnI9PT00JiYobj1HbixhPXFuLHM9WG4saT1sPT5BW2w+PjJdKSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6bD0+e2Zvcih2YXIgdT1BW2w+PjJdLGMsZD1sKzQsbT0wO208PXU7KyttKXt2YXIgaD1sKzQrbSpyO2lmKG09PXV8fGkoaCk9PTApe3ZhciBwPWgtZCx3PW4oZCxwKTtjPT09dm9pZCAwP2M9dzooYys9IlwwIixjKz13KSxkPWgrcn19cmV0dXJuIFoobCksY30sdG9XaXJlVHlwZToobCx1KT0+e3R5cGVvZiB1IT0ic3RyaW5nIiYmayhgQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgJHt0fWApO3ZhciBjPXModSksZD1mcig0K2Mrcik7cmV0dXJuIEFbZD4+Ml09Yy9yLGEodSxkKzQsYytyKSxsIT09bnVsbCYmbC5wdXNoKFosZCksZH0sYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjp5ZSxkZXN0cnVjdG9yRnVuY3Rpb24obCl7WihsKX19KX0sSm49KGUscix0LG4sYSxpKT0+e1JlW2VdPXtuYW1lOmoocikscmF3Q29uc3RydWN0b3I6Vyh0LG4pLHJhd0Rlc3RydWN0b3I6VyhhLGkpLGZpZWxkczpbXX19LFpuPShlLHIsdCxuLGEsaSxzLGwsdSxjKT0+e1JlW2VdLmZpZWxkcy5wdXNoKHtmaWVsZE5hbWU6aihyKSxnZXR0ZXJSZXR1cm5UeXBlOnQsZ2V0dGVyOlcobixhKSxnZXR0ZXJDb250ZXh0Omksc2V0dGVyQXJndW1lbnRUeXBlOnMsc2V0dGVyOlcobCx1KSxzZXR0ZXJDb250ZXh0OmN9KX0sUW49KGUscik9PntyPWoociksSyhlLHtpc1ZvaWQ6ITAsbmFtZTpyLGFyZ1BhY2tBZHZhbmNlOjAsZnJvbVdpcmVUeXBlOigpPT57fSx0b1dpcmVUeXBlOih0LG4pPT57fX0pfSxlYT0xLHJhPSgpPT5lYSx0YT0oZSxyLHQpPT54LmNvcHlXaXRoaW4oZSxyLHIrdCksbmE9KCk9PnRlLnRvSGFuZGxlKHt9KSxhYT0oZSxyLHQpPT57ZT10ZS50b1ZhbHVlKGUpLHI9dGUudG9WYWx1ZShyKSx0PXRlLnRvVmFsdWUodCksZVtyXT10fSxvYT0oZSxyKT0+e3ZhciB0PXVlW2VdO3JldHVybiB0PT09dm9pZCAwJiZrKGAke3J9IGhhcyB1bmtub3duIHR5cGUgJHtIcihlKX1gKSx0fSxpYT0oZSxyKT0+e2U9b2EoZSwiX2VtdmFsX3Rha2VfdmFsdWUiKTt2YXIgdD1lLnJlYWRWYWx1ZUZyb21Qb2ludGVyKHIpO3JldHVybiB0ZS50b0hhbmRsZSh0KX0scXI9KGUscik9PnIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKStyKjQyOTQ5NjcyOTY6TmFOO2Z1bmN0aW9uIHNhKGUscix0KXt2YXIgbj1xcihlLHIpLGE9bmV3IERhdGUobioxZTMpO2dbdD4+Ml09YS5nZXRVVENTZWNvbmRzKCksZ1t0KzQ+PjJdPWEuZ2V0VVRDTWludXRlcygpLGdbdCs4Pj4yXT1hLmdldFVUQ0hvdXJzKCksZ1t0KzEyPj4yXT1hLmdldFVUQ0RhdGUoKSxnW3QrMTY+PjJdPWEuZ2V0VVRDTW9udGgoKSxnW3QrMjA+PjJdPWEuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLGdbdCsyND4+Ml09YS5nZXRVVENEYXkoKTt2YXIgaT1EYXRlLlVUQyhhLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApLHM9KGEuZ2V0VGltZSgpLWkpLygxZTMqNjAqNjAqMjQpfDA7Z1t0KzI4Pj4yXT1zfXZhciBCZT1lPT5lJTQ9PT0wJiYoZSUxMDAhPT0wfHxlJTQwMD09PTApLGxhPShlLHIsdCxuKT0+e3ZhciBhPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxpPW5ldyBEYXRlKGEsMCwxKSxzPW5ldyBEYXRlKGEsNiwxKSxsPWkuZ2V0VGltZXpvbmVPZmZzZXQoKSx1PXMuZ2V0VGltZXpvbmVPZmZzZXQoKSxjPU1hdGgubWF4KGwsdSk7QVtlPj4yXT1jKjYwLGdbcj4+Ml09KyhsIT11KTt2YXIgZD1wPT5wLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAse2hvdXIxMjohMSx0aW1lWm9uZU5hbWU6InNob3J0In0pLnNwbGl0KCIgIilbMV0sbT1kKGkpLGg9ZChzKTt1PGw/KHZlKG0sdCwxNyksdmUoaCxuLDE3KSk6KHZlKG0sbiwxNyksdmUoaCx0LDE3KSl9LHVhPSgpPT5EYXRlLm5vdygpLFhyPSgpPT4yMTQ3NDgzNjQ4LGZhPSgpPT5YcigpLEtyO0tyPSgpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgY2E9ZT0+e3ZhciByPSRlLmJ1ZmZlcix0PShlLXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzY7dHJ5e3JldHVybiAkZS5ncm93KHQpLHdyKCksMX1jYXRjaHt9fSxkYT1lPT57dmFyIHI9eC5sZW5ndGg7ZT4+Pj0wO3ZhciB0PVhyKCk7aWYoZT50KXJldHVybiExO2Zvcih2YXIgbj0odSxjKT0+dSsoYy11JWMpJWMsYT0xO2E8PTQ7YSo9Mil7dmFyIGk9ciooMSsuMi9hKTtpPU1hdGgubWluKGksZSsxMDA2NjMyOTYpO3ZhciBzPU1hdGgubWluKHQsbihNYXRoLm1heChlLGkpLDY1NTM2KSksbD1jYShzKTtpZihsKXJldHVybiEwfXJldHVybiExfSx1cj17fSx2YT0oKT0+aHJ8fCIuL3RoaXMucHJvZ3JhbSIsUGU9KCk9PntpZighUGUuc3RyaW5ncyl7dmFyIGU9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIscj17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmUsXzp2YSgpfTtmb3IodmFyIHQgaW4gdXIpdXJbdF09PT12b2lkIDA/ZGVsZXRlIHJbdF06clt0XT11clt0XTt2YXIgbj1bXTtmb3IodmFyIHQgaW4gciluLnB1c2goYCR7dH09JHtyW3RdfWApO1BlLnN0cmluZ3M9bn1yZXR1cm4gUGUuc3RyaW5nc30saGE9KGUscik9Pntmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdClJW3IrK109ZS5jaGFyQ29kZUF0KHQpO0lbcl09MH0sbWE9KGUscik9Pnt2YXIgdD0wO3JldHVybiBQZSgpLmZvckVhY2goKG4sYSk9Pnt2YXIgaT1yK3Q7QVtlK2EqND4+Ml09aSxoYShuLGkpLHQrPW4ubGVuZ3RoKzF9KSwwfSxwYT0oZSxyKT0+e3ZhciB0PVBlKCk7QVtlPj4yXT10Lmxlbmd0aDt2YXIgbj0wO3JldHVybiB0LmZvckVhY2goYT0+bis9YS5sZW5ndGgrMSksQVtyPj4yXT1uLDB9O2Z1bmN0aW9uIF9hKGUpe3RyeXt2YXIgcj1QLmdldFN0cmVhbUZyb21GRChlKTtyZXR1cm4gby5jbG9zZShyKSwwfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuIHQuZXJybm99fWZ1bmN0aW9uIGdhKGUscil7dHJ5e3ZhciB0PTAsbj0wLGE9MCxpPVAuZ2V0U3RyZWFtRnJvbUZEKGUpLHM9aS50dHk/MjpvLmlzRGlyKGkubW9kZSk/MzpvLmlzTGluayhpLm1vZGUpPzc6NDtyZXR1cm4gSVtyXT1zLFlbcisyPj4xXT1hLCQ9W3Q+Pj4wLCh5PXQsK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3IrOD4+Ml09JFswXSxnW3IrMTI+PjJdPSRbMV0sJD1bbj4+PjAsKHk9biwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbcisxNj4+Ml09JFswXSxnW3IrMjA+PjJdPSRbMV0sMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgeWE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLnJlYWQoZSxJLHMsbCxuKTtpZih1PDApcmV0dXJuLTE7aWYoYSs9dSx1PGwpYnJlYWt9cmV0dXJuIGF9O2Z1bmN0aW9uIHdhKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPXlhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319ZnVuY3Rpb24gRWEoZSxyLHQsbixhKXt2YXIgaT1xcihyLHQpO3RyeXtpZihpc05hTihpKSlyZXR1cm4gNjE7dmFyIHM9UC5nZXRTdHJlYW1Gcm9tRkQoZSk7cmV0dXJuIG8ubGxzZWVrKHMsaSxuKSwkPVtzLnBvc2l0aW9uPj4+MCwoeT1zLnBvc2l0aW9uLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1thPj4yXT0kWzBdLGdbYSs0Pj4yXT0kWzFdLHMuZ2V0ZGVudHMmJmk9PT0wJiZuPT09MCYmKHMuZ2V0ZGVudHM9bnVsbCksMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgYmE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLndyaXRlKGUsSSxzLGwsbik7aWYodTwwKXJldHVybi0xO2ErPXV9cmV0dXJuIGF9O2Z1bmN0aW9uIGthKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPWJhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319dmFyIFBhPShlLHIpPT57Zm9yKHZhciB0PTAsbj0wO248PXI7dCs9ZVtuKytdKTtyZXR1cm4gdH0sSnI9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxacj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLEFhPShlLHIpPT57Zm9yKHZhciB0PW5ldyBEYXRlKGUuZ2V0VGltZSgpKTtyPjA7KXt2YXIgbj1CZSh0LmdldEZ1bGxZZWFyKCkpLGE9dC5nZXRNb250aCgpLGk9KG4/SnI6WnIpW2FdO2lmKHI+aS10LmdldERhdGUoKSlyLT1pLXQuZ2V0RGF0ZSgpKzEsdC5zZXREYXRlKDEpLGE8MTE/dC5zZXRNb250aChhKzEpOih0LnNldE1vbnRoKDApLHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpKzEpKTtlbHNlIHJldHVybiB0LnNldERhdGUodC5nZXREYXRlKCkrciksdH1yZXR1cm4gdH0sRGE9KGUscik9PntJLnNldChlLHIpfSxRcj0oZSxyLHQsbik9Pnt2YXIgYT1BW24rNDA+PjJdLGk9e3RtX3NlYzpnW24+PjJdLHRtX21pbjpnW24rND4+Ml0sdG1faG91cjpnW24rOD4+Ml0sdG1fbWRheTpnW24rMTI+PjJdLHRtX21vbjpnW24rMTY+PjJdLHRtX3llYXI6Z1tuKzIwPj4yXSx0bV93ZGF5OmdbbisyND4+Ml0sdG1feWRheTpnW24rMjg+PjJdLHRtX2lzZHN0OmdbbiszMj4+Ml0sdG1fZ210b2ZmOmdbbiszNj4+Ml0sdG1fem9uZTphP3NlKGEpOiIifSxzPXNlKHQpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9O2Zvcih2YXIgdSBpbiBsKXM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLGxbdV0pO3ZhciBjPVsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTtmdW5jdGlvbiBtKHYsXyxMKXtmb3IodmFyIFQ9dHlwZW9mIHY9PSJudW1iZXIiP3YudG9TdHJpbmcoKTp2fHwiIjtULmxlbmd0aDxfOylUPUxbMF0rVDtyZXR1cm4gVH1mdW5jdGlvbiBoKHYsXyl7cmV0dXJuIG0odixfLCIwIil9ZnVuY3Rpb24gcCh2LF8pe2Z1bmN0aW9uIEwoQil7cmV0dXJuIEI8MD8tMTpCPjA/MTowfXZhciBUO3JldHVybihUPUwodi5nZXRGdWxsWWVhcigpLV8uZ2V0RnVsbFllYXIoKSkpPT09MCYmKFQ9TCh2LmdldE1vbnRoKCktXy5nZXRNb250aCgpKSk9PT0wJiYoVD1MKHYuZ2V0RGF0ZSgpLV8uZ2V0RGF0ZSgpKSksVH1mdW5jdGlvbiB3KHYpe3N3aXRjaCh2LmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHY7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIEQodil7dmFyIF89QWEobmV3IERhdGUodi50bV95ZWFyKzE5MDAsMCwxKSx2LnRtX3lkYXkpLEw9bmV3IERhdGUoXy5nZXRGdWxsWWVhcigpLDAsNCksVD1uZXcgRGF0ZShfLmdldEZ1bGxZZWFyKCkrMSwwLDQpLEI9dyhMKSxPPXcoVCk7cmV0dXJuIHAoQixfKTw9MD9wKE8sXyk8PTA/Xy5nZXRGdWxsWWVhcigpKzE6Xy5nZXRGdWxsWWVhcigpOl8uZ2V0RnVsbFllYXIoKS0xfXZhciBNPXsiJWEiOnY9PmNbdi50bV93ZGF5XS5zdWJzdHJpbmcoMCwzKSwiJUEiOnY9PmNbdi50bV93ZGF5XSwiJWIiOnY9PmRbdi50bV9tb25dLnN1YnN0cmluZygwLDMpLCIlQiI6dj0+ZFt2LnRtX21vbl0sIiVDIjp2PT57dmFyIF89di50bV95ZWFyKzE5MDA7cmV0dXJuIGgoXy8xMDB8MCwyKX0sIiVkIjp2PT5oKHYudG1fbWRheSwyKSwiJWUiOnY9Pm0odi50bV9tZGF5LDIsIiAiKSwiJWciOnY9PkQodikudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjpELCIlSCI6dj0+aCh2LnRtX2hvdXIsMiksIiVJIjp2PT57dmFyIF89di50bV9ob3VyO3JldHVybiBfPT0wP189MTI6Xz4xMiYmKF8tPTEyKSxoKF8sMil9LCIlaiI6dj0+aCh2LnRtX21kYXkrUGEoQmUodi50bV95ZWFyKzE5MDApP0pyOlpyLHYudG1fbW9uLTEpLDMpLCIlbSI6dj0+aCh2LnRtX21vbisxLDIpLCIlTSI6dj0+aCh2LnRtX21pbiwyKSwiJW4iOigpPT5gCmAsIiVwIjp2PT52LnRtX2hvdXI+PTAmJnYudG1faG91cjwxMj8iQU0iOiJQTSIsIiVTIjp2PT5oKHYudG1fc2VjLDIpLCIldCI6KCk9PiIJIiwiJXUiOnY9PnYudG1fd2RheXx8NywiJVUiOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy12LnRtX3dkYXk7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJVYiOnY9Pnt2YXIgXz1NYXRoLmZsb29yKCh2LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTcpLzcpO2lmKCh2LnRtX3dkYXkrMzcxLXYudG1feWRheS0yKSU3PD0yJiZfKyssXyl7aWYoXz09NTMpe3ZhciBUPSh2LnRtX3dkYXkrMzcxLXYudG1feWRheSklNztUIT00JiYoVCE9M3x8IUJlKHYudG1feWVhcikpJiYoXz0xKX19ZWxzZXtfPTUyO3ZhciBMPSh2LnRtX3dkYXkrNy12LnRtX3lkYXktMSklNzsoTD09NHx8TD09NSYmQmUodi50bV95ZWFyJTQwMC0xKSkmJl8rK31yZXR1cm4gaChfLDIpfSwiJXciOnY9PnYudG1fd2RheSwiJVciOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTc7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJXkiOnY9Pih2LnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjp2PT52LnRtX3llYXIrMTkwMCwiJXoiOnY9Pnt2YXIgXz12LnRtX2dtdG9mZixMPV8+PTA7cmV0dXJuIF89TWF0aC5hYnMoXykvNjAsXz1fLzYwKjEwMCtfJTYwLChMPyIrIjoiLSIpKygiMDAwMCIrXykuc2xpY2UoLTQpfSwiJVoiOnY9PnYudG1fem9uZSwiJSUiOigpPT4iJSJ9O3M9cy5yZXBsYWNlKC8lJS9nLCJcMFwwIik7Zm9yKHZhciB1IGluIE0pcy5pbmNsdWRlcyh1KSYmKHM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLE1bdV0oaSkpKTtzPXMucmVwbGFjZSgvXDBcMC9nLCIlIik7dmFyIEY9U2UocywhMSk7cmV0dXJuIEYubGVuZ3RoPnI/MDooRGEoRixlKSxGLmxlbmd0aC0xKX0sJGE9KGUscix0LG4sYSk9PlFyKGUscix0LG4pO28uY3JlYXRlUHJlbG9hZGVkRmlsZT1WdCxvLnN0YXRpY0luaXQoKSxTcj1mLkludGVybmFsRXJyb3I9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyKXtzdXBlcihyKSx0aGlzLm5hbWU9IkludGVybmFsRXJyb3IifX0sZW4oKSxtZT1mLkJpbmRpbmdFcnJvcj1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIpLHRoaXMubmFtZT0iQmluZGluZ0Vycm9yIn19LHZuKCksdW4oKSxFbigpLHhyPWYuVW5ib3VuZFR5cGVFcnJvcj1BbihFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpLE9uKCk7dmFyIENhPXtsOkN0LGM6VHQsVTpqdCxzOnp0LFI6eHQsSjpIdCxXOld0LE86QnQsUDpOdCxLOll0LEk6R3QsSDpxdCxROlh0LEU6S3QsVjpKdCxrOlp0LEI6UXQsWjp0bixoOkRuLHk6Rm4sajpUbixiOlNuLGE6TW4sWTpZcix3OlZuLGk6VW4sZjp6bixkOnhuLG06SG4sdjpXbix0OktuLG46Sm4sZTpabixfOlFuLFM6cmEsVDp0YSx4Ok5yLGFhOm5hLCQ6YWEsZzppYSx6OnNhLEY6bGEscDp1YSxHOmZhLG86S3IsRDpkYSxNOm1hLE46cGEscjpfYSxMOmdhLHU6d2EsQTpFYSxxOmthLFg6UXIsQzokYX0sej0kdCgpLGZyPWU9Pihmcj16LmRhKShlKSxldD1lPT4oZXQ9ei5mYSkoZSksWj1lPT4oWj16LmdhKShlKSxydD1lPT4ocnQ9ei5pYSkoZSk7Zi5keW5DYWxsX2ppamk9KGUscix0LG4sYSk9PihmLmR5bkNhbGxfamlqaT16LmphKShlLHIsdCxuLGEpLGYuZHluQ2FsbF9paWlqaT0oZSxyLHQsbixhLGkpPT4oZi5keW5DYWxsX2lpaWppPXoua2EpKGUscix0LG4sYSxpKSxmLmR5bkNhbGxfamlpaWo9KGUscix0LG4sYSxpKT0+KGYuZHluQ2FsbF9qaWlpaj16LmxhKShlLHIsdCxuLGEsaSksZi5keW5DYWxsX2lpaWlpaj0oZSxyLHQsbixhLGkscyk9PihmLmR5bkNhbGxfaWlpaWlqPXoubWEpKGUscix0LG4sYSxpLHMpLGYuZHluQ2FsbF92aWlqaWk9KGUscix0LG4sYSxpLHMpPT4oZi5keW5DYWxsX3ZpaWppaT16Lm5hKShlLHIsdCxuLGEsaSxzKSxmLmR5bkNhbGxfaWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUpPT4oZi5keW5DYWxsX2lpaWlpamo9ei5vYSkoZSxyLHQsbixhLGkscyxsLHUpLGYuZHluQ2FsbF9paWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUsYyk9PihmLmR5bkNhbGxfaWlpaWlpamo9ei5wYSkoZSxyLHQsbixhLGkscyxsLHUsYyksZi5fZmZfaDI2NF9jYWJhY190YWJsZXM9MjA2ODEyO3ZhciBOZTtnZT1mdW5jdGlvbiBlKCl7TmV8fHR0KCksTmV8fChnZT1lKX07ZnVuY3Rpb24gdHQoKXtpZihvZT4wfHwocHQoKSxvZT4wKSlyZXR1cm47ZnVuY3Rpb24gZSgpe05lfHwoTmU9ITAsZi5jYWxsZWRSdW49ITAsIXByJiYoX3QoKSxVKGYpLGYub25SdW50aW1lSW5pdGlhbGl6ZWQmJmYub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxndCgpKSl9Zi5zZXRTdGF0dXM/KGYuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNldFN0YXR1cygiIil9LDEpLGUoKX0sMSkpOmUoKX1pZihmLnByZUluaXQpZm9yKHR5cGVvZiBmLnByZUluaXQ9PSJmdW5jdGlvbiImJihmLnByZUluaXQ9W2YucHJlSW5pdF0pO2YucHJlSW5pdC5sZW5ndGg+MDspZi5wcmVJbml0LnBvcCgpKCk7dHQoKTtsZXQgbnQ9MzI7ZnVuY3Rpb24gYXQoZSxyPTMsdD01MDApe2xldCBuPTA7Zm9yKDtuPHI7KXRyeXtyZXR1cm4gZSgpfWNhdGNoKGEpe2lmKG50Pj0yNCYmY29uc29sZS53YXJuKGBBdHRlbXB0ICR7bisxfSBmYWlsZWQ6ICR7YS5tZXNzYWdlfWApLG4rKyxuPj1yKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIGFmdGVyICR7cn0gYXR0ZW1wdHNgKX19ZnVuY3Rpb24gRmEoZSl7Y29uc3Qgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoci5vcGVuKCJIRUFEIixlLCExKSxyLnNlbmQoKSxyLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGdldEZpbGVTaXplIHJlcXVlc3QgZmFpbGVkOiAke2V9YCk7cmV0dXJuIHBhcnNlSW50KHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpfWZ1bmN0aW9uIFRhKGUscix0KXtjb25zdCBuPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihuLm9wZW4oIkdFVCIsZSwhMSksbi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsYGJ5dGVzPSR7cn0tJHtyK3QtMX1gKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4uc2VuZCgpLG4uc3RhdHVzIT09MjA2JiZuLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGZldGNoQXJyYXlCdWZmZXIgcmVxdWVzdCBmYWlsZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZXNwb25zZX1jbGFzcyBwZXtjb25zdHJ1Y3RvcihyKXtsZXQgdDt0eXBlb2Ygcj09InN0cmluZyI/KHQ9bmV3IEZpbGUoW10sZW5jb2RlVVJJQ29tcG9uZW50KHIpKSxvLmZpbGVzeXN0ZW1zLldPUktFUkZTLnN0cmVhbV9vcHMucmVhZD1mdW5jdGlvbihhLGkscyxsLHUpe2NvbnN0IGM9ZGVjb2RlVVJJQ29tcG9uZW50KGEubm9kZS5jb250ZW50cy5uYW1lKTtpZihhLm5vZGUuc2l6ZT09PTAmJihhLm5vZGUuc2l6ZT1hdCgoKT0+RmEoYykpKSx1Pj1hLm5vZGUuc2l6ZSlyZXR1cm4gMDtjb25zdCBkPWF0KCgpPT5UYShjLHUsbCkpLG09ZC5ieXRlTGVuZ3RoO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShkKSxzKSxtfSk6dD1yLHRoaXMubW91bnRQb2ludD0iL2RhdGEiLHRoaXMubW91bnRPcHRzPXtmaWxlczpbdF19LHRoaXMuZmlsZVBhdGg9dGhpcy5tb3VudFBvaW50KyIvIit0Lm5hbWV9bW91bnQoKXtvLm1rZGlyKHRoaXMubW91bnRQb2ludCksby5tb3VudChvLmZpbGVzeXN0ZW1zLldPUktFUkZTLHRoaXMubW91bnRPcHRzLHRoaXMubW91bnRQb2ludCl9dW5tb3VudCgpe28udW5tb3VudCh0aGlzLm1vdW50UG9pbnQpLG8ucm1kaXIodGhpcy5tb3VudFBvaW50KX19ZnVuY3Rpb24gY3IoZSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmV4dHJhZGF0YSksdD17aWQ6ZS5pZCxpbmRleDplLmluZGV4LGNvZGVjX3R5cGU6ZS5jb2RlY190eXBlLGNvZGVjX3R5cGVfc3RyaW5nOmUuY29kZWNfdHlwZV9zdHJpbmcsY29kZWNfbmFtZTplLmNvZGVjX25hbWUsY29kZWNfc3RyaW5nOmUuY29kZWNfc3RyaW5nLGNvbG9yX3ByaW1hcmllczplLmNvbG9yX3ByaW1hcmllcyxjb2xvcl90cmFuc2ZlcjplLmNvbG9yX3RyYW5zZmVyLGNvbG9yX3NwYWNlOmUuY29sb3Jfc3BhY2UsY29sb3JfcmFuZ2U6ZS5jb2xvcl9yYW5nZSxwcm9maWxlOmUucHJvZmlsZSxwaXhfZm10OmUucGl4X2ZtdCxsZXZlbDplLmxldmVsLHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGNoYW5uZWxzOmUuY2hhbm5lbHMsc2FtcGxlX3JhdGU6ZS5zYW1wbGVfcmF0ZSxzYW1wbGVfZm10OmUuc2FtcGxlX2ZtdCxiaXRfcmF0ZTplLmJpdF9yYXRlLGV4dHJhZGF0YV9zaXplOmUuZXh0cmFkYXRhX3NpemUsZXh0cmFkYXRhOnIscl9mcmFtZV9yYXRlOmUucl9mcmFtZV9yYXRlLGF2Z19mcmFtZV9yYXRlOmUuYXZnX2ZyYW1lX3JhdGUsc2FtcGxlX2FzcGVjdF9yYXRpbzplLnNhbXBsZV9hc3BlY3RfcmF0aW8sZGlzcGxheV9hc3BlY3RfcmF0aW86ZS5kaXNwbGF5X2FzcGVjdF9yYXRpbyxzdGFydF90aW1lOmUuc3RhcnRfdGltZSxkdXJhdGlvbjplLmR1cmF0aW9uLHJvdGF0aW9uOmUucm90YXRpb24sZmxpcDplLmZsaXAsbmJfZnJhbWVzOmUubmJfZnJhbWVzLHRhZ3M6ZS50YWdzfTtyZXR1cm4gZS5kZWxldGUoKSx0fWZ1bmN0aW9uIGRyKGUpe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSx0PXtrZXlmcmFtZTplLmtleWZyYW1lLHRpbWVzdGFtcDplLnRpbWVzdGFtcCxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLGRhdGE6cn07cmV0dXJuIGUuZGVsZXRlKCksdH1mdW5jdGlvbiBTYShlLHI9MCx0PS0xKXtjb25zdCBuPW5ldyBwZShlKTtuLm1vdW50KCk7dHJ5e2NvbnN0IGE9Zi5nZXRfYXZfc3RyZWFtKG4uZmlsZVBhdGgscix0KTtyZXR1cm4gY3IoYSl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfc3RyZWFtIGZhaWxlZDogIithLm1lc3NhZ2UpfWZpbmFsbHl7bi51bm1vdW50KCl9fWZ1bmN0aW9uIE1hKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9hdl9zdHJlYW1zKHIuZmlsZVBhdGgpLG49W107Zm9yKGxldCBhPTA7YTx0LnN0cmVhbXMuc2l6ZSgpO2ErKyluLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9hdl9zdHJlYW1zIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIFJhKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9tZWRpYV9pbmZvKHIuZmlsZVBhdGgpLG49e2Zvcm1hdF9uYW1lOnQuZm9ybWF0X25hbWUsZHVyYXRpb246dC5kdXJhdGlvbixiaXRfcmF0ZTp0LmJpdF9yYXRlLHN0YXJ0X3RpbWU6dC5zdGFydF90aW1lLG5iX3N0cmVhbXM6dC5uYl9zdHJlYW1zLHN0cmVhbXM6W119O2ZvcihsZXQgYT0wO2E8dC5zdHJlYW1zLnNpemUoKTthKyspbi5zdHJlYW1zLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9tZWRpYV9pbmZvIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIE9hKGUscix0PTAsbj0tMSxhPTEpe2NvbnN0IGk9bmV3IHBlKGUpO2kubW91bnQoKTt0cnl7Y29uc3Qgcz1mLmdldF9hdl9wYWNrZXQoaS5maWxlUGF0aCxyLHQsbixhKTtyZXR1cm4gZHIocyl9Y2F0Y2gocyl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0IGZhaWxlZDogIitzLm1lc3NhZ2UpfWZpbmFsbHl7aS51bm1vdW50KCl9fWZ1bmN0aW9uIElhKGUscix0PTEpe2NvbnN0IG49bmV3IHBlKGUpO24ubW91bnQoKTt0cnl7Y29uc3QgYT1mLmdldF9hdl9wYWNrZXRzKG4uZmlsZVBhdGgscix0KSxpPVtdO2ZvcihsZXQgcz0wO3M8YS5wYWNrZXRzLnNpemUoKTtzKyspaS5wdXNoKGRyKGEucGFja2V0cy5nZXQocykpKTtyZXR1cm4gYS5wYWNrZXRzLmRlbGV0ZSgpLGl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0cyBmYWlsZWQ6ICIrYS5tZXNzYWdlKX1maW5hbGx5e24udW5tb3VudCgpfX1hc3luYyBmdW5jdGlvbiBMYShlLHIsdD0wLG49MCxhPTAsaT0tMSxzPTEpe2NvbnN0IGw9bmV3IHBlKHIpO2wubW91bnQoKTtsZXQgdT1udWxsO3RyeXtpZih1PWYuQVZQYWNrZXRSZWFkZXIuY3JlYXRlKGwuZmlsZVBhdGgsdCxuLGEsaSxzKSwhdSl0aHJvdyBuZXcgRXJyb3IoIkFWUGFja2V0UmVhZGVyLmNyZWF0ZSBmYWlsZWQgKG51bGwgcmVhZGVyKSIpO2NvbnN0IGM9VmEoZSk7Zm9yKDs7KXtjb25zdCBkPXUucmVhZF9uZXh0X2F2X3BhY2tldCgpO2lmKHUuaGFzX2Vycm9yKCkpdGhyb3cgbmV3IEVycm9yKCJBVlBhY2tldFJlYWRlciByZWFkX25leHRfYXZfcGFja2V0IGVycm9yIik7aWYodS5pc19maW5pc2hlZCgpKXthd2FpdCBjKDApO2JyZWFrfWlmKGF3YWl0IGMoZCk9PT0wKWJyZWFrfX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoInJlYWRBVlBhY2tldCBwaXBlbGluZSBmYWlsZWQ6ICIrYy5tZXNzYWdlKX1maW5hbGx5e3UmJnUuZGVsZXRlKCksbC51bm1vdW50KCl9cmV0dXJuIDF9ZnVuY3Rpb24gVmEoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZShuPT57Y29uc3QgYT17dHlwZToiQVZQYWNrZXRTdHJlYW0iLG1zZ0lkOmUscmVzdWx0Om51bGx9O2lmKHQ9PT0wKXtzZWxmLnBvc3RNZXNzYWdlKGEpLG4oMSk7cmV0dXJufWNvbnN0IGk9ZHIodCk7YS5yZXN1bHQ9aSxzZWxmLnBvc3RNZXNzYWdlKGEsW2kuZGF0YS5idWZmZXJdKTtjb25zdCBzPWw9Pntjb25zdHt0eXBlOnUsbXNnSWQ6Y309bC5kYXRhO2M9PT1lJiYodT09PSJSZWFkTmV4dEFWUGFja2V0Ij8oc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDEpKTp1PT09IlN0b3BSZWFkQVZQYWNrZXQiJiYoc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDApKSl9O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KX19ZnVuY3Rpb24gVWEoZSl7bnQ9ZSxmLnNldF9hdl9sb2dfbGV2ZWwoZSl9cmV0dXJuIGYuZ2V0QVZTdHJlYW09U2EsZi5nZXRBVlN0cmVhbXM9TWEsZi5nZXRNZWRpYUluZm89UmEsZi5nZXRBVlBhY2tldD1PYSxmLmdldEFWUGFja2V0cz1JYSxmLnJlYWRBVlBhY2tldD1MYSxmLnNldEFWTG9nTGV2ZWw9VWEsQz1uZSxDfX0pKCk7bGV0IFE7c2VsZi5wb3N0TWVzc2FnZSh7dHlwZTpHLldhc21Xb3JrZXJMb2FkZWR9KSxzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGFzeW5jIGZ1bmN0aW9uKEUpe2NvbnN0e3R5cGU6UixkYXRhOkMsbXNnSWQ6Zn09RS5kYXRhO3RyeXtzd2l0Y2goUil7Y2FzZSJMb2FkV0FTTSI6cmV0dXJuIGF3YWl0IHN0KEMpO2Nhc2UiR2V0QVZTdHJlYW0iOnJldHVybiBsdChDLGYpO2Nhc2UiR2V0QVZTdHJlYW1zIjpyZXR1cm4gdXQoQyxmKTtjYXNlIkdldE1lZGlhSW5mbyI6cmV0dXJuIGZ0KEMsZik7Y2FzZSJHZXRBVlBhY2tldCI6cmV0dXJuIGN0KEMsZik7Y2FzZSJHZXRBVlBhY2tldHMiOnJldHVybiBkdChDLGYpO2Nhc2UiUmVhZEFWUGFja2V0IjpyZXR1cm4gYXdhaXQgdnQoQyxmKTtjYXNlIlNldEFWTG9nTGV2ZWwiOnJldHVybiBodChDLGYpO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChVKXtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOlIsbXNnSWQ6ZixlcnJNc2c6VSBpbnN0YW5jZW9mIEVycm9yP1UubWVzc2FnZToiVW5rbm93biBFcnJvciJ9KX19KTthc3luYyBmdW5jdGlvbiBzdChFKXtjb25zdHt3YXNtRmlsZVBhdGg6Un09RXx8e307UT1hd2FpdCBpdCh7bG9jYXRlRmlsZTooQyxmKT0+Qy5lbmRzV2l0aCgiLndhc20iKSYmUj9SOmYrQyxvblJ1bnRpbWVJbml0aWFsaXplZDooKT0+e3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5XQVNNUnVudGltZUluaXRpYWxpemVkfSl9fSl9ZnVuY3Rpb24gbHQoRSxSKXtjb25zdHtzb3VyY2U6QyxzdHJlYW1UeXBlOmYsc3RyZWFtSW5kZXg6VX09RSxIPVEuZ2V0QVZTdHJlYW0oQyxmLFUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbSxtc2dJZDpSLHJlc3VsdDpIfSxbSC5leHRyYWRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gdXQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0QVZTdHJlYW1zKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbXMsbXNnSWQ6UixyZXN1bHQ6Zn0sZi5tYXAoVT0+VS5leHRyYWRhdGEuYnVmZmVyKSl9ZnVuY3Rpb24gZnQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0TWVkaWFJbmZvKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRNZWRpYUluZm8sbXNnSWQ6UixyZXN1bHQ6Zn0sZi5zdHJlYW1zLm1hcChVPT5VLmV4dHJhZGF0YS5idWZmZXIpKX1mdW5jdGlvbiBjdChFLFIpe2NvbnN0e3NvdXJjZTpDLHRpbWU6ZixzdHJlYW1UeXBlOlUsc3RyZWFtSW5kZXg6SCxzZWVrRmxhZzpuZX09RSxhZT1RLmdldEFWUGFja2V0KEMsZixVLEgsbmUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlBhY2tldCxtc2dJZDpSLHJlc3VsdDphZX0sW2FlLmRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gZHQoRSxSKXtjb25zdHtzb3VyY2U6Qyx0aW1lOmYsc2Vla0ZsYWc6VX09RSxIPVEuZ2V0QVZQYWNrZXRzKEMsZixVKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuR2V0QVZQYWNrZXRzLG1zZ0lkOlIscmVzdWx0Okh9LEgubWFwKG5lPT5uZS5kYXRhLmJ1ZmZlcikpfWFzeW5jIGZ1bmN0aW9uIHZ0KEUsUil7Y29uc3R7c291cmNlOkMsc3RhcnQ6ZixlbmQ6VSxzdHJlYW1UeXBlOkgsc3RyZWFtSW5kZXg6bmUsc2Vla0ZsYWc6YWV9PUUsRGU9YXdhaXQgUS5yZWFkQVZQYWNrZXQoUixDLGYsVSxILG5lLGFlKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuUmVhZEFWUGFja2V0LG1zZ0lkOlIscmVzdWx0OkRlfSl9ZnVuY3Rpb24gaHQoRSxSKXtjb25zdHtsZXZlbDpDfT1FO1Euc2V0QVZMb2dMZXZlbChDKSxzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJTZXRBVkxvZ0xldmVsIixtc2dJZDpSfSl9fSkoKTsK", Za = (t) => Uint8Array.from(atob(t), (e) => e.charCodeAt(0)), Ks = typeof window < "u" && window.Blob && new Blob([Za(un)], {
|
|
10240
|
+
[fa]: I0.AVMEDIA_TYPE_AUDIO,
|
|
10241
|
+
[Za]: I0.AVMEDIA_TYPE_SUBTITLE
|
|
10242
|
+
}, un = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBZT0oRT0+KEVbRS5BVk1FRElBX1RZUEVfVU5LTk9XTj0tMV09IkFWTUVESUFfVFlQRV9VTktOT1dOIixFW0UuQVZNRURJQV9UWVBFX1ZJREVPPTBdPSJBVk1FRElBX1RZUEVfVklERU8iLEVbRS5BVk1FRElBX1RZUEVfQVVESU89MV09IkFWTUVESUFfVFlQRV9BVURJTyIsRVtFLkFWTUVESUFfVFlQRV9EQVRBPTJdPSJBVk1FRElBX1RZUEVfREFUQSIsRVtFLkFWTUVESUFfVFlQRV9TVUJUSVRMRT0zXT0iQVZNRURJQV9UWVBFX1NVQlRJVExFIixFW0UuQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ9NF09IkFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UIixFW0UuQVZNRURJQV9UWVBFX05CPTVdPSJBVk1FRElBX1RZUEVfTkIiLEUpKShBZXx8e30pLEc9KEU9PihFLldhc21Xb3JrZXJMb2FkZWQ9Ildhc21Xb3JrZXJMb2FkZWQiLEUuV0FTTVJ1bnRpbWVJbml0aWFsaXplZD0iV0FTTVJ1bnRpbWVJbml0aWFsaXplZCIsRS5Mb2FkV0FTTT0iTG9hZFdBU00iLEUuR2V0QVZQYWNrZXQ9IkdldEFWUGFja2V0IixFLkdldEFWUGFja2V0cz0iR2V0QVZQYWNrZXRzIixFLkdldEFWU3RyZWFtPSJHZXRBVlN0cmVhbSIsRS5HZXRBVlN0cmVhbXM9IkdldEFWU3RyZWFtcyIsRS5HZXRNZWRpYUluZm89IkdldE1lZGlhSW5mbyIsRS5SZWFkQVZQYWNrZXQ9IlJlYWRBVlBhY2tldCIsRS5BVlBhY2tldFN0cmVhbT0iQVZQYWNrZXRTdHJlYW0iLEUuUmVhZE5leHRBVlBhY2tldD0iUmVhZE5leHRBVlBhY2tldCIsRS5TdG9wUmVhZEFWUGFja2V0PSJTdG9wUmVhZEFWUGFja2V0IixFLlNldEFWTG9nTGV2ZWw9IlNldEFWTG9nTGV2ZWwiLEUpKShHfHx7fSk7InZpZGVvIisiIixBZS5BVk1FRElBX1RZUEVfVklERU8sImF1ZGlvIisiIixBZS5BVk1FRElBX1RZUEVfQVVESU8sInN1YnRpdGxlIisiIixBZS5BVk1FRElBX1RZUEVfU1VCVElUTEU7dmFyIGl0PSgoKT0+e3ZhciBFPXNlbGYubG9jYXRpb24uaHJlZjtyZXR1cm4gZnVuY3Rpb24oUj17fSl7dmFyIEMsZj1PYmplY3QuYXNzaWduKHt9LFIpLFUsSCxuZT1uZXcgUHJvbWlzZSgoZSxyKT0+e1U9ZSxIPXJ9KSxhZT0hMCxEZT1PYmplY3QuYXNzaWduKHt9LGYpLGhyPSIuL3RoaXMucHJvZ3JhbSIscT0iIjtmdW5jdGlvbiBtdChlKXtyZXR1cm4gZi5sb2NhdGVGaWxlP2YubG9jYXRlRmlsZShlLHEpOnErZX12YXIgWWUsbXIsR2U7cT1zZWxmLmxvY2F0aW9uLmhyZWYsRSYmKHE9RSkscS5zdGFydHNXaXRoKCJibG9iOiIpP3E9IiI6cT1xLnN1YnN0cigwLHEucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKSxZZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5zZW5kKG51bGwpLHIucmVzcG9uc2VUZXh0fSxHZT1lPT57dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4oIkdFVCIsZSwhMSksci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixyLnNlbmQobnVsbCksbmV3IFVpbnQ4QXJyYXkoci5yZXNwb25zZSl9LG1yPShlLHIsdCk9Pnt2YXIgbj1uZXcgWE1MSHR0cFJlcXVlc3Q7bi5vcGVuKCJHRVQiLGUsITApLG4ucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciIsbi5vbmxvYWQ9KCk9PntpZihuLnN0YXR1cz09MjAwfHxuLnN0YXR1cz09MCYmbi5yZXNwb25zZSl7cihuLnJlc3BvbnNlKTtyZXR1cm59dCgpfSxuLm9uZXJyb3I9dCxuLnNlbmQobnVsbCl9O3ZhciBxZT1mLnByaW50fHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLGVlPWYucHJpbnRFcnJ8fGNvbnNvbGUuZXJyb3IuYmluZChjb25zb2xlKTtPYmplY3QuYXNzaWduKGYsRGUpLERlPW51bGwsZi5hcmd1bWVudHMmJmYuYXJndW1lbnRzLGYudGhpc1Byb2dyYW0mJihocj1mLnRoaXNQcm9ncmFtKSxmLnF1aXQmJmYucXVpdDt2YXIgX2U7Zi53YXNtQmluYXJ5JiYoX2U9Zi53YXNtQmluYXJ5KTt2YXIgJGUscHI9ITE7ZnVuY3Rpb24gX3IoZSxyKXtlfHxpZShyKX12YXIgSSx4LFksQ2UsZyxBLGdyLHlyO2Z1bmN0aW9uIHdyKCl7dmFyIGU9JGUuYnVmZmVyO2YuSEVBUDg9ST1uZXcgSW50OEFycmF5KGUpLGYuSEVBUDE2PVk9bmV3IEludDE2QXJyYXkoZSksZi5IRUFQVTg9eD1uZXcgVWludDhBcnJheShlKSxmLkhFQVBVMTY9Q2U9bmV3IFVpbnQxNkFycmF5KGUpLGYuSEVBUDMyPWc9bmV3IEludDMyQXJyYXkoZSksZi5IRUFQVTMyPUE9bmV3IFVpbnQzMkFycmF5KGUpLGYuSEVBUEYzMj1ncj1uZXcgRmxvYXQzMkFycmF5KGUpLGYuSEVBUEY2ND15cj1uZXcgRmxvYXQ2NEFycmF5KGUpfXZhciBFcj1bXSxicj1bXSxrcj1bXTtmdW5jdGlvbiBwdCgpe2lmKGYucHJlUnVuKWZvcih0eXBlb2YgZi5wcmVSdW49PSJmdW5jdGlvbiImJihmLnByZVJ1bj1bZi5wcmVSdW5dKTtmLnByZVJ1bi5sZW5ndGg7KXl0KGYucHJlUnVuLnNoaWZ0KCkpO0tlKEVyKX1mdW5jdGlvbiBfdCgpeyFmLm5vRlNJbml0JiYhby5pbml0LmluaXRpYWxpemVkJiZvLmluaXQoKSxvLmlnbm9yZVBlcm1pc3Npb25zPSExLEtlKGJyKX1mdW5jdGlvbiBndCgpe2lmKGYucG9zdFJ1bilmb3IodHlwZW9mIGYucG9zdFJ1bj09ImZ1bmN0aW9uIiYmKGYucG9zdFJ1bj1bZi5wb3N0UnVuXSk7Zi5wb3N0UnVuLmxlbmd0aDspRXQoZi5wb3N0UnVuLnNoaWZ0KCkpO0tlKGtyKX1mdW5jdGlvbiB5dChlKXtFci51bnNoaWZ0KGUpfWZ1bmN0aW9uIHd0KGUpe2JyLnVuc2hpZnQoZSl9ZnVuY3Rpb24gRXQoZSl7a3IudW5zaGlmdChlKX12YXIgb2U9MCxnZT1udWxsO2Z1bmN0aW9uIEhhKGUpe3JldHVybiBlfWZ1bmN0aW9uIFhlKGUpe3ZhciByO29lKyssKHI9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8ci5jYWxsKGYsb2UpfWZ1bmN0aW9uIEZlKGUpe3ZhciB0O2lmKG9lLS0sKHQ9Zi5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKT09bnVsbHx8dC5jYWxsKGYsb2UpLG9lPT0wJiZnZSl7dmFyIHI9Z2U7Z2U9bnVsbCxyKCl9fWZ1bmN0aW9uIGllKGUpe3ZhciB0Oyh0PWYub25BYm9ydCk9PW51bGx8fHQuY2FsbChmLGUpLGU9IkFib3J0ZWQoIitlKyIpIixlZShlKSxwcj0hMCxlKz0iLiBCdWlsZCB3aXRoIC1zQVNTRVJUSU9OUyBmb3IgbW9yZSBpbmZvLiI7dmFyIHI9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihlKTt0aHJvdyBIKHIpLHJ9dmFyIGJ0PSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIixQcj1lPT5lLnN0YXJ0c1dpdGgoYnQpO2Z1bmN0aW9uIGt0KCl7aWYoZi5sb2NhdGVGaWxlKXt2YXIgZT0id2ViLWRlbXV4ZXIud2FzbSI7cmV0dXJuIFByKGUpP2U6bXQoZSl9cmV0dXJuIG5ldyBVUkwoIndlYi1kZW11eGVyLndhc20iLHNlbGYubG9jYXRpb24uaHJlZikuaHJlZn12YXIgVGU7ZnVuY3Rpb24gQXIoZSl7aWYoZT09VGUmJl9lKXJldHVybiBuZXcgVWludDhBcnJheShfZSk7aWYoR2UpcmV0dXJuIEdlKGUpO3Rocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1mdW5jdGlvbiBQdChlKXtyZXR1cm4hX2UmJmFlJiZ0eXBlb2YgZmV0Y2g9PSJmdW5jdGlvbiI/ZmV0Y2goZSx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pLnRoZW4ocj0+e2lmKCFyLm9rKXRocm93YGZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyR7ZX0nYDtyZXR1cm4gci5hcnJheUJ1ZmZlcigpfSkuY2F0Y2goKCk9PkFyKGUpKTpQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5BcihlKSl9ZnVuY3Rpb24gRHIoZSxyLHQpe3JldHVybiBQdChlKS50aGVuKG49PldlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4scikpLnRoZW4odCxuPT57ZWUoYGZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICR7bn1gKSxpZShuKX0pfWZ1bmN0aW9uIEF0KGUscix0LG4pe3JldHVybiFlJiZ0eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmc9PSJmdW5jdGlvbiImJiFQcihyKSYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKHIse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGE9Pnt2YXIgaT1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhhLHQpO3JldHVybiBpLnRoZW4obixmdW5jdGlvbihzKXtyZXR1cm4gZWUoYHdhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAke3N9YCksZWUoImZhbGxpbmcgYmFjayB0byBBcnJheUJ1ZmZlciBpbnN0YW50aWF0aW9uIiksRHIocix0LG4pfSl9KTpEcihyLHQsbil9ZnVuY3Rpb24gRHQoKXtyZXR1cm57YTpDYX19ZnVuY3Rpb24gJHQoKXt2YXIgZT1EdCgpO2Z1bmN0aW9uIHIobixhKXtyZXR1cm4gej1uLmV4cG9ydHMsJGU9ei5iYSx3cigpLGpyPXouZWEsd3Qoei5jYSksRmUoKSx6fVhlKCk7ZnVuY3Rpb24gdChuKXtyKG4uaW5zdGFuY2UpfWlmKGYuaW5zdGFudGlhdGVXYXNtKXRyeXtyZXR1cm4gZi5pbnN0YW50aWF0ZVdhc20oZSxyKX1jYXRjaChuKXtlZShgTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJHtufWApLEgobil9cmV0dXJuIFRlfHwoVGU9a3QoKSksQXQoX2UsVGUsZSx0KS5jYXRjaChIKSx7fX12YXIgeSwkLEtlPWU9Pntmb3IoO2UubGVuZ3RoPjA7KWUuc2hpZnQoKShmKX07Zi5ub0V4aXRSdW50aW1lO3ZhciAkcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMCxjZT0oZSxyLHQpPT57Zm9yKHZhciBuPXIrdCxhPXI7ZVthXSYmIShhPj1uKTspKythO2lmKGEtcj4xNiYmZS5idWZmZXImJiRyKXJldHVybiAkci5kZWNvZGUoZS5zdWJhcnJheShyLGEpKTtmb3IodmFyIGk9IiI7cjxhOyl7dmFyIHM9ZVtyKytdO2lmKCEocyYxMjgpKXtpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHMpO2NvbnRpbnVlfXZhciBsPWVbcisrXSY2MztpZigocyYyMjQpPT0xOTIpe2krPVN0cmluZy5mcm9tQ2hhckNvZGUoKHMmMzEpPDw2fGwpO2NvbnRpbnVlfXZhciB1PWVbcisrXSY2MztpZigocyYyNDApPT0yMjQ/cz0ocyYxNSk8PDEyfGw8PDZ8dTpzPShzJjcpPDwxOHxsPDwxMnx1PDw2fGVbcisrXSY2MyxzPDY1NTM2KWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyk7ZWxzZXt2YXIgYz1zLTY1NTM2O2krPVN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTZ8Yz4+MTAsNTYzMjB8YyYxMDIzKX19cmV0dXJuIGl9LHNlPShlLHIpPT5lP2NlKHgsZSxyKToiIixDdD0oZSxyLHQsbik9PntpZShgQXNzZXJ0aW9uIGZhaWxlZDogJHtzZShlKX0sIGF0OiBgK1tyP3NlKHIpOiJ1bmtub3duIGZpbGVuYW1lIix0LG4/c2Uobik6InVua25vd24gZnVuY3Rpb24iXSl9O2NsYXNzIEZ0e2NvbnN0cnVjdG9yKHIpe3RoaXMuZXhjUHRyPXIsdGhpcy5wdHI9ci0yNH1zZXRfdHlwZShyKXtBW3RoaXMucHRyKzQ+PjJdPXJ9Z2V0X3R5cGUoKXtyZXR1cm4gQVt0aGlzLnB0cis0Pj4yXX1zZXRfZGVzdHJ1Y3RvcihyKXtBW3RoaXMucHRyKzg+PjJdPXJ9Z2V0X2Rlc3RydWN0b3IoKXtyZXR1cm4gQVt0aGlzLnB0cis4Pj4yXX1zZXRfY2F1Z2h0KHIpe3I9cj8xOjAsSVt0aGlzLnB0cisxMl09cn1nZXRfY2F1Z2h0KCl7cmV0dXJuIElbdGhpcy5wdHIrMTJdIT0wfXNldF9yZXRocm93bihyKXtyPXI/MTowLElbdGhpcy5wdHIrMTNdPXJ9Z2V0X3JldGhyb3duKCl7cmV0dXJuIElbdGhpcy5wdHIrMTNdIT0wfWluaXQocix0KXt0aGlzLnNldF9hZGp1c3RlZF9wdHIoMCksdGhpcy5zZXRfdHlwZShyKSx0aGlzLnNldF9kZXN0cnVjdG9yKHQpfXNldF9hZGp1c3RlZF9wdHIocil7QVt0aGlzLnB0cisxNj4+Ml09cn1nZXRfYWRqdXN0ZWRfcHRyKCl7cmV0dXJuIEFbdGhpcy5wdHIrMTY+PjJdfWdldF9leGNlcHRpb25fcHRyKCl7dmFyIHI9cnQodGhpcy5nZXRfdHlwZSgpKTtpZihyKXJldHVybiBBW3RoaXMuZXhjUHRyPj4yXTt2YXIgdD10aGlzLmdldF9hZGp1c3RlZF9wdHIoKTtyZXR1cm4gdCE9PTA/dDp0aGlzLmV4Y1B0cn19dmFyIENyPTAsVHQ9KGUscix0KT0+e3ZhciBuPW5ldyBGdChlKTt0aHJvdyBuLmluaXQocix0KSxDcj1lLENyfSxTPXtpc0FiczplPT5lLmNoYXJBdCgwKT09PSIvIixzcGxpdFBhdGg6ZT0+e3ZhciByPS9eKFwvP3wpKFtcc1xTXSo/KSgoPzpcLnsxLDJ9fFteXC9dKz98KShcLlteLlwvXSp8KSkoPzpbXC9dKikkLztyZXR1cm4gci5leGVjKGUpLnNsaWNlKDEpfSxub3JtYWxpemVBcnJheTooZSxyKT0+e2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7dmFyIGE9ZVtuXTthPT09Ii4iP2Uuc3BsaWNlKG4sMSk6YT09PSIuLiI/KGUuc3BsaWNlKG4sMSksdCsrKTp0JiYoZS5zcGxpY2UobiwxKSx0LS0pfWlmKHIpZm9yKDt0O3QtLSllLnVuc2hpZnQoIi4uIik7cmV0dXJuIGV9LG5vcm1hbGl6ZTplPT57dmFyIHI9Uy5pc0FicyhlKSx0PWUuc3Vic3RyKC0xKT09PSIvIjtyZXR1cm4gZT1TLm5vcm1hbGl6ZUFycmF5KGUuc3BsaXQoIi8iKS5maWx0ZXIobj0+ISFuKSwhcikuam9pbigiLyIpLCFlJiYhciYmKGU9Ii4iKSxlJiZ0JiYoZSs9Ii8iKSwocj8iLyI6IiIpK2V9LGRpcm5hbWU6ZT0+e3ZhciByPVMuc3BsaXRQYXRoKGUpLHQ9clswXSxuPXJbMV07cmV0dXJuIXQmJiFuPyIuIjoobiYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksdCtuKX0sYmFzZW5hbWU6ZT0+e2lmKGU9PT0iLyIpcmV0dXJuIi8iO2U9Uy5ub3JtYWxpemUoZSksZT1lLnJlcGxhY2UoL1wvJC8sIiIpO3ZhciByPWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4gcj09PS0xP2U6ZS5zdWJzdHIocisxKX0sam9pbjooLi4uZSk9PlMubm9ybWFsaXplKGUuam9pbigiLyIpKSxqb2luMjooZSxyKT0+Uy5ub3JtYWxpemUoZSsiLyIrcil9LFN0PSgpPT57aWYodHlwZW9mIGNyeXB0bz09Im9iamVjdCImJnR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iKXJldHVybiBlPT5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpO2llKCJpbml0UmFuZG9tRGV2aWNlIil9LEZyPWU9PihGcj1TdCgpKShlKSxYPXtyZXNvbHZlOiguLi5lKT0+e2Zvcih2YXIgcj0iIix0PSExLG49ZS5sZW5ndGgtMTtuPj0tMSYmIXQ7bi0tKXt2YXIgYT1uPj0wP2Vbbl06by5jd2QoKTtpZih0eXBlb2YgYSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MiKTtpZighYSlyZXR1cm4iIjtyPWErIi8iK3IsdD1TLmlzQWJzKGEpfXJldHVybiByPVMubm9ybWFsaXplQXJyYXkoci5zcGxpdCgiLyIpLmZpbHRlcihpPT4hIWkpLCF0KS5qb2luKCIvIiksKHQ/Ii8iOiIiKStyfHwiLiJ9LHJlbGF0aXZlOihlLHIpPT57ZT1YLnJlc29sdmUoZSkuc3Vic3RyKDEpLHI9WC5yZXNvbHZlKHIpLnN1YnN0cigxKTtmdW5jdGlvbiB0KGMpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGgmJmNbZF09PT0iIjtkKyspO2Zvcih2YXIgbT1jLmxlbmd0aC0xO20+PTAmJmNbbV09PT0iIjttLS0pO3JldHVybiBkPm0/W106Yy5zbGljZShkLG0tZCsxKX1mb3IodmFyIG49dChlLnNwbGl0KCIvIikpLGE9dChyLnNwbGl0KCIvIikpLGk9TWF0aC5taW4obi5sZW5ndGgsYS5sZW5ndGgpLHM9aSxsPTA7bDxpO2wrKylpZihuW2xdIT09YVtsXSl7cz1sO2JyZWFrfWZvcih2YXIgdT1bXSxsPXM7bDxuLmxlbmd0aDtsKyspdS5wdXNoKCIuLiIpO3JldHVybiB1PXUuY29uY2F0KGEuc2xpY2UocykpLHUuam9pbigiLyIpfX0sSmU9W10sWmU9ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO248PTEyNz9yKys6bjw9MjA0Nz9yKz0yOm4+PTU1Mjk2JiZuPD01NzM0Mz8ocis9NCwrK3QpOnIrPTN9cmV0dXJuIHJ9LFFlPShlLHIsdCxuKT0+e2lmKCEobj4wKSlyZXR1cm4gMDtmb3IodmFyIGE9dCxpPXQrbi0xLHM9MDtzPGUubGVuZ3RoOysrcyl7dmFyIGw9ZS5jaGFyQ29kZUF0KHMpO2lmKGw+PTU1Mjk2JiZsPD01NzM0Myl7dmFyIHU9ZS5jaGFyQ29kZUF0KCsrcyk7bD02NTUzNisoKGwmMTAyMyk8PDEwKXx1JjEwMjN9aWYobDw9MTI3KXtpZih0Pj1pKWJyZWFrO3JbdCsrXT1sfWVsc2UgaWYobDw9MjA0Nyl7aWYodCsxPj1pKWJyZWFrO3JbdCsrXT0xOTJ8bD4+NixyW3QrK109MTI4fGwmNjN9ZWxzZSBpZihsPD02NTUzNSl7aWYodCsyPj1pKWJyZWFrO3JbdCsrXT0yMjR8bD4+MTIsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M31lbHNle2lmKHQrMz49aSlicmVhaztyW3QrK109MjQwfGw+PjE4LHJbdCsrXT0xMjh8bD4+MTImNjMsclt0KytdPTEyOHxsPj42JjYzLHJbdCsrXT0xMjh8bCY2M319cmV0dXJuIHJbdF09MCx0LWF9O2Z1bmN0aW9uIFNlKGUscix0KXt2YXIgbj1aZShlKSsxLGE9bmV3IEFycmF5KG4pLGk9UWUoZSxhLDAsYS5sZW5ndGgpO3JldHVybiByJiYoYS5sZW5ndGg9aSksYX12YXIgTXQ9KCk9PntpZighSmUubGVuZ3RoKXt2YXIgZT1udWxsO2lmKCFlKXJldHVybiBudWxsO0plPVNlKGUsITApfXJldHVybiBKZS5zaGlmdCgpfSxsZT17dHR5czpbXSxpbml0KCl7fSxzaHV0ZG93bigpe30scmVnaXN0ZXIoZSxyKXtsZS50dHlzW2VdPXtpbnB1dDpbXSxvdXRwdXQ6W10sb3BzOnJ9LG8ucmVnaXN0ZXJEZXZpY2UoZSxsZS5zdHJlYW1fb3BzKX0sc3RyZWFtX29wczp7b3BlbihlKXt2YXIgcj1sZS50dHlzW2Uubm9kZS5yZGV2XTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtlLnR0eT1yLGUuc2Vla2FibGU9ITF9LGNsb3NlKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LGZzeW5jKGUpe2UudHR5Lm9wcy5mc3luYyhlLnR0eSl9LHJlYWQoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMuZ2V0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7Zm9yKHZhciBpPTAscz0wO3M8bjtzKyspe3ZhciBsO3RyeXtsPWUudHR5Lm9wcy5nZXRfY2hhcihlLnR0eSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9aWYobD09PXZvaWQgMCYmaT09PTApdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2KTtpZihsPT1udWxsKWJyZWFrO2krKyxyW3Qrc109bH1yZXR1cm4gaSYmKGUubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaX0sd3JpdGUoZSxyLHQsbixhKXtpZighZS50dHl8fCFlLnR0eS5vcHMucHV0X2NoYXIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig2MCk7dHJ5e2Zvcih2YXIgaT0wO2k8bjtpKyspZS50dHkub3BzLnB1dF9jaGFyKGUudHR5LHJbdCtpXSl9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9cmV0dXJuIG4mJihlLm5vZGUudGltZXN0YW1wPURhdGUubm93KCkpLGl9fSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyKGUpe3JldHVybiBNdCgpfSxwdXRfY2hhcihlLHIpe3I9PT1udWxsfHxyPT09MTA/KHFlKGNlKGUub3V0cHV0LDApKSxlLm91dHB1dD1bXSk6ciE9MCYmZS5vdXRwdXQucHVzaChyKX0sZnN5bmMoZSl7ZS5vdXRwdXQmJmUub3V0cHV0Lmxlbmd0aD4wJiYocWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKX0saW9jdGxfdGNnZXRzKGUpe3JldHVybntjX2lmbGFnOjI1ODU2LGNfb2ZsYWc6NSxjX2NmbGFnOjE5MSxjX2xmbGFnOjM1Mzg3LGNfY2M6WzMsMjgsMTI3LDIxLDQsMCwxLDAsMTcsMTksMjYsMCwxOCwxNSwyMywyMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXX19LGlvY3RsX3Rjc2V0cyhlLHIsdCl7cmV0dXJuIDB9LGlvY3RsX3Rpb2Nnd2luc3ooZSl7cmV0dXJuWzI0LDgwXX19LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyKGUscil7cj09PW51bGx8fHI9PT0xMD8oZWUoY2UoZS5vdXRwdXQsMCkpLGUub3V0cHV0PVtdKTpyIT0wJiZlLm91dHB1dC5wdXNoKHIpfSxmc3luYyhlKXtlLm91dHB1dCYmZS5vdXRwdXQubGVuZ3RoPjAmJihlZShjZShlLm91dHB1dCwwKSksZS5vdXRwdXQ9W10pfX19LFRyPWU9PntpZSgpfSxiPXtvcHNfdGFibGU6bnVsbCxtb3VudChlKXtyZXR1cm4gYi5jcmVhdGVOb2RlKG51bGwsIi8iLDE2ODk1LDApfSxjcmVhdGVOb2RlKGUscix0LG4pe2lmKG8uaXNCbGtkZXYodCl8fG8uaXNGSUZPKHQpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Iub3BzX3RhYmxlfHwoYi5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIsbG9va3VwOmIubm9kZV9vcHMubG9va3VwLG1rbm9kOmIubm9kZV9vcHMubWtub2QscmVuYW1lOmIubm9kZV9vcHMucmVuYW1lLHVubGluazpiLm5vZGVfb3BzLnVubGluayxybWRpcjpiLm5vZGVfb3BzLnJtZGlyLHJlYWRkaXI6Yi5ub2RlX29wcy5yZWFkZGlyLHN5bWxpbms6Yi5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpiLnN0cmVhbV9vcHMubGxzZWVrfX0sZmlsZTp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOmIuc3RyZWFtX29wcy5sbHNlZWsscmVhZDpiLnN0cmVhbV9vcHMucmVhZCx3cml0ZTpiLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6Yi5zdHJlYW1fb3BzLmFsbG9jYXRlLG1tYXA6Yi5zdHJlYW1fb3BzLm1tYXAsbXN5bmM6Yi5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpiLm5vZGVfb3BzLmdldGF0dHIsc2V0YXR0cjpiLm5vZGVfb3BzLnNldGF0dHIscmVhZGxpbms6Yi5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6Yi5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6Yi5ub2RlX29wcy5zZXRhdHRyfSxzdHJlYW06by5jaHJkZXZfc3RyZWFtX29wc319KTt2YXIgYT1vLmNyZWF0ZU5vZGUoZSxyLHQsbik7cmV0dXJuIG8uaXNEaXIoYS5tb2RlKT8oYS5ub2RlX29wcz1iLm9wc190YWJsZS5kaXIubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZGlyLnN0cmVhbSxhLmNvbnRlbnRzPXt9KTpvLmlzRmlsZShhLm1vZGUpPyhhLm5vZGVfb3BzPWIub3BzX3RhYmxlLmZpbGUubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuZmlsZS5zdHJlYW0sYS51c2VkQnl0ZXM9MCxhLmNvbnRlbnRzPW51bGwpOm8uaXNMaW5rKGEubW9kZSk/KGEubm9kZV9vcHM9Yi5vcHNfdGFibGUubGluay5ub2RlLGEuc3RyZWFtX29wcz1iLm9wc190YWJsZS5saW5rLnN0cmVhbSk6by5pc0NocmRldihhLm1vZGUpJiYoYS5ub2RlX29wcz1iLm9wc190YWJsZS5jaHJkZXYubm9kZSxhLnN0cmVhbV9vcHM9Yi5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSksYS50aW1lc3RhbXA9RGF0ZS5ub3coKSxlJiYoZS5jb250ZW50c1tyXT1hLGUudGltZXN0YW1wPWEudGltZXN0YW1wKSxhfSxnZXRGaWxlRGF0YUFzVHlwZWRBcnJheShlKXtyZXR1cm4gZS5jb250ZW50cz9lLmNvbnRlbnRzLnN1YmFycmF5P2UuY29udGVudHMuc3ViYXJyYXkoMCxlLnVzZWRCeXRlcyk6bmV3IFVpbnQ4QXJyYXkoZS5jb250ZW50cyk6bmV3IFVpbnQ4QXJyYXkoMCl9LGV4cGFuZEZpbGVTdG9yYWdlKGUscil7dmFyIHQ9ZS5jb250ZW50cz9lLmNvbnRlbnRzLmxlbmd0aDowO2lmKCEodD49cikpe3ZhciBuPTEwMjQqMTAyNDtyPU1hdGgubWF4KHIsdCoodDxuPzI6MS4xMjUpPj4+MCksdCE9MCYmKHI9TWF0aC5tYXgociwyNTYpKTt2YXIgYT1lLmNvbnRlbnRzO2UuY29udGVudHM9bmV3IFVpbnQ4QXJyYXkociksZS51c2VkQnl0ZXM+MCYmZS5jb250ZW50cy5zZXQoYS5zdWJhcnJheSgwLGUudXNlZEJ5dGVzKSwwKX19LHJlc2l6ZUZpbGVTdG9yYWdlKGUscil7aWYoZS51c2VkQnl0ZXMhPXIpaWYocj09MCllLmNvbnRlbnRzPW51bGwsZS51c2VkQnl0ZXM9MDtlbHNle3ZhciB0PWUuY29udGVudHM7ZS5jb250ZW50cz1uZXcgVWludDhBcnJheShyKSx0JiZlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsTWF0aC5taW4ocixlLnVzZWRCeXRlcykpKSxlLnVzZWRCeXRlcz1yfX0sbm9kZV9vcHM6e2dldGF0dHIoZSl7dmFyIHI9e307cmV0dXJuIHIuZGV2PW8uaXNDaHJkZXYoZS5tb2RlKT9lLmlkOjEsci5pbm89ZS5pZCxyLm1vZGU9ZS5tb2RlLHIubmxpbms9MSxyLnVpZD0wLHIuZ2lkPTAsci5yZGV2PWUucmRldixvLmlzRGlyKGUubW9kZSk/ci5zaXplPTQwOTY6by5pc0ZpbGUoZS5tb2RlKT9yLnNpemU9ZS51c2VkQnl0ZXM6by5pc0xpbmsoZS5tb2RlKT9yLnNpemU9ZS5saW5rLmxlbmd0aDpyLnNpemU9MCxyLmF0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLm10aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmN0aW1lPW5ldyBEYXRlKGUudGltZXN0YW1wKSxyLmJsa3NpemU9NDA5NixyLmJsb2Nrcz1NYXRoLmNlaWwoci5zaXplL3IuYmxrc2l6ZSkscn0sc2V0YXR0cihlLHIpe3IubW9kZSE9PXZvaWQgMCYmKGUubW9kZT1yLm1vZGUpLHIudGltZXN0YW1wIT09dm9pZCAwJiYoZS50aW1lc3RhbXA9ci50aW1lc3RhbXApLHIuc2l6ZSE9PXZvaWQgMCYmYi5yZXNpemVGaWxlU3RvcmFnZShlLHIuc2l6ZSl9LGxvb2t1cChlLHIpe3Rocm93IG8uZ2VuZXJpY0Vycm9yc1s0NF19LG1rbm9kKGUscix0LG4pe3JldHVybiBiLmNyZWF0ZU5vZGUoZSxyLHQsbil9LHJlbmFtZShlLHIsdCl7aWYoby5pc0RpcihlLm1vZGUpKXt2YXIgbjt0cnl7bj1vLmxvb2t1cE5vZGUocix0KX1jYXRjaHt9aWYobilmb3IodmFyIGEgaW4gbi5jb250ZW50cyl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU1KX1kZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSxlLnBhcmVudC50aW1lc3RhbXA9RGF0ZS5ub3coKSxlLm5hbWU9dCxyLmNvbnRlbnRzW3RdPWUsci50aW1lc3RhbXA9ZS5wYXJlbnQudGltZXN0YW1wLGUucGFyZW50PXJ9LHVubGluayhlLHIpe2RlbGV0ZSBlLmNvbnRlbnRzW3JdLGUudGltZXN0YW1wPURhdGUubm93KCl9LHJtZGlyKGUscil7dmFyIHQ9by5sb29rdXBOb2RlKGUscik7Zm9yKHZhciBuIGluIHQuY29udGVudHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NSk7ZGVsZXRlIGUuY29udGVudHNbcl0sZS50aW1lc3RhbXA9RGF0ZS5ub3coKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3ZhciBuPWIuY3JlYXRlTm9kZShlLHIsNDE0NzEsMCk7cmV0dXJuIG4ubGluaz10LG59LHJlYWRsaW5rKGUpe2lmKCFvLmlzTGluayhlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO3JldHVybiBlLmxpbmt9fSxzdHJlYW1fb3BzOntyZWFkKGUscix0LG4sYSl7dmFyIGk9ZS5ub2RlLmNvbnRlbnRzO2lmKGE+PWUubm9kZS51c2VkQnl0ZXMpcmV0dXJuIDA7dmFyIHM9TWF0aC5taW4oZS5ub2RlLnVzZWRCeXRlcy1hLG4pO2lmKHM+OCYmaS5zdWJhcnJheSlyLnNldChpLnN1YmFycmF5KGEsYStzKSx0KTtlbHNlIGZvcih2YXIgbD0wO2w8cztsKyspclt0K2xdPWlbYStsXTtyZXR1cm4gc30sd3JpdGUoZSxyLHQsbixhLGkpe2lmKHIuYnVmZmVyPT09SS5idWZmZXImJihpPSExKSwhbilyZXR1cm4gMDt2YXIgcz1lLm5vZGU7aWYocy50aW1lc3RhbXA9RGF0ZS5ub3coKSxyLnN1YmFycmF5JiYoIXMuY29udGVudHN8fHMuY29udGVudHMuc3ViYXJyYXkpKXtpZihpKXJldHVybiBzLmNvbnRlbnRzPXIuc3ViYXJyYXkodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihzLnVzZWRCeXRlcz09PTAmJmE9PT0wKXJldHVybiBzLmNvbnRlbnRzPXIuc2xpY2UodCx0K24pLHMudXNlZEJ5dGVzPW4sbjtpZihhK248PXMudXNlZEJ5dGVzKXJldHVybiBzLmNvbnRlbnRzLnNldChyLnN1YmFycmF5KHQsdCtuKSxhKSxufWlmKGIuZXhwYW5kRmlsZVN0b3JhZ2UocyxhK24pLHMuY29udGVudHMuc3ViYXJyYXkmJnIuc3ViYXJyYXkpcy5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LHQrbiksYSk7ZWxzZSBmb3IodmFyIGw9MDtsPG47bCsrKXMuY29udGVudHNbYStsXT1yW3QrbF07cmV0dXJuIHMudXNlZEJ5dGVzPU1hdGgubWF4KHMudXNlZEJ5dGVzLGErbiksbn0sbGxzZWVrKGUscix0KXt2YXIgbj1yO2lmKHQ9PT0xP24rPWUucG9zaXRpb246dD09PTImJm8uaXNGaWxlKGUubm9kZS5tb2RlKSYmKG4rPWUubm9kZS51c2VkQnl0ZXMpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn0sYWxsb2NhdGUoZSxyLHQpe2IuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLHIrdCksZS5ub2RlLnVzZWRCeXRlcz1NYXRoLm1heChlLm5vZGUudXNlZEJ5dGVzLHIrdCl9LG1tYXAoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO3ZhciBpLHMsbD1lLm5vZGUuY29udGVudHM7aWYoIShhJjIpJiZsLmJ1ZmZlcj09PUkuYnVmZmVyKXM9ITEsaT1sLmJ5dGVPZmZzZXQ7ZWxzZXtpZigodD4wfHx0K3I8bC5sZW5ndGgpJiYobC5zdWJhcnJheT9sPWwuc3ViYXJyYXkodCx0K3IpOmw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobCx0LHQrcikpLHM9ITAsaT1UcigpLCFpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDgpO0kuc2V0KGwsaSl9cmV0dXJue3B0cjppLGFsbG9jYXRlZDpzfX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gYi5zdHJlYW1fb3BzLndyaXRlKGUsciwwLG4sdCwhMSksMH19fSxSdD0oZSxyLHQsbik9Pnt2YXIgYT1gYWwgJHtlfWA7bXIoZSxpPT57cihuZXcgVWludDhBcnJheShpKSksYSYmRmUoKX0saT0+e2lmKHQpdCgpO2Vsc2UgdGhyb3dgTG9hZGluZyBkYXRhIGZpbGUgIiR7ZX0iIGZhaWxlZC5gfSksYSYmWGUoKX0sT3Q9KGUscix0LG4sYSxpKT0+e28uY3JlYXRlRGF0YUZpbGUoZSxyLHQsbixhLGkpfSxJdD1mLnByZWxvYWRQbHVnaW5zfHxbXSxMdD0oZSxyLHQsbik9Pnt0eXBlb2YgQnJvd3NlcjwidSImJkJyb3dzZXIuaW5pdCgpO3ZhciBhPSExO3JldHVybiBJdC5mb3JFYWNoKGk9PnthfHxpLmNhbkhhbmRsZShyKSYmKGkuaGFuZGxlKGUscix0LG4pLGE9ITApfSksYX0sVnQ9KGUscix0LG4sYSxpLHMsbCx1LGMpPT57dmFyIGQ9cj9YLnJlc29sdmUoUy5qb2luMihlLHIpKTplO2Z1bmN0aW9uIG0oaCl7ZnVuY3Rpb24gcCh3KXtjPT1udWxsfHxjKCksbHx8T3QoZSxyLHcsbixhLHUpLGk9PW51bGx8fGkoKSxGZSgpfUx0KGgsZCxwLCgpPT57cz09bnVsbHx8cygpLEZlKCl9KXx8cChoKX1YZSgpLHR5cGVvZiB0PT0ic3RyaW5nIj9SdCh0LG0scyk6bSh0KX0sVXQ9ZT0+e3ZhciByPXtyOjAsInIrIjoyLHc6NTc3LCJ3KyI6NTc4LGE6MTA4OSwiYSsiOjEwOTB9LHQ9cltlXTtpZih0eXBlb2YgdD4idSIpdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpbGUgb3BlbiBtb2RlOiAke2V9YCk7cmV0dXJuIHR9LGVyPShlLHIpPT57dmFyIHQ9MDtyZXR1cm4gZSYmKHR8PTM2NSksciYmKHR8PTE0NiksdH0sVj17RElSX01PREU6MTY4OTUsRklMRV9NT0RFOjMzMjc5LHJlYWRlcjpudWxsLG1vdW50KGUpe19yKGFlKSxWLnJlYWRlcnx8KFYucmVhZGVyPW5ldyBGaWxlUmVhZGVyU3luYyk7dmFyIHI9Vi5jcmVhdGVOb2RlKG51bGwsIi8iLFYuRElSX01PREUsMCksdD17fTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgcz1pLnNwbGl0KCIvIiksbD1yLHU9MDt1PHMubGVuZ3RoLTE7dSsrKXt2YXIgYz1zLnNsaWNlKDAsdSsxKS5qb2luKCIvIik7dFtjXXx8KHRbY109Vi5jcmVhdGVOb2RlKGwsc1t1XSxWLkRJUl9NT0RFLDApKSxsPXRbY119cmV0dXJuIGx9ZnVuY3Rpb24gYShpKXt2YXIgcz1pLnNwbGl0KCIvIik7cmV0dXJuIHNbcy5sZW5ndGgtMV19cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5vcHRzLmZpbGVzfHxbXSxmdW5jdGlvbihpKXtWLmNyZWF0ZU5vZGUobihpLm5hbWUpLGEoaS5uYW1lKSxWLkZJTEVfTU9ERSwwLGksaS5sYXN0TW9kaWZpZWREYXRlKX0pLChlLm9wdHMuYmxvYnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe1YuY3JlYXRlTm9kZShuKGkubmFtZSksYShpLm5hbWUpLFYuRklMRV9NT0RFLDAsaS5kYXRhKX0pLChlLm9wdHMucGFja2FnZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubWV0YWRhdGEuZmlsZXMuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgbD1zLmZpbGVuYW1lLnN1YnN0cigxKTtWLmNyZWF0ZU5vZGUobihsKSxhKGwpLFYuRklMRV9NT0RFLDAsaS5ibG9iLnNsaWNlKHMuc3RhcnQscy5lbmQpKX0pfSkscn0sY3JlYXRlTm9kZShlLHIsdCxuLGEsaSl7dmFyIHM9by5jcmVhdGVOb2RlKGUscix0KTtyZXR1cm4gcy5tb2RlPXQscy5ub2RlX29wcz1WLm5vZGVfb3BzLHMuc3RyZWFtX29wcz1WLnN0cmVhbV9vcHMscy50aW1lc3RhbXA9KGl8fG5ldyBEYXRlKS5nZXRUaW1lKCksX3IoVi5GSUxFX01PREUhPT1WLkRJUl9NT0RFKSx0PT09Vi5GSUxFX01PREU/KHMuc2l6ZT1hLnNpemUscy5jb250ZW50cz1hKToocy5zaXplPTQwOTYscy5jb250ZW50cz17fSksZSYmKGUuY29udGVudHNbcl09cyksc30sbm9kZV9vcHM6e2dldGF0dHIoZSl7cmV0dXJue2RldjoxLGlubzplLmlkLG1vZGU6ZS5tb2RlLG5saW5rOjEsdWlkOjAsZ2lkOjAscmRldjowLHNpemU6ZS5zaXplLGF0aW1lOm5ldyBEYXRlKGUudGltZXN0YW1wKSxtdGltZTpuZXcgRGF0ZShlLnRpbWVzdGFtcCksY3RpbWU6bmV3IERhdGUoZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKGUuc2l6ZS80MDk2KX19LHNldGF0dHIoZSxyKXtyLm1vZGUhPT12b2lkIDAmJihlLm1vZGU9ci5tb2RlKSxyLnRpbWVzdGFtcCE9PXZvaWQgMCYmKGUudGltZXN0YW1wPXIudGltZXN0YW1wKX0sbG9va3VwKGUscil7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCl9LG1rbm9kKGUscix0LG4pe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSxyZW5hbWUoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfSx1bmxpbmsoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scm1kaXIoZSxyKXt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKX0scmVhZGRpcihlKXt2YXIgcj1bIi4iLCIuLiJdO2Zvcih2YXIgdCBvZiBPYmplY3Qua2V5cyhlLmNvbnRlbnRzKSlyLnB1c2godCk7cmV0dXJuIHJ9LHN5bWxpbmsoZSxyLHQpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpfX0sc3RyZWFtX29wczp7cmVhZChlLHIsdCxuLGEpe2lmKGE+PWUubm9kZS5zaXplKXJldHVybiAwO3ZhciBpPWUubm9kZS5jb250ZW50cy5zbGljZShhLGErbikscz1WLnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihpKTtyZXR1cm4gci5zZXQobmV3IFVpbnQ4QXJyYXkocyksdCksaS5zaXplfSx3cml0ZShlLHIsdCxuLGEpe3Rocm93IG5ldyBvLkVycm5vRXJyb3IoMjkpfSxsbHNlZWsoZSxyLHQpe3ZhciBuPXI7aWYodD09PTE/bis9ZS5wb3NpdGlvbjp0PT09MiYmby5pc0ZpbGUoZS5ub2RlLm1vZGUpJiYobis9ZS5ub2RlLnNpemUpLG48MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gbn19fSxvPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6e30sc3RyZWFtczpbXSxuZXh0SW5vZGU6MSxuYW1lVGFibGU6bnVsbCxjdXJyZW50UGF0aDoiLyIsaW5pdGlhbGl6ZWQ6ITEsaWdub3JlUGVybWlzc2lvbnM6ITAsRXJybm9FcnJvcjpjbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLm5hbWU9IkVycm5vRXJyb3IiLHRoaXMuZXJybm89ZX19LGdlbmVyaWNFcnJvcnM6e30sZmlsZXN5c3RlbXM6bnVsbCxzeW5jRlNSZXF1ZXN0czowLEZTU3RyZWFtOmNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFyZWQ9e319Z2V0IG9iamVjdCgpe3JldHVybiB0aGlzLm5vZGV9c2V0IG9iamVjdChlKXt0aGlzLm5vZGU9ZX1nZXQgaXNSZWFkKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfWdldCBpc1dyaXRlKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0wfWdldCBpc0FwcGVuZCgpe3JldHVybiB0aGlzLmZsYWdzJjEwMjR9Z2V0IGZsYWdzKCl7cmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzfXNldCBmbGFncyhlKXt0aGlzLnNoYXJlZC5mbGFncz1lfWdldCBwb3NpdGlvbigpe3JldHVybiB0aGlzLnNoYXJlZC5wb3NpdGlvbn1zZXQgcG9zaXRpb24oZSl7dGhpcy5zaGFyZWQucG9zaXRpb249ZX19LEZTTm9kZTpjbGFzc3tjb25zdHJ1Y3RvcihlLHIsdCxuKXtlfHwoZT10aGlzKSx0aGlzLnBhcmVudD1lLHRoaXMubW91bnQ9ZS5tb3VudCx0aGlzLm1vdW50ZWQ9bnVsbCx0aGlzLmlkPW8ubmV4dElub2RlKyssdGhpcy5uYW1lPXIsdGhpcy5tb2RlPXQsdGhpcy5ub2RlX29wcz17fSx0aGlzLnN0cmVhbV9vcHM9e30sdGhpcy5yZGV2PW4sdGhpcy5yZWFkTW9kZT0zNjUsdGhpcy53cml0ZU1vZGU9MTQ2fWdldCByZWFkKCl7cmV0dXJuKHRoaXMubW9kZSZ0aGlzLnJlYWRNb2RlKT09PXRoaXMucmVhZE1vZGV9c2V0IHJlYWQoZSl7ZT90aGlzLm1vZGV8PXRoaXMucmVhZE1vZGU6dGhpcy5tb2RlJj1+dGhpcy5yZWFkTW9kZX1nZXQgd3JpdGUoKXtyZXR1cm4odGhpcy5tb2RlJnRoaXMud3JpdGVNb2RlKT09PXRoaXMud3JpdGVNb2RlfXNldCB3cml0ZShlKXtlP3RoaXMubW9kZXw9dGhpcy53cml0ZU1vZGU6dGhpcy5tb2RlJj1+dGhpcy53cml0ZU1vZGV9Z2V0IGlzRm9sZGVyKCl7cmV0dXJuIG8uaXNEaXIodGhpcy5tb2RlKX1nZXQgaXNEZXZpY2UoKXtyZXR1cm4gby5pc0NocmRldih0aGlzLm1vZGUpfX0sbG9va3VwUGF0aChlLHI9e30pe2lmKGU9WC5yZXNvbHZlKGUpLCFlKXJldHVybntwYXRoOiIiLG5vZGU6bnVsbH07dmFyIHQ9e2ZvbGxvd19tb3VudDohMCxyZWN1cnNlX2NvdW50OjB9O2lmKHI9T2JqZWN0LmFzc2lnbih0LHIpLHIucmVjdXJzZV9jb3VudD44KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzIpO2Zvcih2YXIgbj1lLnNwbGl0KCIvIikuZmlsdGVyKG09PiEhbSksYT1vLnJvb3QsaT0iLyIscz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbD1zPT09bi5sZW5ndGgtMTtpZihsJiZyLnBhcmVudClicmVhaztpZihhPW8ubG9va3VwTm9kZShhLG5bc10pLGk9Uy5qb2luMihpLG5bc10pLG8uaXNNb3VudHBvaW50KGEpJiYoIWx8fGwmJnIuZm9sbG93X21vdW50KSYmKGE9YS5tb3VudGVkLnJvb3QpLCFsfHxyLmZvbGxvdylmb3IodmFyIHU9MDtvLmlzTGluayhhLm1vZGUpOyl7dmFyIGM9by5yZWFkbGluayhpKTtpPVgucmVzb2x2ZShTLmRpcm5hbWUoaSksYyk7dmFyIGQ9by5sb29rdXBQYXRoKGkse3JlY3Vyc2VfY291bnQ6ci5yZWN1cnNlX2NvdW50KzF9KTtpZihhPWQubm9kZSx1Kys+NDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMil9fXJldHVybntwYXRoOmksbm9kZTphfX0sZ2V0UGF0aChlKXtmb3IodmFyIHI7Oyl7aWYoby5pc1Jvb3QoZSkpe3ZhciB0PWUubW91bnQubW91bnRwb2ludDtyZXR1cm4gcj90W3QubGVuZ3RoLTFdIT09Ii8iP2Ake3R9LyR7cn1gOnQrcjp0fXI9cj9gJHtlLm5hbWV9LyR7cn1gOmUubmFtZSxlPWUucGFyZW50fX0saGFzaE5hbWUoZSxyKXtmb3IodmFyIHQ9MCxuPTA7bjxyLmxlbmd0aDtuKyspdD0odDw8NSktdCtyLmNoYXJDb2RlQXQobil8MDtyZXR1cm4oZSt0Pj4+MCklby5uYW1lVGFibGUubGVuZ3RofSxoYXNoQWRkTm9kZShlKXt2YXIgcj1vLmhhc2hOYW1lKGUucGFyZW50LmlkLGUubmFtZSk7ZS5uYW1lX25leHQ9by5uYW1lVGFibGVbcl0sby5uYW1lVGFibGVbcl09ZX0saGFzaFJlbW92ZU5vZGUoZSl7dmFyIHI9by5oYXNoTmFtZShlLnBhcmVudC5pZCxlLm5hbWUpO2lmKG8ubmFtZVRhYmxlW3JdPT09ZSlvLm5hbWVUYWJsZVtyXT1lLm5hbWVfbmV4dDtlbHNlIGZvcih2YXIgdD1vLm5hbWVUYWJsZVtyXTt0Oyl7aWYodC5uYW1lX25leHQ9PT1lKXt0Lm5hbWVfbmV4dD1lLm5hbWVfbmV4dDticmVha310PXQubmFtZV9uZXh0fX0sbG9va3VwTm9kZShlLHIpe3ZhciB0PW8ubWF5TG9va3VwKGUpO2lmKHQpdGhyb3cgbmV3IG8uRXJybm9FcnJvcih0KTtmb3IodmFyIG49by5oYXNoTmFtZShlLmlkLHIpLGE9by5uYW1lVGFibGVbbl07YTthPWEubmFtZV9uZXh0KXt2YXIgaT1hLm5hbWU7aWYoYS5wYXJlbnQuaWQ9PT1lLmlkJiZpPT09cilyZXR1cm4gYX1yZXR1cm4gby5sb29rdXAoZSxyKX0sY3JlYXRlTm9kZShlLHIsdCxuKXt2YXIgYT1uZXcgby5GU05vZGUoZSxyLHQsbik7cmV0dXJuIG8uaGFzaEFkZE5vZGUoYSksYX0sZGVzdHJveU5vZGUoZSl7by5oYXNoUmVtb3ZlTm9kZShlKX0saXNSb290KGUpe3JldHVybiBlPT09ZS5wYXJlbnR9LGlzTW91bnRwb2ludChlKXtyZXR1cm4hIWUubW91bnRlZH0saXNGaWxlKGUpe3JldHVybihlJjYxNDQwKT09PTMyNzY4fSxpc0RpcihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0xNjM4NH0saXNMaW5rKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTYwfSxpc0NocmRldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT04MTkyfSxpc0Jsa2RldihlKXtyZXR1cm4oZSY2MTQ0MCk9PT0yNDU3Nn0saXNGSUZPKGUpe3JldHVybihlJjYxNDQwKT09PTQwOTZ9LGlzU29ja2V0KGUpe3JldHVybihlJjQ5MTUyKT09PTQ5MTUyfSxmbGFnc1RvUGVybWlzc2lvblN0cmluZyhlKXt2YXIgcj1bInIiLCJ3IiwicnciXVtlJjNdO3JldHVybiBlJjUxMiYmKHIrPSJ3Iikscn0sbm9kZVBlcm1pc3Npb25zKGUscil7cmV0dXJuIG8uaWdub3JlUGVybWlzc2lvbnM/MDpyLmluY2x1ZGVzKCJyIikmJiEoZS5tb2RlJjI5Mil8fHIuaW5jbHVkZXMoInciKSYmIShlLm1vZGUmMTQ2KXx8ci5pbmNsdWRlcygieCIpJiYhKGUubW9kZSY3Myk/MjowfSxtYXlMb29rdXAoZSl7aWYoIW8uaXNEaXIoZS5tb2RlKSlyZXR1cm4gNTQ7dmFyIHI9by5ub2RlUGVybWlzc2lvbnMoZSwieCIpO3JldHVybiByfHwoZS5ub2RlX29wcy5sb29rdXA/MDoyKX0sbWF5Q3JlYXRlKGUscil7dHJ5e3ZhciB0PW8ubG9va3VwTm9kZShlLHIpO3JldHVybiAyMH1jYXRjaHt9cmV0dXJuIG8ubm9kZVBlcm1pc3Npb25zKGUsInd4Iil9LG1heURlbGV0ZShlLHIsdCl7dmFyIG47dHJ5e249by5sb29rdXBOb2RlKGUscil9Y2F0Y2goaSl7cmV0dXJuIGkuZXJybm99dmFyIGE9by5ub2RlUGVybWlzc2lvbnMoZSwid3giKTtpZihhKXJldHVybiBhO2lmKHQpe2lmKCFvLmlzRGlyKG4ubW9kZSkpcmV0dXJuIDU0O2lmKG8uaXNSb290KG4pfHxvLmdldFBhdGgobik9PT1vLmN3ZCgpKXJldHVybiAxMH1lbHNlIGlmKG8uaXNEaXIobi5tb2RlKSlyZXR1cm4gMzE7cmV0dXJuIDB9LG1heU9wZW4oZSxyKXtyZXR1cm4gZT9vLmlzTGluayhlLm1vZGUpPzMyOm8uaXNEaXIoZS5tb2RlKSYmKG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikhPT0iciJ8fHImNTEyKT8zMTpvLm5vZGVQZXJtaXNzaW9ucyhlLG8uZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcocikpOjQ0fSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQoKXtmb3IodmFyIGU9MDtlPD1vLk1BWF9PUEVOX0ZEUztlKyspaWYoIW8uc3RyZWFtc1tlXSlyZXR1cm4gZTt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMzKX0sZ2V0U3RyZWFtQ2hlY2tlZChlKXt2YXIgcj1vLmdldFN0cmVhbShlKTtpZighcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO3JldHVybiByfSxnZXRTdHJlYW06ZT0+by5zdHJlYW1zW2VdLGNyZWF0ZVN0cmVhbShlLHI9LTEpe3JldHVybiBlPU9iamVjdC5hc3NpZ24obmV3IG8uRlNTdHJlYW0sZSkscj09LTEmJihyPW8ubmV4dGZkKCkpLGUuZmQ9cixvLnN0cmVhbXNbcl09ZSxlfSxjbG9zZVN0cmVhbShlKXtvLnN0cmVhbXNbZV09bnVsbH0sZHVwU3RyZWFtKGUscj0tMSl7dmFyIG4sYTt2YXIgdD1vLmNyZWF0ZVN0cmVhbShlLHIpO3JldHVybihhPShuPXQuc3RyZWFtX29wcyk9PW51bGw/dm9pZCAwOm4uZHVwKT09bnVsbHx8YS5jYWxsKG4sdCksdH0sY2hyZGV2X3N0cmVhbV9vcHM6e29wZW4oZSl7dmFyIHQsbjt2YXIgcj1vLmdldERldmljZShlLm5vZGUucmRldik7ZS5zdHJlYW1fb3BzPXIuc3RyZWFtX29wcywobj0odD1lLnN0cmVhbV9vcHMpLm9wZW4pPT1udWxsfHxuLmNhbGwodCxlKX0sbGxzZWVrKCl7dGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCl9fSxtYWpvcjplPT5lPj44LG1pbm9yOmU9PmUmMjU1LG1ha2VkZXY6KGUscik9PmU8PDh8cixyZWdpc3RlckRldmljZShlLHIpe28uZGV2aWNlc1tlXT17c3RyZWFtX29wczpyfX0sZ2V0RGV2aWNlOmU9Pm8uZGV2aWNlc1tlXSxnZXRNb3VudHMoZSl7Zm9yKHZhciByPVtdLHQ9W2VdO3QubGVuZ3RoOyl7dmFyIG49dC5wb3AoKTtyLnB1c2gobiksdC5wdXNoKC4uLm4ubW91bnRzKX1yZXR1cm4gcn0sc3luY2ZzKGUscil7dHlwZW9mIGU9PSJmdW5jdGlvbiImJihyPWUsZT0hMSksby5zeW5jRlNSZXF1ZXN0cysrLG8uc3luY0ZTUmVxdWVzdHM+MSYmZWUoYHdhcm5pbmc6ICR7by5zeW5jRlNSZXF1ZXN0c30gRlMuc3luY2ZzIG9wZXJhdGlvbnMgaW4gZmxpZ2h0IGF0IG9uY2UsIHByb2JhYmx5IGp1c3QgZG9pbmcgZXh0cmEgd29ya2ApO3ZhciB0PW8uZ2V0TW91bnRzKG8ucm9vdC5tb3VudCksbj0wO2Z1bmN0aW9uIGEocyl7cmV0dXJuIG8uc3luY0ZTUmVxdWVzdHMtLSxyKHMpfWZ1bmN0aW9uIGkocyl7aWYocylyZXR1cm4gaS5lcnJvcmVkP3ZvaWQgMDooaS5lcnJvcmVkPSEwLGEocykpOysrbj49dC5sZW5ndGgmJmEobnVsbCl9dC5mb3JFYWNoKHM9PntpZighcy50eXBlLnN5bmNmcylyZXR1cm4gaShudWxsKTtzLnR5cGUuc3luY2ZzKHMsZSxpKX0pfSxtb3VudChlLHIsdCl7dmFyIG49dD09PSIvIixhPSF0LGk7aWYobiYmby5yb290KXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFuJiYhYSl7dmFyIHM9by5sb29rdXBQYXRoKHQse2ZvbGxvd19tb3VudDohMX0pO2lmKHQ9cy5wYXRoLGk9cy5ub2RlLG8uaXNNb3VudHBvaW50KGkpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTApO2lmKCFvLmlzRGlyKGkubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCl9dmFyIGw9e3R5cGU6ZSxvcHRzOnIsbW91bnRwb2ludDp0LG1vdW50czpbXX0sdT1lLm1vdW50KGwpO3JldHVybiB1Lm1vdW50PWwsbC5yb290PXUsbj9vLnJvb3Q9dTppJiYoaS5tb3VudGVkPWwsaS5tb3VudCYmaS5tb3VudC5tb3VudHMucHVzaChsKSksdX0sdW5tb3VudChlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93X21vdW50OiExfSk7aWYoIW8uaXNNb3VudHBvaW50KHIubm9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7dmFyIHQ9ci5ub2RlLG49dC5tb3VudGVkLGE9by5nZXRNb3VudHMobik7T2JqZWN0LmtleXMoby5uYW1lVGFibGUpLmZvckVhY2gocz0+e2Zvcih2YXIgbD1vLm5hbWVUYWJsZVtzXTtsOyl7dmFyIHU9bC5uYW1lX25leHQ7YS5pbmNsdWRlcyhsLm1vdW50KSYmby5kZXN0cm95Tm9kZShsKSxsPXV9fSksdC5tb3VudGVkPW51bGw7dmFyIGk9dC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTt0Lm1vdW50Lm1vdW50cy5zcGxpY2UoaSwxKX0sbG9va3VwKGUscil7cmV0dXJuIGUubm9kZV9vcHMubG9va3VwKGUscil9LG1rbm9kKGUscix0KXt2YXIgbj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksYT1uLm5vZGUsaT1TLmJhc2VuYW1lKGUpO2lmKCFpfHxpPT09Ii4ifHxpPT09Ii4uIil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgcz1vLm1heUNyZWF0ZShhLGkpO2lmKHMpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihzKTtpZighYS5ub2RlX29wcy5ta25vZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gYS5ub2RlX29wcy5ta25vZChhLGkscix0KX0sY3JlYXRlKGUscil7cmV0dXJuIHI9ciE9PXZvaWQgMD9yOjQzOCxyJj00MDk1LHJ8PTMyNzY4LG8ubWtub2QoZSxyLDApfSxta2RpcihlLHIpe3JldHVybiByPXIhPT12b2lkIDA/cjo1MTEsciY9MTAyMyxyfD0xNjM4NCxvLm1rbm9kKGUsciwwKX0sbWtkaXJUcmVlKGUscil7Zm9yKHZhciB0PWUuc3BsaXQoIi8iKSxuPSIiLGE9MDthPHQubGVuZ3RoOysrYSlpZih0W2FdKXtuKz0iLyIrdFthXTt0cnl7by5ta2RpcihuLHIpfWNhdGNoKGkpe2lmKGkuZXJybm8hPTIwKXRocm93IGl9fX0sbWtkZXYoZSxyLHQpe3JldHVybiB0eXBlb2YgdD4idSImJih0PXIscj00MzgpLHJ8PTgxOTIsby5ta25vZChlLHIsdCl9LHN5bWxpbmsoZSxyKXtpZighWC5yZXNvbHZlKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciB0PW8ubG9va3VwUGF0aChyLHtwYXJlbnQ6ITB9KSxuPXQubm9kZTtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTt2YXIgYT1TLmJhc2VuYW1lKHIpLGk9by5tYXlDcmVhdGUobixhKTtpZihpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoaSk7aWYoIW4ubm9kZV9vcHMuc3ltbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5zeW1saW5rKG4sYSxlKX0scmVuYW1lKGUscil7dmFyIHQ9Uy5kaXJuYW1lKGUpLG49Uy5kaXJuYW1lKHIpLGE9Uy5iYXNlbmFtZShlKSxpPVMuYmFzZW5hbWUocikscyxsLHU7aWYocz1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksbD1zLm5vZGUscz1vLmxvb2t1cFBhdGgocix7cGFyZW50OiEwfSksdT1zLm5vZGUsIWx8fCF1KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO2lmKGwubW91bnQhPT11Lm1vdW50KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzUpO3ZhciBjPW8ubG9va3VwTm9kZShsLGEpLGQ9WC5yZWxhdGl2ZShlLG4pO2lmKGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKGQ9WC5yZWxhdGl2ZShyLHQpLGQuY2hhckF0KDApIT09Ii4iKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTUpO3ZhciBtO3RyeXttPW8ubG9va3VwTm9kZSh1LGkpfWNhdGNoe31pZihjIT09bSl7dmFyIGg9by5pc0RpcihjLm1vZGUpLHA9by5tYXlEZWxldGUobCxhLGgpO2lmKHApdGhyb3cgbmV3IG8uRXJybm9FcnJvcihwKTtpZihwPW0/by5tYXlEZWxldGUodSxpLGgpOm8ubWF5Q3JlYXRlKHUsaSkscCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO2lmKCFsLm5vZGVfb3BzLnJlbmFtZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChjKXx8bSYmby5pc01vdW50cG9pbnQobSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigxMCk7aWYodSE9PWwmJihwPW8ubm9kZVBlcm1pc3Npb25zKGwsInciKSxwKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHApO28uaGFzaFJlbW92ZU5vZGUoYyk7dHJ5e2wubm9kZV9vcHMucmVuYW1lKGMsdSxpKX1jYXRjaCh3KXt0aHJvdyB3fWZpbmFsbHl7by5oYXNoQWRkTm9kZShjKX19fSxybWRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7cGFyZW50OiEwfSksdD1yLm5vZGUsbj1TLmJhc2VuYW1lKGUpLGE9by5sb29rdXBOb2RlKHQsbiksaT1vLm1heURlbGV0ZSh0LG4sITApO2lmKGkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcihpKTtpZighdC5ub2RlX29wcy5ybWRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnJtZGlyKHQsbiksby5kZXN0cm95Tm9kZShhKX0scmVhZGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSksdD1yLm5vZGU7aWYoIXQubm9kZV9vcHMucmVhZGRpcil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDU0KTtyZXR1cm4gdC5ub2RlX29wcy5yZWFkZGlyKHQpfSx1bmxpbmsoZSl7dmFyIHI9by5sb29rdXBQYXRoKGUse3BhcmVudDohMH0pLHQ9ci5ub2RlO2lmKCF0KXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3ZhciBuPVMuYmFzZW5hbWUoZSksYT1vLmxvb2t1cE5vZGUodCxuKSxpPW8ubWF5RGVsZXRlKHQsbiwhMSk7aWYoaSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGkpO2lmKCF0Lm5vZGVfb3BzLnVubGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtpZihvLmlzTW91bnRwb2ludChhKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDEwKTt0Lm5vZGVfb3BzLnVubGluayh0LG4pLG8uZGVzdHJveU5vZGUoYSl9LHJlYWRsaW5rKGUpe3ZhciByPW8ubG9va3VwUGF0aChlKSx0PXIubm9kZTtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighdC5ub2RlX29wcy5yZWFkbGluayl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtyZXR1cm4gWC5yZXNvbHZlKG8uZ2V0UGF0aCh0LnBhcmVudCksdC5ub2RlX29wcy5yZWFkbGluayh0KSl9LHN0YXQoZSxyKXt2YXIgdD1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiFyfSksbj10Lm5vZGU7aWYoIW4pdGhyb3cgbmV3IG8uRXJybm9FcnJvcig0NCk7aWYoIW4ubm9kZV9vcHMuZ2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtyZXR1cm4gbi5ub2RlX29wcy5nZXRhdHRyKG4pfSxsc3RhdChlKXtyZXR1cm4gby5zdGF0KGUsITApfSxjaG1vZChlLHIsdCl7dmFyIG47aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgYT1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiF0fSk7bj1hLm5vZGV9ZWxzZSBuPWU7aWYoIW4ubm9kZV9vcHMuc2V0YXR0cil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYzKTtuLm5vZGVfb3BzLnNldGF0dHIobix7bW9kZTpyJjQwOTV8bi5tb2RlJi00MDk2LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9LGxjaG1vZChlLHIpe28uY2htb2QoZSxyLCEwKX0sZmNobW9kKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO28uY2htb2QodC5ub2RlLHIpfSxjaG93bihlLHIsdCxuKXt2YXIgYTtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBpPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IW59KTthPWkubm9kZX1lbHNlIGE9ZTtpZighYS5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2Eubm9kZV9vcHMuc2V0YXR0cihhLHt0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSxsY2hvd24oZSxyLHQpe28uY2hvd24oZSxyLHQsITApfSxmY2hvd24oZSxyLHQpe3ZhciBuPW8uZ2V0U3RyZWFtQ2hlY2tlZChlKTtvLmNob3duKG4ubm9kZSxyLHQpfSx0cnVuY2F0ZShlLHIpe2lmKHI8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgdDtpZih0eXBlb2YgZT09InN0cmluZyIpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KTt0PW4ubm9kZX1lbHNlIHQ9ZTtpZighdC5ub2RlX29wcy5zZXRhdHRyKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNjMpO2lmKG8uaXNEaXIodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDMxKTtpZighby5pc0ZpbGUodC5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgYT1vLm5vZGVQZXJtaXNzaW9ucyh0LCJ3Iik7aWYoYSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKGEpO3Qubm9kZV9vcHMuc2V0YXR0cih0LHtzaXplOnIsdGltZXN0YW1wOkRhdGUubm93KCl9KX0sZnRydW5jYXRlKGUscil7dmFyIHQ9by5nZXRTdHJlYW1DaGVja2VkKGUpO2lmKCEodC5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtvLnRydW5jYXRlKHQubm9kZSxyKX0sdXRpbWUoZSxyLHQpe3ZhciBuPW8ubG9va3VwUGF0aChlLHtmb2xsb3c6ITB9KSxhPW4ubm9kZTthLm5vZGVfb3BzLnNldGF0dHIoYSx7dGltZXN0YW1wOk1hdGgubWF4KHIsdCl9KX0sb3BlbihlLHIsdCl7aWYoZT09PSIiKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDQpO3I9dHlwZW9mIHI9PSJzdHJpbmciP1V0KHIpOnIsciY2ND8odD10eXBlb2YgdD4idSI/NDM4OnQsdD10JjQwOTV8MzI3NjgpOnQ9MDt2YXIgbjtpZih0eXBlb2YgZT09Im9iamVjdCIpbj1lO2Vsc2V7ZT1TLm5vcm1hbGl6ZShlKTt0cnl7dmFyIGE9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohKHImMTMxMDcyKX0pO249YS5ub2RlfWNhdGNoe319dmFyIGk9ITE7aWYociY2NClpZihuKXtpZihyJjEyOCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIwKX1lbHNlIG49by5ta25vZChlLHQsMCksaT0hMDtpZighbil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZihvLmlzQ2hyZGV2KG4ubW9kZSkmJihyJj0tNTEzKSxyJjY1NTM2JiYhby5pc0RpcihuLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTQpO2lmKCFpKXt2YXIgcz1vLm1heU9wZW4obixyKTtpZihzKXRocm93IG5ldyBvLkVycm5vRXJyb3Iocyl9ciY1MTImJiFpJiZvLnRydW5jYXRlKG4sMCksciY9LTEzMTcxMzt2YXIgbD1vLmNyZWF0ZVN0cmVhbSh7bm9kZTpuLHBhdGg6by5nZXRQYXRoKG4pLGZsYWdzOnIsc2Vla2FibGU6ITAscG9zaXRpb246MCxzdHJlYW1fb3BzOm4uc3RyZWFtX29wcyx1bmdvdHRlbjpbXSxlcnJvcjohMX0pO3JldHVybiBsLnN0cmVhbV9vcHMub3BlbiYmbC5zdHJlYW1fb3BzLm9wZW4obCksZi5sb2dSZWFkRmlsZXMmJiEociYxKSYmKG8ucmVhZEZpbGVzfHwoby5yZWFkRmlsZXM9e30pLGUgaW4gby5yZWFkRmlsZXN8fChvLnJlYWRGaWxlc1tlXT0xKSksbH0sY2xvc2UoZSl7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2UuZ2V0ZGVudHMmJihlLmdldGRlbnRzPW51bGwpO3RyeXtlLnN0cmVhbV9vcHMuY2xvc2UmJmUuc3RyZWFtX29wcy5jbG9zZShlKX1jYXRjaChyKXt0aHJvdyByfWZpbmFsbHl7by5jbG9zZVN0cmVhbShlLmZkKX1lLmZkPW51bGx9LGlzQ2xvc2VkKGUpe3JldHVybiBlLmZkPT09bnVsbH0sbGxzZWVrKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIWUuc2Vla2FibGV8fCFlLnN0cmVhbV9vcHMubGxzZWVrKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNzApO2lmKHQhPTAmJnQhPTEmJnQhPTIpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7cmV0dXJuIGUucG9zaXRpb249ZS5zdHJlYW1fb3BzLmxsc2VlayhlLHIsdCksZS51bmdvdHRlbj1bXSxlLnBvc2l0aW9ufSxyZWFkKGUscix0LG4sYSl7aWYobjwwfHxhPDApdGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOCk7aWYoby5pc0Nsb3NlZChlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKG8uaXNEaXIoZS5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMzEpO2lmKCFlLnN0cmVhbV9vcHMucmVhZCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTt2YXIgaT10eXBlb2YgYTwidSI7aWYoIWkpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIHM9ZS5zdHJlYW1fb3BzLnJlYWQoZSxyLHQsbixhKTtyZXR1cm4gaXx8KGUucG9zaXRpb24rPXMpLHN9LHdyaXRlKGUscix0LG4sYSxpKXtpZihuPDB8fGE8MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoIShlLmZsYWdzJjIwOTcxNTUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYoby5pc0RpcihlLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcigzMSk7aWYoIWUuc3RyZWFtX29wcy53cml0ZSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI4KTtlLnNlZWthYmxlJiZlLmZsYWdzJjEwMjQmJm8ubGxzZWVrKGUsMCwyKTt2YXIgcz10eXBlb2YgYTwidSI7aWYoIXMpYT1lLnBvc2l0aW9uO2Vsc2UgaWYoIWUuc2Vla2FibGUpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig3MCk7dmFyIGw9ZS5zdHJlYW1fb3BzLndyaXRlKGUscix0LG4sYSxpKTtyZXR1cm4gc3x8KGUucG9zaXRpb24rPWwpLGx9LGFsbG9jYXRlKGUscix0KXtpZihvLmlzQ2xvc2VkKGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoOCk7aWYocjwwfHx0PD0wKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMjgpO2lmKCEoZS5mbGFncyYyMDk3MTU1KSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDgpO2lmKCFvLmlzRmlsZShlLm5vZGUubW9kZSkmJiFvLmlzRGlyKGUubm9kZS5tb2RlKSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtpZighZS5zdHJlYW1fb3BzLmFsbG9jYXRlKXRocm93IG5ldyBvLkVycm5vRXJyb3IoMTM4KTtlLnN0cmVhbV9vcHMuYWxsb2NhdGUoZSxyLHQpfSxtbWFwKGUscix0LG4sYSl7aWYobiYyJiYhKGEmMikmJihlLmZsYWdzJjIwOTcxNTUpIT09Mil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKChlLmZsYWdzJjIwOTcxNTUpPT09MSl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDIpO2lmKCFlLnN0cmVhbV9vcHMubW1hcCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQzKTtyZXR1cm4gZS5zdHJlYW1fb3BzLm1tYXAoZSxyLHQsbixhKX0sbXN5bmMoZSxyLHQsbixhKXtyZXR1cm4gZS5zdHJlYW1fb3BzLm1zeW5jP2Uuc3RyZWFtX29wcy5tc3luYyhlLHIsdCxuLGEpOjB9LGlvY3RsKGUscix0KXtpZighZS5zdHJlYW1fb3BzLmlvY3RsKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNTkpO3JldHVybiBlLnN0cmVhbV9vcHMuaW9jdGwoZSxyLHQpfSxyZWFkRmlsZShlLHI9e30pe2lmKHIuZmxhZ3M9ci5mbGFnc3x8MCxyLmVuY29kaW5nPXIuZW5jb2Rpbmd8fCJiaW5hcnkiLHIuZW5jb2RpbmchPT0idXRmOCImJnIuZW5jb2RpbmchPT0iYmluYXJ5Iil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5jb2RpbmcgdHlwZSAiJHtyLmVuY29kaW5nfSJgKTt2YXIgdCxuPW8ub3BlbihlLHIuZmxhZ3MpLGE9by5zdGF0KGUpLGk9YS5zaXplLHM9bmV3IFVpbnQ4QXJyYXkoaSk7cmV0dXJuIG8ucmVhZChuLHMsMCxpLDApLHIuZW5jb2Rpbmc9PT0idXRmOCI/dD1jZShzLDApOnIuZW5jb2Rpbmc9PT0iYmluYXJ5IiYmKHQ9cyksby5jbG9zZShuKSx0fSx3cml0ZUZpbGUoZSxyLHQ9e30pe3QuZmxhZ3M9dC5mbGFnc3x8NTc3O3ZhciBuPW8ub3BlbihlLHQuZmxhZ3MsdC5tb2RlKTtpZih0eXBlb2Ygcj09InN0cmluZyIpe3ZhciBhPW5ldyBVaW50OEFycmF5KFplKHIpKzEpLGk9UWUocixhLDAsYS5sZW5ndGgpO28ud3JpdGUobixhLDAsaSx2b2lkIDAsdC5jYW5Pd24pfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKW8ud3JpdGUobixyLDAsci5ieXRlTGVuZ3RoLHZvaWQgMCx0LmNhbk93bik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO28uY2xvc2Uobil9LGN3ZDooKT0+by5jdXJyZW50UGF0aCxjaGRpcihlKXt2YXIgcj1vLmxvb2t1cFBhdGgoZSx7Zm9sbG93OiEwfSk7aWYoci5ub2RlPT09bnVsbCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtpZighby5pc0RpcihyLm5vZGUubW9kZSkpdGhyb3cgbmV3IG8uRXJybm9FcnJvcig1NCk7dmFyIHQ9by5ub2RlUGVybWlzc2lvbnMoci5ub2RlLCJ4Iik7aWYodCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKHQpO28uY3VycmVudFBhdGg9ci5wYXRofSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKXtvLm1rZGlyKCIvdG1wIiksby5ta2RpcigiL2hvbWUiKSxvLm1rZGlyKCIvaG9tZS93ZWJfdXNlciIpfSxjcmVhdGVEZWZhdWx0RGV2aWNlcygpe28ubWtkaXIoIi9kZXYiKSxvLnJlZ2lzdGVyRGV2aWNlKG8ubWFrZWRldigxLDMpLHtyZWFkOigpPT4wLHdyaXRlOihuLGEsaSxzLGwpPT5zfSksby5ta2RldigiL2Rldi9udWxsIixvLm1ha2VkZXYoMSwzKSksbGUucmVnaXN0ZXIoby5tYWtlZGV2KDUsMCksbGUuZGVmYXVsdF90dHlfb3BzKSxsZS5yZWdpc3RlcihvLm1ha2VkZXYoNiwwKSxsZS5kZWZhdWx0X3R0eTFfb3BzKSxvLm1rZGV2KCIvZGV2L3R0eSIsby5tYWtlZGV2KDUsMCkpLG8ubWtkZXYoIi9kZXYvdHR5MSIsby5tYWtlZGV2KDYsMCkpO3ZhciBlPW5ldyBVaW50OEFycmF5KDEwMjQpLHI9MCx0PSgpPT4ocj09PTAmJihyPUZyKGUpLmJ5dGVMZW5ndGgpLGVbLS1yXSk7by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJyYW5kb20iLHQpLG8uY3JlYXRlRGV2aWNlKCIvZGV2IiwidXJhbmRvbSIsdCksby5ta2RpcigiL2Rldi9zaG0iKSxvLm1rZGlyKCIvZGV2L3NobS90bXAiKX0sY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCl7by5ta2RpcigiL3Byb2MiKTt2YXIgZT1vLm1rZGlyKCIvcHJvYy9zZWxmIik7by5ta2RpcigiL3Byb2Mvc2VsZi9mZCIpLG8ubW91bnQoe21vdW50KCl7dmFyIHI9by5jcmVhdGVOb2RlKGUsImZkIiwxNjg5NSw3Myk7cmV0dXJuIHIubm9kZV9vcHM9e2xvb2t1cCh0LG4pe3ZhciBhPStuLGk9by5nZXRTdHJlYW1DaGVja2VkKGEpLHM9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50OiJmYWtlIn0sbm9kZV9vcHM6e3JlYWRsaW5rOigpPT5pLnBhdGh9fTtyZXR1cm4gcy5wYXJlbnQ9cyxzfX0scn19LHt9LCIvcHJvYy9zZWxmL2ZkIil9LGNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpe2Yuc3RkaW4/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRpbiIsZi5zdGRpbik6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3RkaW4iKSxmLnN0ZG91dD9vLmNyZWF0ZURldmljZSgiL2RldiIsInN0ZG91dCIsbnVsbCxmLnN0ZG91dCk6by5zeW1saW5rKCIvZGV2L3R0eSIsIi9kZXYvc3Rkb3V0IiksZi5zdGRlcnI/by5jcmVhdGVEZXZpY2UoIi9kZXYiLCJzdGRlcnIiLG51bGwsZi5zdGRlcnIpOm8uc3ltbGluaygiL2Rldi90dHkxIiwiL2Rldi9zdGRlcnIiKSxvLm9wZW4oIi9kZXYvc3RkaW4iLDApLG8ub3BlbigiL2Rldi9zdGRvdXQiLDEpLG8ub3BlbigiL2Rldi9zdGRlcnIiLDEpfSxzdGF0aWNJbml0KCl7WzQ0XS5mb3JFYWNoKGU9PntvLmdlbmVyaWNFcnJvcnNbZV09bmV3IG8uRXJybm9FcnJvcihlKSxvLmdlbmVyaWNFcnJvcnNbZV0uc3RhY2s9IjxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4ifSksby5uYW1lVGFibGU9bmV3IEFycmF5KDQwOTYpLG8ubW91bnQoYix7fSwiLyIpLG8uY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzKCksby5jcmVhdGVEZWZhdWx0RGV2aWNlcygpLG8uY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksby5maWxlc3lzdGVtcz17TUVNRlM6YixXT1JLRVJGUzpWfX0saW5pdChlLHIsdCl7by5pbml0LmluaXRpYWxpemVkPSEwLGYuc3RkaW49ZXx8Zi5zdGRpbixmLnN0ZG91dD1yfHxmLnN0ZG91dCxmLnN0ZGVycj10fHxmLnN0ZGVycixvLmNyZWF0ZVN0YW5kYXJkU3RyZWFtcygpfSxxdWl0KCl7by5pbml0LmluaXRpYWxpemVkPSExO2Zvcih2YXIgZT0wO2U8by5zdHJlYW1zLmxlbmd0aDtlKyspe3ZhciByPW8uc3RyZWFtc1tlXTtyJiZvLmNsb3NlKHIpfX0sZmluZE9iamVjdChlLHIpe3ZhciB0PW8uYW5hbHl6ZVBhdGgoZSxyKTtyZXR1cm4gdC5leGlzdHM/dC5vYmplY3Q6bnVsbH0sYW5hbHl6ZVBhdGgoZSxyKXt0cnl7dmFyIHQ9by5sb29rdXBQYXRoKGUse2ZvbGxvdzohcn0pO2U9dC5wYXRofWNhdGNoe312YXIgbj17aXNSb290OiExLGV4aXN0czohMSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOiExLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3ZhciB0PW8ubG9va3VwUGF0aChlLHtwYXJlbnQ6ITB9KTtuLnBhcmVudEV4aXN0cz0hMCxuLnBhcmVudFBhdGg9dC5wYXRoLG4ucGFyZW50T2JqZWN0PXQubm9kZSxuLm5hbWU9Uy5iYXNlbmFtZShlKSx0PW8ubG9va3VwUGF0aChlLHtmb2xsb3c6IXJ9KSxuLmV4aXN0cz0hMCxuLnBhdGg9dC5wYXRoLG4ub2JqZWN0PXQubm9kZSxuLm5hbWU9dC5ub2RlLm5hbWUsbi5pc1Jvb3Q9dC5wYXRoPT09Ii8ifWNhdGNoKGEpe24uZXJyb3I9YS5lcnJub31yZXR1cm4gbn0sY3JlYXRlUGF0aChlLHIsdCxuKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOm8uZ2V0UGF0aChlKTtmb3IodmFyIGE9ci5zcGxpdCgiLyIpLnJldmVyc2UoKTthLmxlbmd0aDspe3ZhciBpPWEucG9wKCk7aWYoaSl7dmFyIHM9Uy5qb2luMihlLGkpO3RyeXtvLm1rZGlyKHMpfWNhdGNoe31lPXN9fXJldHVybiBzfSxjcmVhdGVGaWxlKGUscix0LG4sYSl7dmFyIGk9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscikscz1lcihuLGEpO3JldHVybiBvLmNyZWF0ZShpLHMpfSxjcmVhdGVEYXRhRmlsZShlLHIsdCxuLGEsaSl7dmFyIHM9cjtlJiYoZT10eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSkscz1yP1Muam9pbjIoZSxyKTplKTt2YXIgbD1lcihuLGEpLHU9by5jcmVhdGUocyxsKTtpZih0KXtpZih0eXBlb2YgdD09InN0cmluZyIpe2Zvcih2YXIgYz1uZXcgQXJyYXkodC5sZW5ndGgpLGQ9MCxtPXQubGVuZ3RoO2Q8bTsrK2QpY1tkXT10LmNoYXJDb2RlQXQoZCk7dD1jfW8uY2htb2QodSxsfDE0Nik7dmFyIGg9by5vcGVuKHUsNTc3KTtvLndyaXRlKGgsdCwwLHQubGVuZ3RoLDAsaSksby5jbG9zZShoKSxvLmNobW9kKHUsbCl9fSxjcmVhdGVEZXZpY2UoZSxyLHQsbil7dmFyIGE9Uy5qb2luMih0eXBlb2YgZT09InN0cmluZyI/ZTpvLmdldFBhdGgoZSksciksaT1lcighIXQsISFuKTtvLmNyZWF0ZURldmljZS5tYWpvcnx8KG8uY3JlYXRlRGV2aWNlLm1ham9yPTY0KTt2YXIgcz1vLm1ha2VkZXYoby5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtyZXR1cm4gby5yZWdpc3RlckRldmljZShzLHtvcGVuKGwpe2wuc2Vla2FibGU9ITF9LGNsb3NlKGwpe3ZhciB1Oyh1PW49PW51bGw/dm9pZCAwOm4uYnVmZmVyKSE9bnVsbCYmdS5sZW5ndGgmJm4oMTApfSxyZWFkKGwsdSxjLGQsbSl7Zm9yKHZhciBoPTAscD0wO3A8ZDtwKyspe3ZhciB3O3RyeXt3PXQoKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1pZih3PT09dm9pZCAwJiZoPT09MCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDYpO2lmKHc9PW51bGwpYnJlYWs7aCsrLHVbYytwXT13fXJldHVybiBoJiYobC5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpKSxofSx3cml0ZShsLHUsYyxkLG0pe2Zvcih2YXIgaD0wO2g8ZDtoKyspdHJ5e24odVtjK2hdKX1jYXRjaHt0aHJvdyBuZXcgby5FcnJub0Vycm9yKDI5KX1yZXR1cm4gZCYmKGwubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKSksaH19KSxvLm1rZGV2KGEsaSxzKX0sZm9yY2VMb2FkRmlsZShlKXtpZihlLmlzRGV2aWNlfHxlLmlzRm9sZGVyfHxlLmxpbmt8fGUuY29udGVudHMpcmV0dXJuITA7aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil0aHJvdyBuZXcgRXJyb3IoIkxhenkgbG9hZGluZyBzaG91bGQgaGF2ZSBiZWVuIHBlcmZvcm1lZCAoY29udGVudHMgc2V0KSBpbiBjcmVhdGVMYXp5RmlsZSwgYnV0IGl0IHdhcyBub3QuIExhenkgbG9hZGluZyBvbmx5IHdvcmtzIGluIHdlYiB3b3JrZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2Mgb24gdGhlIG1haW4gdGhyZWFkLiIpO2lmKFllKXRyeXtlLmNvbnRlbnRzPVNlKFllKGUudXJsKSwhMCksZS51c2VkQnl0ZXM9ZS5jb250ZW50cy5sZW5ndGh9Y2F0Y2h7dGhyb3cgbmV3IG8uRXJybm9FcnJvcigyOSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIHdpdGhvdXQgcmVhZCgpIG9yIFhNTEh0dHBSZXF1ZXN0LiIpfSxjcmVhdGVMYXp5RmlsZShlLHIsdCxuLGEpe2NsYXNzIGl7Y29uc3RydWN0b3IoKXt0aGlzLmxlbmd0aEtub3duPSExLHRoaXMuY2h1bmtzPVtdfWdldChwKXtpZighKHA+dGhpcy5sZW5ndGgtMXx8cDwwKSl7dmFyIHc9cCV0aGlzLmNodW5rU2l6ZSxEPXAvdGhpcy5jaHVua1NpemV8MDtyZXR1cm4gdGhpcy5nZXR0ZXIoRClbd119fXNldERhdGFHZXR0ZXIocCl7dGhpcy5nZXR0ZXI9cH1jYWNoZUxlbmd0aCgpe3ZhciBwPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihwLm9wZW4oIkhFQUQiLHQsITEpLHAuc2VuZChudWxsKSwhKHAuc3RhdHVzPj0yMDAmJnAuc3RhdHVzPDMwMHx8cC5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK3Auc3RhdHVzKTt2YXIgdz1OdW1iZXIocC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1sZW5ndGgiKSksRCxNPShEPXAuZ2V0UmVzcG9uc2VIZWFkZXIoIkFjY2VwdC1SYW5nZXMiKSkmJkQ9PT0iYnl0ZXMiLEY9KEQ9cC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1FbmNvZGluZyIpKSYmRD09PSJnemlwIix2PTEwMjQqMTAyNDtNfHwodj13KTt2YXIgXz0oVCxCKT0+e2lmKFQ+Qil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgcmFuZ2UgKCIrVCsiLCAiK0IrIikgb3Igbm8gYnl0ZXMgcmVxdWVzdGVkISIpO2lmKEI+dy0xKXRocm93IG5ldyBFcnJvcigib25seSAiK3crIiBieXRlcyBhdmFpbGFibGUhIHByb2dyYW1tZXIgZXJyb3IhIik7dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKE8ub3BlbigiR0VUIix0LCExKSx3IT09diYmTy5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsImJ5dGVzPSIrVCsiLSIrQiksTy5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIixPLm92ZXJyaWRlTWltZVR5cGUmJk8ub3ZlcnJpZGVNaW1lVHlwZSgidGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCIpLE8uc2VuZChudWxsKSwhKE8uc3RhdHVzPj0yMDAmJk8uc3RhdHVzPDMwMHx8Ty5zdGF0dXM9PT0zMDQpKXRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgbG9hZCAiK3QrIi4gU3RhdHVzOiAiK08uc3RhdHVzKTtyZXR1cm4gTy5yZXNwb25zZSE9PXZvaWQgMD9uZXcgVWludDhBcnJheShPLnJlc3BvbnNlfHxbXSk6U2UoTy5yZXNwb25zZVRleHR8fCIiLCEwKX0sTD10aGlzO0wuc2V0RGF0YUdldHRlcihUPT57dmFyIEI9VCp2LE89KFQrMSkqdi0xO2lmKE89TWF0aC5taW4oTyx3LTEpLHR5cGVvZiBMLmNodW5rc1tUXT4idSImJihMLmNodW5rc1tUXT1fKEIsTykpLHR5cGVvZiBMLmNodW5rc1tUXT4idSIpdGhyb3cgbmV3IEVycm9yKCJkb1hIUiBmYWlsZWQhIik7cmV0dXJuIEwuY2h1bmtzW1RdfSksKEZ8fCF3KSYmKHY9dz0xLHc9dGhpcy5nZXR0ZXIoMCkubGVuZ3RoLHY9dyxxZSgiTGF6eUZpbGVzIG9uIGd6aXAgZm9yY2VzIGRvd25sb2FkIG9mIHRoZSB3aG9sZSBmaWxlIHdoZW4gbGVuZ3RoIGlzIGFjY2Vzc2VkIikpLHRoaXMuX2xlbmd0aD13LHRoaXMuX2NodW5rU2l6ZT12LHRoaXMubGVuZ3RoS25vd249ITB9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmxlbmd0aEtub3dufHx0aGlzLmNhY2hlTGVuZ3RoKCksdGhpcy5fbGVuZ3RofWdldCBjaHVua1NpemUoKXtyZXR1cm4gdGhpcy5sZW5ndGhLbm93bnx8dGhpcy5jYWNoZUxlbmd0aCgpLHRoaXMuX2NodW5rU2l6ZX19aWYodHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1Iil2YXIgcz1uZXcgaSxsPXtpc0RldmljZTohMSxjb250ZW50czpzfTtlbHNlIHZhciBsPXtpc0RldmljZTohMSx1cmw6dH07dmFyIHU9by5jcmVhdGVGaWxlKGUscixsLG4sYSk7bC5jb250ZW50cz91LmNvbnRlbnRzPWwuY29udGVudHM6bC51cmwmJih1LmNvbnRlbnRzPW51bGwsdS51cmw9bC51cmwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHUse3VzZWRCeXRlczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGVudHMubGVuZ3RofX19KTt2YXIgYz17fSxkPU9iamVjdC5rZXlzKHUuc3RyZWFtX29wcyk7ZC5mb3JFYWNoKGg9Pnt2YXIgcD11LnN0cmVhbV9vcHNbaF07Y1toXT0oLi4udyk9PihvLmZvcmNlTG9hZEZpbGUodSkscCguLi53KSl9KTtmdW5jdGlvbiBtKGgscCx3LEQsTSl7dmFyIEY9aC5ub2RlLmNvbnRlbnRzO2lmKE0+PUYubGVuZ3RoKXJldHVybiAwO3ZhciB2PU1hdGgubWluKEYubGVuZ3RoLU0sRCk7aWYoRi5zbGljZSlmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GW00rX107ZWxzZSBmb3IodmFyIF89MDtfPHY7XysrKXBbdytfXT1GLmdldChNK18pO3JldHVybiB2fXJldHVybiBjLnJlYWQ9KGgscCx3LEQsTSk9PihvLmZvcmNlTG9hZEZpbGUodSksbShoLHAsdyxELE0pKSxjLm1tYXA9KGgscCx3LEQsTSk9PntvLmZvcmNlTG9hZEZpbGUodSk7dmFyIEY9VHIoKTtpZighRil0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ4KTtyZXR1cm4gbShoLEksRixwLHcpLHtwdHI6RixhbGxvY2F0ZWQ6ITB9fSx1LnN0cmVhbV9vcHM9Yyx1fX0sUD17REVGQVVMVF9QT0xMTUFTSzo1LGNhbGN1bGF0ZUF0KGUscix0KXtpZihTLmlzQWJzKHIpKXJldHVybiByO3ZhciBuO2lmKGU9PT0tMTAwKW49by5jd2QoKTtlbHNle3ZhciBhPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO249YS5wYXRofWlmKHIubGVuZ3RoPT0wKXtpZighdCl0aHJvdyBuZXcgby5FcnJub0Vycm9yKDQ0KTtyZXR1cm4gbn1yZXR1cm4gUy5qb2luMihuLHIpfSxkb1N0YXQoZSxyLHQpe3ZhciBuPWUocik7Z1t0Pj4yXT1uLmRldixnW3QrND4+Ml09bi5tb2RlLEFbdCs4Pj4yXT1uLm5saW5rLGdbdCsxMj4+Ml09bi51aWQsZ1t0KzE2Pj4yXT1uLmdpZCxnW3QrMjA+PjJdPW4ucmRldiwkPVtuLnNpemU+Pj4wLCh5PW4uc2l6ZSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCsyND4+Ml09JFswXSxnW3QrMjg+PjJdPSRbMV0sZ1t0KzMyPj4yXT00MDk2LGdbdCszNj4+Ml09bi5ibG9ja3M7dmFyIGE9bi5hdGltZS5nZXRUaW1lKCksaT1uLm10aW1lLmdldFRpbWUoKSxzPW4uY3RpbWUuZ2V0VGltZSgpO3JldHVybiAkPVtNYXRoLmZsb29yKGEvMWUzKT4+PjAsKHk9TWF0aC5mbG9vcihhLzFlMyksK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrNDA+PjJdPSRbMF0sZ1t0KzQ0Pj4yXT0kWzFdLEFbdCs0OD4+Ml09YSUxZTMqMWUzLCQ9W01hdGguZmxvb3IoaS8xZTMpPj4+MCwoeT1NYXRoLmZsb29yKGkvMWUzKSwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbdCs1Nj4+Ml09JFswXSxnW3QrNjA+PjJdPSRbMV0sQVt0KzY0Pj4yXT1pJTFlMyoxZTMsJD1bTWF0aC5mbG9vcihzLzFlMyk+Pj4wLCh5PU1hdGguZmxvb3Iocy8xZTMpLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1t0KzcyPj4yXT0kWzBdLGdbdCs3Nj4+Ml09JFsxXSxBW3QrODA+PjJdPXMlMWUzKjFlMywkPVtuLmlubz4+PjAsKHk9bi5pbm8sK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3QrODg+PjJdPSRbMF0sZ1t0KzkyPj4yXT0kWzFdLDB9LGRvTXN5bmMoZSxyLHQsbixhKXtpZighby5pc0ZpbGUoci5ub2RlLm1vZGUpKXRocm93IG5ldyBvLkVycm5vRXJyb3IoNDMpO2lmKG4mMilyZXR1cm4gMDt2YXIgaT14LnNsaWNlKGUsZSt0KTtvLm1zeW5jKHIsaSxhLHQsbil9LGdldFN0cmVhbUZyb21GRChlKXt2YXIgcj1vLmdldFN0cmVhbUNoZWNrZWQoZSk7cmV0dXJuIHJ9LHZhcmFyZ3M6dm9pZCAwLGdldFN0cihlKXt2YXIgcj1zZShlKTtyZXR1cm4gcn19O2Z1bmN0aW9uIGp0KGUscix0LG4pe3RyeXtpZihyPVAuZ2V0U3RyKHIpLHI9UC5jYWxjdWxhdGVBdChlLHIpLHQmLTgpcmV0dXJuLTI4O3ZhciBhPW8ubG9va3VwUGF0aChyLHtmb2xsb3c6ITB9KSxpPWEubm9kZTtpZighaSlyZXR1cm4tNDQ7dmFyIHM9IiI7cmV0dXJuIHQmNCYmKHMrPSJyIiksdCYyJiYocys9InciKSx0JjEmJihzKz0ieCIpLHMmJm8ubm9kZVBlcm1pc3Npb25zKGkscyk/LTI6MH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybi1sLmVycm5vfX1mdW5jdGlvbiBNZSgpe3ZhciBlPWdbK1AudmFyYXJncz4+Ml07cmV0dXJuIFAudmFyYXJncys9NCxlfXZhciBkZT1NZTtmdW5jdGlvbiB6dChlLHIsdCl7UC52YXJhcmdzPXQ7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3N3aXRjaChyKXtjYXNlIDA6e3ZhciBhPU1lKCk7aWYoYTwwKXJldHVybi0yODtmb3IoO28uc3RyZWFtc1thXTspYSsrO3ZhciBpO3JldHVybiBpPW8uZHVwU3RyZWFtKG4sYSksaS5mZH1jYXNlIDE6Y2FzZSAyOnJldHVybiAwO2Nhc2UgMzpyZXR1cm4gbi5mbGFncztjYXNlIDQ6e3ZhciBhPU1lKCk7cmV0dXJuIG4uZmxhZ3N8PWEsMH1jYXNlIDEyOnt2YXIgYT1kZSgpLHM9MDtyZXR1cm4gWVthK3M+PjFdPTIsMH1jYXNlIDEzOmNhc2UgMTQ6cmV0dXJuIDB9cmV0dXJuLTI4fWNhdGNoKGwpe2lmKHR5cGVvZiBvPiJ1Inx8bC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGw7cmV0dXJuLWwuZXJybm99fWZ1bmN0aW9uIHh0KGUscil7dHJ5e3ZhciB0PVAuZ2V0U3RyZWFtRnJvbUZEKGUpO3JldHVybiBQLmRvU3RhdChvLnN0YXQsdC5wYXRoLHIpfWNhdGNoKG4pe2lmKHR5cGVvZiBvPiJ1Inx8bi5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IG47cmV0dXJuLW4uZXJybm99fXZhciB2ZT0oZSxyLHQpPT5RZShlLHgscix0KTtmdW5jdGlvbiBIdChlLHIsdCl7dHJ5e3ZhciBuPVAuZ2V0U3RyZWFtRnJvbUZEKGUpO24uZ2V0ZGVudHN8fChuLmdldGRlbnRzPW8ucmVhZGRpcihuLnBhdGgpKTtmb3IodmFyIGE9MjgwLGk9MCxzPW8ubGxzZWVrKG4sMCwxKSxsPU1hdGguZmxvb3Iocy9hKTtsPG4uZ2V0ZGVudHMubGVuZ3RoJiZpK2E8PXQ7KXt2YXIgdSxjLGQ9bi5nZXRkZW50c1tsXTtpZihkPT09Ii4iKXU9bi5ub2RlLmlkLGM9NDtlbHNlIGlmKGQ9PT0iLi4iKXt2YXIgbT1vLmxvb2t1cFBhdGgobi5wYXRoLHtwYXJlbnQ6ITB9KTt1PW0ubm9kZS5pZCxjPTR9ZWxzZXt2YXIgaD1vLmxvb2t1cE5vZGUobi5ub2RlLGQpO3U9aC5pZCxjPW8uaXNDaHJkZXYoaC5tb2RlKT8yOm8uaXNEaXIoaC5tb2RlKT80Om8uaXNMaW5rKGgubW9kZSk/MTA6OH0kPVt1Pj4+MCwoeT11LCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2k+PjJdPSRbMF0sZ1tyK2krND4+Ml09JFsxXSwkPVsobCsxKSphPj4+MCwoeT0obCsxKSphLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1tyK2krOD4+Ml09JFswXSxnW3IraSsxMj4+Ml09JFsxXSxZW3IraSsxNj4+MV09MjgwLElbcitpKzE4XT1jLHZlKGQscitpKzE5LDI1NiksaSs9YSxsKz0xfXJldHVybiBvLmxsc2VlayhuLGwqYSwwKSxpfWNhdGNoKHApe2lmKHR5cGVvZiBvPiJ1Inx8cC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHA7cmV0dXJuLXAuZXJybm99fWZ1bmN0aW9uIFd0KGUscix0KXtQLnZhcmFyZ3M9dDt0cnl7dmFyIG49UC5nZXRTdHJlYW1Gcm9tRkQoZSk7c3dpdGNoKHIpe2Nhc2UgMjE1MDk6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDU6e2lmKCFuLnR0eSlyZXR1cm4tNTk7aWYobi50dHkub3BzLmlvY3RsX3RjZ2V0cyl7dmFyIGE9bi50dHkub3BzLmlvY3RsX3RjZ2V0cyhuKSxpPWRlKCk7Z1tpPj4yXT1hLmNfaWZsYWd8fDAsZ1tpKzQ+PjJdPWEuY19vZmxhZ3x8MCxnW2krOD4+Ml09YS5jX2NmbGFnfHwwLGdbaSsxMj4+Ml09YS5jX2xmbGFnfHwwO2Zvcih2YXIgcz0wO3M8MzI7cysrKUlbaStzKzE3XT1hLmNfY2Nbc118fDA7cmV0dXJuIDB9cmV0dXJuIDB9Y2FzZSAyMTUxMDpjYXNlIDIxNTExOmNhc2UgMjE1MTI6cmV0dXJuIG4udHR5PzA6LTU5O2Nhc2UgMjE1MDY6Y2FzZSAyMTUwNzpjYXNlIDIxNTA4OntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90Y3NldHMpe2Zvcih2YXIgaT1kZSgpLGw9Z1tpPj4yXSx1PWdbaSs0Pj4yXSxjPWdbaSs4Pj4yXSxkPWdbaSsxMj4+Ml0sbT1bXSxzPTA7czwzMjtzKyspbS5wdXNoKElbaStzKzE3XSk7cmV0dXJuIG4udHR5Lm9wcy5pb2N0bF90Y3NldHMobi50dHkscix7Y19pZmxhZzpsLGNfb2ZsYWc6dSxjX2NmbGFnOmMsY19sZmxhZzpkLGNfY2M6bX0pfXJldHVybiAwfWNhc2UgMjE1MTk6e2lmKCFuLnR0eSlyZXR1cm4tNTk7dmFyIGk9ZGUoKTtyZXR1cm4gZ1tpPj4yXT0wLDB9Y2FzZSAyMTUyMDpyZXR1cm4gbi50dHk/LTI4Oi01OTtjYXNlIDIxNTMxOnt2YXIgaT1kZSgpO3JldHVybiBvLmlvY3RsKG4scixpKX1jYXNlIDIxNTIzOntpZighbi50dHkpcmV0dXJuLTU5O2lmKG4udHR5Lm9wcy5pb2N0bF90aW9jZ3dpbnN6KXt2YXIgaD1uLnR0eS5vcHMuaW9jdGxfdGlvY2d3aW5zeihuLnR0eSksaT1kZSgpO1lbaT4+MV09aFswXSxZW2krMj4+MV09aFsxXX1yZXR1cm4gMH1jYXNlIDIxNTI0OnJldHVybiBuLnR0eT8wOi01OTtjYXNlIDIxNTE1OnJldHVybiBuLnR0eT8wOi01OTtkZWZhdWx0OnJldHVybi0yOH19Y2F0Y2gocCl7aWYodHlwZW9mIG8+InUifHxwLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcDtyZXR1cm4tcC5lcnJub319ZnVuY3Rpb24gQnQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5sc3RhdCxlLHIpfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuLXQuZXJybm99fWZ1bmN0aW9uIE50KGUscix0LG4pe3RyeXtyPVAuZ2V0U3RyKHIpO3ZhciBhPW4mMjU2LGk9biY0MDk2O3JldHVybiBuPW4mLTY0MDEscj1QLmNhbGN1bGF0ZUF0KGUscixpKSxQLmRvU3RhdChhP28ubHN0YXQ6by5zdGF0LHIsdCl9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4tcy5lcnJub319ZnVuY3Rpb24gWXQoZSxyLHQsbil7UC52YXJhcmdzPW47dHJ5e3I9UC5nZXRTdHIocikscj1QLmNhbGN1bGF0ZUF0KGUscik7dmFyIGE9bj9NZSgpOjA7cmV0dXJuIG8ub3BlbihyLHQsYSkuZmR9Y2F0Y2goaSl7aWYodHlwZW9mIG8+InUifHxpLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgaTtyZXR1cm4taS5lcnJub319ZnVuY3Rpb24gR3QoZSxyLHQsbil7dHJ5e3JldHVybiByPVAuZ2V0U3RyKHIpLG49UC5nZXRTdHIobikscj1QLmNhbGN1bGF0ZUF0KGUsciksbj1QLmNhbGN1bGF0ZUF0KHQsbiksby5yZW5hbWUocixuKSwwfWNhdGNoKGEpe2lmKHR5cGVvZiBvPiJ1Inx8YS5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IGE7cmV0dXJuLWEuZXJybm99fWZ1bmN0aW9uIHF0KGUpe3RyeXtyZXR1cm4gZT1QLmdldFN0cihlKSxvLnJtZGlyKGUpLDB9Y2F0Y2gocil7aWYodHlwZW9mIG8+InUifHxyLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcjtyZXR1cm4tci5lcnJub319ZnVuY3Rpb24gWHQoZSxyKXt0cnl7cmV0dXJuIGU9UC5nZXRTdHIoZSksUC5kb1N0YXQoby5zdGF0LGUscil9Y2F0Y2godCl7aWYodHlwZW9mIG8+InUifHx0Lm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgdDtyZXR1cm4tdC5lcnJub319ZnVuY3Rpb24gS3QoZSxyLHQpe3RyeXtyZXR1cm4gcj1QLmdldFN0cihyKSxyPVAuY2FsY3VsYXRlQXQoZSxyKSx0PT09MD9vLnVubGluayhyKTp0PT09NTEyP28ucm1kaXIocik6aWUoIkludmFsaWQgZmxhZ3MgcGFzc2VkIHRvIHVubGlua2F0IiksMH1jYXRjaChuKXtpZih0eXBlb2Ygbz4idSJ8fG4ubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBuO3JldHVybi1uLmVycm5vfX12YXIgSnQ9KCk9PntpZSgiIil9LFJlPXt9LHJyPWU9Pntmb3IoO2UubGVuZ3RoOyl7dmFyIHI9ZS5wb3AoKSx0PWUucG9wKCk7dChyKX19O2Z1bmN0aW9uIHllKGUpe3JldHVybiB0aGlzLmZyb21XaXJlVHlwZShBW2U+PjJdKX12YXIgaGU9e30sdWU9e30sT2U9e30sU3IsSWU9ZT0+e3Rocm93IG5ldyBTcihlKX0sTj0oZSxyLHQpPT57ZS5mb3JFYWNoKGZ1bmN0aW9uKGwpe09lW2xdPXJ9KTtmdW5jdGlvbiBuKGwpe3ZhciB1PXQobCk7dS5sZW5ndGghPT1lLmxlbmd0aCYmSWUoIk1pc21hdGNoZWQgdHlwZSBjb252ZXJ0ZXIgY291bnQiKTtmb3IodmFyIGM9MDtjPGUubGVuZ3RoOysrYylLKGVbY10sdVtjXSl9dmFyIGE9bmV3IEFycmF5KHIubGVuZ3RoKSxpPVtdLHM9MDtyLmZvckVhY2goKGwsdSk9Pnt1ZS5oYXNPd25Qcm9wZXJ0eShsKT9hW3VdPXVlW2xdOihpLnB1c2gobCksaGUuaGFzT3duUHJvcGVydHkobCl8fChoZVtsXT1bXSksaGVbbF0ucHVzaCgoKT0+e2FbdV09dWVbbF0sKytzLHM9PT1pLmxlbmd0aCYmbihhKX0pKX0pLGkubGVuZ3RoPT09MCYmbihhKX0sWnQ9ZT0+e3ZhciByPVJlW2VdO2RlbGV0ZSBSZVtlXTt2YXIgdD1yLnJhd0NvbnN0cnVjdG9yLG49ci5yYXdEZXN0cnVjdG9yLGE9ci5maWVsZHMsaT1hLm1hcChzPT5zLmdldHRlclJldHVyblR5cGUpLmNvbmNhdChhLm1hcChzPT5zLnNldHRlckFyZ3VtZW50VHlwZSkpO04oW2VdLGkscz0+e3ZhciBsPXt9O3JldHVybiBhLmZvckVhY2goKHUsYyk9Pnt2YXIgZD11LmZpZWxkTmFtZSxtPXNbY10saD11LmdldHRlcixwPXUuZ2V0dGVyQ29udGV4dCx3PXNbYythLmxlbmd0aF0sRD11LnNldHRlcixNPXUuc2V0dGVyQ29udGV4dDtsW2RdPXtyZWFkOkY9Pm0uZnJvbVdpcmVUeXBlKGgocCxGKSksd3JpdGU6KEYsdik9Pnt2YXIgXz1bXTtEKE0sRix3LnRvV2lyZVR5cGUoXyx2KSkscnIoXyl9fX0pLFt7bmFtZTpyLm5hbWUsZnJvbVdpcmVUeXBlOnU9Pnt2YXIgYz17fTtmb3IodmFyIGQgaW4gbCljW2RdPWxbZF0ucmVhZCh1KTtyZXR1cm4gbih1KSxjfSx0b1dpcmVUeXBlOih1LGMpPT57Zm9yKHZhciBkIGluIGwpaWYoIShkIGluIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoYE1pc3NpbmcgZmllbGQ6ICIke2R9ImApO3ZhciBtPXQoKTtmb3IoZCBpbiBsKWxbZF0ud3JpdGUobSxjW2RdKTtyZXR1cm4gdSE9PW51bGwmJnUucHVzaChuLG0pLG19LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm59XX0pfSxRdD0oZSxyLHQsbixhKT0+e30sZW49KCk9Pntmb3IodmFyIGU9bmV3IEFycmF5KDI1Nikscj0wO3I8MjU2OysrcillW3JdPVN0cmluZy5mcm9tQ2hhckNvZGUocik7TXI9ZX0sTXIsaj1lPT57Zm9yKHZhciByPSIiLHQ9ZTt4W3RdOylyKz1Nclt4W3QrK11dO3JldHVybiByfSxtZSxrPWU9Pnt0aHJvdyBuZXcgbWUoZSl9O2Z1bmN0aW9uIHJuKGUscix0PXt9KXt2YXIgbj1yLm5hbWU7aWYoZXx8ayhgdHlwZSAiJHtufSIgbXVzdCBoYXZlIGEgcG9zaXRpdmUgaW50ZWdlciB0eXBlaWQgcG9pbnRlcmApLHVlLmhhc093blByb3BlcnR5KGUpKXtpZih0Lmlnbm9yZUR1cGxpY2F0ZVJlZ2lzdHJhdGlvbnMpcmV0dXJuO2soYENhbm5vdCByZWdpc3RlciB0eXBlICcke259JyB0d2ljZWApfWlmKHVlW2VdPXIsZGVsZXRlIE9lW2VdLGhlLmhhc093blByb3BlcnR5KGUpKXt2YXIgYT1oZVtlXTtkZWxldGUgaGVbZV0sYS5mb3JFYWNoKGk9PmkoKSl9fWZ1bmN0aW9uIEsoZSxyLHQ9e30pe2lmKCEoImFyZ1BhY2tBZHZhbmNlImluIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZ2lzdGVyVHlwZSByZWdpc3RlcmVkSW5zdGFuY2UgcmVxdWlyZXMgYXJnUGFja0FkdmFuY2UiKTtyZXR1cm4gcm4oZSxyLHQpfXZhciBKPTgsdG49KGUscix0LG4pPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4hIWF9LHRvV2lyZVR5cGU6ZnVuY3Rpb24oYSxpKXtyZXR1cm4gaT90Om59LGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKHhbYV0pfSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSxubj1lPT4oe2NvdW50OmUuY291bnQsZGVsZXRlU2NoZWR1bGVkOmUuZGVsZXRlU2NoZWR1bGVkLHByZXNlcnZlUG9pbnRlck9uRGVsZXRlOmUucHJlc2VydmVQb2ludGVyT25EZWxldGUscHRyOmUucHRyLHB0clR5cGU6ZS5wdHJUeXBlLHNtYXJ0UHRyOmUuc21hcnRQdHIsc21hcnRQdHJUeXBlOmUuc21hcnRQdHJUeXBlfSksdHI9ZT0+e2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3MubmFtZX1rKHIoZSkrIiBpbnN0YW5jZSBhbHJlYWR5IGRlbGV0ZWQiKX0sbnI9ITEsUnI9ZT0+e30sYW49ZT0+e2Uuc21hcnRQdHI/ZS5zbWFydFB0clR5cGUucmF3RGVzdHJ1Y3RvcihlLnNtYXJ0UHRyKTplLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLnJhd0Rlc3RydWN0b3IoZS5wdHIpfSxPcj1lPT57ZS5jb3VudC52YWx1ZS09MTt2YXIgcj1lLmNvdW50LnZhbHVlPT09MDtyJiZhbihlKX0sSXI9KGUscix0KT0+e2lmKHI9PT10KXJldHVybiBlO2lmKHQuYmFzZUNsYXNzPT09dm9pZCAwKXJldHVybiBudWxsO3ZhciBuPUlyKGUscix0LmJhc2VDbGFzcyk7cmV0dXJuIG49PT1udWxsP251bGw6dC5kb3duY2FzdChuKX0sTHI9e30sb249KCk9Pk9iamVjdC5rZXlzKGJlKS5sZW5ndGgsc249KCk9Pnt2YXIgZT1bXTtmb3IodmFyIHIgaW4gYmUpYmUuaGFzT3duUHJvcGVydHkocikmJmUucHVzaChiZVtyXSk7cmV0dXJuIGV9LHdlPVtdLGFyPSgpPT57Zm9yKDt3ZS5sZW5ndGg7KXt2YXIgZT13ZS5wb3AoKTtlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlLmRlbGV0ZSgpfX0sRWUsbG49ZT0+e0VlPWUsd2UubGVuZ3RoJiZFZSYmRWUoYXIpfSx1bj0oKT0+e2YuZ2V0SW5oZXJpdGVkSW5zdGFuY2VDb3VudD1vbixmLmdldExpdmVJbmhlcml0ZWRJbnN0YW5jZXM9c24sZi5mbHVzaFBlbmRpbmdEZWxldGVzPWFyLGYuc2V0RGVsYXlGdW5jdGlvbj1sbn0sYmU9e30sZm49KGUscik9Pntmb3Iocj09PXZvaWQgMCYmaygicHRyIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkIik7ZS5iYXNlQ2xhc3M7KXI9ZS51cGNhc3QociksZT1lLmJhc2VDbGFzcztyZXR1cm4gcn0sY249KGUscik9PihyPWZuKGUsciksYmVbcl0pLExlPShlLHIpPT57KCFyLnB0clR5cGV8fCFyLnB0cikmJkllKCJtYWtlQ2xhc3NIYW5kbGUgcmVxdWlyZXMgcHRyIGFuZCBwdHJUeXBlIik7dmFyIHQ9ISFyLnNtYXJ0UHRyVHlwZSxuPSEhci5zbWFydFB0cjtyZXR1cm4gdCE9PW4mJkllKCJCb3RoIHNtYXJ0UHRyVHlwZSBhbmQgc21hcnRQdHIgbXVzdCBiZSBzcGVjaWZpZWQiKSxyLmNvdW50PXt2YWx1ZToxfSxrZShPYmplY3QuY3JlYXRlKGUseyQkOnt2YWx1ZTpyLHdyaXRhYmxlOiEwfX0pKX07ZnVuY3Rpb24gZG4oZSl7dmFyIHI9dGhpcy5nZXRQb2ludGVlKGUpO2lmKCFyKXJldHVybiB0aGlzLmRlc3RydWN0b3IoZSksbnVsbDt2YXIgdD1jbih0aGlzLnJlZ2lzdGVyZWRDbGFzcyxyKTtpZih0IT09dm9pZCAwKXtpZih0LiQkLmNvdW50LnZhbHVlPT09MClyZXR1cm4gdC4kJC5wdHI9cix0LiQkLnNtYXJ0UHRyPWUsdC5jbG9uZSgpO3ZhciBuPXQuY2xvbmUoKTtyZXR1cm4gdGhpcy5kZXN0cnVjdG9yKGUpLG59ZnVuY3Rpb24gYSgpe3JldHVybiB0aGlzLmlzU21hcnRQb2ludGVyP0xlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMucG9pbnRlZVR5cGUscHRyOnIsc21hcnRQdHJUeXBlOnRoaXMsc21hcnRQdHI6ZX0pOkxlKHRoaXMucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHtwdHJUeXBlOnRoaXMscHRyOmV9KX12YXIgaT10aGlzLnJlZ2lzdGVyZWRDbGFzcy5nZXRBY3R1YWxUeXBlKHIpLHM9THJbaV07aWYoIXMpcmV0dXJuIGEuY2FsbCh0aGlzKTt2YXIgbDt0aGlzLmlzQ29uc3Q/bD1zLmNvbnN0UG9pbnRlclR5cGU6bD1zLnBvaW50ZXJUeXBlO3ZhciB1PUlyKHIsdGhpcy5yZWdpc3RlcmVkQ2xhc3MsbC5yZWdpc3RlcmVkQ2xhc3MpO3JldHVybiB1PT09bnVsbD9hLmNhbGwodGhpcyk6dGhpcy5pc1NtYXJ0UG9pbnRlcj9MZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1LHNtYXJ0UHRyVHlwZTp0aGlzLHNtYXJ0UHRyOmV9KTpMZShsLnJlZ2lzdGVyZWRDbGFzcy5pbnN0YW5jZVByb3RvdHlwZSx7cHRyVHlwZTpsLHB0cjp1fSl9dmFyIGtlPWU9PnR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT4idSI/KGtlPXI9PnIsZSk6KG5yPW5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeShyPT57T3Ioci4kJCl9KSxrZT1yPT57dmFyIHQ9ci4kJCxuPSEhdC5zbWFydFB0cjtpZihuKXt2YXIgYT17JCQ6dH07bnIucmVnaXN0ZXIocixhLHIpfXJldHVybiByfSxScj1yPT5uci51bnJlZ2lzdGVyKHIpLGtlKGUpKSx2bj0oKT0+e09iamVjdC5hc3NpZ24oVmUucHJvdG90eXBlLHtpc0FsaWFzT2YoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgVmUpfHwhKGUgaW5zdGFuY2VvZiBWZSkpcmV0dXJuITE7dmFyIHI9dGhpcy4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyx0PXRoaXMuJCQucHRyO2UuJCQ9ZS4kJDtmb3IodmFyIG49ZS4kJC5wdHJUeXBlLnJlZ2lzdGVyZWRDbGFzcyxhPWUuJCQucHRyO3IuYmFzZUNsYXNzOyl0PXIudXBjYXN0KHQpLHI9ci5iYXNlQ2xhc3M7Zm9yKDtuLmJhc2VDbGFzczspYT1uLnVwY2FzdChhKSxuPW4uYmFzZUNsYXNzO3JldHVybiByPT09biYmdD09PWF9LGNsb25lKCl7aWYodGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQucHJlc2VydmVQb2ludGVyT25EZWxldGUpcmV0dXJuIHRoaXMuJCQuY291bnQudmFsdWUrPTEsdGhpczt2YXIgZT1rZShPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSx7JCQ6e3ZhbHVlOm5uKHRoaXMuJCQpfX0pKTtyZXR1cm4gZS4kJC5jb3VudC52YWx1ZSs9MSxlLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMSxlfSxkZWxldGUoKXt0aGlzLiQkLnB0cnx8dHIodGhpcyksdGhpcy4kJC5kZWxldGVTY2hlZHVsZWQmJiF0aGlzLiQkLnByZXNlcnZlUG9pbnRlck9uRGVsZXRlJiZrKCJPYmplY3QgYWxyZWFkeSBzY2hlZHVsZWQgZm9yIGRlbGV0aW9uIiksUnIodGhpcyksT3IodGhpcy4kJCksdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZXx8KHRoaXMuJCQuc21hcnRQdHI9dm9pZCAwLHRoaXMuJCQucHRyPXZvaWQgMCl9LGlzRGVsZXRlZCgpe3JldHVybiF0aGlzLiQkLnB0cn0sZGVsZXRlTGF0ZXIoKXtyZXR1cm4gdGhpcy4kJC5wdHJ8fHRyKHRoaXMpLHRoaXMuJCQuZGVsZXRlU2NoZWR1bGVkJiYhdGhpcy4kJC5wcmVzZXJ2ZVBvaW50ZXJPbkRlbGV0ZSYmaygiT2JqZWN0IGFscmVhZHkgc2NoZWR1bGVkIGZvciBkZWxldGlvbiIpLHdlLnB1c2godGhpcyksd2UubGVuZ3RoPT09MSYmRWUmJkVlKGFyKSx0aGlzLiQkLmRlbGV0ZVNjaGVkdWxlZD0hMCx0aGlzfX0pfTtmdW5jdGlvbiBWZSgpe312YXIgVWU9KGUscik9Pk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJuYW1lIix7dmFsdWU6ZX0pLG9yPShlLHIsdCk9PntpZihlW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDApe3ZhciBuPWVbcl07ZVtyXT1mdW5jdGlvbiguLi5hKXtyZXR1cm4gZVtyXS5vdmVybG9hZFRhYmxlLmhhc093blByb3BlcnR5KGEubGVuZ3RoKXx8ayhgRnVuY3Rpb24gJyR7dH0nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHthLmxlbmd0aH0pIC0gZXhwZWN0cyBvbmUgb2YgKCR7ZVtyXS5vdmVybG9hZFRhYmxlfSkhYCksZVtyXS5vdmVybG9hZFRhYmxlW2EubGVuZ3RoXS5hcHBseSh0aGlzLGEpfSxlW3JdLm92ZXJsb2FkVGFibGU9W10sZVtyXS5vdmVybG9hZFRhYmxlW24uYXJnQ291bnRdPW59fSxWcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKT8oKHQ9PT12b2lkIDB8fGZbZV0ub3ZlcmxvYWRUYWJsZSE9PXZvaWQgMCYmZltlXS5vdmVybG9hZFRhYmxlW3RdIT09dm9pZCAwKSYmayhgQ2Fubm90IHJlZ2lzdGVyIHB1YmxpYyBuYW1lICcke2V9JyB0d2ljZWApLG9yKGYsZSxlKSxmLmhhc093blByb3BlcnR5KHQpJiZrKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgb3ZlcmxvYWRzIG9mIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzICgke3R9KSFgKSxmW2VdLm92ZXJsb2FkVGFibGVbdF09cik6KGZbZV09cix0IT09dm9pZCAwJiYoZltlXS5udW1Bcmd1bWVudHM9dCkpfSxobj00OCxtbj01Nyxwbj1lPT57aWYoZT09PXZvaWQgMClyZXR1cm4iX3Vua25vd24iO2U9ZS5yZXBsYWNlKC9bXmEtekEtWjAtOV9dL2csIiQiKTt2YXIgcj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHI+PWhuJiZyPD1tbj9gXyR7ZX1gOmV9O2Z1bmN0aW9uIF9uKGUscix0LG4sYSxpLHMsbCl7dGhpcy5uYW1lPWUsdGhpcy5jb25zdHJ1Y3Rvcj1yLHRoaXMuaW5zdGFuY2VQcm90b3R5cGU9dCx0aGlzLnJhd0Rlc3RydWN0b3I9bix0aGlzLmJhc2VDbGFzcz1hLHRoaXMuZ2V0QWN0dWFsVHlwZT1pLHRoaXMudXBjYXN0PXMsdGhpcy5kb3duY2FzdD1sLHRoaXMucHVyZVZpcnR1YWxGdW5jdGlvbnM9W119dmFyIGplPShlLHIsdCk9Pntmb3IoO3IhPT10OylyLnVwY2FzdHx8ayhgRXhwZWN0ZWQgbnVsbCBvciBpbnN0YW5jZSBvZiAke3QubmFtZX0sIGdvdCBhbiBpbnN0YW5jZSBvZiAke3IubmFtZX1gKSxlPXIudXBjYXN0KGUpLHI9ci5iYXNlQ2xhc3M7cmV0dXJuIGV9O2Z1bmN0aW9uIGduKGUscil7aWYocj09PW51bGwpcmV0dXJuIHRoaXMuaXNSZWZlcmVuY2UmJmsoYG51bGwgaXMgbm90IGEgdmFsaWQgJHt0aGlzLm5hbWV9YCksMDtyLiQkfHxrKGBDYW5ub3QgcGFzcyAiJHtscihyKX0iIGFzIGEgJHt0aGlzLm5hbWV9YCksci4kJC5wdHJ8fGsoYENhbm5vdCBwYXNzIGRlbGV0ZWQgb2JqZWN0IGFzIGEgcG9pbnRlciBvZiB0eXBlICR7dGhpcy5uYW1lfWApO3ZhciB0PXIuJCQucHRyVHlwZS5yZWdpc3RlcmVkQ2xhc3Msbj1qZShyLiQkLnB0cix0LHRoaXMucmVnaXN0ZXJlZENsYXNzKTtyZXR1cm4gbn1mdW5jdGlvbiB5bihlLHIpe3ZhciB0O2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLHRoaXMuaXNTbWFydFBvaW50ZXI/KHQ9dGhpcy5yYXdDb25zdHJ1Y3RvcigpLGUhPT1udWxsJiZlLnB1c2godGhpcy5yYXdEZXN0cnVjdG9yLHQpLHQpOjA7KCFyfHwhci4kJCkmJmsoYENhbm5vdCBwYXNzICIke2xyKHIpfSIgYXMgYSAke3RoaXMubmFtZX1gKSxyLiQkLnB0cnx8ayhgQ2Fubm90IHBhc3MgZGVsZXRlZCBvYmplY3QgYXMgYSBwb2ludGVyIG9mIHR5cGUgJHt0aGlzLm5hbWV9YCksIXRoaXMuaXNDb25zdCYmci4kJC5wdHJUeXBlLmlzQ29uc3QmJmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgbj1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzO2lmKHQ9amUoci4kJC5wdHIsbix0aGlzLnJlZ2lzdGVyZWRDbGFzcyksdGhpcy5pc1NtYXJ0UG9pbnRlcilzd2l0Y2goci4kJC5zbWFydFB0cj09PXZvaWQgMCYmaygiUGFzc2luZyByYXcgcG9pbnRlciB0byBzbWFydCBwb2ludGVyIGlzIGlsbGVnYWwiKSx0aGlzLnNoYXJpbmdQb2xpY3kpe2Nhc2UgMDpyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXM/dD1yLiQkLnNtYXJ0UHRyOmsoYENhbm5vdCBjb252ZXJ0IGFyZ3VtZW50IG9mIHR5cGUgJHtyLiQkLnNtYXJ0UHRyVHlwZT9yLiQkLnNtYXJ0UHRyVHlwZS5uYW1lOnIuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTticmVhaztjYXNlIDE6dD1yLiQkLnNtYXJ0UHRyO2JyZWFrO2Nhc2UgMjppZihyLiQkLnNtYXJ0UHRyVHlwZT09PXRoaXMpdD1yLiQkLnNtYXJ0UHRyO2Vsc2V7dmFyIGE9ci5jbG9uZSgpO3Q9dGhpcy5yYXdTaGFyZSh0LHRlLnRvSGFuZGxlKCgpPT5hLmRlbGV0ZSgpKSksZSE9PW51bGwmJmUucHVzaCh0aGlzLnJhd0Rlc3RydWN0b3IsdCl9YnJlYWs7ZGVmYXVsdDprKCJVbnN1cHBvcnRpbmcgc2hhcmluZyBwb2xpY3kiKX1yZXR1cm4gdH1mdW5jdGlvbiB3bihlLHIpe2lmKHI9PT1udWxsKXJldHVybiB0aGlzLmlzUmVmZXJlbmNlJiZrKGBudWxsIGlzIG5vdCBhIHZhbGlkICR7dGhpcy5uYW1lfWApLDA7ci4kJHx8ayhgQ2Fubm90IHBhc3MgIiR7bHIocil9IiBhcyBhICR7dGhpcy5uYW1lfWApLHIuJCQucHRyfHxrKGBDYW5ub3QgcGFzcyBkZWxldGVkIG9iamVjdCBhcyBhIHBvaW50ZXIgb2YgdHlwZSAke3RoaXMubmFtZX1gKSxyLiQkLnB0clR5cGUuaXNDb25zdCYmayhgQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgb2YgdHlwZSAke3IuJCQucHRyVHlwZS5uYW1lfSB0byBwYXJhbWV0ZXIgdHlwZSAke3RoaXMubmFtZX1gKTt2YXIgdD1yLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLG49amUoci4kJC5wdHIsdCx0aGlzLnJlZ2lzdGVyZWRDbGFzcyk7cmV0dXJuIG59dmFyIEVuPSgpPT57T2JqZWN0LmFzc2lnbih6ZS5wcm90b3R5cGUse2dldFBvaW50ZWUoZSl7cmV0dXJuIHRoaXMucmF3R2V0UG9pbnRlZSYmKGU9dGhpcy5yYXdHZXRQb2ludGVlKGUpKSxlfSxkZXN0cnVjdG9yKGUpe3ZhciByOyhyPXRoaXMucmF3RGVzdHJ1Y3Rvcik9PW51bGx8fHIuY2FsbCh0aGlzLGUpfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGZyb21XaXJlVHlwZTpkbn0pfTtmdW5jdGlvbiB6ZShlLHIsdCxuLGEsaSxzLGwsdSxjLGQpe3RoaXMubmFtZT1lLHRoaXMucmVnaXN0ZXJlZENsYXNzPXIsdGhpcy5pc1JlZmVyZW5jZT10LHRoaXMuaXNDb25zdD1uLHRoaXMuaXNTbWFydFBvaW50ZXI9YSx0aGlzLnBvaW50ZWVUeXBlPWksdGhpcy5zaGFyaW5nUG9saWN5PXMsdGhpcy5yYXdHZXRQb2ludGVlPWwsdGhpcy5yYXdDb25zdHJ1Y3Rvcj11LHRoaXMucmF3U2hhcmU9Yyx0aGlzLnJhd0Rlc3RydWN0b3I9ZCwhYSYmci5iYXNlQ2xhc3M9PT12b2lkIDA/bj8odGhpcy50b1dpcmVUeXBlPWduLHRoaXMuZGVzdHJ1Y3RvckZ1bmN0aW9uPW51bGwpOih0aGlzLnRvV2lyZVR5cGU9d24sdGhpcy5kZXN0cnVjdG9yRnVuY3Rpb249bnVsbCk6dGhpcy50b1dpcmVUeXBlPXlufXZhciBVcj0oZSxyLHQpPT57Zi5oYXNPd25Qcm9wZXJ0eShlKXx8SWUoIlJlcGxhY2luZyBub25leGlzdGVudCBwdWJsaWMgc3ltYm9sIiksZltlXS5vdmVybG9hZFRhYmxlIT09dm9pZCAwJiZ0IT09dm9pZCAwP2ZbZV0ub3ZlcmxvYWRUYWJsZVt0XT1yOihmW2VdPXIsZltlXS5hcmdDb3VudD10KX0sYm49KGUscix0KT0+e2U9ZS5yZXBsYWNlKC9wL2csImkiKTt2YXIgbj1mWyJkeW5DYWxsXyIrZV07cmV0dXJuIG4ociwuLi50KX0seGU9W10sanIsenI9ZT0+e3ZhciByPXhlW2VdO3JldHVybiByfHwoZT49eGUubGVuZ3RoJiYoeGUubGVuZ3RoPWUrMSkseGVbZV09cj1qci5nZXQoZSkpLHJ9LGtuPShlLHIsdD1bXSk9PntpZihlLmluY2x1ZGVzKCJqIikpcmV0dXJuIGJuKGUscix0KTt2YXIgbj16cihyKSguLi50KTtyZXR1cm4gbn0sUG49KGUscik9PiguLi50KT0+a24oZSxyLHQpLFc9KGUscik9PntlPWooZSk7ZnVuY3Rpb24gdCgpe3JldHVybiBlLmluY2x1ZGVzKCJqIik/UG4oZSxyKTp6cihyKX12YXIgbj10KCk7cmV0dXJuIHR5cGVvZiBuIT0iZnVuY3Rpb24iJiZrKGB1bmtub3duIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBzaWduYXR1cmUgJHtlfTogJHtyfWApLG59LEFuPShlLHIpPT57dmFyIHQ9VWUocixmdW5jdGlvbihuKXt0aGlzLm5hbWU9cix0aGlzLm1lc3NhZ2U9bjt2YXIgYT1uZXcgRXJyb3Iobikuc3RhY2s7YSE9PXZvaWQgMCYmKHRoaXMuc3RhY2s9dGhpcy50b1N0cmluZygpK2AKYCthLnJlcGxhY2UoL15FcnJvcig6W15cbl0qKT9cbi8sIiIpKX0pO3JldHVybiB0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVzc2FnZT09PXZvaWQgMD90aGlzLm5hbWU6YCR7dGhpcy5uYW1lfTogJHt0aGlzLm1lc3NhZ2V9YH0sdH0seHIsSHI9ZT0+e3ZhciByPWV0KGUpLHQ9aihyKTtyZXR1cm4gWihyKSx0fSxmZT0oZSxyKT0+e3ZhciB0PVtdLG49e307ZnVuY3Rpb24gYShpKXtpZighbltpXSYmIXVlW2ldKXtpZihPZVtpXSl7T2VbaV0uZm9yRWFjaChhKTtyZXR1cm59dC5wdXNoKGkpLG5baV09ITB9fXRocm93IHIuZm9yRWFjaChhKSxuZXcgeHIoYCR7ZX06IGArdC5tYXAoSHIpLmpvaW4oWyIsICJdKSl9LERuPShlLHIsdCxuLGEsaSxzLGwsdSxjLGQsbSxoKT0+e2Q9aihkKSxpPVcoYSxpKSxsJiYobD1XKHMsbCkpLGMmJihjPVcodSxjKSksaD1XKG0saCk7dmFyIHA9cG4oZCk7VnIocCxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLFtuXSl9KSxOKFtlLHIsdF0sbj9bbl06W10sdz0+e3ZhciBPO3c9d1swXTt2YXIgRCxNO24/KEQ9dy5yZWdpc3RlcmVkQ2xhc3MsTT1ELmluc3RhbmNlUHJvdG90eXBlKTpNPVZlLnByb3RvdHlwZTt2YXIgRj1VZShkLGZ1bmN0aW9uKC4uLnZyKXtpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykhPT12KXRocm93IG5ldyBtZSgiVXNlICduZXcnIHRvIGNvbnN0cnVjdCAiK2QpO2lmKF8uY29uc3RydWN0b3JfYm9keT09PXZvaWQgMCl0aHJvdyBuZXcgbWUoZCsiIGhhcyBubyBhY2Nlc3NpYmxlIGNvbnN0cnVjdG9yIik7dmFyIG90PV8uY29uc3RydWN0b3JfYm9keVt2ci5sZW5ndGhdO2lmKG90PT09dm9pZCAwKXRocm93IG5ldyBtZShgVHJpZWQgdG8gaW52b2tlIGN0b3Igb2YgJHtkfSB3aXRoIGludmFsaWQgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCR7dnIubGVuZ3RofSkgLSBleHBlY3RlZCAoJHtPYmplY3Qua2V5cyhfLmNvbnN0cnVjdG9yX2JvZHkpLnRvU3RyaW5nKCl9KSBwYXJhbWV0ZXJzIGluc3RlYWQhYCk7cmV0dXJuIG90LmFwcGx5KHRoaXMsdnIpfSksdj1PYmplY3QuY3JlYXRlKE0se2NvbnN0cnVjdG9yOnt2YWx1ZTpGfX0pO0YucHJvdG90eXBlPXY7dmFyIF89bmV3IF9uKGQsRix2LGgsRCxpLGwsYyk7Xy5iYXNlQ2xhc3MmJigoTz1fLmJhc2VDbGFzcykuX19kZXJpdmVkQ2xhc3Nlcz8/KE8uX19kZXJpdmVkQ2xhc3Nlcz1bXSksXy5iYXNlQ2xhc3MuX19kZXJpdmVkQ2xhc3Nlcy5wdXNoKF8pKTt2YXIgTD1uZXcgemUoZCxfLCEwLCExLCExKSxUPW5ldyB6ZShkKyIqIixfLCExLCExLCExKSxCPW5ldyB6ZShkKyIgY29uc3QqIixfLCExLCEwLCExKTtyZXR1cm4gTHJbZV09e3BvaW50ZXJUeXBlOlQsY29uc3RQb2ludGVyVHlwZTpCfSxVcihwLEYpLFtMLFQsQl19KX07ZnVuY3Rpb24gV3IoZSl7Zm9yKHZhciByPTE7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXSE9PW51bGwmJmVbcl0uZGVzdHJ1Y3RvckZ1bmN0aW9uPT09dm9pZCAwKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uICRuKGUscil7aWYoIShlIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoYG5ld18gY2FsbGVkIHdpdGggY29uc3RydWN0b3IgdHlwZSAke3R5cGVvZiBlfSB3aGljaCBpcyBub3QgYSBmdW5jdGlvbmApO3ZhciB0PVVlKGUubmFtZXx8InVua25vd25GdW5jdGlvbk5hbWUiLGZ1bmN0aW9uKCl7fSk7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU7dmFyIG49bmV3IHQsYT1lLmFwcGx5KG4scik7cmV0dXJuIGEgaW5zdGFuY2VvZiBPYmplY3Q/YTpufWZ1bmN0aW9uIENuKGUscix0LG4pe2Zvcih2YXIgYT1XcihlKSxpPWUubGVuZ3RoLHM9IiIsbD0iIix1PTA7dTxpLTI7Kyt1KXMrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1LGwrPSh1IT09MD8iLCAiOiIiKSsiYXJnIit1KyJXaXJlZCI7dmFyIGM9YAogICAgICAgIHJldHVybiBmdW5jdGlvbiAoJHtzfSkgewogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAke2ktMn0pIHsKICAgICAgICAgIHRocm93QmluZGluZ0Vycm9yKCdmdW5jdGlvbiAnICsgaHVtYW5OYW1lICsgJyBjYWxsZWQgd2l0aCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLCBleHBlY3RlZCAke2ktMn0nKTsKICAgICAgICB9YDthJiYoYys9YHZhciBkZXN0cnVjdG9ycyA9IFtdOwpgKTt2YXIgZD1hPyJkZXN0cnVjdG9ycyI6Im51bGwiLG09WyJodW1hbk5hbWUiLCJ0aHJvd0JpbmRpbmdFcnJvciIsImludm9rZXIiLCJmbiIsInJ1bkRlc3RydWN0b3JzIiwicmV0VHlwZSIsImNsYXNzUGFyYW0iXTtyJiYoYys9InZhciB0aGlzV2lyZWQgPSBjbGFzc1BhcmFtWyd0b1dpcmVUeXBlJ10oIitkK2AsIHRoaXMpOwpgKTtmb3IodmFyIHU9MDt1PGktMjsrK3UpYys9InZhciBhcmciK3UrIldpcmVkID0gYXJnVHlwZSIrdSsiWyd0b1dpcmVUeXBlJ10oIitkKyIsIGFyZyIrdStgKTsKYCxtLnB1c2goImFyZ1R5cGUiK3UpO2lmKHImJihsPSJ0aGlzV2lyZWQiKyhsLmxlbmd0aD4wPyIsICI6IiIpK2wpLGMrPSh0fHxuPyJ2YXIgcnYgPSAiOiIiKSsiaW52b2tlcihmbiIrKGwubGVuZ3RoPjA/IiwgIjoiIikrbCtgKTsKYCxhKWMrPWBydW5EZXN0cnVjdG9ycyhkZXN0cnVjdG9ycyk7CmA7ZWxzZSBmb3IodmFyIHU9cj8xOjI7dTxlLmxlbmd0aDsrK3Upe3ZhciBoPXU9PT0xPyJ0aGlzV2lyZWQiOiJhcmciKyh1LTIpKyJXaXJlZCI7ZVt1XS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiYoYys9YCR7aH1fZHRvcigke2h9KTsKYCxtLnB1c2goYCR7aH1fZHRvcmApKX1yZXR1cm4gdCYmKGMrPWB2YXIgcmV0ID0gcmV0VHlwZVsnZnJvbVdpcmVUeXBlJ10ocnYpOwpyZXR1cm4gcmV0OwpgKSxjKz1gfQpgLFttLGNdfWZ1bmN0aW9uIEhlKGUscix0LG4sYSxpKXt2YXIgcz1yLmxlbmd0aDtzPDImJmsoImFyZ1R5cGVzIGFycmF5IHNpemUgbWlzbWF0Y2ghIE11c3QgYXQgbGVhc3QgZ2V0IHJldHVybiB2YWx1ZSBhbmQgJ3RoaXMnIHR5cGVzISIpO2Zvcih2YXIgbD1yWzFdIT09bnVsbCYmdCE9PW51bGwsdT1XcihyKSxjPXJbMF0ubmFtZSE9PSJ2b2lkIixkPVtlLGssbixhLHJyLHJbMF0sclsxXV0sbT0wO208cy0yOysrbSlkLnB1c2goclttKzJdKTtpZighdSlmb3IodmFyIG09bD8xOjI7bTxyLmxlbmd0aDsrK20pclttXS5kZXN0cnVjdG9yRnVuY3Rpb24hPT1udWxsJiZkLnB1c2goclttXS5kZXN0cnVjdG9yRnVuY3Rpb24pO2xldFtoLHBdPUNuKHIsbCxjLGkpO2gucHVzaChwKTt2YXIgdz0kbihGdW5jdGlvbixoKSguLi5kKTtyZXR1cm4gVWUoZSx3KX12YXIgV2U9KGUscik9Pntmb3IodmFyIHQ9W10sbj0wO248ZTtuKyspdC5wdXNoKEFbcituKjQ+PjJdKTtyZXR1cm4gdH0saXI9ZT0+e2U9ZS50cmltKCk7Y29uc3Qgcj1lLmluZGV4T2YoIigiKTtyZXR1cm4gciE9PS0xP2Uuc3Vic3RyKDAscik6ZX0sRm49KGUscix0LG4sYSxpLHMsbCk9Pnt2YXIgdT1XZSh0LG4pO3I9aihyKSxyPWlyKHIpLGk9VyhhLGkpLE4oW10sW2VdLGM9PntjPWNbMF07dmFyIGQ9YCR7Yy5uYW1lfS4ke3J9YDtmdW5jdGlvbiBtKCl7ZmUoYENhbm5vdCBjYWxsICR7ZH0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLHUpfXIuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSk7dmFyIGg9Yy5yZWdpc3RlcmVkQ2xhc3MuY29uc3RydWN0b3I7cmV0dXJuIGhbcl09PT12b2lkIDA/KG0uYXJnQ291bnQ9dC0xLGhbcl09bSk6KG9yKGgscixkKSxoW3JdLm92ZXJsb2FkVGFibGVbdC0xXT1tKSxOKFtdLHUscD0+e3ZhciB3PVtwWzBdLG51bGxdLmNvbmNhdChwLnNsaWNlKDEpKSxEPUhlKGQsdyxudWxsLGkscyxsKTtpZihoW3JdLm92ZXJsb2FkVGFibGU9PT12b2lkIDA/KEQuYXJnQ291bnQ9dC0xLGhbcl09RCk6aFtyXS5vdmVybG9hZFRhYmxlW3QtMV09RCxjLnJlZ2lzdGVyZWRDbGFzcy5fX2Rlcml2ZWRDbGFzc2VzKWZvcihjb25zdCBNIG9mIGMucmVnaXN0ZXJlZENsYXNzLl9fZGVyaXZlZENsYXNzZXMpTS5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShyKXx8KE0uY29uc3RydWN0b3Jbcl09RCk7cmV0dXJuW119KSxbXX0pfSxUbj0oZSxyLHQsbixhLGkpPT57dmFyIHM9V2Uocix0KTthPVcobixhKSxOKFtdLFtlXSxsPT57bD1sWzBdO3ZhciB1PWBjb25zdHJ1Y3RvciAke2wubmFtZX1gO2lmKGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHk9PT12b2lkIDAmJihsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5PVtdKSxsLnJlZ2lzdGVyZWRDbGFzcy5jb25zdHJ1Y3Rvcl9ib2R5W3ItMV0hPT12b2lkIDApdGhyb3cgbmV3IG1lKGBDYW5ub3QgcmVnaXN0ZXIgbXVsdGlwbGUgY29uc3RydWN0b3JzIHdpdGggaWRlbnRpY2FsIG51bWJlciBvZiBwYXJhbWV0ZXJzICgke3ItMX0pIGZvciBjbGFzcyAnJHtsLm5hbWV9JyEgT3ZlcmxvYWQgcmVzb2x1dGlvbiBpcyBjdXJyZW50bHkgb25seSBwZXJmb3JtZWQgdXNpbmcgdGhlIHBhcmFtZXRlciBjb3VudCwgbm90IGFjdHVhbCB0eXBlIGluZm8hYCk7cmV0dXJuIGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT0oKT0+e2ZlKGBDYW5ub3QgY29uc3RydWN0ICR7bC5uYW1lfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2Ascyl9LE4oW10scyxjPT4oYy5zcGxpY2UoMSwwLG51bGwpLGwucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yX2JvZHlbci0xXT1IZSh1LGMsbnVsbCxhLGkpLFtdKSksW119KX0sU249KGUscix0LG4sYSxpLHMsbCx1KT0+e3ZhciBjPVdlKHQsbik7cj1qKHIpLHI9aXIociksaT1XKGEsaSksTihbXSxbZV0sZD0+e2Q9ZFswXTt2YXIgbT1gJHtkLm5hbWV9LiR7cn1gO3Iuc3RhcnRzV2l0aCgiQEAiKSYmKHI9U3ltYm9sW3Iuc3Vic3RyaW5nKDIpXSksbCYmZC5yZWdpc3RlcmVkQ2xhc3MucHVyZVZpcnR1YWxGdW5jdGlvbnMucHVzaChyKTtmdW5jdGlvbiBoKCl7ZmUoYENhbm5vdCBjYWxsICR7bX0gZHVlIHRvIHVuYm91bmQgdHlwZXNgLGMpfXZhciBwPWQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHc9cFtyXTtyZXR1cm4gdz09PXZvaWQgMHx8dy5vdmVybG9hZFRhYmxlPT09dm9pZCAwJiZ3LmNsYXNzTmFtZSE9PWQubmFtZSYmdy5hcmdDb3VudD09PXQtMj8oaC5hcmdDb3VudD10LTIsaC5jbGFzc05hbWU9ZC5uYW1lLHBbcl09aCk6KG9yKHAscixtKSxwW3JdLm92ZXJsb2FkVGFibGVbdC0yXT1oKSxOKFtdLGMsRD0+e3ZhciBNPUhlKG0sRCxkLGkscyx1KTtyZXR1cm4gcFtyXS5vdmVybG9hZFRhYmxlPT09dm9pZCAwPyhNLmFyZ0NvdW50PXQtMixwW3JdPU0pOnBbcl0ub3ZlcmxvYWRUYWJsZVt0LTJdPU0sW119KSxbXX0pfSxCcj0oZSxyLHQpPT4oZSBpbnN0YW5jZW9mIE9iamVjdHx8ayhgJHt0fSB3aXRoIGludmFsaWQgInRoaXMiOiAke2V9YCksZSBpbnN0YW5jZW9mIHIucmVnaXN0ZXJlZENsYXNzLmNvbnN0cnVjdG9yfHxrKGAke3R9IGluY29tcGF0aWJsZSB3aXRoICJ0aGlzIiBvZiB0eXBlICR7ZS5jb25zdHJ1Y3Rvci5uYW1lfWApLGUuJCQucHRyfHxrKGBjYW5ub3QgY2FsbCBlbXNjcmlwdGVuIGJpbmRpbmcgbWV0aG9kICR7dH0gb24gZGVsZXRlZCBvYmplY3RgKSxqZShlLiQkLnB0cixlLiQkLnB0clR5cGUucmVnaXN0ZXJlZENsYXNzLHIucmVnaXN0ZXJlZENsYXNzKSksTW49KGUscix0LG4sYSxpLHMsbCx1LGMpPT57cj1qKHIpLGE9VyhuLGEpLE4oW10sW2VdLGQ9PntkPWRbMF07dmFyIG09YCR7ZC5uYW1lfS4ke3J9YCxoPXtnZXQoKXtmZShgQ2Fubm90IGFjY2VzcyAke219IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxbdCxzXSl9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtyZXR1cm4gdT9oLnNldD0oKT0+ZmUoYENhbm5vdCBhY2Nlc3MgJHttfSBkdWUgdG8gdW5ib3VuZCB0eXBlc2AsW3Qsc10pOmguc2V0PXA9PmsobSsiIGlzIGEgcmVhZC1vbmx5IHByb3BlcnR5IiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQucmVnaXN0ZXJlZENsYXNzLmluc3RhbmNlUHJvdG90eXBlLHIsaCksTihbXSx1P1t0LHNdOlt0XSxwPT57dmFyIHc9cFswXSxEPXtnZXQoKXt2YXIgRj1Ccih0aGlzLGQsbSsiIGdldHRlciIpO3JldHVybiB3LmZyb21XaXJlVHlwZShhKGksRikpfSxlbnVtZXJhYmxlOiEwfTtpZih1KXt1PVcobCx1KTt2YXIgTT1wWzFdO0Quc2V0PWZ1bmN0aW9uKEYpe3ZhciB2PUJyKHRoaXMsZCxtKyIgc2V0dGVyIiksXz1bXTt1KGMsdixNLnRvV2lyZVR5cGUoXyxGKSkscnIoXyl9fXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZC5yZWdpc3RlcmVkQ2xhc3MuaW5zdGFuY2VQcm90b3R5cGUscixEKSxbXX0pLFtdfSl9LHNyPVtdLHJlPVtdLE5yPWU9PntlPjkmJi0tcmVbZSsxXT09PTAmJihyZVtlXT12b2lkIDAsc3IucHVzaChlKSl9LFJuPSgpPT5yZS5sZW5ndGgvMi01LXNyLmxlbmd0aCxPbj0oKT0+e3JlLnB1c2goMCwxLHZvaWQgMCwxLG51bGwsMSwhMCwxLCExLDEpLGYuY291bnRfZW12YWxfaGFuZGxlcz1Sbn0sdGU9e3RvVmFsdWU6ZT0+KGV8fGsoIkNhbm5vdCB1c2UgZGVsZXRlZCB2YWwuIGhhbmRsZSA9ICIrZSkscmVbZV0pLHRvSGFuZGxlOmU9Pntzd2l0Y2goZSl7Y2FzZSB2b2lkIDA6cmV0dXJuIDI7Y2FzZSBudWxsOnJldHVybiA0O2Nhc2UhMDpyZXR1cm4gNjtjYXNlITE6cmV0dXJuIDg7ZGVmYXVsdDp7Y29uc3Qgcj1zci5wb3AoKXx8cmUubGVuZ3RoO3JldHVybiByZVtyXT1lLHJlW3IrMV09MSxyfX19fSxJbj17bmFtZToiZW1zY3JpcHRlbjo6dmFsIixmcm9tV2lyZVR5cGU6ZT0+e3ZhciByPXRlLnRvVmFsdWUoZSk7cmV0dXJuIE5yKGUpLHJ9LHRvV2lyZVR5cGU6KGUscik9PnRlLnRvSGFuZGxlKHIpLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6eWUsZGVzdHJ1Y3RvckZ1bmN0aW9uOm51bGx9LFlyPWU9PksoZSxJbiksbHI9ZT0+e2lmKGU9PT1udWxsKXJldHVybiJudWxsIjt2YXIgcj10eXBlb2YgZTtyZXR1cm4gcj09PSJvYmplY3QifHxyPT09ImFycmF5Inx8cj09PSJmdW5jdGlvbiI/ZS50b1N0cmluZygpOiIiK2V9LExuPShlLHIpPT57c3dpdGNoKHIpe2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZnJvbVdpcmVUeXBlKGdyW3Q+PjJdKX07Y2FzZSA4OnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mcm9tV2lyZVR5cGUoeXJbdD4+M10pfTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgZmxvYXQgd2lkdGggKCR7cn0pOiAke2V9YCl9fSxWbj0oZSxyLHQpPT57cj1qKHIpLEsoZSx7bmFtZTpyLGZyb21XaXJlVHlwZTpuPT5uLHRvV2lyZVR5cGU6KG4sYSk9PmEsYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjpMbihyLHQpLGRlc3RydWN0b3JGdW5jdGlvbjpudWxsfSl9LFVuPShlLHIsdCxuLGEsaSxzKT0+e3ZhciBsPVdlKHIsdCk7ZT1qKGUpLGU9aXIoZSksYT1XKG4sYSksVnIoZSxmdW5jdGlvbigpe2ZlKGBDYW5ub3QgY2FsbCAke2V9IGR1ZSB0byB1bmJvdW5kIHR5cGVzYCxsKX0sci0xKSxOKFtdLGwsdT0+e3ZhciBjPVt1WzBdLG51bGxdLmNvbmNhdCh1LnNsaWNlKDEpKTtyZXR1cm4gVXIoZSxIZShlLGMsbnVsbCxhLGkscyksci0xKSxbXX0pfSxqbj0oZSxyLHQpPT57c3dpdGNoKHIpe2Nhc2UgMTpyZXR1cm4gdD9uPT5JW25dOm49Pnhbbl07Y2FzZSAyOnJldHVybiB0P249Pllbbj4+MV06bj0+Q2Vbbj4+MV07Y2FzZSA0OnJldHVybiB0P249Pmdbbj4+Ml06bj0+QVtuPj4yXTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgaW50ZWdlciB3aWR0aCAoJHtyfSk6ICR7ZX1gKX19LHpuPShlLHIsdCxuLGEpPT57cj1qKHIpO3ZhciBpPWQ9PmQ7aWYobj09PTApe3ZhciBzPTMyLTgqdDtpPWQ9PmQ8PHM+Pj5zfXZhciBsPXIuaW5jbHVkZXMoInVuc2lnbmVkIiksdT0oZCxtKT0+e30sYztsP2M9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbT4+PjB9OmM9ZnVuY3Rpb24oZCxtKXtyZXR1cm4gdShtLHRoaXMubmFtZSksbX0sSyhlLHtuYW1lOnIsZnJvbVdpcmVUeXBlOmksdG9XaXJlVHlwZTpjLGFyZ1BhY2tBZHZhbmNlOkoscmVhZFZhbHVlRnJvbVBvaW50ZXI6am4ocix0LG4hPT0wKSxkZXN0cnVjdG9yRnVuY3Rpb246bnVsbH0pfSx4bj0oZSxyLHQpPT57dmFyIG49W0ludDhBcnJheSxVaW50OEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5XSxhPW5bcl07ZnVuY3Rpb24gaShzKXt2YXIgbD1BW3M+PjJdLHU9QVtzKzQ+PjJdO3JldHVybiBuZXcgYShJLmJ1ZmZlcix1LGwpfXQ9aih0KSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6aSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOml9LHtpZ25vcmVEdXBsaWNhdGVSZWdpc3RyYXRpb25zOiEwfSl9LEhuPShlLHIpPT57WXIoZSl9LFduPShlLHIpPT57cj1qKHIpO3ZhciB0PXI9PT0ic3RkOjpzdHJpbmciO0soZSx7bmFtZTpyLGZyb21XaXJlVHlwZShuKXt2YXIgYT1BW24+PjJdLGk9bis0LHM7aWYodClmb3IodmFyIGw9aSx1PTA7dTw9YTsrK3Upe3ZhciBjPWkrdTtpZih1PT1hfHx4W2NdPT0wKXt2YXIgZD1jLWwsbT1zZShsLGQpO3M9PT12b2lkIDA/cz1tOihzKz0iXDAiLHMrPW0pLGw9YysxfX1lbHNle2Zvcih2YXIgaD1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3UpaFt1XT1TdHJpbmcuZnJvbUNoYXJDb2RlKHhbaSt1XSk7cz1oLmpvaW4oIiIpfXJldHVybiBaKG4pLHN9LHRvV2lyZVR5cGUobixhKXthIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihhPW5ldyBVaW50OEFycmF5KGEpKTt2YXIgaSxzPXR5cGVvZiBhPT0ic3RyaW5nIjtzfHxhIGluc3RhbmNlb2YgVWludDhBcnJheXx8YSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5fHxhIGluc3RhbmNlb2YgSW50OEFycmF5fHxrKCJDYW5ub3QgcGFzcyBub24tc3RyaW5nIHRvIHN0ZDo6c3RyaW5nIiksdCYmcz9pPVplKGEpOmk9YS5sZW5ndGg7dmFyIGw9ZnIoNCtpKzEpLHU9bCs0O2lmKEFbbD4+Ml09aSx0JiZzKXZlKGEsdSxpKzEpO2Vsc2UgaWYocylmb3IodmFyIGM9MDtjPGk7KytjKXt2YXIgZD1hLmNoYXJDb2RlQXQoYyk7ZD4yNTUmJihaKHUpLGsoIlN0cmluZyBoYXMgVVRGLTE2IGNvZGUgdW5pdHMgdGhhdCBkbyBub3QgZml0IGluIDggYml0cyIpKSx4W3UrY109ZH1lbHNlIGZvcih2YXIgYz0wO2M8aTsrK2MpeFt1K2NdPWFbY107cmV0dXJuIG4hPT1udWxsJiZuLnB1c2goWixsKSxsfSxhcmdQYWNrQWR2YW5jZTpKLHJlYWRWYWx1ZUZyb21Qb2ludGVyOnllLGRlc3RydWN0b3JGdW5jdGlvbihuKXtaKG4pfX0pfSxHcj10eXBlb2YgVGV4dERlY29kZXI8InUiP25ldyBUZXh0RGVjb2RlcigidXRmLTE2bGUiKTp2b2lkIDAsQm49KGUscik9Pntmb3IodmFyIHQ9ZSxuPXQ+PjEsYT1uK3IvMjshKG4+PWEpJiZDZVtuXTspKytuO2lmKHQ9bjw8MSx0LWU+MzImJkdyKXJldHVybiBHci5kZWNvZGUoeC5zdWJhcnJheShlLHQpKTtmb3IodmFyIGk9IiIscz0wOyEocz49ci8yKTsrK3Mpe3ZhciBsPVlbZStzKjI+PjFdO2lmKGw9PTApYnJlYWs7aSs9U3RyaW5nLmZyb21DaGFyQ29kZShsKX1yZXR1cm4gaX0sTm49KGUscix0KT0+e2lmKHQ/Pyh0PTIxNDc0ODM2NDcpLHQ8MilyZXR1cm4gMDt0LT0yO2Zvcih2YXIgbj1yLGE9dDxlLmxlbmd0aCoyP3QvMjplLmxlbmd0aCxpPTA7aTxhOysraSl7dmFyIHM9ZS5jaGFyQ29kZUF0KGkpO1lbcj4+MV09cyxyKz0yfXJldHVybiBZW3I+PjFdPTAsci1ufSxZbj1lPT5lLmxlbmd0aCoyLEduPShlLHIpPT57Zm9yKHZhciB0PTAsbj0iIjshKHQ+PXIvNCk7KXt2YXIgYT1nW2UrdCo0Pj4yXTtpZihhPT0wKWJyZWFrO2lmKCsrdCxhPj02NTUzNil7dmFyIGk9YS02NTUzNjtuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fGk+PjEwLDU2MzIwfGkmMTAyMyl9ZWxzZSBuKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGEpfXJldHVybiBufSxxbj0oZSxyLHQpPT57aWYodD8/KHQ9MjE0NzQ4MzY0NyksdDw0KXJldHVybiAwO2Zvcih2YXIgbj1yLGE9bit0LTQsaT0wO2k8ZS5sZW5ndGg7KytpKXt2YXIgcz1lLmNoYXJDb2RlQXQoaSk7aWYocz49NTUyOTYmJnM8PTU3MzQzKXt2YXIgbD1lLmNoYXJDb2RlQXQoKytpKTtzPTY1NTM2KygocyYxMDIzKTw8MTApfGwmMTAyM31pZihnW3I+PjJdPXMscis9NCxyKzQ+YSlicmVha31yZXR1cm4gZ1tyPj4yXT0wLHItbn0sWG49ZT0+e2Zvcih2YXIgcj0wLHQ9MDt0PGUubGVuZ3RoOysrdCl7dmFyIG49ZS5jaGFyQ29kZUF0KHQpO24+PTU1Mjk2JiZuPD01NzM0MyYmKyt0LHIrPTR9cmV0dXJuIHJ9LEtuPShlLHIsdCk9Pnt0PWoodCk7dmFyIG4sYSxpLHM7cj09PTI/KG49Qm4sYT1ObixzPVluLGk9bD0+Q2VbbD4+MV0pOnI9PT00JiYobj1HbixhPXFuLHM9WG4saT1sPT5BW2w+PjJdKSxLKGUse25hbWU6dCxmcm9tV2lyZVR5cGU6bD0+e2Zvcih2YXIgdT1BW2w+PjJdLGMsZD1sKzQsbT0wO208PXU7KyttKXt2YXIgaD1sKzQrbSpyO2lmKG09PXV8fGkoaCk9PTApe3ZhciBwPWgtZCx3PW4oZCxwKTtjPT09dm9pZCAwP2M9dzooYys9IlwwIixjKz13KSxkPWgrcn19cmV0dXJuIFoobCksY30sdG9XaXJlVHlwZToobCx1KT0+e3R5cGVvZiB1IT0ic3RyaW5nIiYmayhgQ2Fubm90IHBhc3Mgbm9uLXN0cmluZyB0byBDKysgc3RyaW5nIHR5cGUgJHt0fWApO3ZhciBjPXModSksZD1mcig0K2Mrcik7cmV0dXJuIEFbZD4+Ml09Yy9yLGEodSxkKzQsYytyKSxsIT09bnVsbCYmbC5wdXNoKFosZCksZH0sYXJnUGFja0FkdmFuY2U6SixyZWFkVmFsdWVGcm9tUG9pbnRlcjp5ZSxkZXN0cnVjdG9yRnVuY3Rpb24obCl7WihsKX19KX0sSm49KGUscix0LG4sYSxpKT0+e1JlW2VdPXtuYW1lOmoocikscmF3Q29uc3RydWN0b3I6Vyh0LG4pLHJhd0Rlc3RydWN0b3I6VyhhLGkpLGZpZWxkczpbXX19LFpuPShlLHIsdCxuLGEsaSxzLGwsdSxjKT0+e1JlW2VdLmZpZWxkcy5wdXNoKHtmaWVsZE5hbWU6aihyKSxnZXR0ZXJSZXR1cm5UeXBlOnQsZ2V0dGVyOlcobixhKSxnZXR0ZXJDb250ZXh0Omksc2V0dGVyQXJndW1lbnRUeXBlOnMsc2V0dGVyOlcobCx1KSxzZXR0ZXJDb250ZXh0OmN9KX0sUW49KGUscik9PntyPWoociksSyhlLHtpc1ZvaWQ6ITAsbmFtZTpyLGFyZ1BhY2tBZHZhbmNlOjAsZnJvbVdpcmVUeXBlOigpPT57fSx0b1dpcmVUeXBlOih0LG4pPT57fX0pfSxlYT0xLHJhPSgpPT5lYSx0YT0oZSxyLHQpPT54LmNvcHlXaXRoaW4oZSxyLHIrdCksbmE9KCk9PnRlLnRvSGFuZGxlKHt9KSxhYT0oZSxyLHQpPT57ZT10ZS50b1ZhbHVlKGUpLHI9dGUudG9WYWx1ZShyKSx0PXRlLnRvVmFsdWUodCksZVtyXT10fSxvYT0oZSxyKT0+e3ZhciB0PXVlW2VdO3JldHVybiB0PT09dm9pZCAwJiZrKGAke3J9IGhhcyB1bmtub3duIHR5cGUgJHtIcihlKX1gKSx0fSxpYT0oZSxyKT0+e2U9b2EoZSwiX2VtdmFsX3Rha2VfdmFsdWUiKTt2YXIgdD1lLnJlYWRWYWx1ZUZyb21Qb2ludGVyKHIpO3JldHVybiB0ZS50b0hhbmRsZSh0KX0scXI9KGUscik9PnIrMjA5NzE1Mj4+PjA8NDE5NDMwNS0hIWU/KGU+Pj4wKStyKjQyOTQ5NjcyOTY6TmFOO2Z1bmN0aW9uIHNhKGUscix0KXt2YXIgbj1xcihlLHIpLGE9bmV3IERhdGUobioxZTMpO2dbdD4+Ml09YS5nZXRVVENTZWNvbmRzKCksZ1t0KzQ+PjJdPWEuZ2V0VVRDTWludXRlcygpLGdbdCs4Pj4yXT1hLmdldFVUQ0hvdXJzKCksZ1t0KzEyPj4yXT1hLmdldFVUQ0RhdGUoKSxnW3QrMTY+PjJdPWEuZ2V0VVRDTW9udGgoKSxnW3QrMjA+PjJdPWEuZ2V0VVRDRnVsbFllYXIoKS0xOTAwLGdbdCsyND4+Ml09YS5nZXRVVENEYXkoKTt2YXIgaT1EYXRlLlVUQyhhLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApLHM9KGEuZ2V0VGltZSgpLWkpLygxZTMqNjAqNjAqMjQpfDA7Z1t0KzI4Pj4yXT1zfXZhciBCZT1lPT5lJTQ9PT0wJiYoZSUxMDAhPT0wfHxlJTQwMD09PTApLGxhPShlLHIsdCxuKT0+e3ZhciBhPW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxpPW5ldyBEYXRlKGEsMCwxKSxzPW5ldyBEYXRlKGEsNiwxKSxsPWkuZ2V0VGltZXpvbmVPZmZzZXQoKSx1PXMuZ2V0VGltZXpvbmVPZmZzZXQoKSxjPU1hdGgubWF4KGwsdSk7QVtlPj4yXT1jKjYwLGdbcj4+Ml09KyhsIT11KTt2YXIgZD1wPT5wLnRvTG9jYWxlVGltZVN0cmluZyh2b2lkIDAse2hvdXIxMjohMSx0aW1lWm9uZU5hbWU6InNob3J0In0pLnNwbGl0KCIgIilbMV0sbT1kKGkpLGg9ZChzKTt1PGw/KHZlKG0sdCwxNyksdmUoaCxuLDE3KSk6KHZlKG0sbiwxNyksdmUoaCx0LDE3KSl9LHVhPSgpPT5EYXRlLm5vdygpLFhyPSgpPT4yMTQ3NDgzNjQ4LGZhPSgpPT5YcigpLEtyO0tyPSgpPT5wZXJmb3JtYW5jZS5ub3coKTt2YXIgY2E9ZT0+e3ZhciByPSRlLmJ1ZmZlcix0PShlLXIuYnl0ZUxlbmd0aCs2NTUzNSkvNjU1MzY7dHJ5e3JldHVybiAkZS5ncm93KHQpLHdyKCksMX1jYXRjaHt9fSxkYT1lPT57dmFyIHI9eC5sZW5ndGg7ZT4+Pj0wO3ZhciB0PVhyKCk7aWYoZT50KXJldHVybiExO2Zvcih2YXIgbj0odSxjKT0+dSsoYy11JWMpJWMsYT0xO2E8PTQ7YSo9Mil7dmFyIGk9ciooMSsuMi9hKTtpPU1hdGgubWluKGksZSsxMDA2NjMyOTYpO3ZhciBzPU1hdGgubWluKHQsbihNYXRoLm1heChlLGkpLDY1NTM2KSksbD1jYShzKTtpZihsKXJldHVybiEwfXJldHVybiExfSx1cj17fSx2YT0oKT0+aHJ8fCIuL3RoaXMucHJvZ3JhbSIsUGU9KCk9PntpZighUGUuc3RyaW5ncyl7dmFyIGU9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIscj17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmUsXzp2YSgpfTtmb3IodmFyIHQgaW4gdXIpdXJbdF09PT12b2lkIDA/ZGVsZXRlIHJbdF06clt0XT11clt0XTt2YXIgbj1bXTtmb3IodmFyIHQgaW4gciluLnB1c2goYCR7dH09JHtyW3RdfWApO1BlLnN0cmluZ3M9bn1yZXR1cm4gUGUuc3RyaW5nc30saGE9KGUscik9Pntmb3IodmFyIHQ9MDt0PGUubGVuZ3RoOysrdClJW3IrK109ZS5jaGFyQ29kZUF0KHQpO0lbcl09MH0sbWE9KGUscik9Pnt2YXIgdD0wO3JldHVybiBQZSgpLmZvckVhY2goKG4sYSk9Pnt2YXIgaT1yK3Q7QVtlK2EqND4+Ml09aSxoYShuLGkpLHQrPW4ubGVuZ3RoKzF9KSwwfSxwYT0oZSxyKT0+e3ZhciB0PVBlKCk7QVtlPj4yXT10Lmxlbmd0aDt2YXIgbj0wO3JldHVybiB0LmZvckVhY2goYT0+bis9YS5sZW5ndGgrMSksQVtyPj4yXT1uLDB9O2Z1bmN0aW9uIF9hKGUpe3RyeXt2YXIgcj1QLmdldFN0cmVhbUZyb21GRChlKTtyZXR1cm4gby5jbG9zZShyKSwwfWNhdGNoKHQpe2lmKHR5cGVvZiBvPiJ1Inx8dC5uYW1lIT09IkVycm5vRXJyb3IiKXRocm93IHQ7cmV0dXJuIHQuZXJybm99fWZ1bmN0aW9uIGdhKGUscil7dHJ5e3ZhciB0PTAsbj0wLGE9MCxpPVAuZ2V0U3RyZWFtRnJvbUZEKGUpLHM9aS50dHk/MjpvLmlzRGlyKGkubW9kZSk/MzpvLmlzTGluayhpLm1vZGUpPzc6NDtyZXR1cm4gSVtyXT1zLFlbcisyPj4xXT1hLCQ9W3Q+Pj4wLCh5PXQsK01hdGguYWJzKHkpPj0xP3k+MD8rTWF0aC5mbG9vcih5LzQyOTQ5NjcyOTYpPj4+MDp+fitNYXRoLmNlaWwoKHktKyh+fnk+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxnW3IrOD4+Ml09JFswXSxnW3IrMTI+PjJdPSRbMV0sJD1bbj4+PjAsKHk9biwrTWF0aC5hYnMoeSk+PTE/eT4wPytNYXRoLmZsb29yKHkvNDI5NDk2NzI5Nik+Pj4wOn5+K01hdGguY2VpbCgoeS0rKH5+eT4+PjApKS80Mjk0OTY3Mjk2KT4+PjA6MCldLGdbcisxNj4+Ml09JFswXSxnW3IrMjA+PjJdPSRbMV0sMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgeWE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLnJlYWQoZSxJLHMsbCxuKTtpZih1PDApcmV0dXJuLTE7aWYoYSs9dSx1PGwpYnJlYWt9cmV0dXJuIGF9O2Z1bmN0aW9uIHdhKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPXlhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319ZnVuY3Rpb24gRWEoZSxyLHQsbixhKXt2YXIgaT1xcihyLHQpO3RyeXtpZihpc05hTihpKSlyZXR1cm4gNjE7dmFyIHM9UC5nZXRTdHJlYW1Gcm9tRkQoZSk7cmV0dXJuIG8ubGxzZWVrKHMsaSxuKSwkPVtzLnBvc2l0aW9uPj4+MCwoeT1zLnBvc2l0aW9uLCtNYXRoLmFicyh5KT49MT95PjA/K01hdGguZmxvb3IoeS80Mjk0OTY3Mjk2KT4+PjA6fn4rTWF0aC5jZWlsKCh5LSsofn55Pj4+MCkpLzQyOTQ5NjcyOTYpPj4+MDowKV0sZ1thPj4yXT0kWzBdLGdbYSs0Pj4yXT0kWzFdLHMuZ2V0ZGVudHMmJmk9PT0wJiZuPT09MCYmKHMuZ2V0ZGVudHM9bnVsbCksMH1jYXRjaChsKXtpZih0eXBlb2Ygbz4idSJ8fGwubmFtZSE9PSJFcnJub0Vycm9yIil0aHJvdyBsO3JldHVybiBsLmVycm5vfX12YXIgYmE9KGUscix0LG4pPT57Zm9yKHZhciBhPTAsaT0wO2k8dDtpKyspe3ZhciBzPUFbcj4+Ml0sbD1BW3IrND4+Ml07cis9ODt2YXIgdT1vLndyaXRlKGUsSSxzLGwsbik7aWYodTwwKXJldHVybi0xO2ErPXV9cmV0dXJuIGF9O2Z1bmN0aW9uIGthKGUscix0LG4pe3RyeXt2YXIgYT1QLmdldFN0cmVhbUZyb21GRChlKSxpPWJhKGEscix0KTtyZXR1cm4gQVtuPj4yXT1pLDB9Y2F0Y2gocyl7aWYodHlwZW9mIG8+InUifHxzLm5hbWUhPT0iRXJybm9FcnJvciIpdGhyb3cgcztyZXR1cm4gcy5lcnJub319dmFyIFBhPShlLHIpPT57Zm9yKHZhciB0PTAsbj0wO248PXI7dCs9ZVtuKytdKTtyZXR1cm4gdH0sSnI9WzMxLDI5LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXSxacj1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdLEFhPShlLHIpPT57Zm9yKHZhciB0PW5ldyBEYXRlKGUuZ2V0VGltZSgpKTtyPjA7KXt2YXIgbj1CZSh0LmdldEZ1bGxZZWFyKCkpLGE9dC5nZXRNb250aCgpLGk9KG4/SnI6WnIpW2FdO2lmKHI+aS10LmdldERhdGUoKSlyLT1pLXQuZ2V0RGF0ZSgpKzEsdC5zZXREYXRlKDEpLGE8MTE/dC5zZXRNb250aChhKzEpOih0LnNldE1vbnRoKDApLHQuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpKzEpKTtlbHNlIHJldHVybiB0LnNldERhdGUodC5nZXREYXRlKCkrciksdH1yZXR1cm4gdH0sRGE9KGUscik9PntJLnNldChlLHIpfSxRcj0oZSxyLHQsbik9Pnt2YXIgYT1BW24rNDA+PjJdLGk9e3RtX3NlYzpnW24+PjJdLHRtX21pbjpnW24rND4+Ml0sdG1faG91cjpnW24rOD4+Ml0sdG1fbWRheTpnW24rMTI+PjJdLHRtX21vbjpnW24rMTY+PjJdLHRtX3llYXI6Z1tuKzIwPj4yXSx0bV93ZGF5OmdbbisyND4+Ml0sdG1feWRheTpnW24rMjg+PjJdLHRtX2lzZHN0OmdbbiszMj4+Ml0sdG1fZ210b2ZmOmdbbiszNj4+Ml0sdG1fem9uZTphP3NlKGEpOiIifSxzPXNlKHQpLGw9eyIlYyI6IiVhICViICVkICVIOiVNOiVTICVZIiwiJUQiOiIlbS8lZC8leSIsIiVGIjoiJVktJW0tJWQiLCIlaCI6IiViIiwiJXIiOiIlSTolTTolUyAlcCIsIiVSIjoiJUg6JU0iLCIlVCI6IiVIOiVNOiVTIiwiJXgiOiIlbS8lZC8leSIsIiVYIjoiJUg6JU06JVMiLCIlRWMiOiIlYyIsIiVFQyI6IiVDIiwiJUV4IjoiJW0vJWQvJXkiLCIlRVgiOiIlSDolTTolUyIsIiVFeSI6IiV5IiwiJUVZIjoiJVkiLCIlT2QiOiIlZCIsIiVPZSI6IiVlIiwiJU9IIjoiJUgiLCIlT0kiOiIlSSIsIiVPbSI6IiVtIiwiJU9NIjoiJU0iLCIlT1MiOiIlUyIsIiVPdSI6IiV1IiwiJU9VIjoiJVUiLCIlT1YiOiIlViIsIiVPdyI6IiV3IiwiJU9XIjoiJVciLCIlT3kiOiIleSJ9O2Zvcih2YXIgdSBpbiBsKXM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLGxbdV0pO3ZhciBjPVsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXTtmdW5jdGlvbiBtKHYsXyxMKXtmb3IodmFyIFQ9dHlwZW9mIHY9PSJudW1iZXIiP3YudG9TdHJpbmcoKTp2fHwiIjtULmxlbmd0aDxfOylUPUxbMF0rVDtyZXR1cm4gVH1mdW5jdGlvbiBoKHYsXyl7cmV0dXJuIG0odixfLCIwIil9ZnVuY3Rpb24gcCh2LF8pe2Z1bmN0aW9uIEwoQil7cmV0dXJuIEI8MD8tMTpCPjA/MTowfXZhciBUO3JldHVybihUPUwodi5nZXRGdWxsWWVhcigpLV8uZ2V0RnVsbFllYXIoKSkpPT09MCYmKFQ9TCh2LmdldE1vbnRoKCktXy5nZXRNb250aCgpKSk9PT0wJiYoVD1MKHYuZ2V0RGF0ZSgpLV8uZ2V0RGF0ZSgpKSksVH1mdW5jdGlvbiB3KHYpe3N3aXRjaCh2LmdldERheSgpKXtjYXNlIDA6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKS0xLDExLDI5KTtjYXNlIDE6cmV0dXJuIHY7Y2FzZSAyOnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCksMCwzKTtjYXNlIDM6cmV0dXJuIG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwwLDIpO2Nhc2UgNDpyZXR1cm4gbmV3IERhdGUodi5nZXRGdWxsWWVhcigpLDAsMSk7Y2FzZSA1OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMSk7Y2FzZSA2OnJldHVybiBuZXcgRGF0ZSh2LmdldEZ1bGxZZWFyKCktMSwxMSwzMCl9fWZ1bmN0aW9uIEQodil7dmFyIF89QWEobmV3IERhdGUodi50bV95ZWFyKzE5MDAsMCwxKSx2LnRtX3lkYXkpLEw9bmV3IERhdGUoXy5nZXRGdWxsWWVhcigpLDAsNCksVD1uZXcgRGF0ZShfLmdldEZ1bGxZZWFyKCkrMSwwLDQpLEI9dyhMKSxPPXcoVCk7cmV0dXJuIHAoQixfKTw9MD9wKE8sXyk8PTA/Xy5nZXRGdWxsWWVhcigpKzE6Xy5nZXRGdWxsWWVhcigpOl8uZ2V0RnVsbFllYXIoKS0xfXZhciBNPXsiJWEiOnY9PmNbdi50bV93ZGF5XS5zdWJzdHJpbmcoMCwzKSwiJUEiOnY9PmNbdi50bV93ZGF5XSwiJWIiOnY9PmRbdi50bV9tb25dLnN1YnN0cmluZygwLDMpLCIlQiI6dj0+ZFt2LnRtX21vbl0sIiVDIjp2PT57dmFyIF89di50bV95ZWFyKzE5MDA7cmV0dXJuIGgoXy8xMDB8MCwyKX0sIiVkIjp2PT5oKHYudG1fbWRheSwyKSwiJWUiOnY9Pm0odi50bV9tZGF5LDIsIiAiKSwiJWciOnY9PkQodikudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVHIjpELCIlSCI6dj0+aCh2LnRtX2hvdXIsMiksIiVJIjp2PT57dmFyIF89di50bV9ob3VyO3JldHVybiBfPT0wP189MTI6Xz4xMiYmKF8tPTEyKSxoKF8sMil9LCIlaiI6dj0+aCh2LnRtX21kYXkrUGEoQmUodi50bV95ZWFyKzE5MDApP0pyOlpyLHYudG1fbW9uLTEpLDMpLCIlbSI6dj0+aCh2LnRtX21vbisxLDIpLCIlTSI6dj0+aCh2LnRtX21pbiwyKSwiJW4iOigpPT5gCmAsIiVwIjp2PT52LnRtX2hvdXI+PTAmJnYudG1faG91cjwxMj8iQU0iOiJQTSIsIiVTIjp2PT5oKHYudG1fc2VjLDIpLCIldCI6KCk9PiIJIiwiJXUiOnY9PnYudG1fd2RheXx8NywiJVUiOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy12LnRtX3dkYXk7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJVYiOnY9Pnt2YXIgXz1NYXRoLmZsb29yKCh2LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTcpLzcpO2lmKCh2LnRtX3dkYXkrMzcxLXYudG1feWRheS0yKSU3PD0yJiZfKyssXyl7aWYoXz09NTMpe3ZhciBUPSh2LnRtX3dkYXkrMzcxLXYudG1feWRheSklNztUIT00JiYoVCE9M3x8IUJlKHYudG1feWVhcikpJiYoXz0xKX19ZWxzZXtfPTUyO3ZhciBMPSh2LnRtX3dkYXkrNy12LnRtX3lkYXktMSklNzsoTD09NHx8TD09NSYmQmUodi50bV95ZWFyJTQwMC0xKSkmJl8rK31yZXR1cm4gaChfLDIpfSwiJXciOnY9PnYudG1fd2RheSwiJVciOnY9Pnt2YXIgXz12LnRtX3lkYXkrNy0odi50bV93ZGF5KzYpJTc7cmV0dXJuIGgoTWF0aC5mbG9vcihfLzcpLDIpfSwiJXkiOnY9Pih2LnRtX3llYXIrMTkwMCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksIiVZIjp2PT52LnRtX3llYXIrMTkwMCwiJXoiOnY9Pnt2YXIgXz12LnRtX2dtdG9mZixMPV8+PTA7cmV0dXJuIF89TWF0aC5hYnMoXykvNjAsXz1fLzYwKjEwMCtfJTYwLChMPyIrIjoiLSIpKygiMDAwMCIrXykuc2xpY2UoLTQpfSwiJVoiOnY9PnYudG1fem9uZSwiJSUiOigpPT4iJSJ9O3M9cy5yZXBsYWNlKC8lJS9nLCJcMFwwIik7Zm9yKHZhciB1IGluIE0pcy5pbmNsdWRlcyh1KSYmKHM9cy5yZXBsYWNlKG5ldyBSZWdFeHAodSwiZyIpLE1bdV0oaSkpKTtzPXMucmVwbGFjZSgvXDBcMC9nLCIlIik7dmFyIEY9U2UocywhMSk7cmV0dXJuIEYubGVuZ3RoPnI/MDooRGEoRixlKSxGLmxlbmd0aC0xKX0sJGE9KGUscix0LG4sYSk9PlFyKGUscix0LG4pO28uY3JlYXRlUHJlbG9hZGVkRmlsZT1WdCxvLnN0YXRpY0luaXQoKSxTcj1mLkludGVybmFsRXJyb3I9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyKXtzdXBlcihyKSx0aGlzLm5hbWU9IkludGVybmFsRXJyb3IifX0sZW4oKSxtZT1mLkJpbmRpbmdFcnJvcj1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHIpe3N1cGVyKHIpLHRoaXMubmFtZT0iQmluZGluZ0Vycm9yIn19LHZuKCksdW4oKSxFbigpLHhyPWYuVW5ib3VuZFR5cGVFcnJvcj1BbihFcnJvciwiVW5ib3VuZFR5cGVFcnJvciIpLE9uKCk7dmFyIENhPXtsOkN0LGM6VHQsVTpqdCxzOnp0LFI6eHQsSjpIdCxXOld0LE86QnQsUDpOdCxLOll0LEk6R3QsSDpxdCxROlh0LEU6S3QsVjpKdCxrOlp0LEI6UXQsWjp0bixoOkRuLHk6Rm4sajpUbixiOlNuLGE6TW4sWTpZcix3OlZuLGk6VW4sZjp6bixkOnhuLG06SG4sdjpXbix0OktuLG46Sm4sZTpabixfOlFuLFM6cmEsVDp0YSx4Ok5yLGFhOm5hLCQ6YWEsZzppYSx6OnNhLEY6bGEscDp1YSxHOmZhLG86S3IsRDpkYSxNOm1hLE46cGEscjpfYSxMOmdhLHU6d2EsQTpFYSxxOmthLFg6UXIsQzokYX0sej0kdCgpLGZyPWU9Pihmcj16LmRhKShlKSxldD1lPT4oZXQ9ei5mYSkoZSksWj1lPT4oWj16LmdhKShlKSxydD1lPT4ocnQ9ei5pYSkoZSk7Zi5keW5DYWxsX2ppamk9KGUscix0LG4sYSk9PihmLmR5bkNhbGxfamlqaT16LmphKShlLHIsdCxuLGEpLGYuZHluQ2FsbF9paWlqaT0oZSxyLHQsbixhLGkpPT4oZi5keW5DYWxsX2lpaWppPXoua2EpKGUscix0LG4sYSxpKSxmLmR5bkNhbGxfamlpaWo9KGUscix0LG4sYSxpKT0+KGYuZHluQ2FsbF9qaWlpaj16LmxhKShlLHIsdCxuLGEsaSksZi5keW5DYWxsX2lpaWlpaj0oZSxyLHQsbixhLGkscyk9PihmLmR5bkNhbGxfaWlpaWlqPXoubWEpKGUscix0LG4sYSxpLHMpLGYuZHluQ2FsbF92aWlqaWk9KGUscix0LG4sYSxpLHMpPT4oZi5keW5DYWxsX3ZpaWppaT16Lm5hKShlLHIsdCxuLGEsaSxzKSxmLmR5bkNhbGxfaWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUpPT4oZi5keW5DYWxsX2lpaWlpamo9ei5vYSkoZSxyLHQsbixhLGkscyxsLHUpLGYuZHluQ2FsbF9paWlpaWlqaj0oZSxyLHQsbixhLGkscyxsLHUsYyk9PihmLmR5bkNhbGxfaWlpaWlpamo9ei5wYSkoZSxyLHQsbixhLGkscyxsLHUsYyksZi5fZmZfaDI2NF9jYWJhY190YWJsZXM9MjA2ODEyO3ZhciBOZTtnZT1mdW5jdGlvbiBlKCl7TmV8fHR0KCksTmV8fChnZT1lKX07ZnVuY3Rpb24gdHQoKXtpZihvZT4wfHwocHQoKSxvZT4wKSlyZXR1cm47ZnVuY3Rpb24gZSgpe05lfHwoTmU9ITAsZi5jYWxsZWRSdW49ITAsIXByJiYoX3QoKSxVKGYpLGYub25SdW50aW1lSW5pdGlhbGl6ZWQmJmYub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxndCgpKSl9Zi5zZXRTdGF0dXM/KGYuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLnNldFN0YXR1cygiIil9LDEpLGUoKX0sMSkpOmUoKX1pZihmLnByZUluaXQpZm9yKHR5cGVvZiBmLnByZUluaXQ9PSJmdW5jdGlvbiImJihmLnByZUluaXQ9W2YucHJlSW5pdF0pO2YucHJlSW5pdC5sZW5ndGg+MDspZi5wcmVJbml0LnBvcCgpKCk7dHQoKTtsZXQgbnQ9MzI7ZnVuY3Rpb24gYXQoZSxyPTMsdD01MDApe2xldCBuPTA7Zm9yKDtuPHI7KXRyeXtyZXR1cm4gZSgpfWNhdGNoKGEpe2lmKG50Pj0yNCYmY29uc29sZS53YXJuKGBBdHRlbXB0ICR7bisxfSBmYWlsZWQ6ICR7YS5tZXNzYWdlfWApLG4rKyxuPj1yKXRocm93IG5ldyBFcnJvcihgRmFpbGVkIGFmdGVyICR7cn0gYXR0ZW1wdHNgKX19ZnVuY3Rpb24gRmEoZSl7Y29uc3Qgcj1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoci5vcGVuKCJIRUFEIixlLCExKSxyLnNlbmQoKSxyLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGdldEZpbGVTaXplIHJlcXVlc3QgZmFpbGVkOiAke2V9YCk7cmV0dXJuIHBhcnNlSW50KHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikpfWZ1bmN0aW9uIFRhKGUscix0KXtjb25zdCBuPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihuLm9wZW4oIkdFVCIsZSwhMSksbi5zZXRSZXF1ZXN0SGVhZGVyKCJSYW5nZSIsYGJ5dGVzPSR7cn0tJHtyK3QtMX1gKSxuLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIiLG4uc2VuZCgpLG4uc3RhdHVzIT09MjA2JiZuLnN0YXR1cyE9PTIwMCl0aHJvdyBuZXcgRXJyb3IoYGZldGNoQXJyYXlCdWZmZXIgcmVxdWVzdCBmYWlsZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZXNwb25zZX1jbGFzcyBwZXtjb25zdHJ1Y3RvcihyKXtsZXQgdDt0eXBlb2Ygcj09InN0cmluZyI/KHQ9bmV3IEZpbGUoW10sZW5jb2RlVVJJQ29tcG9uZW50KHIpKSxvLmZpbGVzeXN0ZW1zLldPUktFUkZTLnN0cmVhbV9vcHMucmVhZD1mdW5jdGlvbihhLGkscyxsLHUpe2NvbnN0IGM9ZGVjb2RlVVJJQ29tcG9uZW50KGEubm9kZS5jb250ZW50cy5uYW1lKTtpZihhLm5vZGUuc2l6ZT09PTAmJihhLm5vZGUuc2l6ZT1hdCgoKT0+RmEoYykpKSx1Pj1hLm5vZGUuc2l6ZSlyZXR1cm4gMDtjb25zdCBkPWF0KCgpPT5UYShjLHUsbCkpLG09ZC5ieXRlTGVuZ3RoO3JldHVybiBpLnNldChuZXcgVWludDhBcnJheShkKSxzKSxtfSk6dD1yLHRoaXMubW91bnRQb2ludD0iL2RhdGEiLHRoaXMubW91bnRPcHRzPXtmaWxlczpbdF19LHRoaXMuZmlsZVBhdGg9dGhpcy5tb3VudFBvaW50KyIvIit0Lm5hbWV9bW91bnQoKXtvLm1rZGlyKHRoaXMubW91bnRQb2ludCksby5tb3VudChvLmZpbGVzeXN0ZW1zLldPUktFUkZTLHRoaXMubW91bnRPcHRzLHRoaXMubW91bnRQb2ludCl9dW5tb3VudCgpe28udW5tb3VudCh0aGlzLm1vdW50UG9pbnQpLG8ucm1kaXIodGhpcy5tb3VudFBvaW50KX19ZnVuY3Rpb24gY3IoZSl7Y29uc3Qgcj1uZXcgVWludDhBcnJheShlLmV4dHJhZGF0YSksdD17aWQ6ZS5pZCxpbmRleDplLmluZGV4LGNvZGVjX3R5cGU6ZS5jb2RlY190eXBlLGNvZGVjX3R5cGVfc3RyaW5nOmUuY29kZWNfdHlwZV9zdHJpbmcsY29kZWNfbmFtZTplLmNvZGVjX25hbWUsY29kZWNfc3RyaW5nOmUuY29kZWNfc3RyaW5nLGNvbG9yX3ByaW1hcmllczplLmNvbG9yX3ByaW1hcmllcyxjb2xvcl90cmFuc2ZlcjplLmNvbG9yX3RyYW5zZmVyLGNvbG9yX3NwYWNlOmUuY29sb3Jfc3BhY2UsY29sb3JfcmFuZ2U6ZS5jb2xvcl9yYW5nZSxwcm9maWxlOmUucHJvZmlsZSxwaXhfZm10OmUucGl4X2ZtdCxsZXZlbDplLmxldmVsLHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGNoYW5uZWxzOmUuY2hhbm5lbHMsc2FtcGxlX3JhdGU6ZS5zYW1wbGVfcmF0ZSxzYW1wbGVfZm10OmUuc2FtcGxlX2ZtdCxiaXRfcmF0ZTplLmJpdF9yYXRlLGV4dHJhZGF0YV9zaXplOmUuZXh0cmFkYXRhX3NpemUsZXh0cmFkYXRhOnIscl9mcmFtZV9yYXRlOmUucl9mcmFtZV9yYXRlLGF2Z19mcmFtZV9yYXRlOmUuYXZnX2ZyYW1lX3JhdGUsc2FtcGxlX2FzcGVjdF9yYXRpbzplLnNhbXBsZV9hc3BlY3RfcmF0aW8sZGlzcGxheV9hc3BlY3RfcmF0aW86ZS5kaXNwbGF5X2FzcGVjdF9yYXRpbyxzdGFydF90aW1lOmUuc3RhcnRfdGltZSxkdXJhdGlvbjplLmR1cmF0aW9uLHJvdGF0aW9uOmUucm90YXRpb24sZmxpcDplLmZsaXAsbmJfZnJhbWVzOmUubmJfZnJhbWVzLHRhZ3M6ZS50YWdzfTtyZXR1cm4gZS5kZWxldGUoKSx0fWZ1bmN0aW9uIGRyKGUpe2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSx0PXtrZXlmcmFtZTplLmtleWZyYW1lLHRpbWVzdGFtcDplLnRpbWVzdGFtcCxkdXJhdGlvbjplLmR1cmF0aW9uLHNpemU6ZS5zaXplLGRhdGE6cn07cmV0dXJuIGUuZGVsZXRlKCksdH1mdW5jdGlvbiBTYShlLHI9MCx0PS0xKXtjb25zdCBuPW5ldyBwZShlKTtuLm1vdW50KCk7dHJ5e2NvbnN0IGE9Zi5nZXRfYXZfc3RyZWFtKG4uZmlsZVBhdGgscix0KTtyZXR1cm4gY3IoYSl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfc3RyZWFtIGZhaWxlZDogIithLm1lc3NhZ2UpfWZpbmFsbHl7bi51bm1vdW50KCl9fWZ1bmN0aW9uIE1hKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9hdl9zdHJlYW1zKHIuZmlsZVBhdGgpLG49W107Zm9yKGxldCBhPTA7YTx0LnN0cmVhbXMuc2l6ZSgpO2ErKyluLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9hdl9zdHJlYW1zIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIFJhKGUpe2NvbnN0IHI9bmV3IHBlKGUpO3IubW91bnQoKTt0cnl7Y29uc3QgdD1mLmdldF9tZWRpYV9pbmZvKHIuZmlsZVBhdGgpLG49e2Zvcm1hdF9uYW1lOnQuZm9ybWF0X25hbWUsZHVyYXRpb246dC5kdXJhdGlvbixiaXRfcmF0ZTp0LmJpdF9yYXRlLHN0YXJ0X3RpbWU6dC5zdGFydF90aW1lLG5iX3N0cmVhbXM6dC5uYl9zdHJlYW1zLHN0cmVhbXM6W119O2ZvcihsZXQgYT0wO2E8dC5zdHJlYW1zLnNpemUoKTthKyspbi5zdHJlYW1zLnB1c2goY3IodC5zdHJlYW1zLmdldChhKSkpO3JldHVybiB0LnN0cmVhbXMuZGVsZXRlKCksbn1jYXRjaCh0KXt0aHJvdyBuZXcgRXJyb3IoImdldF9tZWRpYV9pbmZvIGZhaWxlZDogIit0Lm1lc3NhZ2UpfWZpbmFsbHl7ci51bm1vdW50KCl9fWZ1bmN0aW9uIE9hKGUscix0PTAsbj0tMSxhPTEpe2NvbnN0IGk9bmV3IHBlKGUpO2kubW91bnQoKTt0cnl7Y29uc3Qgcz1mLmdldF9hdl9wYWNrZXQoaS5maWxlUGF0aCxyLHQsbixhKTtyZXR1cm4gZHIocyl9Y2F0Y2gocyl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0IGZhaWxlZDogIitzLm1lc3NhZ2UpfWZpbmFsbHl7aS51bm1vdW50KCl9fWZ1bmN0aW9uIElhKGUscix0PTEpe2NvbnN0IG49bmV3IHBlKGUpO24ubW91bnQoKTt0cnl7Y29uc3QgYT1mLmdldF9hdl9wYWNrZXRzKG4uZmlsZVBhdGgscix0KSxpPVtdO2ZvcihsZXQgcz0wO3M8YS5wYWNrZXRzLnNpemUoKTtzKyspaS5wdXNoKGRyKGEucGFja2V0cy5nZXQocykpKTtyZXR1cm4gYS5wYWNrZXRzLmRlbGV0ZSgpLGl9Y2F0Y2goYSl7dGhyb3cgbmV3IEVycm9yKCJnZXRfYXZfcGFja2V0cyBmYWlsZWQ6ICIrYS5tZXNzYWdlKX1maW5hbGx5e24udW5tb3VudCgpfX1hc3luYyBmdW5jdGlvbiBMYShlLHIsdD0wLG49MCxhPTAsaT0tMSxzPTEpe2NvbnN0IGw9bmV3IHBlKHIpO2wubW91bnQoKTtsZXQgdT1udWxsO3RyeXtpZih1PWYuQVZQYWNrZXRSZWFkZXIuY3JlYXRlKGwuZmlsZVBhdGgsdCxuLGEsaSxzKSwhdSl0aHJvdyBuZXcgRXJyb3IoIkFWUGFja2V0UmVhZGVyLmNyZWF0ZSBmYWlsZWQgKG51bGwgcmVhZGVyKSIpO2NvbnN0IGM9VmEoZSk7Zm9yKDs7KXtjb25zdCBkPXUucmVhZF9uZXh0X2F2X3BhY2tldCgpO2lmKHUuaGFzX2Vycm9yKCkpdGhyb3cgbmV3IEVycm9yKCJBVlBhY2tldFJlYWRlciByZWFkX25leHRfYXZfcGFja2V0IGVycm9yIik7aWYodS5pc19maW5pc2hlZCgpKXthd2FpdCBjKDApO2JyZWFrfWlmKGF3YWl0IGMoZCk9PT0wKWJyZWFrfX1jYXRjaChjKXt0aHJvdyBuZXcgRXJyb3IoInJlYWRBVlBhY2tldCBwaXBlbGluZSBmYWlsZWQ6ICIrYy5tZXNzYWdlKX1maW5hbGx5e3UmJnUuZGVsZXRlKCksbC51bm1vdW50KCl9cmV0dXJuIDF9ZnVuY3Rpb24gVmEoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZShuPT57Y29uc3QgYT17dHlwZToiQVZQYWNrZXRTdHJlYW0iLG1zZ0lkOmUscmVzdWx0Om51bGx9O2lmKHQ9PT0wKXtzZWxmLnBvc3RNZXNzYWdlKGEpLG4oMSk7cmV0dXJufWNvbnN0IGk9ZHIodCk7YS5yZXN1bHQ9aSxzZWxmLnBvc3RNZXNzYWdlKGEsW2kuZGF0YS5idWZmZXJdKTtjb25zdCBzPWw9Pntjb25zdHt0eXBlOnUsbXNnSWQ6Y309bC5kYXRhO2M9PT1lJiYodT09PSJSZWFkTmV4dEFWUGFja2V0Ij8oc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDEpKTp1PT09IlN0b3BSZWFkQVZQYWNrZXQiJiYoc2VsZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxuKDApKSl9O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KX19ZnVuY3Rpb24gVWEoZSl7bnQ9ZSxmLnNldF9hdl9sb2dfbGV2ZWwoZSl9cmV0dXJuIGYuZ2V0QVZTdHJlYW09U2EsZi5nZXRBVlN0cmVhbXM9TWEsZi5nZXRNZWRpYUluZm89UmEsZi5nZXRBVlBhY2tldD1PYSxmLmdldEFWUGFja2V0cz1JYSxmLnJlYWRBVlBhY2tldD1MYSxmLnNldEFWTG9nTGV2ZWw9VWEsQz1uZSxDfX0pKCk7bGV0IFE7c2VsZi5wb3N0TWVzc2FnZSh7dHlwZTpHLldhc21Xb3JrZXJMb2FkZWR9KSxzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGFzeW5jIGZ1bmN0aW9uKEUpe2NvbnN0e3R5cGU6UixkYXRhOkMsbXNnSWQ6Zn09RS5kYXRhO3RyeXtzd2l0Y2goUil7Y2FzZSJMb2FkV0FTTSI6cmV0dXJuIGF3YWl0IHN0KEMpO2Nhc2UiR2V0QVZTdHJlYW0iOnJldHVybiBsdChDLGYpO2Nhc2UiR2V0QVZTdHJlYW1zIjpyZXR1cm4gdXQoQyxmKTtjYXNlIkdldE1lZGlhSW5mbyI6cmV0dXJuIGZ0KEMsZik7Y2FzZSJHZXRBVlBhY2tldCI6cmV0dXJuIGN0KEMsZik7Y2FzZSJHZXRBVlBhY2tldHMiOnJldHVybiBkdChDLGYpO2Nhc2UiUmVhZEFWUGFja2V0IjpyZXR1cm4gYXdhaXQgdnQoQyxmKTtjYXNlIlNldEFWTG9nTGV2ZWwiOnJldHVybiBodChDLGYpO2RlZmF1bHQ6cmV0dXJufX1jYXRjaChVKXtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOlIsbXNnSWQ6ZixlcnJNc2c6VSBpbnN0YW5jZW9mIEVycm9yP1UubWVzc2FnZToiVW5rbm93biBFcnJvciJ9KX19KTthc3luYyBmdW5jdGlvbiBzdChFKXtjb25zdHt3YXNtRmlsZVBhdGg6Un09RXx8e307UT1hd2FpdCBpdCh7bG9jYXRlRmlsZTooQyxmKT0+Qy5lbmRzV2l0aCgiLndhc20iKSYmUj9SOmYrQyxvblJ1bnRpbWVJbml0aWFsaXplZDooKT0+e3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5XQVNNUnVudGltZUluaXRpYWxpemVkfSl9fSl9ZnVuY3Rpb24gbHQoRSxSKXtjb25zdHtzb3VyY2U6QyxzdHJlYW1UeXBlOmYsc3RyZWFtSW5kZXg6VX09RSxIPVEuZ2V0QVZTdHJlYW0oQyxmLFUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbSxtc2dJZDpSLHJlc3VsdDpIfSxbSC5leHRyYWRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gdXQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0QVZTdHJlYW1zKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlN0cmVhbXMsbXNnSWQ6UixyZXN1bHQ6Zn0sZi5tYXAoVT0+VS5leHRyYWRhdGEuYnVmZmVyKSl9ZnVuY3Rpb24gZnQoRSxSKXtjb25zdHtzb3VyY2U6Q309RSxmPVEuZ2V0TWVkaWFJbmZvKEMpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRNZWRpYUluZm8sbXNnSWQ6UixyZXN1bHQ6Zn0sZi5zdHJlYW1zLm1hcChVPT5VLmV4dHJhZGF0YS5idWZmZXIpKX1mdW5jdGlvbiBjdChFLFIpe2NvbnN0e3NvdXJjZTpDLHRpbWU6ZixzdHJlYW1UeXBlOlUsc3RyZWFtSW5kZXg6SCxzZWVrRmxhZzpuZX09RSxhZT1RLmdldEFWUGFja2V0KEMsZixVLEgsbmUpO3NlbGYucG9zdE1lc3NhZ2Uoe3R5cGU6Ry5HZXRBVlBhY2tldCxtc2dJZDpSLHJlc3VsdDphZX0sW2FlLmRhdGEuYnVmZmVyXSl9ZnVuY3Rpb24gZHQoRSxSKXtjb25zdHtzb3VyY2U6Qyx0aW1lOmYsc2Vla0ZsYWc6VX09RSxIPVEuZ2V0QVZQYWNrZXRzKEMsZixVKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuR2V0QVZQYWNrZXRzLG1zZ0lkOlIscmVzdWx0Okh9LEgubWFwKG5lPT5uZS5kYXRhLmJ1ZmZlcikpfWFzeW5jIGZ1bmN0aW9uIHZ0KEUsUil7Y29uc3R7c291cmNlOkMsc3RhcnQ6ZixlbmQ6VSxzdHJlYW1UeXBlOkgsc3RyZWFtSW5kZXg6bmUsc2Vla0ZsYWc6YWV9PUUsRGU9YXdhaXQgUS5yZWFkQVZQYWNrZXQoUixDLGYsVSxILG5lLGFlKTtzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOkcuUmVhZEFWUGFja2V0LG1zZ0lkOlIscmVzdWx0OkRlfSl9ZnVuY3Rpb24gaHQoRSxSKXtjb25zdHtsZXZlbDpDfT1FO1Euc2V0QVZMb2dMZXZlbChDKSxzZWxmLnBvc3RNZXNzYWdlKHt0eXBlOiJTZXRBVkxvZ0xldmVsIixtc2dJZDpSfSl9fSkoKTsK", Xa = (t) => Uint8Array.from(atob(t), (e) => e.charCodeAt(0)), Ks = typeof window < "u" && window.Blob && new Blob([Xa(un)], {
|
|
10212
10243
|
type: "text/javascript;charset=utf-8"
|
|
10213
10244
|
});
|
|
10214
|
-
function
|
|
10245
|
+
function _a(t) {
|
|
10215
10246
|
let e;
|
|
10216
10247
|
try {
|
|
10217
10248
|
if (e = Ks && (window.URL || window.webkitURL).createObjectURL(Ks), !e)
|
|
@@ -10233,7 +10264,7 @@ function Xa(t) {
|
|
|
10233
10264
|
const Ms = 1e6;
|
|
10234
10265
|
class fi {
|
|
10235
10266
|
constructor(e) {
|
|
10236
|
-
oi(this, "wasmWorker"), oi(this, "wasmWorkerLoadStatus"), oi(this, "msgId"), oi(this, "source"), this.wasmWorker = new
|
|
10267
|
+
oi(this, "wasmWorker"), oi(this, "wasmWorkerLoadStatus"), oi(this, "msgId"), oi(this, "source"), this.wasmWorker = new _a({
|
|
10237
10268
|
name: "web-demuxer"
|
|
10238
10269
|
}), this.wasmWorkerLoadStatus = new Promise((i, n) => {
|
|
10239
10270
|
this.wasmWorker.addEventListener("message", (d) => {
|
|
@@ -10262,9 +10293,9 @@ class fi {
|
|
|
10262
10293
|
}
|
|
10263
10294
|
const o = this.msgId, m = (h) => {
|
|
10264
10295
|
let {
|
|
10265
|
-
data:
|
|
10296
|
+
data: S
|
|
10266
10297
|
} = h;
|
|
10267
|
-
|
|
10298
|
+
S.type === e && S.msgId === o && (S.errMsg ? d(S.errMsg) : n(S.result), this.wasmWorker.removeEventListener("message", m));
|
|
10268
10299
|
};
|
|
10269
10300
|
this.wasmWorker.addEventListener("message", m), this.post(e, i, o);
|
|
10270
10301
|
});
|
|
@@ -10363,7 +10394,7 @@ class fi {
|
|
|
10363
10394
|
const m = new CountQueuingStrategy({
|
|
10364
10395
|
highWaterMark: 1
|
|
10365
10396
|
}), h = this.msgId;
|
|
10366
|
-
let
|
|
10397
|
+
let S = 0, W, v;
|
|
10367
10398
|
return new ReadableStream({
|
|
10368
10399
|
start: (Z) => {
|
|
10369
10400
|
if (!this.source) {
|
|
@@ -10383,7 +10414,7 @@ class fi {
|
|
|
10383
10414
|
});
|
|
10384
10415
|
},
|
|
10385
10416
|
pull: () => {
|
|
10386
|
-
|
|
10417
|
+
S > 0 && this.post(rt.ReadNextAVPacket, void 0, h), S++;
|
|
10387
10418
|
},
|
|
10388
10419
|
cancel: () => new Promise((Z) => {
|
|
10389
10420
|
v = Z, this.post(rt.StopReadAVPacket, void 0, h);
|
|
@@ -10509,7 +10540,7 @@ function Zi() {
|
|
|
10509
10540
|
"⚠️ Demo/Learning Function: This utility is intended for demos and learning purposes only. For production use, please use a proper demuxing library like MediaBunny (https://mediabunny.dev/) or web-demuxer (https://github.com/bilibili/web-demuxer) directly."
|
|
10510
10541
|
), ks = !0);
|
|
10511
10542
|
}
|
|
10512
|
-
async function
|
|
10543
|
+
async function L1(t) {
|
|
10513
10544
|
Zi();
|
|
10514
10545
|
const e = new fi({
|
|
10515
10546
|
wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
|
|
@@ -10518,12 +10549,12 @@ async function W1(t) {
|
|
|
10518
10549
|
const i = e.read("video", 0).getReader(), n = [];
|
|
10519
10550
|
return new Promise(function(d) {
|
|
10520
10551
|
i.read().then(async function o(m) {
|
|
10521
|
-
const { done: h, value:
|
|
10522
|
-
return
|
|
10552
|
+
const { done: h, value: S } = m;
|
|
10553
|
+
return S && n.push(S), h ? d(n) : i.read().then(o);
|
|
10523
10554
|
});
|
|
10524
10555
|
});
|
|
10525
10556
|
}
|
|
10526
|
-
async function
|
|
10557
|
+
async function x1(t) {
|
|
10527
10558
|
Zi();
|
|
10528
10559
|
const e = new fi({
|
|
10529
10560
|
wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
|
|
@@ -10531,9 +10562,9 @@ async function L1(t) {
|
|
|
10531
10562
|
await e.load(t);
|
|
10532
10563
|
const i = e.read("audio", 0).getReader(), n = [];
|
|
10533
10564
|
await new Promise(function(h) {
|
|
10534
|
-
i.read().then(async function
|
|
10565
|
+
i.read().then(async function S(W) {
|
|
10535
10566
|
const { done: v, value: Z } = W;
|
|
10536
|
-
return Z && n.push(Z), v ? h(n) : i.read().then(
|
|
10567
|
+
return Z && n.push(Z), v ? h(n) : i.read().then(S);
|
|
10537
10568
|
});
|
|
10538
10569
|
});
|
|
10539
10570
|
const o = (await e.getMediaInfo()).streams.filter((h) => h.codec_type_string === "audio")[0], m = {
|
|
@@ -10546,7 +10577,7 @@ async function L1(t) {
|
|
|
10546
10577
|
config: m
|
|
10547
10578
|
};
|
|
10548
10579
|
}
|
|
10549
|
-
async function
|
|
10580
|
+
async function H1(t) {
|
|
10550
10581
|
Zi();
|
|
10551
10582
|
const e = new fi({
|
|
10552
10583
|
wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
|
|
@@ -10554,9 +10585,9 @@ async function x1(t) {
|
|
|
10554
10585
|
await e.load(t);
|
|
10555
10586
|
const i = e.read("video", 0).getReader(), n = [];
|
|
10556
10587
|
await new Promise(function(h) {
|
|
10557
|
-
i.read().then(async function
|
|
10588
|
+
i.read().then(async function S(W) {
|
|
10558
10589
|
const { done: v, value: Z } = W;
|
|
10559
|
-
return Z && n.push(Z), v ? h(n) : i.read().then(
|
|
10590
|
+
return Z && n.push(Z), v ? h(n) : i.read().then(S);
|
|
10560
10591
|
});
|
|
10561
10592
|
});
|
|
10562
10593
|
const o = (await e.getMediaInfo()).streams.filter((h) => h.codec_type_string === "video")[0], m = {
|
|
@@ -10570,7 +10601,7 @@ async function x1(t) {
|
|
|
10570
10601
|
config: m
|
|
10571
10602
|
};
|
|
10572
10603
|
}
|
|
10573
|
-
async function
|
|
10604
|
+
async function Y1(t) {
|
|
10574
10605
|
Zi();
|
|
10575
10606
|
const e = new fi({
|
|
10576
10607
|
wasmFilePath: "https://cdn.jsdelivr.net/npm/web-demuxer@latest/dist/wasm-files/web-demuxer.wasm"
|
|
@@ -10579,8 +10610,8 @@ async function H1(t) {
|
|
|
10579
10610
|
const i = e.read("audio", 0).getReader(), n = [];
|
|
10580
10611
|
return new Promise(function(d) {
|
|
10581
10612
|
i.read().then(async function o(m) {
|
|
10582
|
-
const { done: h, value:
|
|
10583
|
-
return
|
|
10613
|
+
const { done: h, value: S } = m;
|
|
10614
|
+
return S && n.push(S), h ? d(n) : i.read().then(o);
|
|
10584
10615
|
});
|
|
10585
10616
|
});
|
|
10586
10617
|
}
|
|
@@ -10652,7 +10683,7 @@ const ye = (t) => {
|
|
|
10652
10683
|
}, s0 = (t) => {
|
|
10653
10684
|
const e = ye(t);
|
|
10654
10685
|
return e & 1 ? e + 1 >> 1 : -(e >> 1);
|
|
10655
|
-
}, Q0 = (t) => t.constructor === Uint8Array ? t : ArrayBuffer.isView(t) ? new Uint8Array(t.buffer, t.byteOffset, t.byteLength) : new Uint8Array(t),
|
|
10686
|
+
}, Q0 = (t) => t.constructor === Uint8Array ? t : ArrayBuffer.isView(t) ? new Uint8Array(t.buffer, t.byteOffset, t.byteLength) : new Uint8Array(t), Sa = (t) => t.constructor === DataView ? t : ArrayBuffer.isView(t) ? new DataView(t.buffer, t.byteOffset, t.byteLength) : new DataView(t), $t = /* @__PURE__ */ new TextEncoder(), $i = {
|
|
10656
10687
|
bt709: 1,
|
|
10657
10688
|
// ITU-R BT.709
|
|
10658
10689
|
bt470bg: 5,
|
|
@@ -10700,27 +10731,27 @@ class bn {
|
|
|
10700
10731
|
return this.currentPromise = i, await n, e;
|
|
10701
10732
|
}
|
|
10702
10733
|
}
|
|
10703
|
-
const
|
|
10734
|
+
const va = () => {
|
|
10704
10735
|
let t, e;
|
|
10705
10736
|
return { promise: new Promise((n, d) => {
|
|
10706
10737
|
t = n, e = d;
|
|
10707
10738
|
}), resolve: t, reject: e };
|
|
10708
10739
|
}, pn = (t) => {
|
|
10709
10740
|
throw new Error(`Unexpected value: ${t}`);
|
|
10710
|
-
},
|
|
10741
|
+
}, Ia = (t, e, i, n) => {
|
|
10711
10742
|
i = i >>> 0, i = i & 16777215, t.setUint8(e, i >>> 16 & 255), t.setUint8(e + 1, i >>> 8 & 255), t.setUint8(e + 2, i & 255);
|
|
10712
|
-
},
|
|
10743
|
+
}, Va = "und", Ra = /^[a-z]{3}$/, Ta = (t) => Ra.test(t), Bs = 1e6 * (1 + Number.EPSILON), Wa = (t, e) => {
|
|
10713
10744
|
const i = t < 0 ? -1 : 1;
|
|
10714
10745
|
t = Math.abs(t);
|
|
10715
10746
|
let n = 0, d = 1, o = 1, m = 0, h = t;
|
|
10716
10747
|
for (; ; ) {
|
|
10717
|
-
const
|
|
10748
|
+
const S = Math.floor(h), W = S * o + n, v = S * m + d;
|
|
10718
10749
|
if (v > e)
|
|
10719
10750
|
return {
|
|
10720
10751
|
numerator: i * o,
|
|
10721
10752
|
denominator: m
|
|
10722
10753
|
};
|
|
10723
|
-
if (n = o, d = m, o = W, m = v, h = 1 / (h -
|
|
10754
|
+
if (n = o, d = m, o = W, m = v, h = 1 / (h - S), !isFinite(h))
|
|
10724
10755
|
break;
|
|
10725
10756
|
}
|
|
10726
10757
|
return {
|
|
@@ -10749,7 +10780,7 @@ class fn {
|
|
|
10749
10780
|
throw new TypeError("mimeType must be a string.");
|
|
10750
10781
|
}
|
|
10751
10782
|
}
|
|
10752
|
-
class
|
|
10783
|
+
class La {
|
|
10753
10784
|
/** Creates a new {@link AttachedFile}. */
|
|
10754
10785
|
constructor(e, i, n, d) {
|
|
10755
10786
|
if (this.data = e, this.mimeType = i, this.name = n, this.description = d, !(e instanceof Uint8Array))
|
|
@@ -10762,7 +10793,7 @@ class Wa {
|
|
|
10762
10793
|
throw new TypeError("description, when provided, must be a string.");
|
|
10763
10794
|
}
|
|
10764
10795
|
}
|
|
10765
|
-
const
|
|
10796
|
+
const xa = (t) => {
|
|
10766
10797
|
if (!t || typeof t != "object")
|
|
10767
10798
|
throw new TypeError("tags must be an object.");
|
|
10768
10799
|
if (t.title !== void 0 && typeof t.title != "string")
|
|
@@ -10809,10 +10840,10 @@ const La = (t) => {
|
|
|
10809
10840
|
if (!t.raw || typeof t.raw != "object")
|
|
10810
10841
|
throw new TypeError("tags.raw, when provided, must be an object.");
|
|
10811
10842
|
for (const e of Object.values(t.raw))
|
|
10812
|
-
if (e !== null && typeof e != "string" && !(e instanceof Uint8Array) && !(e instanceof fn) && !(e instanceof
|
|
10843
|
+
if (e !== null && typeof e != "string" && !(e instanceof Uint8Array) && !(e instanceof fn) && !(e instanceof La))
|
|
10813
10844
|
throw new TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, or null.");
|
|
10814
10845
|
}
|
|
10815
|
-
},
|
|
10846
|
+
}, Ha = (t) => {
|
|
10816
10847
|
if (!t || typeof t != "object")
|
|
10817
10848
|
throw new TypeError("disposition must be an object.");
|
|
10818
10849
|
if (t.default !== void 0 && typeof t.default != "boolean")
|
|
@@ -10868,21 +10899,21 @@ const O0 = [
|
|
|
10868
10899
|
...k0
|
|
10869
10900
|
], hi = [
|
|
10870
10901
|
"webvtt"
|
|
10871
|
-
],
|
|
10872
|
-
const e = t.split("."), d = (1 << 7) + 1, o = Number(e[1]), m = e[2], h = Number(m.slice(0, -1)),
|
|
10873
|
-
return [d,
|
|
10874
|
-
},
|
|
10902
|
+
], Ya = (t) => {
|
|
10903
|
+
const e = t.split("."), d = (1 << 7) + 1, o = Number(e[1]), m = e[2], h = Number(m.slice(0, -1)), S = (o << 5) + h, W = m.slice(-1) === "H" ? 1 : 0, Z = Number(e[3]) === 8 ? 0 : 1, O = 0, w = e[4] ? Number(e[4]) : 0, N = e[5] ? Number(e[5][0]) : 1, J = e[5] ? Number(e[5][1]) : 1, U = e[5] ? Number(e[5][2]) : 0, k = (W << 7) + (Z << 6) + (O << 5) + (w << 4) + (N << 3) + (J << 2) + U;
|
|
10904
|
+
return [d, S, k, 0];
|
|
10905
|
+
}, wa = /^pcm-([usf])(\d+)+(be)?$/, D0 = (t) => {
|
|
10875
10906
|
if (ve(k0.includes(t)), t === "ulaw")
|
|
10876
10907
|
return { dataType: "ulaw", sampleSize: 1, littleEndian: !0, silentValue: 255 };
|
|
10877
10908
|
if (t === "alaw")
|
|
10878
10909
|
return { dataType: "alaw", sampleSize: 1, littleEndian: !0, silentValue: 213 };
|
|
10879
|
-
const e =
|
|
10910
|
+
const e = wa.exec(t);
|
|
10880
10911
|
ve(e);
|
|
10881
10912
|
let i;
|
|
10882
10913
|
e[1] === "u" ? i = "unsigned" : e[1] === "s" ? i = "signed" : i = "float";
|
|
10883
10914
|
const n = Number(e[2]) / 8, d = e[3] !== "be", o = t === "pcm-u8" ? 2 ** 7 : 0;
|
|
10884
10915
|
return { dataType: i, sampleSize: n, littleEndian: d, silentValue: o };
|
|
10885
|
-
},
|
|
10916
|
+
}, Ka = ["avc1", "avc3", "hev1", "hvc1", "vp8", "vp09", "av01"], Ma = /^(avc1|avc3)\.[0-9a-fA-F]{6}$/, ka = /^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/, Ba = /^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/, Ca = /^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/, ga = (t) => {
|
|
10886
10917
|
if (!t)
|
|
10887
10918
|
throw new TypeError("Video chunk metadata must be provided.");
|
|
10888
10919
|
if (typeof t != "object")
|
|
@@ -10893,7 +10924,7 @@ const O0 = [
|
|
|
10893
10924
|
throw new TypeError("Video chunk metadata decoder configuration must be an object.");
|
|
10894
10925
|
if (typeof t.decoderConfig.codec != "string")
|
|
10895
10926
|
throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");
|
|
10896
|
-
if (!
|
|
10927
|
+
if (!Ka.some((e) => t.decoderConfig.codec.startsWith(e)))
|
|
10897
10928
|
throw new TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the WebCodecs Codec Registry.");
|
|
10898
10929
|
if (!Number.isInteger(t.decoderConfig.codedWidth) || t.decoderConfig.codedWidth <= 0)
|
|
10899
10930
|
throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");
|
|
@@ -10918,20 +10949,20 @@ const O0 = [
|
|
|
10918
10949
|
throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.");
|
|
10919
10950
|
}
|
|
10920
10951
|
if (t.decoderConfig.codec.startsWith("avc1") || t.decoderConfig.codec.startsWith("avc3")) {
|
|
10921
|
-
if (!
|
|
10952
|
+
if (!Ma.test(t.decoderConfig.codec))
|
|
10922
10953
|
throw new TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.");
|
|
10923
10954
|
} else if (t.decoderConfig.codec.startsWith("hev1") || t.decoderConfig.codec.startsWith("hvc1")) {
|
|
10924
|
-
if (!
|
|
10955
|
+
if (!ka.test(t.decoderConfig.codec))
|
|
10925
10956
|
throw new TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.");
|
|
10926
10957
|
} else if (t.decoderConfig.codec.startsWith("vp8")) {
|
|
10927
10958
|
if (t.decoderConfig.codec !== "vp8")
|
|
10928
10959
|
throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".');
|
|
10929
10960
|
} else if (t.decoderConfig.codec.startsWith("vp09")) {
|
|
10930
|
-
if (!
|
|
10961
|
+
if (!Ba.test(t.decoderConfig.codec))
|
|
10931
10962
|
throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.');
|
|
10932
|
-
} else if (t.decoderConfig.codec.startsWith("av01") && !
|
|
10963
|
+
} else if (t.decoderConfig.codec.startsWith("av01") && !Ca.test(t.decoderConfig.codec))
|
|
10933
10964
|
throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.');
|
|
10934
|
-
},
|
|
10965
|
+
}, Fa = ["mp4a", "mp3", "opus", "vorbis", "flac", "ulaw", "alaw", "pcm"], Ja = (t) => {
|
|
10935
10966
|
if (!t)
|
|
10936
10967
|
throw new TypeError("Audio chunk metadata must be provided.");
|
|
10937
10968
|
if (typeof t != "object")
|
|
@@ -10942,7 +10973,7 @@ const O0 = [
|
|
|
10942
10973
|
throw new TypeError("Audio chunk metadata decoder configuration must be an object.");
|
|
10943
10974
|
if (typeof t.decoderConfig.codec != "string")
|
|
10944
10975
|
throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");
|
|
10945
|
-
if (!
|
|
10976
|
+
if (!Fa.some((e) => t.decoderConfig.codec.startsWith(e)))
|
|
10946
10977
|
throw new TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the WebCodecs Codec Registry.");
|
|
10947
10978
|
if (!Number.isInteger(t.decoderConfig.sampleRate) || t.decoderConfig.sampleRate <= 0)
|
|
10948
10979
|
throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");
|
|
@@ -10975,7 +11006,7 @@ const O0 = [
|
|
|
10975
11006
|
throw new TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.");
|
|
10976
11007
|
} else if ((t.decoderConfig.codec.startsWith("pcm") || t.decoderConfig.codec.startsWith("ulaw") || t.decoderConfig.codec.startsWith("alaw")) && !k0.includes(t.decoderConfig.codec))
|
|
10977
11008
|
throw new TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${k0.join(", ")}).`);
|
|
10978
|
-
},
|
|
11009
|
+
}, Ea = (t) => {
|
|
10979
11010
|
if (!t)
|
|
10980
11011
|
throw new TypeError("Subtitle metadata must be provided.");
|
|
10981
11012
|
if (typeof t != "object")
|
|
@@ -10994,7 +11025,7 @@ const O0 = [
|
|
|
10994
11025
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
10995
11026
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
10996
11027
|
*/
|
|
10997
|
-
class
|
|
11028
|
+
class Na {
|
|
10998
11029
|
constructor(e) {
|
|
10999
11030
|
this.mutex = new bn(), this.firstMediaStreamTimestamp = null, this.trackTimestampInfo = /* @__PURE__ */ new WeakMap(), this.output = e;
|
|
11000
11031
|
}
|
|
@@ -11067,7 +11098,7 @@ const ts = (t) => {
|
|
|
11067
11098
|
for (let n = 0; n < i; n++)
|
|
11068
11099
|
n + 2 < i && t[n] === 0 && t[n + 1] === 0 && t[n + 2] === 3 ? (e.push(0, 0), n += 2) : e.push(t[n]);
|
|
11069
11100
|
return new Uint8Array(e);
|
|
11070
|
-
},
|
|
11101
|
+
}, Pa = (t, e) => {
|
|
11071
11102
|
const i = t.reduce((o, m) => o + e + m.byteLength, 0), n = new Uint8Array(i);
|
|
11072
11103
|
let d = 0;
|
|
11073
11104
|
for (const o of t) {
|
|
@@ -11080,7 +11111,7 @@ const ts = (t) => {
|
|
|
11080
11111
|
m.setUint16(d, o.byteLength, !1);
|
|
11081
11112
|
break;
|
|
11082
11113
|
case 3:
|
|
11083
|
-
|
|
11114
|
+
Ia(m, d, o.byteLength);
|
|
11084
11115
|
break;
|
|
11085
11116
|
case 4:
|
|
11086
11117
|
m.setUint32(d, o.byteLength, !1);
|
|
@@ -11089,12 +11120,12 @@ const ts = (t) => {
|
|
|
11089
11120
|
d += e, n.set(o, d), d += o.byteLength;
|
|
11090
11121
|
}
|
|
11091
11122
|
return n;
|
|
11092
|
-
}, gi = (t) => t[0] & 31,
|
|
11123
|
+
}, gi = (t) => t[0] & 31, Ua = (t) => {
|
|
11093
11124
|
try {
|
|
11094
|
-
const e = ts(t), i = e.filter((
|
|
11125
|
+
const e = ts(t), i = e.filter((S) => gi(S) === z0.SPS), n = e.filter((S) => gi(S) === z0.PPS), d = e.filter((S) => gi(S) === z0.SPS_EXT);
|
|
11095
11126
|
if (i.length === 0 || n.length === 0)
|
|
11096
11127
|
return null;
|
|
11097
|
-
const o = i[0], m =
|
|
11128
|
+
const o = i[0], m = Aa(o);
|
|
11098
11129
|
ve(m !== null);
|
|
11099
11130
|
const h = m.profileIdc === 100 || m.profileIdc === 110 || m.profileIdc === 122 || m.profileIdc === 144;
|
|
11100
11131
|
return {
|
|
@@ -11114,7 +11145,7 @@ const ts = (t) => {
|
|
|
11114
11145
|
} catch (e) {
|
|
11115
11146
|
return console.error("Error building AVC Decoder Configuration Record:", e), null;
|
|
11116
11147
|
}
|
|
11117
|
-
},
|
|
11148
|
+
}, za = (t) => {
|
|
11118
11149
|
const e = [];
|
|
11119
11150
|
e.push(t.configurationVersion), e.push(t.avcProfileIndication), e.push(t.profileCompatibility), e.push(t.avcLevelIndication), e.push(252 | t.lengthSizeMinusOne & 3), e.push(224 | t.sequenceParameterSets.length & 31);
|
|
11120
11151
|
for (const i of t.sequenceParameterSets) {
|
|
@@ -11140,15 +11171,15 @@ const ts = (t) => {
|
|
|
11140
11171
|
}
|
|
11141
11172
|
}
|
|
11142
11173
|
return new Uint8Array(e);
|
|
11143
|
-
},
|
|
11174
|
+
}, Aa = (t) => {
|
|
11144
11175
|
try {
|
|
11145
11176
|
const e = new A0(Oi(t));
|
|
11146
11177
|
if (e.skipBits(1), e.skipBits(2), e.readBits(5) !== 7)
|
|
11147
11178
|
return null;
|
|
11148
11179
|
const n = e.readAlignedByte(), d = e.readAlignedByte(), o = e.readAlignedByte();
|
|
11149
11180
|
ye(e);
|
|
11150
|
-
let m = null, h = null,
|
|
11151
|
-
if ((n === 100 || n === 110 || n === 122 || n === 244 || n === 44 || n === 83 || n === 86 || n === 118 || n === 128) && (m = ye(e), m === 3 && e.skipBits(1), h = ye(e),
|
|
11181
|
+
let m = null, h = null, S = null;
|
|
11182
|
+
if ((n === 100 || n === 110 || n === 122 || n === 244 || n === 44 || n === 83 || n === 86 || n === 118 || n === 128) && (m = ye(e), m === 3 && e.skipBits(1), h = ye(e), S = ye(e), e.skipBits(1), e.readBits(1))) {
|
|
11152
11183
|
for (let O = 0; O < (m !== 3 ? 8 : 12); O++)
|
|
11153
11184
|
if (e.readBits(1)) {
|
|
11154
11185
|
const N = O < 6 ? 16 : 64;
|
|
@@ -11181,37 +11212,37 @@ const ts = (t) => {
|
|
|
11181
11212
|
frameMbsOnlyFlag: v,
|
|
11182
11213
|
chromaFormatIdc: m,
|
|
11183
11214
|
bitDepthLumaMinus8: h,
|
|
11184
|
-
bitDepthChromaMinus8:
|
|
11215
|
+
bitDepthChromaMinus8: S
|
|
11185
11216
|
};
|
|
11186
11217
|
} catch (e) {
|
|
11187
11218
|
return console.error("Error parsing AVC SPS:", e), null;
|
|
11188
11219
|
}
|
|
11189
|
-
}, H0 = (t) => t[0] >> 1 & 63,
|
|
11220
|
+
}, H0 = (t) => t[0] >> 1 & 63, Oa = (t) => {
|
|
11190
11221
|
try {
|
|
11191
11222
|
const e = ts(t), i = e.filter((u) => H0(u) === Dt.VPS_NUT), n = e.filter((u) => H0(u) === Dt.SPS_NUT), d = e.filter((u) => H0(u) === Dt.PPS_NUT), o = e.filter((u) => H0(u) === Dt.PREFIX_SEI_NUT || H0(u) === Dt.SUFFIX_SEI_NUT);
|
|
11192
11223
|
if (n.length === 0 || d.length === 0)
|
|
11193
11224
|
return null;
|
|
11194
11225
|
const m = n[0], h = new A0(Oi(m));
|
|
11195
11226
|
h.skipBits(16), h.readBits(4);
|
|
11196
|
-
const
|
|
11227
|
+
const S = h.readBits(3), W = h.readBits(1), { general_profile_space: v, general_tier_flag: Z, general_profile_idc: O, general_profile_compatibility_flags: w, general_constraint_indicator_flags: N, general_level_idc: J } = ja(h, S);
|
|
11197
11228
|
ye(h);
|
|
11198
11229
|
const U = ye(h);
|
|
11199
11230
|
U === 3 && h.skipBits(1), ye(h), ye(h), h.readBits(1) && (ye(h), ye(h), ye(h), ye(h));
|
|
11200
11231
|
const k = ye(h), I = ye(h);
|
|
11201
11232
|
ye(h);
|
|
11202
|
-
const K = h.readBits(1) ? 0 :
|
|
11203
|
-
for (let u = K; u <=
|
|
11233
|
+
const K = h.readBits(1) ? 0 : S;
|
|
11234
|
+
for (let u = K; u <= S; u++)
|
|
11204
11235
|
ye(h), ye(h), ye(h);
|
|
11205
|
-
ye(h), ye(h), ye(h), ye(h), ye(h), ye(h), h.readBits(1) && h.readBits(1) &&
|
|
11236
|
+
ye(h), ye(h), ye(h), ye(h), ye(h), ye(h), h.readBits(1) && h.readBits(1) && Qa(h), h.skipBits(1), h.skipBits(1), h.readBits(1) && (h.skipBits(4), h.skipBits(4), ye(h), ye(h), h.skipBits(1));
|
|
11206
11237
|
const X = ye(h);
|
|
11207
|
-
if (
|
|
11238
|
+
if (Da(h, X), h.readBits(1)) {
|
|
11208
11239
|
const u = ye(h);
|
|
11209
11240
|
for (let l = 0; l < u; l++)
|
|
11210
11241
|
ye(h), h.skipBits(1);
|
|
11211
11242
|
}
|
|
11212
11243
|
h.skipBits(1), h.skipBits(1);
|
|
11213
11244
|
let A = 0;
|
|
11214
|
-
h.readBits(1) && (A =
|
|
11245
|
+
h.readBits(1) && (A = qa(h, S));
|
|
11215
11246
|
let T = 0;
|
|
11216
11247
|
if (d.length > 0) {
|
|
11217
11248
|
const u = d[0], l = new A0(Oi(u));
|
|
@@ -11264,7 +11295,7 @@ const ts = (t) => {
|
|
|
11264
11295
|
bitDepthChromaMinus8: I,
|
|
11265
11296
|
avgFrameRate: 0,
|
|
11266
11297
|
constantFrameRate: 0,
|
|
11267
|
-
numTemporalLayers:
|
|
11298
|
+
numTemporalLayers: S + 1,
|
|
11268
11299
|
temporalIdNested: W,
|
|
11269
11300
|
lengthSizeMinusOne: 3,
|
|
11270
11301
|
arrays: H
|
|
@@ -11272,7 +11303,7 @@ const ts = (t) => {
|
|
|
11272
11303
|
} catch (e) {
|
|
11273
11304
|
return console.error("Error building HEVC Decoder Configuration Record:", e), null;
|
|
11274
11305
|
}
|
|
11275
|
-
},
|
|
11306
|
+
}, ja = (t, e) => {
|
|
11276
11307
|
const i = t.readBits(2), n = t.readBits(1), d = t.readBits(5);
|
|
11277
11308
|
let o = 0;
|
|
11278
11309
|
for (let v = 0; v < 32; v++)
|
|
@@ -11280,14 +11311,14 @@ const ts = (t) => {
|
|
|
11280
11311
|
const m = new Uint8Array(6);
|
|
11281
11312
|
for (let v = 0; v < 6; v++)
|
|
11282
11313
|
m[v] = t.readBits(8);
|
|
11283
|
-
const h = t.readBits(8),
|
|
11314
|
+
const h = t.readBits(8), S = [], W = [];
|
|
11284
11315
|
for (let v = 0; v < e; v++)
|
|
11285
|
-
|
|
11316
|
+
S.push(t.readBits(1)), W.push(t.readBits(1));
|
|
11286
11317
|
if (e > 0)
|
|
11287
11318
|
for (let v = e; v < 8; v++)
|
|
11288
11319
|
t.skipBits(2);
|
|
11289
11320
|
for (let v = 0; v < e; v++)
|
|
11290
|
-
|
|
11321
|
+
S[v] && t.skipBits(88), W[v] && t.skipBits(8);
|
|
11291
11322
|
return {
|
|
11292
11323
|
general_profile_space: i,
|
|
11293
11324
|
general_tier_flag: n,
|
|
@@ -11296,7 +11327,7 @@ const ts = (t) => {
|
|
|
11296
11327
|
general_constraint_indicator_flags: m,
|
|
11297
11328
|
general_level_idc: h
|
|
11298
11329
|
};
|
|
11299
|
-
},
|
|
11330
|
+
}, Qa = (t) => {
|
|
11300
11331
|
for (let e = 0; e < 4; e++)
|
|
11301
11332
|
for (let i = 0; i < (e === 3 ? 2 : 6); i++)
|
|
11302
11333
|
if (!t.readBits(1))
|
|
@@ -11307,55 +11338,55 @@ const ts = (t) => {
|
|
|
11307
11338
|
for (let o = 0; o < d; o++)
|
|
11308
11339
|
s0(t);
|
|
11309
11340
|
}
|
|
11310
|
-
},
|
|
11341
|
+
}, Da = (t, e) => {
|
|
11311
11342
|
const i = [];
|
|
11312
11343
|
for (let n = 0; n < e; n++)
|
|
11313
|
-
i[n] =
|
|
11314
|
-
},
|
|
11344
|
+
i[n] = $a(t, n, e, i);
|
|
11345
|
+
}, $a = (t, e, i, n) => {
|
|
11315
11346
|
let d = 0, o = 0, m = 0;
|
|
11316
11347
|
if (e !== 0 && (o = t.readBits(1)), o) {
|
|
11317
11348
|
if (e === i) {
|
|
11318
|
-
const
|
|
11319
|
-
m = e - (
|
|
11349
|
+
const S = ye(t);
|
|
11350
|
+
m = e - (S + 1);
|
|
11320
11351
|
} else
|
|
11321
11352
|
m = e - 1;
|
|
11322
11353
|
t.readBits(1), ye(t);
|
|
11323
11354
|
const h = n[m] ?? 0;
|
|
11324
|
-
for (let
|
|
11355
|
+
for (let S = 0; S <= h; S++)
|
|
11325
11356
|
t.readBits(1) || t.readBits(1);
|
|
11326
11357
|
d = n[m];
|
|
11327
11358
|
} else {
|
|
11328
|
-
const h = ye(t),
|
|
11359
|
+
const h = ye(t), S = ye(t);
|
|
11329
11360
|
for (let W = 0; W < h; W++)
|
|
11330
11361
|
ye(t), t.readBits(1);
|
|
11331
|
-
for (let W = 0; W <
|
|
11362
|
+
for (let W = 0; W < S; W++)
|
|
11332
11363
|
ye(t), t.readBits(1);
|
|
11333
|
-
d = h +
|
|
11364
|
+
d = h + S;
|
|
11334
11365
|
}
|
|
11335
11366
|
return d;
|
|
11336
|
-
},
|
|
11337
|
-
if (t.readBits(1) && t.readBits(8) === 255 && (t.readBits(16), t.readBits(16)), t.readBits(1) && t.readBits(1), t.readBits(1) && (t.readBits(3), t.readBits(1), t.readBits(1) && (t.readBits(8), t.readBits(8), t.readBits(8))), t.readBits(1) && (ye(t), ye(t)), t.readBits(1), t.readBits(1), t.readBits(1), t.readBits(1) && (ye(t), ye(t), ye(t), ye(t)), t.readBits(1) && (t.readBits(32), t.readBits(32), t.readBits(1) && ye(t), t.readBits(1) &&
|
|
11367
|
+
}, qa = (t, e) => {
|
|
11368
|
+
if (t.readBits(1) && t.readBits(8) === 255 && (t.readBits(16), t.readBits(16)), t.readBits(1) && t.readBits(1), t.readBits(1) && (t.readBits(3), t.readBits(1), t.readBits(1) && (t.readBits(8), t.readBits(8), t.readBits(8))), t.readBits(1) && (ye(t), ye(t)), t.readBits(1), t.readBits(1), t.readBits(1), t.readBits(1) && (ye(t), ye(t), ye(t), ye(t)), t.readBits(1) && (t.readBits(32), t.readBits(32), t.readBits(1) && ye(t), t.readBits(1) && el(t, !0, e)), t.readBits(1)) {
|
|
11338
11369
|
t.readBits(1), t.readBits(1), t.readBits(1);
|
|
11339
11370
|
const i = ye(t);
|
|
11340
11371
|
return ye(t), ye(t), ye(t), ye(t), i;
|
|
11341
11372
|
}
|
|
11342
11373
|
return 0;
|
|
11343
|
-
},
|
|
11374
|
+
}, el = (t, e, i) => {
|
|
11344
11375
|
let n = !1, d = !1, o = !1;
|
|
11345
11376
|
n = t.readBits(1) === 1, d = t.readBits(1) === 1, (n || d) && (o = t.readBits(1) === 1, o && (t.readBits(8), t.readBits(5), t.readBits(1), t.readBits(5)), t.readBits(4), t.readBits(4), o && t.readBits(4), t.readBits(5), t.readBits(5), t.readBits(5));
|
|
11346
11377
|
for (let m = 0; m <= i; m++) {
|
|
11347
11378
|
const h = t.readBits(1) === 1;
|
|
11348
|
-
let
|
|
11349
|
-
h || (
|
|
11379
|
+
let S = !0;
|
|
11380
|
+
h || (S = t.readBits(1) === 1);
|
|
11350
11381
|
let W = !1;
|
|
11351
|
-
|
|
11382
|
+
S ? ye(t) : W = t.readBits(1) === 1;
|
|
11352
11383
|
let v = 1;
|
|
11353
11384
|
W || (v = ye(t) + 1), n && Cs(t, v, o), d && Cs(t, v, o);
|
|
11354
11385
|
}
|
|
11355
11386
|
}, Cs = (t, e, i) => {
|
|
11356
11387
|
for (let n = 0; n < e; n++)
|
|
11357
11388
|
ye(t), ye(t), i && (ye(t), ye(t)), t.readBits(1);
|
|
11358
|
-
},
|
|
11389
|
+
}, tl = (t) => {
|
|
11359
11390
|
const e = [];
|
|
11360
11391
|
e.push(t.configurationVersion), e.push((t.generalProfileSpace & 3) << 6 | (t.generalTierFlag & 1) << 5 | t.generalProfileIdc & 31), e.push(t.generalProfileCompatibilityFlags >>> 24 & 255), e.push(t.generalProfileCompatibilityFlags >>> 16 & 255), e.push(t.generalProfileCompatibilityFlags >>> 8 & 255), e.push(t.generalProfileCompatibilityFlags & 255), e.push(...t.generalConstraintIndicatorFlags), e.push(t.generalLevelIdc & 255), e.push(240 | t.minSpatialSegmentationIdc >> 8 & 15), e.push(t.minSpatialSegmentationIdc & 255), e.push(252 | t.parallelismType & 3), e.push(252 | t.chromaFormatIdc & 3), e.push(248 | t.bitDepthLumaMinus8 & 7), e.push(248 | t.bitDepthChromaMinus8 & 7), e.push(t.avgFrameRate >> 8 & 255), e.push(t.avgFrameRate & 255), e.push((t.constantFrameRate & 3) << 6 | (t.numTemporalLayers & 7) << 3 | (t.temporalIdNested & 1) << 2 | t.lengthSizeMinusOne & 3), e.push(t.arrays.length & 255);
|
|
11361
11392
|
for (const i of t.arrays) {
|
|
@@ -11367,8 +11398,8 @@ const ts = (t) => {
|
|
|
11367
11398
|
}
|
|
11368
11399
|
}
|
|
11369
11400
|
return new Uint8Array(e);
|
|
11370
|
-
},
|
|
11371
|
-
const e =
|
|
11401
|
+
}, il = (t) => {
|
|
11402
|
+
const e = Sa(t), i = e.getUint8(9), n = e.getUint16(10, !0), d = e.getUint32(12, !0), o = e.getInt16(16, !0), m = e.getUint8(18);
|
|
11372
11403
|
let h = null;
|
|
11373
11404
|
return m && (h = t.subarray(19, 21 + i)), {
|
|
11374
11405
|
outputChannelCount: i,
|
|
@@ -11510,7 +11541,7 @@ class B0 {
|
|
|
11510
11541
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
11511
11542
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
11512
11543
|
*/
|
|
11513
|
-
const
|
|
11544
|
+
const sl = (t) => {
|
|
11514
11545
|
let i = (t.hasVideo ? "video/" : t.hasAudio ? "audio/" : "application/") + (t.isQuickTime ? "quicktime" : "mp4");
|
|
11515
11546
|
if (t.codecStrings.length > 0) {
|
|
11516
11547
|
const n = [...new Set(t.codecStrings)];
|
|
@@ -11533,7 +11564,7 @@ const Fi = 8, Js = 16;
|
|
|
11533
11564
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
11534
11565
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
11535
11566
|
*/
|
|
11536
|
-
const Es = /<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,
|
|
11567
|
+
const Es = /<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g, nl = (t) => {
|
|
11537
11568
|
const e = Math.floor(t / 36e5), i = Math.floor(t % (60 * 60 * 1e3) / (60 * 1e3)), n = Math.floor(t % (60 * 1e3) / 1e3), d = t % 1e3;
|
|
11538
11569
|
return e.toString().padStart(2, "0") + ":" + i.toString().padStart(2, "0") + ":" + n.toString().padStart(2, "0") + "." + d.toString().padStart(3, "0");
|
|
11539
11570
|
};
|
|
@@ -11595,7 +11626,7 @@ class Ns {
|
|
|
11595
11626
|
}
|
|
11596
11627
|
}
|
|
11597
11628
|
}
|
|
11598
|
-
const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(He.buffer), Ue = (t) => [(t % 256 + 256) % 256],
|
|
11629
|
+
const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(He.buffer), Ue = (t) => [(t % 256 + 256) % 256], Se = (t) => (qt.setUint16(0, t, !1), [He[0], He[1]]), Xn = (t) => (qt.setInt16(0, t, !1), [He[0], He[1]]), _n = (t) => (qt.setUint32(0, t, !1), [He[1], He[2], He[3]]), me = (t) => (qt.setUint32(0, t, !1), [He[0], He[1], He[2], He[3]]), d0 = (t) => (qt.setInt32(0, t, !1), [He[0], He[1], He[2], He[3]]), V0 = (t) => (qt.setUint32(0, Math.floor(t / 2 ** 32), !1), qt.setUint32(4, t, !1), [He[0], He[1], He[2], He[3], He[4], He[5], He[6], He[7]]), Sn = (t) => (qt.setInt16(0, 2 ** 8 * t, !1), [He[0], He[1]]), i0 = (t) => (qt.setInt32(0, 2 ** 16 * t, !1), [He[0], He[1], He[2], He[3]]), Ji = (t) => (qt.setInt32(0, 2 ** 30 * t, !1), [He[0], He[1], He[2], He[3]]), Ei = (t, e) => {
|
|
11599
11630
|
const i = [];
|
|
11600
11631
|
let n = t;
|
|
11601
11632
|
do {
|
|
@@ -11611,7 +11642,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11611
11642
|
for (const i of t)
|
|
11612
11643
|
(!e || i.timestamp > e.timestamp) && (e = i);
|
|
11613
11644
|
return e;
|
|
11614
|
-
},
|
|
11645
|
+
}, Gn = (t) => {
|
|
11615
11646
|
const e = t * (Math.PI / 180), i = Math.round(Math.cos(e)), n = Math.round(Math.sin(e));
|
|
11616
11647
|
return [
|
|
11617
11648
|
i,
|
|
@@ -11624,7 +11655,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11624
11655
|
0,
|
|
11625
11656
|
1
|
|
11626
11657
|
];
|
|
11627
|
-
}, vn = /* @__PURE__ */
|
|
11658
|
+
}, vn = /* @__PURE__ */ Gn(0), In = (t) => [
|
|
11628
11659
|
i0(t[0]),
|
|
11629
11660
|
i0(t[1]),
|
|
11630
11661
|
Ji(t[2]),
|
|
@@ -11634,18 +11665,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11634
11665
|
i0(t[6]),
|
|
11635
11666
|
i0(t[7]),
|
|
11636
11667
|
Ji(t[8])
|
|
11637
|
-
],
|
|
11668
|
+
], Ge = (t, e, i) => ({
|
|
11638
11669
|
type: t,
|
|
11639
11670
|
contents: e && new Uint8Array(e.flat(10)),
|
|
11640
11671
|
children: i
|
|
11641
|
-
}), Ye = (t, e, i, n, d) =>
|
|
11672
|
+
}), Ye = (t, e, i, n, d) => Ge(t, [Ue(e), _n(i), n ?? []], d), rl = (t) => t.isQuickTime ? Ge("ftyp", [
|
|
11642
11673
|
at("qt "),
|
|
11643
11674
|
// Major brand
|
|
11644
11675
|
me(512),
|
|
11645
11676
|
// Minor version
|
|
11646
11677
|
// Compatible brands
|
|
11647
11678
|
at("qt ")
|
|
11648
|
-
]) : t.fragmented ?
|
|
11679
|
+
]) : t.fragmented ? Ge("ftyp", [
|
|
11649
11680
|
at("iso5"),
|
|
11650
11681
|
// Major brand
|
|
11651
11682
|
me(512),
|
|
@@ -11654,7 +11685,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11654
11685
|
at("iso5"),
|
|
11655
11686
|
at("iso6"),
|
|
11656
11687
|
at("mp41")
|
|
11657
|
-
]) :
|
|
11688
|
+
]) : Ge("ftyp", [
|
|
11658
11689
|
at("isom"),
|
|
11659
11690
|
// Major brand
|
|
11660
11691
|
me(512),
|
|
@@ -11663,12 +11694,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11663
11694
|
at("isom"),
|
|
11664
11695
|
t.holdsAvc ? at("avc1") : [],
|
|
11665
11696
|
at("mp41")
|
|
11666
|
-
]), ci = (t) => ({ type: "mdat", largeSize: t }),
|
|
11667
|
-
|
|
11668
|
-
...t.trackDatas.map((e) =>
|
|
11669
|
-
t.isFragmented ?
|
|
11670
|
-
|
|
11671
|
-
]),
|
|
11697
|
+
]), ci = (t) => ({ type: "mdat", largeSize: t }), al = (t) => ({ type: "free", size: t }), U0 = (t) => Ge("moov", void 0, [
|
|
11698
|
+
ll(t.creationTime, t.trackDatas),
|
|
11699
|
+
...t.trackDatas.map((e) => ol(e, t.creationTime)),
|
|
11700
|
+
t.isFragmented ? Nl(t.trackDatas) : null,
|
|
11701
|
+
i1(t)
|
|
11702
|
+
]), ll = (t, e) => {
|
|
11672
11703
|
const i = tt(Math.max(0, ...e.filter((m) => m.samples.length > 0).map((m) => {
|
|
11673
11704
|
const h = is(m.samples);
|
|
11674
11705
|
return h.timestamp + h.duration;
|
|
@@ -11684,7 +11715,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11684
11715
|
// Duration
|
|
11685
11716
|
i0(1),
|
|
11686
11717
|
// Preferred rate
|
|
11687
|
-
|
|
11718
|
+
Sn(1),
|
|
11688
11719
|
// Preferred volume
|
|
11689
11720
|
Array(10).fill(0),
|
|
11690
11721
|
// Reserved
|
|
@@ -11695,28 +11726,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11695
11726
|
me(n)
|
|
11696
11727
|
// Next track ID
|
|
11697
11728
|
]);
|
|
11698
|
-
},
|
|
11699
|
-
const i =
|
|
11700
|
-
return
|
|
11701
|
-
ol(t, e),
|
|
11729
|
+
}, ol = (t, e) => {
|
|
11730
|
+
const i = h1(t);
|
|
11731
|
+
return Ge("trak", void 0, [
|
|
11702
11732
|
cl(t, e),
|
|
11703
|
-
|
|
11704
|
-
|
|
11733
|
+
dl(t, e),
|
|
11734
|
+
i.name !== void 0 ? Ge("udta", void 0, [
|
|
11735
|
+
Ge("name", [
|
|
11705
11736
|
...$t.encode(i.name)
|
|
11706
11737
|
])
|
|
11707
11738
|
]) : null
|
|
11708
11739
|
]);
|
|
11709
|
-
},
|
|
11710
|
-
var
|
|
11740
|
+
}, cl = (t, e) => {
|
|
11741
|
+
var S;
|
|
11711
11742
|
const i = is(t.samples), n = tt(i ? i.timestamp + i.duration : 0, ji), d = !M0(e) || !M0(n), o = d ? V0 : me;
|
|
11712
11743
|
let m;
|
|
11713
11744
|
if (t.type === "video") {
|
|
11714
11745
|
const W = t.track.metadata.rotation;
|
|
11715
|
-
m =
|
|
11746
|
+
m = Gn(W ?? 0);
|
|
11716
11747
|
} else
|
|
11717
11748
|
m = vn;
|
|
11718
11749
|
let h = 2;
|
|
11719
|
-
return ((
|
|
11750
|
+
return ((S = t.track.metadata.disposition) == null ? void 0 : S.default) !== !1 && (h |= 1), Ye("tkhd", +d, h, [
|
|
11720
11751
|
o(e),
|
|
11721
11752
|
// Creation time
|
|
11722
11753
|
o(e),
|
|
@@ -11729,13 +11760,13 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11729
11760
|
// Duration
|
|
11730
11761
|
Array(8).fill(0),
|
|
11731
11762
|
// Reserved
|
|
11732
|
-
|
|
11763
|
+
Se(0),
|
|
11733
11764
|
// Layer
|
|
11734
|
-
|
|
11765
|
+
Se(t.track.id),
|
|
11735
11766
|
// Alternate group
|
|
11736
|
-
|
|
11767
|
+
Sn(t.type === "audio" ? 1 : 0),
|
|
11737
11768
|
// Volume
|
|
11738
|
-
|
|
11769
|
+
Se(0),
|
|
11739
11770
|
// Reserved
|
|
11740
11771
|
In(m),
|
|
11741
11772
|
// Matrix
|
|
@@ -11744,11 +11775,11 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11744
11775
|
i0(t.type === "video" ? t.info.height : 0)
|
|
11745
11776
|
// Track height
|
|
11746
11777
|
]);
|
|
11747
|
-
},
|
|
11748
|
-
|
|
11749
|
-
ss(!0,
|
|
11750
|
-
|
|
11751
|
-
]),
|
|
11778
|
+
}, dl = (t, e) => Ge("mdia", void 0, [
|
|
11779
|
+
ml(t, e),
|
|
11780
|
+
ss(!0, ul[t.type], hl[t.type]),
|
|
11781
|
+
bl(t)
|
|
11782
|
+
]), ml = (t, e) => {
|
|
11752
11783
|
const i = is(t.samples), n = tt(i ? i.timestamp + i.duration : 0, t.timescale), d = !M0(e) || !M0(n), o = d ? V0 : me;
|
|
11753
11784
|
return Ye("mdhd", +d, 0, [
|
|
11754
11785
|
o(e),
|
|
@@ -11759,16 +11790,16 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11759
11790
|
// Timescale
|
|
11760
11791
|
o(n),
|
|
11761
11792
|
// Duration
|
|
11762
|
-
|
|
11793
|
+
Se(Wn(t.track.metadata.languageCode ?? Va)),
|
|
11763
11794
|
// Language
|
|
11764
|
-
|
|
11795
|
+
Se(0)
|
|
11765
11796
|
// Quality
|
|
11766
11797
|
]);
|
|
11767
|
-
},
|
|
11798
|
+
}, ul = {
|
|
11768
11799
|
video: "vide",
|
|
11769
11800
|
audio: "soun",
|
|
11770
11801
|
subtitle: "text"
|
|
11771
|
-
},
|
|
11802
|
+
}, hl = {
|
|
11772
11803
|
video: "MediabunnyVideoHandler",
|
|
11773
11804
|
audio: "MediabunnySoundHandler",
|
|
11774
11805
|
subtitle: "MediabunnyTextHandler"
|
|
@@ -11785,75 +11816,75 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11785
11816
|
// Component flags mask
|
|
11786
11817
|
at(i, !0)
|
|
11787
11818
|
// Component name
|
|
11788
|
-
]),
|
|
11789
|
-
|
|
11790
|
-
|
|
11819
|
+
]), bl = (t) => Ge("minf", void 0, [
|
|
11820
|
+
Zl[t.type](),
|
|
11821
|
+
Xl(),
|
|
11791
11822
|
Gl(t)
|
|
11792
|
-
]),
|
|
11793
|
-
|
|
11823
|
+
]), pl = () => Ye("vmhd", 0, 1, [
|
|
11824
|
+
Se(0),
|
|
11794
11825
|
// Graphics mode
|
|
11795
|
-
|
|
11826
|
+
Se(0),
|
|
11796
11827
|
// Opcolor R
|
|
11797
|
-
|
|
11828
|
+
Se(0),
|
|
11798
11829
|
// Opcolor G
|
|
11799
|
-
|
|
11830
|
+
Se(0)
|
|
11800
11831
|
// Opcolor B
|
|
11801
|
-
]),
|
|
11802
|
-
|
|
11832
|
+
]), yl = () => Ye("smhd", 0, 0, [
|
|
11833
|
+
Se(0),
|
|
11803
11834
|
// Balance
|
|
11804
|
-
|
|
11835
|
+
Se(0)
|
|
11805
11836
|
// Reserved
|
|
11806
|
-
]),
|
|
11807
|
-
video:
|
|
11808
|
-
audio:
|
|
11809
|
-
subtitle:
|
|
11810
|
-
},
|
|
11811
|
-
|
|
11812
|
-
]),
|
|
11837
|
+
]), fl = () => Ye("nmhd", 0, 0), Zl = {
|
|
11838
|
+
video: pl,
|
|
11839
|
+
audio: yl,
|
|
11840
|
+
subtitle: fl
|
|
11841
|
+
}, Xl = () => Ge("dinf", void 0, [
|
|
11842
|
+
_l()
|
|
11843
|
+
]), _l = () => Ye("dref", 0, 0, [
|
|
11813
11844
|
me(1)
|
|
11814
11845
|
// Entry count
|
|
11815
11846
|
], [
|
|
11816
|
-
|
|
11817
|
-
]),
|
|
11847
|
+
Sl()
|
|
11848
|
+
]), Sl = () => Ye("url ", 0, 1), Gl = (t) => {
|
|
11818
11849
|
const e = t.compositionTimeOffsetTable.length > 1 || t.compositionTimeOffsetTable.some((i) => i.sampleCompositionTimeOffset !== 0);
|
|
11819
|
-
return
|
|
11820
|
-
|
|
11821
|
-
|
|
11822
|
-
e ? Fl(t) : null,
|
|
11850
|
+
return Ge("stbl", void 0, [
|
|
11851
|
+
vl(t),
|
|
11852
|
+
kl(t),
|
|
11823
11853
|
e ? Jl(t) : null,
|
|
11824
|
-
|
|
11854
|
+
e ? El(t) : null,
|
|
11825
11855
|
Cl(t),
|
|
11826
11856
|
gl(t),
|
|
11827
|
-
|
|
11857
|
+
Fl(t),
|
|
11858
|
+
Bl(t)
|
|
11828
11859
|
]);
|
|
11829
|
-
},
|
|
11860
|
+
}, vl = (t) => {
|
|
11830
11861
|
let e;
|
|
11831
11862
|
if (t.type === "video")
|
|
11832
|
-
e =
|
|
11863
|
+
e = Il(a1(t.track.source._codec, t.info.decoderConfig.codec), t);
|
|
11833
11864
|
else if (t.type === "audio") {
|
|
11834
11865
|
const i = Tn(t.track.source._codec, t.muxer.isQuickTime);
|
|
11835
|
-
ve(i), e =
|
|
11836
|
-
} else t.type === "subtitle" && (e =
|
|
11866
|
+
ve(i), e = Ll(i, t);
|
|
11867
|
+
} else t.type === "subtitle" && (e = Kl(c1[t.track.source._codec], t));
|
|
11837
11868
|
return ve(e), Ye("stsd", 0, 0, [
|
|
11838
11869
|
me(1)
|
|
11839
11870
|
// Entry count
|
|
11840
11871
|
], [
|
|
11841
11872
|
e
|
|
11842
11873
|
]);
|
|
11843
|
-
},
|
|
11874
|
+
}, Il = (t, e) => Ge(t, [
|
|
11844
11875
|
Array(6).fill(0),
|
|
11845
11876
|
// Reserved
|
|
11846
|
-
|
|
11877
|
+
Se(1),
|
|
11847
11878
|
// Data reference index
|
|
11848
|
-
|
|
11879
|
+
Se(0),
|
|
11849
11880
|
// Pre-defined
|
|
11850
|
-
|
|
11881
|
+
Se(0),
|
|
11851
11882
|
// Reserved
|
|
11852
11883
|
Array(12).fill(0),
|
|
11853
11884
|
// Pre-defined
|
|
11854
|
-
|
|
11885
|
+
Se(e.info.width),
|
|
11855
11886
|
// Width
|
|
11856
|
-
|
|
11887
|
+
Se(e.info.height),
|
|
11857
11888
|
// Height
|
|
11858
11889
|
me(4718592),
|
|
11859
11890
|
// Horizontal resolution
|
|
@@ -11861,45 +11892,45 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11861
11892
|
// Vertical resolution
|
|
11862
11893
|
me(0),
|
|
11863
11894
|
// Reserved
|
|
11864
|
-
|
|
11895
|
+
Se(1),
|
|
11865
11896
|
// Frame count
|
|
11866
11897
|
Array(32).fill(0),
|
|
11867
11898
|
// Compressor name
|
|
11868
|
-
|
|
11899
|
+
Se(24),
|
|
11869
11900
|
// Depth
|
|
11870
11901
|
Xn(65535)
|
|
11871
11902
|
// Pre-defined
|
|
11872
11903
|
], [
|
|
11873
|
-
|
|
11874
|
-
Ga(e.info.decoderConfig.colorSpace) ?
|
|
11875
|
-
]),
|
|
11904
|
+
l1[e.track.source._codec](e),
|
|
11905
|
+
Ga(e.info.decoderConfig.colorSpace) ? Vl(e) : null
|
|
11906
|
+
]), Vl = (t) => Ge("colr", [
|
|
11876
11907
|
at("nclx"),
|
|
11877
11908
|
// Colour type
|
|
11878
|
-
|
|
11909
|
+
Se($i[t.info.decoderConfig.colorSpace.primaries]),
|
|
11879
11910
|
// Colour primaries
|
|
11880
|
-
|
|
11911
|
+
Se(qi[t.info.decoderConfig.colorSpace.transfer]),
|
|
11881
11912
|
// Transfer characteristics
|
|
11882
|
-
|
|
11913
|
+
Se(es[t.info.decoderConfig.colorSpace.matrix]),
|
|
11883
11914
|
// Matrix coefficients
|
|
11884
11915
|
Ue((t.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)
|
|
11885
11916
|
// Full range flag
|
|
11886
|
-
]),
|
|
11917
|
+
]), Rl = (t) => t.info.decoderConfig && Ge("avcC", [
|
|
11887
11918
|
// For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here
|
|
11888
11919
|
...Q0(t.info.decoderConfig.description)
|
|
11889
|
-
]),
|
|
11920
|
+
]), Tl = (t) => t.info.decoderConfig && Ge("hvcC", [
|
|
11890
11921
|
// For HEVC, description is an HEVCDecoderConfigurationRecord, so nothing else to do here
|
|
11891
11922
|
...Q0(t.info.decoderConfig.description)
|
|
11892
11923
|
]), Ps = (t) => {
|
|
11893
11924
|
var O, w, N, J;
|
|
11894
11925
|
if (!t.info.decoderConfig)
|
|
11895
11926
|
return null;
|
|
11896
|
-
const e = t.info.decoderConfig, i = e.codec.split("."), n = Number(i[1]), d = Number(i[2]), o = Number(i[3]), m = i[4] ? Number(i[4]) : 1, h = i[8] ? Number(i[8]) : Number(((O = e.colorSpace) == null ? void 0 : O.fullRange) ?? 0),
|
|
11927
|
+
const e = t.info.decoderConfig, i = e.codec.split("."), n = Number(i[1]), d = Number(i[2]), o = Number(i[3]), m = i[4] ? Number(i[4]) : 1, h = i[8] ? Number(i[8]) : Number(((O = e.colorSpace) == null ? void 0 : O.fullRange) ?? 0), S = (o << 4) + (m << 1) + h, W = i[5] ? Number(i[5]) : (w = e.colorSpace) != null && w.primaries ? $i[e.colorSpace.primaries] : 2, v = i[6] ? Number(i[6]) : (N = e.colorSpace) != null && N.transfer ? qi[e.colorSpace.transfer] : 2, Z = i[7] ? Number(i[7]) : (J = e.colorSpace) != null && J.matrix ? es[e.colorSpace.matrix] : 2;
|
|
11897
11928
|
return Ye("vpcC", 1, 0, [
|
|
11898
11929
|
Ue(n),
|
|
11899
11930
|
// Profile
|
|
11900
11931
|
Ue(d),
|
|
11901
11932
|
// Level
|
|
11902
|
-
Ue(
|
|
11933
|
+
Ue(S),
|
|
11903
11934
|
// Bit depth, chroma subsampling, full range
|
|
11904
11935
|
Ue(W),
|
|
11905
11936
|
// Colour primaries
|
|
@@ -11907,10 +11938,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11907
11938
|
// Transfer characteristics
|
|
11908
11939
|
Ue(Z),
|
|
11909
11940
|
// Matrix coefficients
|
|
11910
|
-
|
|
11941
|
+
Se(0)
|
|
11911
11942
|
// Codec initialization data size
|
|
11912
11943
|
]);
|
|
11913
|
-
},
|
|
11944
|
+
}, Wl = (t) => Ge("av1C", Ya(t.info.decoderConfig.codec)), Ll = (t, e) => {
|
|
11914
11945
|
var o;
|
|
11915
11946
|
let i = 0, n, d = 16;
|
|
11916
11947
|
if (k0.includes(e.track.source._codec)) {
|
|
@@ -11920,48 +11951,48 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11920
11951
|
return i === 0 ? n = [
|
|
11921
11952
|
Array(6).fill(0),
|
|
11922
11953
|
// Reserved
|
|
11923
|
-
|
|
11954
|
+
Se(1),
|
|
11924
11955
|
// Data reference index
|
|
11925
|
-
|
|
11956
|
+
Se(i),
|
|
11926
11957
|
// Version
|
|
11927
|
-
|
|
11958
|
+
Se(0),
|
|
11928
11959
|
// Revision level
|
|
11929
11960
|
me(0),
|
|
11930
11961
|
// Vendor
|
|
11931
|
-
|
|
11962
|
+
Se(e.info.numberOfChannels),
|
|
11932
11963
|
// Number of channels
|
|
11933
|
-
|
|
11964
|
+
Se(d),
|
|
11934
11965
|
// Sample size (bits)
|
|
11935
|
-
|
|
11966
|
+
Se(0),
|
|
11936
11967
|
// Compression ID
|
|
11937
|
-
|
|
11968
|
+
Se(0),
|
|
11938
11969
|
// Packet size
|
|
11939
|
-
|
|
11970
|
+
Se(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
|
|
11940
11971
|
// Sample rate (upper)
|
|
11941
|
-
|
|
11972
|
+
Se(0)
|
|
11942
11973
|
// Sample rate (lower)
|
|
11943
11974
|
] : n = [
|
|
11944
11975
|
Array(6).fill(0),
|
|
11945
11976
|
// Reserved
|
|
11946
|
-
|
|
11977
|
+
Se(1),
|
|
11947
11978
|
// Data reference index
|
|
11948
|
-
|
|
11979
|
+
Se(i),
|
|
11949
11980
|
// Version
|
|
11950
|
-
|
|
11981
|
+
Se(0),
|
|
11951
11982
|
// Revision level
|
|
11952
11983
|
me(0),
|
|
11953
11984
|
// Vendor
|
|
11954
|
-
|
|
11985
|
+
Se(e.info.numberOfChannels),
|
|
11955
11986
|
// Number of channels
|
|
11956
|
-
|
|
11987
|
+
Se(Math.min(d, 16)),
|
|
11957
11988
|
// Sample size (bits)
|
|
11958
|
-
|
|
11989
|
+
Se(0),
|
|
11959
11990
|
// Compression ID
|
|
11960
|
-
|
|
11991
|
+
Se(0),
|
|
11961
11992
|
// Packet size
|
|
11962
|
-
|
|
11993
|
+
Se(e.info.sampleRate < 2 ** 16 ? e.info.sampleRate : 0),
|
|
11963
11994
|
// Sample rate (upper)
|
|
11964
|
-
|
|
11995
|
+
Se(0),
|
|
11965
11996
|
// Sample rate (lower)
|
|
11966
11997
|
me(1),
|
|
11967
11998
|
// Samples per packet (must be 1 for uncompressed formats)
|
|
@@ -11971,8 +12002,8 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
11971
12002
|
// Bytes per frame
|
|
11972
12003
|
me(2)
|
|
11973
12004
|
// Bytes per sample (constant in FFmpeg)
|
|
11974
|
-
],
|
|
11975
|
-
((o =
|
|
12005
|
+
], Ge(t, n, [
|
|
12006
|
+
((o = o1(e.track.source._codec, e.muxer.isQuickTime)) == null ? void 0 : o(e)) ?? null
|
|
11976
12007
|
]);
|
|
11977
12008
|
}, Ni = (t) => {
|
|
11978
12009
|
let e;
|
|
@@ -12012,7 +12043,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12012
12043
|
];
|
|
12013
12044
|
}
|
|
12014
12045
|
return i = [
|
|
12015
|
-
...
|
|
12046
|
+
...Se(1),
|
|
12016
12047
|
// ES_ID = 1
|
|
12017
12048
|
...Ue(0),
|
|
12018
12049
|
// flags etc = 0
|
|
@@ -12032,33 +12063,33 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12032
12063
|
...Ei(i.length),
|
|
12033
12064
|
...i
|
|
12034
12065
|
], Ye("esds", 0, 0, i);
|
|
12035
|
-
}, c0 = (t) =>
|
|
12036
|
-
Ll(t),
|
|
12066
|
+
}, c0 = (t) => Ge("wave", void 0, [
|
|
12037
12067
|
xl(t),
|
|
12038
|
-
|
|
12068
|
+
Hl(t),
|
|
12069
|
+
Ge("\0\0\0\0")
|
|
12039
12070
|
// NULL tag at the end
|
|
12040
|
-
]),
|
|
12071
|
+
]), xl = (t) => Ge("frma", [
|
|
12041
12072
|
at(Tn(t.track.source._codec, t.muxer.isQuickTime))
|
|
12042
|
-
]),
|
|
12073
|
+
]), Hl = (t) => {
|
|
12043
12074
|
const { littleEndian: e } = D0(t.track.source._codec);
|
|
12044
|
-
return
|
|
12045
|
-
|
|
12075
|
+
return Ge("enda", [
|
|
12076
|
+
Se(+e)
|
|
12046
12077
|
]);
|
|
12047
|
-
},
|
|
12048
|
-
var
|
|
12078
|
+
}, Yl = (t) => {
|
|
12079
|
+
var S;
|
|
12049
12080
|
let e = t.info.numberOfChannels, i = 3840, n = t.info.sampleRate, d = 0, o = 0, m = new Uint8Array(0);
|
|
12050
|
-
const h = (
|
|
12081
|
+
const h = (S = t.info.decoderConfig) == null ? void 0 : S.description;
|
|
12051
12082
|
if (h) {
|
|
12052
12083
|
ve(h.byteLength >= 18);
|
|
12053
|
-
const W = Q0(h), v =
|
|
12084
|
+
const W = Q0(h), v = il(W);
|
|
12054
12085
|
e = v.outputChannelCount, i = v.preSkip, n = v.inputSampleRate, d = v.outputGain, o = v.channelMappingFamily, v.channelMappingTable && (m = v.channelMappingTable);
|
|
12055
12086
|
}
|
|
12056
|
-
return
|
|
12087
|
+
return Ge("dOps", [
|
|
12057
12088
|
Ue(0),
|
|
12058
12089
|
// Version
|
|
12059
12090
|
Ue(e),
|
|
12060
12091
|
// OutputChannelCount
|
|
12061
|
-
|
|
12092
|
+
Se(i),
|
|
12062
12093
|
// PreSkip
|
|
12063
12094
|
me(n),
|
|
12064
12095
|
// InputSampleRate
|
|
@@ -12068,7 +12099,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12068
12099
|
// ChannelMappingFamily
|
|
12069
12100
|
...m
|
|
12070
12101
|
]);
|
|
12071
|
-
},
|
|
12102
|
+
}, wl = (t) => {
|
|
12072
12103
|
var n;
|
|
12073
12104
|
const e = (n = t.info.decoderConfig) == null ? void 0 : n.description;
|
|
12074
12105
|
ve(e);
|
|
@@ -12082,16 +12113,16 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12082
12113
|
Ue(n),
|
|
12083
12114
|
Ue(8 * i)
|
|
12084
12115
|
]);
|
|
12085
|
-
},
|
|
12116
|
+
}, Kl = (t, e) => Ge(t, [
|
|
12086
12117
|
Array(6).fill(0),
|
|
12087
12118
|
// Reserved
|
|
12088
|
-
|
|
12119
|
+
Se(1)
|
|
12089
12120
|
// Data reference index
|
|
12090
12121
|
], [
|
|
12091
|
-
|
|
12092
|
-
]),
|
|
12122
|
+
d1[e.track.source._codec](e)
|
|
12123
|
+
]), Ml = (t) => Ge("vttC", [
|
|
12093
12124
|
...$t.encode(t.info.config.description)
|
|
12094
|
-
]),
|
|
12125
|
+
]), kl = (t) => Ye("stts", 0, 0, [
|
|
12095
12126
|
me(t.timeToSampleTable.length),
|
|
12096
12127
|
// Number of entries
|
|
12097
12128
|
t.timeToSampleTable.map((e) => [
|
|
@@ -12100,7 +12131,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12100
12131
|
me(e.sampleDelta)
|
|
12101
12132
|
// Sample duration
|
|
12102
12133
|
])
|
|
12103
|
-
]),
|
|
12134
|
+
]), Bl = (t) => {
|
|
12104
12135
|
if (t.samples.every((i) => i.type === "key"))
|
|
12105
12136
|
return null;
|
|
12106
12137
|
const e = [...t.samples.entries()].filter(([, i]) => i.type === "key");
|
|
@@ -12110,7 +12141,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12110
12141
|
e.map(([i]) => me(i + 1))
|
|
12111
12142
|
// Sync sample table
|
|
12112
12143
|
]);
|
|
12113
|
-
},
|
|
12144
|
+
}, Cl = (t) => Ye("stsc", 0, 0, [
|
|
12114
12145
|
me(t.compactlyCodedChunkTable.length),
|
|
12115
12146
|
// Number of entries
|
|
12116
12147
|
t.compactlyCodedChunkTable.map((e) => [
|
|
@@ -12121,7 +12152,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12121
12152
|
me(1)
|
|
12122
12153
|
// Sample description index
|
|
12123
12154
|
])
|
|
12124
|
-
]),
|
|
12155
|
+
]), gl = (t) => {
|
|
12125
12156
|
if (t.type === "audio" && t.info.requiresPcmTransformation) {
|
|
12126
12157
|
const { sampleSize: e } = D0(t.track.source._codec);
|
|
12127
12158
|
return Ye("stsz", 0, 0, [
|
|
@@ -12138,7 +12169,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12138
12169
|
t.samples.map((e) => me(e.size))
|
|
12139
12170
|
// Sample size table
|
|
12140
12171
|
]);
|
|
12141
|
-
},
|
|
12172
|
+
}, Fl = (t) => t.finalizedChunks.length > 0 && Y0(t.finalizedChunks).offset >= 2 ** 32 ? Ye("co64", 0, 0, [
|
|
12142
12173
|
me(t.finalizedChunks.length),
|
|
12143
12174
|
// Number of entries
|
|
12144
12175
|
t.finalizedChunks.map((e) => V0(e.offset))
|
|
@@ -12148,7 +12179,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12148
12179
|
// Number of entries
|
|
12149
12180
|
t.finalizedChunks.map((e) => me(e.offset))
|
|
12150
12181
|
// Chunk offset table
|
|
12151
|
-
]),
|
|
12182
|
+
]), Jl = (t) => Ye("ctts", 1, 0, [
|
|
12152
12183
|
me(t.compositionTimeOffsetTable.length),
|
|
12153
12184
|
// Number of entries
|
|
12154
12185
|
t.compositionTimeOffsetTable.map((e) => [
|
|
@@ -12157,7 +12188,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12157
12188
|
d0(e.sampleCompositionTimeOffset)
|
|
12158
12189
|
// Sample offset
|
|
12159
12190
|
])
|
|
12160
|
-
]),
|
|
12191
|
+
]), El = (t) => {
|
|
12161
12192
|
let e = 1 / 0, i = -1 / 0, n = 1 / 0, d = -1 / 0;
|
|
12162
12193
|
ve(t.compositionTimeOffsetTable.length > 0), ve(t.samples.length > 0);
|
|
12163
12194
|
for (let m = 0; m < t.compositionTimeOffsetTable.length; m++) {
|
|
@@ -12181,7 +12212,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12181
12212
|
d0(d)
|
|
12182
12213
|
// Composition end time
|
|
12183
12214
|
]);
|
|
12184
|
-
},
|
|
12215
|
+
}, Nl = (t) => Ge("mvex", void 0, t.map(Pl)), Pl = (t) => Ye("trex", 0, 0, [
|
|
12185
12216
|
me(t.track.id),
|
|
12186
12217
|
// Track ID
|
|
12187
12218
|
me(1),
|
|
@@ -12192,21 +12223,21 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12192
12223
|
// Default sample size
|
|
12193
12224
|
me(0)
|
|
12194
12225
|
// Default sample flags
|
|
12195
|
-
]), Us = (t, e) =>
|
|
12196
|
-
|
|
12197
|
-
...e.map(
|
|
12198
|
-
]),
|
|
12226
|
+
]), Us = (t, e) => Ge("moof", void 0, [
|
|
12227
|
+
Ul(t),
|
|
12228
|
+
...e.map(zl)
|
|
12229
|
+
]), Ul = (t) => Ye("mfhd", 0, 0, [
|
|
12199
12230
|
me(t)
|
|
12200
12231
|
// Sequence number
|
|
12201
12232
|
]), Vn = (t) => {
|
|
12202
12233
|
let e = 0, i = 0;
|
|
12203
12234
|
const n = 0, d = 0, o = t.type === "delta";
|
|
12204
12235
|
return i |= +o, o ? e |= 1 : e |= 2, e << 24 | i << 16 | n << 8 | d;
|
|
12205
|
-
},
|
|
12206
|
-
zl(t),
|
|
12236
|
+
}, zl = (t) => Ge("traf", void 0, [
|
|
12207
12237
|
Al(t),
|
|
12208
|
-
Ol(t)
|
|
12209
|
-
|
|
12238
|
+
Ol(t),
|
|
12239
|
+
jl(t)
|
|
12240
|
+
]), Al = (t) => {
|
|
12210
12241
|
ve(t.currentChunk);
|
|
12211
12242
|
let e = 0;
|
|
12212
12243
|
e |= 8, e |= 16, e |= 32, e |= 131072;
|
|
@@ -12225,12 +12256,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12225
12256
|
me(n.flags)
|
|
12226
12257
|
// Default sample flags
|
|
12227
12258
|
]);
|
|
12228
|
-
},
|
|
12259
|
+
}, Ol = (t) => (ve(t.currentChunk), Ye("tfdt", 1, 0, [
|
|
12229
12260
|
V0(tt(t.currentChunk.startTimestamp, t.timescale))
|
|
12230
12261
|
// Base Media Decode Time
|
|
12231
|
-
])),
|
|
12262
|
+
])), jl = (t) => {
|
|
12232
12263
|
ve(t.currentChunk);
|
|
12233
|
-
const e = t.currentChunk.samples.map((J) => J.timescaleUnitsToNextSample), i = t.currentChunk.samples.map((J) => J.size), n = t.currentChunk.samples.map(Vn), d = t.currentChunk.samples.map((J) => tt(J.timestamp - J.decodeTimestamp, t.timescale)), o = new Set(e), m = new Set(i), h = new Set(n),
|
|
12264
|
+
const e = t.currentChunk.samples.map((J) => J.timescaleUnitsToNextSample), i = t.currentChunk.samples.map((J) => J.size), n = t.currentChunk.samples.map(Vn), d = t.currentChunk.samples.map((J) => tt(J.timestamp - J.decodeTimestamp, t.timescale)), o = new Set(e), m = new Set(i), h = new Set(n), S = new Set(d), W = h.size === 2 && n[0] !== n[1], v = o.size > 1, Z = m.size > 1, O = !W && h.size > 1, w = S.size > 1 || [...S].some((J) => J !== 0);
|
|
12234
12265
|
let N = 0;
|
|
12235
12266
|
return N |= 1, N |= 4 * +W, N |= 256 * +v, N |= 512 * +Z, N |= 1024 * +O, N |= 2048 * +w, Ye("trun", 1, N, [
|
|
12236
12267
|
me(t.currentChunk.samples.length),
|
|
@@ -12249,10 +12280,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12249
12280
|
w ? d0(d[U]) : []
|
|
12250
12281
|
])
|
|
12251
12282
|
]);
|
|
12252
|
-
},
|
|
12253
|
-
...t.map(
|
|
12254
|
-
|
|
12255
|
-
]),
|
|
12283
|
+
}, Ql = (t) => Ge("mfra", void 0, [
|
|
12284
|
+
...t.map(Dl),
|
|
12285
|
+
$l()
|
|
12286
|
+
]), Dl = (t, e) => Ye("tfra", 1, 0, [
|
|
12256
12287
|
me(t.track.id),
|
|
12257
12288
|
// Track ID
|
|
12258
12289
|
me(63),
|
|
@@ -12271,28 +12302,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12271
12302
|
me(1)
|
|
12272
12303
|
// Sample number
|
|
12273
12304
|
])
|
|
12274
|
-
]),
|
|
12305
|
+
]), $l = () => Ye("mfro", 0, 0, [
|
|
12275
12306
|
// This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box
|
|
12276
12307
|
// is known
|
|
12277
12308
|
me(0)
|
|
12278
12309
|
// Size
|
|
12279
|
-
]),
|
|
12280
|
-
d !== null ?
|
|
12281
|
-
i !== null ?
|
|
12282
|
-
e !== null ?
|
|
12283
|
-
n !== null ?
|
|
12284
|
-
|
|
12285
|
-
]),
|
|
12310
|
+
]), ql = () => Ge("vtte"), e1 = (t, e, i, n, d) => Ge("vttc", void 0, [
|
|
12311
|
+
d !== null ? Ge("vsid", [d0(d)]) : null,
|
|
12312
|
+
i !== null ? Ge("iden", [...$t.encode(i)]) : null,
|
|
12313
|
+
e !== null ? Ge("ctim", [...$t.encode(nl(e))]) : null,
|
|
12314
|
+
n !== null ? Ge("sttg", [...$t.encode(n)]) : null,
|
|
12315
|
+
Ge("payl", [...$t.encode(t)])
|
|
12316
|
+
]), t1 = (t) => Ge("vtta", [...$t.encode(t)]), i1 = (t) => {
|
|
12286
12317
|
const e = [], i = t.format._options.metadataFormat ?? "auto", n = t.output._metadataTags;
|
|
12287
12318
|
if (i === "mdir" || i === "auto" && !t.isQuickTime) {
|
|
12288
|
-
const d =
|
|
12319
|
+
const d = n1(n);
|
|
12289
12320
|
d && e.push(d);
|
|
12290
12321
|
} else if (i === "mdta") {
|
|
12291
|
-
const d =
|
|
12322
|
+
const d = r1(n);
|
|
12292
12323
|
d && e.push(d);
|
|
12293
|
-
} else (i === "udta" || i === "auto" && t.isQuickTime) &&
|
|
12294
|
-
return e.length === 0 ? null :
|
|
12295
|
-
},
|
|
12324
|
+
} else (i === "udta" || i === "auto" && t.isQuickTime) && s1(e, t.output._metadataTags);
|
|
12325
|
+
return e.length === 0 ? null : Ge("udta", void 0, e);
|
|
12326
|
+
}, s1 = (t, e) => {
|
|
12296
12327
|
for (const { key: i, value: n } of yn(e))
|
|
12297
12328
|
switch (i) {
|
|
12298
12329
|
case "title":
|
|
@@ -12336,13 +12367,13 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12336
12367
|
if (e.raw)
|
|
12337
12368
|
for (const i in e.raw) {
|
|
12338
12369
|
const n = e.raw[i];
|
|
12339
|
-
n == null || i.length !== 4 || t.some((d) => d.type === i) || (typeof n == "string" ? t.push(Qt(i, n)) : n instanceof Uint8Array && t.push(
|
|
12370
|
+
n == null || i.length !== 4 || t.some((d) => d.type === i) || (typeof n == "string" ? t.push(Qt(i, n)) : n instanceof Uint8Array && t.push(Ge(i, Array.from(n))));
|
|
12340
12371
|
}
|
|
12341
12372
|
}, Qt = (t, e) => {
|
|
12342
12373
|
const i = $t.encode(e);
|
|
12343
|
-
return
|
|
12344
|
-
|
|
12345
|
-
|
|
12374
|
+
return Ge(t, [
|
|
12375
|
+
Se(i.length),
|
|
12376
|
+
Se(Wn("und")),
|
|
12346
12377
|
Array.from(i)
|
|
12347
12378
|
]);
|
|
12348
12379
|
}, zs = {
|
|
@@ -12385,7 +12416,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12385
12416
|
break;
|
|
12386
12417
|
case "images":
|
|
12387
12418
|
for (const o of d)
|
|
12388
|
-
o.kind === "coverFront" && i.push({ key: "covr", value:
|
|
12419
|
+
o.kind === "coverFront" && i.push({ key: "covr", value: Ge("data", [
|
|
12389
12420
|
me(zs[o.mimeType] ?? 0),
|
|
12390
12421
|
// Type indicator
|
|
12391
12422
|
me(0),
|
|
@@ -12399,28 +12430,28 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12399
12430
|
const o = t.tracksTotal !== void 0 ? `${d}/${t.tracksTotal}` : d.toString();
|
|
12400
12431
|
i.push({ key: "track", value: Pt(o) });
|
|
12401
12432
|
} else
|
|
12402
|
-
i.push({ key: "trkn", value:
|
|
12433
|
+
i.push({ key: "trkn", value: Ge("data", [
|
|
12403
12434
|
me(0),
|
|
12404
12435
|
// 8 bytes empty
|
|
12405
12436
|
me(0),
|
|
12406
|
-
|
|
12437
|
+
Se(0),
|
|
12407
12438
|
// Empty
|
|
12408
|
-
|
|
12409
|
-
|
|
12410
|
-
|
|
12439
|
+
Se(d),
|
|
12440
|
+
Se(t.tracksTotal ?? 0),
|
|
12441
|
+
Se(0)
|
|
12411
12442
|
// Empty
|
|
12412
12443
|
]) });
|
|
12413
12444
|
break;
|
|
12414
12445
|
case "discNumber":
|
|
12415
|
-
e || i.push({ key: "disc", value:
|
|
12446
|
+
e || i.push({ key: "disc", value: Ge("data", [
|
|
12416
12447
|
me(0),
|
|
12417
12448
|
// 8 bytes empty
|
|
12418
12449
|
me(0),
|
|
12419
|
-
|
|
12450
|
+
Se(0),
|
|
12420
12451
|
// Empty
|
|
12421
|
-
|
|
12422
|
-
|
|
12423
|
-
|
|
12452
|
+
Se(d),
|
|
12453
|
+
Se(t.discsTotal ?? 0),
|
|
12454
|
+
Se(0)
|
|
12424
12455
|
// Empty
|
|
12425
12456
|
]) });
|
|
12426
12457
|
break;
|
|
@@ -12435,13 +12466,13 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12435
12466
|
if (t.raw)
|
|
12436
12467
|
for (const n in t.raw) {
|
|
12437
12468
|
const d = t.raw[n];
|
|
12438
|
-
d == null || !e && n.length !== 4 || i.some((o) => o.key === n) || (typeof d == "string" ? i.push({ key: n, value: Pt(d) }) : d instanceof Uint8Array ? i.push({ key: n, value:
|
|
12469
|
+
d == null || !e && n.length !== 4 || i.some((o) => o.key === n) || (typeof d == "string" ? i.push({ key: n, value: Pt(d) }) : d instanceof Uint8Array ? i.push({ key: n, value: Ge("data", [
|
|
12439
12470
|
me(0),
|
|
12440
12471
|
// Type indicator
|
|
12441
12472
|
me(0),
|
|
12442
12473
|
// Locale indicator
|
|
12443
12474
|
Array.from(d)
|
|
12444
|
-
]) }) : d instanceof fn && i.push({ key: n, value:
|
|
12475
|
+
]) }) : d instanceof fn && i.push({ key: n, value: Ge("data", [
|
|
12445
12476
|
me(zs[d.mimeType] ?? 0),
|
|
12446
12477
|
// Type indicator
|
|
12447
12478
|
me(0),
|
|
@@ -12451,36 +12482,36 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12451
12482
|
]) }));
|
|
12452
12483
|
}
|
|
12453
12484
|
return i;
|
|
12454
|
-
},
|
|
12485
|
+
}, n1 = (t) => {
|
|
12455
12486
|
const e = Rn(t, !1);
|
|
12456
12487
|
return e.length === 0 ? null : Ye("meta", 0, 0, void 0, [
|
|
12457
12488
|
ss(!1, "mdir", "", "appl"),
|
|
12458
12489
|
// mdir handler
|
|
12459
|
-
|
|
12490
|
+
Ge("ilst", void 0, e.map((i) => Ge(i.key, void 0, [i.value])))
|
|
12460
12491
|
// Item list without keys box
|
|
12461
12492
|
]);
|
|
12462
|
-
},
|
|
12493
|
+
}, r1 = (t) => {
|
|
12463
12494
|
const e = Rn(t, !0);
|
|
12464
|
-
return e.length === 0 ? null :
|
|
12495
|
+
return e.length === 0 ? null : Ge("meta", void 0, [
|
|
12465
12496
|
ss(!1, "mdta", ""),
|
|
12466
12497
|
// mdta handler
|
|
12467
12498
|
Ye("keys", 0, 0, [
|
|
12468
12499
|
me(e.length)
|
|
12469
|
-
], e.map((i) =>
|
|
12500
|
+
], e.map((i) => Ge("mdta", [
|
|
12470
12501
|
...$t.encode(i.key)
|
|
12471
12502
|
]))),
|
|
12472
|
-
|
|
12503
|
+
Ge("ilst", void 0, e.map((i, n) => {
|
|
12473
12504
|
const d = String.fromCharCode(...me(n + 1));
|
|
12474
|
-
return
|
|
12505
|
+
return Ge(d, void 0, [i.value]);
|
|
12475
12506
|
}))
|
|
12476
12507
|
]);
|
|
12477
|
-
}, Pt = (t) =>
|
|
12508
|
+
}, Pt = (t) => Ge("data", [
|
|
12478
12509
|
me(1),
|
|
12479
12510
|
// Type indicator (UTF-8)
|
|
12480
12511
|
me(0),
|
|
12481
12512
|
// Locale indicator
|
|
12482
12513
|
...$t.encode(t)
|
|
12483
|
-
]),
|
|
12514
|
+
]), a1 = (t, e) => {
|
|
12484
12515
|
switch (t) {
|
|
12485
12516
|
case "avc":
|
|
12486
12517
|
return e.startsWith("avc3") ? "avc3" : "avc1";
|
|
@@ -12493,12 +12524,12 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12493
12524
|
case "av1":
|
|
12494
12525
|
return "av01";
|
|
12495
12526
|
}
|
|
12496
|
-
},
|
|
12497
|
-
avc:
|
|
12498
|
-
hevc:
|
|
12527
|
+
}, l1 = {
|
|
12528
|
+
avc: Rl,
|
|
12529
|
+
hevc: Tl,
|
|
12499
12530
|
vp8: Ps,
|
|
12500
12531
|
vp9: Ps,
|
|
12501
|
-
av1:
|
|
12532
|
+
av1: Wl
|
|
12502
12533
|
}, Tn = (t, e) => {
|
|
12503
12534
|
switch (t) {
|
|
12504
12535
|
case "aac":
|
|
@@ -12566,18 +12597,18 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12566
12597
|
case "pcm-f64be":
|
|
12567
12598
|
return "fpcm";
|
|
12568
12599
|
}
|
|
12569
|
-
},
|
|
12600
|
+
}, o1 = (t, e) => {
|
|
12570
12601
|
switch (t) {
|
|
12571
12602
|
case "aac":
|
|
12572
12603
|
return Ni;
|
|
12573
12604
|
case "mp3":
|
|
12574
12605
|
return Ni;
|
|
12575
12606
|
case "opus":
|
|
12576
|
-
return
|
|
12607
|
+
return Yl;
|
|
12577
12608
|
case "vorbis":
|
|
12578
12609
|
return Ni;
|
|
12579
12610
|
case "flac":
|
|
12580
|
-
return
|
|
12611
|
+
return wl;
|
|
12581
12612
|
}
|
|
12582
12613
|
if (e)
|
|
12583
12614
|
switch (t) {
|
|
@@ -12622,10 +12653,10 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12622
12653
|
return jt;
|
|
12623
12654
|
}
|
|
12624
12655
|
return null;
|
|
12625
|
-
}, o1 = {
|
|
12626
|
-
webvtt: "wvtt"
|
|
12627
12656
|
}, c1 = {
|
|
12628
|
-
webvtt:
|
|
12657
|
+
webvtt: "wvtt"
|
|
12658
|
+
}, d1 = {
|
|
12659
|
+
webvtt: Ml
|
|
12629
12660
|
}, Wn = (t) => {
|
|
12630
12661
|
ve(t.length === 3);
|
|
12631
12662
|
let e = 0;
|
|
@@ -12640,7 +12671,7 @@ const He = /* @__PURE__ */ new Uint8Array(8), qt = /* @__PURE__ */ new DataView(
|
|
|
12640
12671
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
12641
12672
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
12642
12673
|
*/
|
|
12643
|
-
class
|
|
12674
|
+
class m1 {
|
|
12644
12675
|
constructor() {
|
|
12645
12676
|
this.ensureMonotonicity = !1, this.trackedWrites = null, this.trackedStart = -1, this.trackedEnd = -1;
|
|
12646
12677
|
}
|
|
@@ -12680,7 +12711,7 @@ class d1 {
|
|
|
12680
12711
|
}
|
|
12681
12712
|
}
|
|
12682
12713
|
const Pi = 2 ** 16, Ui = 2 ** 32;
|
|
12683
|
-
class Ln extends
|
|
12714
|
+
class Ln extends m1 {
|
|
12684
12715
|
constructor(e) {
|
|
12685
12716
|
if (super(), this.pos = 0, this.maxPos = 0, this.target = e, this.supportsResize = "resize" in new ArrayBuffer(0), this.supportsResize)
|
|
12686
12717
|
try {
|
|
@@ -12756,22 +12787,22 @@ class Hn extends xn {
|
|
|
12756
12787
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
12757
12788
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
12758
12789
|
*/
|
|
12759
|
-
const ji = 1e3,
|
|
12790
|
+
const ji = 1e3, u1 = 2082844800, h1 = (t) => {
|
|
12760
12791
|
const e = {}, i = t.track;
|
|
12761
12792
|
return i.metadata.name !== void 0 && (e.name = i.metadata.name), e;
|
|
12762
12793
|
}, tt = (t, e, i = !0) => {
|
|
12763
12794
|
const n = t * e;
|
|
12764
12795
|
return i ? Math.round(n) : n;
|
|
12765
12796
|
};
|
|
12766
|
-
class
|
|
12797
|
+
class b1 extends Na {
|
|
12767
12798
|
constructor(e, i) {
|
|
12768
|
-
super(e), this.auxTarget = new Hn(), this.auxWriter = this.auxTarget._createWriter(), this.auxBoxWriter = new Ns(this.auxWriter), this.mdat = null, this.ftypSize = null, this.trackDatas = [], this.allTracksKnown =
|
|
12799
|
+
super(e), this.auxTarget = new Hn(), this.auxWriter = this.auxTarget._createWriter(), this.auxBoxWriter = new Ns(this.auxWriter), this.mdat = null, this.ftypSize = null, this.trackDatas = [], this.allTracksKnown = va(), this.creationTime = Math.floor(Date.now() / 1e3) + u1, this.finalizedChunks = [], this.nextFragmentNumber = 1, this.maxWrittenTimestamp = -1 / 0, this.format = i, this.writer = e._writer, this.boxWriter = new Ns(this.writer), this.isQuickTime = i instanceof Mn;
|
|
12769
12800
|
const n = this.writer instanceof Ln ? "in-memory" : !1;
|
|
12770
12801
|
this.fastStart = i._options.fastStart ?? n, this.isFragmented = this.fastStart === "fragmented", (this.fastStart === "in-memory" || this.isFragmented) && (this.writer.ensureMonotonicity = !0), this.minimumFragmentDuration = i._options.minimumFragmentDuration ?? 1;
|
|
12771
12802
|
}
|
|
12772
12803
|
async start() {
|
|
12773
12804
|
const e = await this.mutex.acquire(), i = this.output._tracks.some((n) => n.type === "video" && n.source._codec === "avc");
|
|
12774
|
-
if (this.format._options.onFtyp && this.writer.startTrackingWrites(), this.boxWriter.writeBox(
|
|
12805
|
+
if (this.format._options.onFtyp && this.writer.startTrackingWrites(), this.boxWriter.writeBox(rl({
|
|
12775
12806
|
isQuickTime: this.isQuickTime,
|
|
12776
12807
|
holdsAvc: i,
|
|
12777
12808
|
fragmented: this.isFragmented
|
|
@@ -12797,7 +12828,7 @@ class h1 extends Ea {
|
|
|
12797
12828
|
const e = this.trackDatas.map((i) => i.type === "video" || i.type === "audio" ? i.info.decoderConfig.codec : {
|
|
12798
12829
|
webvtt: "wvtt"
|
|
12799
12830
|
}[i.track.source._codec]);
|
|
12800
|
-
return
|
|
12831
|
+
return sl({
|
|
12801
12832
|
isQuickTime: this.isQuickTime,
|
|
12802
12833
|
hasVideo: this.trackDatas.some((i) => i.type === "video"),
|
|
12803
12834
|
hasAudio: this.trackDatas.some((i) => i.type === "audio"),
|
|
@@ -12808,22 +12839,22 @@ class h1 extends Ea {
|
|
|
12808
12839
|
const d = this.trackDatas.find((W) => W.track === e);
|
|
12809
12840
|
if (d)
|
|
12810
12841
|
return d;
|
|
12811
|
-
|
|
12842
|
+
ga(n), ve(n), ve(n.decoderConfig);
|
|
12812
12843
|
const o = { ...n.decoderConfig };
|
|
12813
12844
|
ve(o.codedWidth !== void 0), ve(o.codedHeight !== void 0);
|
|
12814
12845
|
let m = !1;
|
|
12815
12846
|
if (e.source._codec === "avc" && !o.description) {
|
|
12816
|
-
const W =
|
|
12847
|
+
const W = Ua(i.data);
|
|
12817
12848
|
if (!W)
|
|
12818
12849
|
throw new Error("Couldn't extract an AVCDecoderConfigurationRecord from the AVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.264) when not providing a description, or provide a description (must be an AVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in AVCC format.");
|
|
12819
|
-
o.description =
|
|
12850
|
+
o.description = za(W), m = !0;
|
|
12820
12851
|
} else if (e.source._codec === "hevc" && !o.description) {
|
|
12821
|
-
const W =
|
|
12852
|
+
const W = Oa(i.data);
|
|
12822
12853
|
if (!W)
|
|
12823
12854
|
throw new Error("Couldn't extract an HEVCDecoderConfigurationRecord from the HEVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.265) when not providing a description, or provide a description (must be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in HEVC format.");
|
|
12824
|
-
o.description =
|
|
12855
|
+
o.description = tl(W), m = !0;
|
|
12825
12856
|
}
|
|
12826
|
-
const h =
|
|
12857
|
+
const h = Wa(1 / (e.metadata.frameRate ?? 57600), 1e6).denominator, S = {
|
|
12827
12858
|
muxer: this,
|
|
12828
12859
|
track: e,
|
|
12829
12860
|
type: "video",
|
|
@@ -12845,13 +12876,13 @@ class h1 extends Ea {
|
|
|
12845
12876
|
currentChunk: null,
|
|
12846
12877
|
compactlyCodedChunkTable: []
|
|
12847
12878
|
};
|
|
12848
|
-
return this.trackDatas.push(
|
|
12879
|
+
return this.trackDatas.push(S), this.trackDatas.sort((W, v) => W.track.id - v.track.id), this.allTracksAreKnown() && this.allTracksKnown.resolve(), S;
|
|
12849
12880
|
}
|
|
12850
12881
|
getAudioTrackData(e, i) {
|
|
12851
12882
|
const n = this.trackDatas.find((o) => o.track === e);
|
|
12852
12883
|
if (n)
|
|
12853
12884
|
return n;
|
|
12854
|
-
|
|
12885
|
+
Ja(i), ve(i), ve(i.decoderConfig);
|
|
12855
12886
|
const d = {
|
|
12856
12887
|
muxer: this,
|
|
12857
12888
|
track: e,
|
|
@@ -12880,7 +12911,7 @@ class h1 extends Ea {
|
|
|
12880
12911
|
const n = this.trackDatas.find((o) => o.track === e);
|
|
12881
12912
|
if (n)
|
|
12882
12913
|
return n;
|
|
12883
|
-
|
|
12914
|
+
Ea(i), ve(i), ve(i.config);
|
|
12884
12915
|
const d = {
|
|
12885
12916
|
muxer: this,
|
|
12886
12917
|
track: e,
|
|
@@ -12916,10 +12947,10 @@ class h1 extends Ea {
|
|
|
12916
12947
|
const W = ts(m);
|
|
12917
12948
|
if (W.length === 0)
|
|
12918
12949
|
throw new Error("Failed to transform packet data. Make sure all packets are provided in Annex B format, as specified in ITU-T-REC-H.264 and ITU-T-REC-H.265.");
|
|
12919
|
-
m =
|
|
12950
|
+
m = Pa(W, 4);
|
|
12920
12951
|
}
|
|
12921
|
-
const h = this.validateAndNormalizeTimestamp(o.track, i.timestamp, i.type === "key"),
|
|
12922
|
-
await this.registerSample(o,
|
|
12952
|
+
const h = this.validateAndNormalizeTimestamp(o.track, i.timestamp, i.type === "key"), S = this.createSampleForTrack(o, m, h, i.duration, i.type);
|
|
12953
|
+
await this.registerSample(o, S);
|
|
12923
12954
|
} finally {
|
|
12924
12955
|
d();
|
|
12925
12956
|
}
|
|
@@ -12936,7 +12967,7 @@ class h1 extends Ea {
|
|
|
12936
12967
|
async maybePadWithSilence(e, i) {
|
|
12937
12968
|
const n = Y0(e.samples), d = n ? n.timestamp + n.duration : 0, o = i - d, m = tt(o, e.timescale);
|
|
12938
12969
|
if (m > 0) {
|
|
12939
|
-
const { sampleSize: h, silentValue:
|
|
12970
|
+
const { sampleSize: h, silentValue: S } = D0(e.info.decoderConfig.codec), W = m * e.info.numberOfChannels, v = new Uint8Array(h * W).fill(S), Z = this.createSampleForTrack(e, new Uint8Array(v.buffer), d, o, "key");
|
|
12940
12971
|
await this.registerSample(e, Z);
|
|
12941
12972
|
}
|
|
12942
12973
|
}
|
|
@@ -12959,7 +12990,7 @@ class h1 extends Ea {
|
|
|
12959
12990
|
break;
|
|
12960
12991
|
if (e.lastCueEndTimestamp < o) {
|
|
12961
12992
|
this.auxWriter.seek(0);
|
|
12962
|
-
const W =
|
|
12993
|
+
const W = ql();
|
|
12963
12994
|
this.auxBoxWriter.writeBox(W);
|
|
12964
12995
|
const v = this.auxWriter.getSlice(0, this.auxWriter.getPos()), Z = this.createSampleForTrack(e, v, e.lastCueEndTimestamp, o - e.lastCueEndTimestamp, "key");
|
|
12965
12996
|
await this.registerSample(e, Z), e.lastCueEndTimestamp = o;
|
|
@@ -12973,14 +13004,14 @@ class h1 extends Ea {
|
|
|
12973
13004
|
const Z = Es.test(v.text), O = v.timestamp + v.duration;
|
|
12974
13005
|
let w = e.cueToSourceId.get(v);
|
|
12975
13006
|
if (w === void 0 && m < O && (w = e.nextSourceId++, e.cueToSourceId.set(v, w)), v.notes) {
|
|
12976
|
-
const J =
|
|
13007
|
+
const J = t1(v.notes);
|
|
12977
13008
|
this.auxBoxWriter.writeBox(J);
|
|
12978
13009
|
}
|
|
12979
|
-
const N =
|
|
13010
|
+
const N = e1(v.text, Z ? o : null, v.identifier ?? null, v.settings ?? null, w ?? null);
|
|
12980
13011
|
this.auxBoxWriter.writeBox(N), O === m && e.cueQueue.splice(W--, 1);
|
|
12981
13012
|
}
|
|
12982
|
-
const h = this.auxWriter.getSlice(0, this.auxWriter.getPos()),
|
|
12983
|
-
await this.registerSample(e,
|
|
13013
|
+
const h = this.auxWriter.getSlice(0, this.auxWriter.getPos()), S = this.createSampleForTrack(e, h, o, m - o, "key");
|
|
13014
|
+
await this.registerSample(e, S), e.lastCueEndTimestamp = m;
|
|
12984
13015
|
}
|
|
12985
13016
|
}
|
|
12986
13017
|
createSampleForTrack(e, i, n, d, o) {
|
|
@@ -13024,7 +13055,7 @@ class h1 extends Ea {
|
|
|
13024
13055
|
const m = tt(o.timestamp - o.decodeTimestamp, e.timescale), h = tt(o.duration, e.timescale);
|
|
13025
13056
|
if (e.lastTimescaleUnits !== null) {
|
|
13026
13057
|
ve(e.lastSample);
|
|
13027
|
-
const
|
|
13058
|
+
const S = tt(o.decodeTimestamp, e.timescale, !1), W = Math.round(S - e.lastTimescaleUnits);
|
|
13028
13059
|
if (ve(W >= 0), e.lastTimescaleUnits += W, e.lastSample.timescaleUnitsToNextSample = W, !this.isFragmented) {
|
|
13029
13060
|
let v = Y0(e.timeToSampleTable);
|
|
13030
13061
|
if (ve(v), v.sampleCount === 1) {
|
|
@@ -13139,12 +13170,12 @@ class h1 extends Ea {
|
|
|
13139
13170
|
}
|
|
13140
13171
|
}
|
|
13141
13172
|
const n = this.trackDatas.filter((w) => w.currentChunk), d = Us(i, n), o = this.writer.getPos(), m = o + this.boxWriter.measureBox(d);
|
|
13142
|
-
let h = m + Fi,
|
|
13173
|
+
let h = m + Fi, S = 1 / 0;
|
|
13143
13174
|
for (const w of n) {
|
|
13144
13175
|
w.currentChunk.offset = h, w.currentChunk.moofOffset = o;
|
|
13145
13176
|
for (const N of w.currentChunk.samples)
|
|
13146
13177
|
h += N.size;
|
|
13147
|
-
|
|
13178
|
+
S = Math.min(S, w.currentChunk.startTimestamp);
|
|
13148
13179
|
}
|
|
13149
13180
|
const W = h - m, v = W >= 2 ** 32;
|
|
13150
13181
|
if (v)
|
|
@@ -13154,7 +13185,7 @@ class h1 extends Ea {
|
|
|
13154
13185
|
const Z = Us(i, n);
|
|
13155
13186
|
if (this.boxWriter.writeBox(Z), this.format._options.onMoof) {
|
|
13156
13187
|
const { data: w, start: N } = this.writer.stopTrackingWrites();
|
|
13157
|
-
this.format._options.onMoof(w, N,
|
|
13188
|
+
this.format._options.onMoof(w, N, S);
|
|
13158
13189
|
}
|
|
13159
13190
|
ve(this.writer.getPos() === m), this.format._options.onMdat && this.writer.startTrackingWrites();
|
|
13160
13191
|
const O = ci(v);
|
|
@@ -13224,9 +13255,9 @@ class h1 extends Ea {
|
|
|
13224
13255
|
const o = U0(this), m = this.boxWriter.measureBox(o);
|
|
13225
13256
|
i = this.boxWriter.measureBox(this.mdat);
|
|
13226
13257
|
let h = this.writer.getPos() + m + i;
|
|
13227
|
-
for (const
|
|
13228
|
-
|
|
13229
|
-
for (const { data: W } of
|
|
13258
|
+
for (const S of this.finalizedChunks) {
|
|
13259
|
+
S.offset = h;
|
|
13260
|
+
for (const { data: W } of S.samples)
|
|
13230
13261
|
ve(W), h += W.byteLength, i += W.byteLength;
|
|
13231
13262
|
}
|
|
13232
13263
|
if (h < 2 ** 32)
|
|
@@ -13248,7 +13279,7 @@ class h1 extends Ea {
|
|
|
13248
13279
|
this.format._options.onMdat(d, o);
|
|
13249
13280
|
}
|
|
13250
13281
|
} else if (this.isFragmented) {
|
|
13251
|
-
const i = this.writer.getPos(), n =
|
|
13282
|
+
const i = this.writer.getPos(), n = Ql(this.trackDatas);
|
|
13252
13283
|
this.boxWriter.writeBox(n);
|
|
13253
13284
|
const d = this.writer.getPos() - i;
|
|
13254
13285
|
this.writer.seek(this.writer.getPos() - 4), this.boxWriter.writeU32(d);
|
|
@@ -13265,7 +13296,7 @@ class h1 extends Ea {
|
|
|
13265
13296
|
if (this.fastStart === "reserve") {
|
|
13266
13297
|
ve(this.ftypSize !== null), this.writer.seek(this.ftypSize), this.format._options.onMoov && this.writer.startTrackingWrites(), this.boxWriter.writeBox(d);
|
|
13267
13298
|
const o = this.boxWriter.offsets.get(this.mdat) - this.writer.getPos();
|
|
13268
|
-
this.boxWriter.writeBox(
|
|
13299
|
+
this.boxWriter.writeBox(al(o));
|
|
13269
13300
|
} else
|
|
13270
13301
|
this.format._options.onMoov && this.writer.startTrackingWrites(), this.boxWriter.writeBox(d);
|
|
13271
13302
|
if (this.format._options.onMoov) {
|
|
@@ -13337,7 +13368,7 @@ class wn extends Yn {
|
|
|
13337
13368
|
}
|
|
13338
13369
|
/** @internal */
|
|
13339
13370
|
_createMuxer(e) {
|
|
13340
|
-
return new
|
|
13371
|
+
return new b1(e, this);
|
|
13341
13372
|
}
|
|
13342
13373
|
}
|
|
13343
13374
|
class Kn extends wn {
|
|
@@ -13465,7 +13496,7 @@ class kn extends ns {
|
|
|
13465
13496
|
this._codec = e;
|
|
13466
13497
|
}
|
|
13467
13498
|
}
|
|
13468
|
-
class
|
|
13499
|
+
class p1 extends kn {
|
|
13469
13500
|
/** Creates a new {@link EncodedVideoPacketSource} whose packets are encoded using `codec`. */
|
|
13470
13501
|
constructor(e) {
|
|
13471
13502
|
super(e);
|
|
@@ -13498,7 +13529,7 @@ class Bn extends ns {
|
|
|
13498
13529
|
this._codec = e;
|
|
13499
13530
|
}
|
|
13500
13531
|
}
|
|
13501
|
-
class
|
|
13532
|
+
class y1 extends Bn {
|
|
13502
13533
|
/** Creates a new {@link EncodedAudioPacketSource} whose packets are encoded using `codec`. */
|
|
13503
13534
|
constructor(e) {
|
|
13504
13535
|
super(e);
|
|
@@ -13522,7 +13553,7 @@ class p1 extends Bn {
|
|
|
13522
13553
|
return this._ensureValidAdd(), this._connectedTrack.output._muxer.addEncodedAudioPacket(this._connectedTrack, e, i);
|
|
13523
13554
|
}
|
|
13524
13555
|
}
|
|
13525
|
-
class
|
|
13556
|
+
class f1 extends ns {
|
|
13526
13557
|
/** Internal constructor. */
|
|
13527
13558
|
constructor(e) {
|
|
13528
13559
|
if (super(), this._connectedTrack = null, !hi.includes(e))
|
|
@@ -13537,17 +13568,17 @@ class y1 extends ns {
|
|
|
13537
13568
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
13538
13569
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
13539
13570
|
*/
|
|
13540
|
-
const
|
|
13571
|
+
const Z1 = ["video", "audio", "subtitle"], zi = (t) => {
|
|
13541
13572
|
if (!t || typeof t != "object")
|
|
13542
13573
|
throw new TypeError("metadata must be an object.");
|
|
13543
|
-
if (t.languageCode !== void 0 && !
|
|
13574
|
+
if (t.languageCode !== void 0 && !Ta(t.languageCode))
|
|
13544
13575
|
throw new TypeError("metadata.languageCode, when provided, must be a three-letter, ISO 639-2/T language code.");
|
|
13545
13576
|
if (t.name !== void 0 && typeof t.name != "string")
|
|
13546
13577
|
throw new TypeError("metadata.name, when provided, must be a string.");
|
|
13547
|
-
if (t.disposition !== void 0 &&
|
|
13578
|
+
if (t.disposition !== void 0 && Ha(t.disposition), t.maximumPacketCount !== void 0 && (!Number.isInteger(t.maximumPacketCount) || t.maximumPacketCount < 0))
|
|
13548
13579
|
throw new TypeError("metadata.maximumPacketCount, when provided, must be a non-negative integer.");
|
|
13549
13580
|
};
|
|
13550
|
-
class
|
|
13581
|
+
class X1 {
|
|
13551
13582
|
/**
|
|
13552
13583
|
* Creates a new instance of {@link Output} which can then be used to create a new media file according to the
|
|
13553
13584
|
* specified {@link OutputOptions}.
|
|
@@ -13583,7 +13614,7 @@ class Z1 {
|
|
|
13583
13614
|
}
|
|
13584
13615
|
/** Adds a subtitle track to the output with the given source. Can only be called before the output is started. */
|
|
13585
13616
|
addSubtitleTrack(e, i = {}) {
|
|
13586
|
-
if (!(e instanceof
|
|
13617
|
+
if (!(e instanceof f1))
|
|
13587
13618
|
throw new TypeError("source must be a SubtitleSource.");
|
|
13588
13619
|
zi(i), this._addTrack("subtitle", e, i);
|
|
13589
13620
|
}
|
|
@@ -13594,7 +13625,7 @@ class Z1 {
|
|
|
13594
13625
|
* Can only be called before the output is started.
|
|
13595
13626
|
*/
|
|
13596
13627
|
setMetadataTags(e) {
|
|
13597
|
-
if (
|
|
13628
|
+
if (xa(e), this.state !== "pending")
|
|
13598
13629
|
throw new Error("Cannot set metadata tags after output has been started or canceled.");
|
|
13599
13630
|
this._metadataTags = e;
|
|
13600
13631
|
}
|
|
@@ -13610,33 +13641,33 @@ class Z1 {
|
|
|
13610
13641
|
const h = d.total.max;
|
|
13611
13642
|
if (this._tracks.length === h)
|
|
13612
13643
|
throw new Error(`${this.format._name} does not support more than ${h} tracks${h === 1 ? "" : "s"} in total.`);
|
|
13613
|
-
const
|
|
13644
|
+
const S = {
|
|
13614
13645
|
id: this._tracks.length + 1,
|
|
13615
13646
|
output: this,
|
|
13616
13647
|
type: e,
|
|
13617
13648
|
source: i,
|
|
13618
13649
|
metadata: n
|
|
13619
13650
|
};
|
|
13620
|
-
if (
|
|
13651
|
+
if (S.type === "video") {
|
|
13621
13652
|
const W = this.format.getSupportedVideoCodecs();
|
|
13622
13653
|
if (W.length === 0)
|
|
13623
|
-
throw new Error(`${this.format._name} does not support video tracks.` + this.format._codecUnsupportedHint(
|
|
13624
|
-
if (!W.includes(
|
|
13625
|
-
throw new Error(`Codec '${
|
|
13626
|
-
} else if (
|
|
13654
|
+
throw new Error(`${this.format._name} does not support video tracks.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13655
|
+
if (!W.includes(S.source._codec))
|
|
13656
|
+
throw new Error(`Codec '${S.source._codec}' cannot be contained within ${this.format._name}. Supported video codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13657
|
+
} else if (S.type === "audio") {
|
|
13627
13658
|
const W = this.format.getSupportedAudioCodecs();
|
|
13628
13659
|
if (W.length === 0)
|
|
13629
|
-
throw new Error(`${this.format._name} does not support audio tracks.` + this.format._codecUnsupportedHint(
|
|
13630
|
-
if (!W.includes(
|
|
13631
|
-
throw new Error(`Codec '${
|
|
13632
|
-
} else if (
|
|
13660
|
+
throw new Error(`${this.format._name} does not support audio tracks.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13661
|
+
if (!W.includes(S.source._codec))
|
|
13662
|
+
throw new Error(`Codec '${S.source._codec}' cannot be contained within ${this.format._name}. Supported audio codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13663
|
+
} else if (S.type === "subtitle") {
|
|
13633
13664
|
const W = this.format.getSupportedSubtitleCodecs();
|
|
13634
13665
|
if (W.length === 0)
|
|
13635
|
-
throw new Error(`${this.format._name} does not support subtitle tracks.` + this.format._codecUnsupportedHint(
|
|
13636
|
-
if (!W.includes(
|
|
13637
|
-
throw new Error(`Codec '${
|
|
13666
|
+
throw new Error(`${this.format._name} does not support subtitle tracks.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13667
|
+
if (!W.includes(S.source._codec))
|
|
13668
|
+
throw new Error(`Codec '${S.source._codec}' cannot be contained within ${this.format._name}. Supported subtitle codecs are: ${W.map((v) => `'${v}'`).join(", ")}.` + this.format._codecUnsupportedHint(S.source._codec));
|
|
13638
13669
|
}
|
|
13639
|
-
this._tracks.push(
|
|
13670
|
+
this._tracks.push(S), i._connectedTrack = S;
|
|
13640
13671
|
}
|
|
13641
13672
|
/**
|
|
13642
13673
|
* Starts the creation of the output file. This method should be called after all tracks have been added. Only after
|
|
@@ -13646,7 +13677,7 @@ class Z1 {
|
|
|
13646
13677
|
*/
|
|
13647
13678
|
async start() {
|
|
13648
13679
|
const e = this.format.getSupportedTrackCounts();
|
|
13649
|
-
for (const n of
|
|
13680
|
+
for (const n of Z1) {
|
|
13650
13681
|
const d = this._tracks.reduce((m, h) => m + (h.type === n ? 1 : 0), 0), o = e[n].min;
|
|
13651
13682
|
if (d < o)
|
|
13652
13683
|
throw new Error(o === e[n].max ? `${this.format._name} requires exactly ${o} ${n} track${o === 1 ? "" : "s"}.` : `${this.format._name} requires at least ${o} ${n} track${o === 1 ? "" : "s"}.`);
|
|
@@ -13707,7 +13738,7 @@ class Z1 {
|
|
|
13707
13738
|
})();
|
|
13708
13739
|
}
|
|
13709
13740
|
}
|
|
13710
|
-
class
|
|
13741
|
+
class w1 {
|
|
13711
13742
|
/**
|
|
13712
13743
|
* Create a new ExampleMuxer.
|
|
13713
13744
|
*
|
|
@@ -13715,11 +13746,11 @@ class Y1 {
|
|
|
13715
13746
|
*/
|
|
13716
13747
|
constructor(e) {
|
|
13717
13748
|
this.type = e || "video", this.target = new Hn();
|
|
13718
|
-
const i = new
|
|
13749
|
+
const i = new X1({
|
|
13719
13750
|
format: new Kn(),
|
|
13720
13751
|
target: this.target
|
|
13721
13752
|
});
|
|
13722
|
-
this.started = !1, this.output = i, this.source = this.type === "video" ? new
|
|
13753
|
+
this.started = !1, this.output = i, this.source = this.type === "video" ? new p1("avc") : new y1("aac"), this.output.addVideoTrack(this.source), console.warn(
|
|
13723
13754
|
"⚠️ Demo/Learning Function: This utility is intended for demos and learning purposes only. For production use, please use a proper muxing library like MediaBunny (https://mediabunny.dev/) "
|
|
13724
13755
|
);
|
|
13725
13756
|
}
|
|
@@ -13744,17 +13775,18 @@ class Y1 {
|
|
|
13744
13775
|
}
|
|
13745
13776
|
}
|
|
13746
13777
|
export {
|
|
13747
|
-
|
|
13748
|
-
|
|
13749
|
-
|
|
13750
|
-
|
|
13751
|
-
|
|
13752
|
-
|
|
13753
|
-
|
|
13754
|
-
x1 as
|
|
13778
|
+
w1 as ExampleMuxer,
|
|
13779
|
+
I1 as GPUFrameRenderer,
|
|
13780
|
+
W1 as InMemoryStorage,
|
|
13781
|
+
R1 as MP3Decoder,
|
|
13782
|
+
V1 as MP3Encoder,
|
|
13783
|
+
T1 as MP4Demuxer,
|
|
13784
|
+
ba as MediaStreamTrackProcessor,
|
|
13785
|
+
x1 as demuxAudio,
|
|
13786
|
+
H1 as demuxVideo,
|
|
13755
13787
|
Jn as extractChannels,
|
|
13756
|
-
|
|
13788
|
+
Y1 as getAudioChunks,
|
|
13757
13789
|
G1 as getBitrate,
|
|
13758
|
-
|
|
13759
|
-
|
|
13790
|
+
v1 as getCodecString,
|
|
13791
|
+
L1 as getVideoChunks
|
|
13760
13792
|
};
|