@genspectrum/dashboard-components 0.7.1 → 0.7.2

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.
@@ -1115,7 +1115,7 @@ var O;
1115
1115
  n.errToObj = (e) => typeof e == "string" ? { message: e } : e || {}, n.toString = (e) => typeof e == "string" ? e : e == null ? void 0 : e.message;
1116
1116
  })(O || (O = {}));
1117
1117
  var ds, Is;
1118
- class nn {
1118
+ class on {
1119
1119
  constructor(e, t, i, o) {
1120
1120
  this._cachedPath = [], this.parent = e, this.data = t, this._path = i, this._key = o;
1121
1121
  }
@@ -1250,7 +1250,7 @@ class ne {
1250
1250
  return this._refinement((i, o) => e(i) ? !0 : (o.addIssue(typeof t == "function" ? t(i, o) : t), !1));
1251
1251
  }
1252
1252
  _refinement(e) {
1253
- return new _t({
1253
+ return new zt({
1254
1254
  schema: this,
1255
1255
  typeName: j.ZodEffects,
1256
1256
  effect: { type: "refinement", refinement: e }
@@ -1260,7 +1260,7 @@ class ne {
1260
1260
  return this._refinement(e);
1261
1261
  }
1262
1262
  optional() {
1263
- return Qt.create(this, this._def);
1263
+ return $t.create(this, this._def);
1264
1264
  }
1265
1265
  nullable() {
1266
1266
  return oi.create(this, this._def);
@@ -1269,7 +1269,7 @@ class ne {
1269
1269
  return this.nullable().optional();
1270
1270
  }
1271
1271
  array() {
1272
- return Kt.create(this, this._def);
1272
+ return _t.create(this, this._def);
1273
1273
  }
1274
1274
  promise() {
1275
1275
  return Yo.create(this, this._def);
@@ -1281,7 +1281,7 @@ class ne {
1281
1281
  return _s.create(this, e, this._def);
1282
1282
  }
1283
1283
  transform(e) {
1284
- return new _t({
1284
+ return new zt({
1285
1285
  ...$(this._def),
1286
1286
  schema: this,
1287
1287
  typeName: j.ZodEffects,
@@ -1351,7 +1351,7 @@ function pC(n) {
1351
1351
  function Yf(n, e) {
1352
1352
  return !!((e === "v4" || !e) && Rf.test(n) || (e === "v6" || !e) && xf.test(n));
1353
1353
  }
1354
- class Nt extends ne {
1354
+ class Ft extends ne {
1355
1355
  _parse(e) {
1356
1356
  if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== _.string) {
1357
1357
  const s = this._getOrReturnCtx(e);
@@ -1502,7 +1502,7 @@ class Nt extends ne {
1502
1502
  });
1503
1503
  }
1504
1504
  _addCheck(e) {
1505
- return new Nt({
1505
+ return new Ft({
1506
1506
  ...this._def,
1507
1507
  checks: [...this._def.checks, e]
1508
1508
  });
@@ -1628,19 +1628,19 @@ class Nt extends ne {
1628
1628
  return this.min(1, O.errToObj(e));
1629
1629
  }
1630
1630
  trim() {
1631
- return new Nt({
1631
+ return new Ft({
1632
1632
  ...this._def,
1633
1633
  checks: [...this._def.checks, { kind: "trim" }]
1634
1634
  });
1635
1635
  }
1636
1636
  toLowerCase() {
1637
- return new Nt({
1637
+ return new Ft({
1638
1638
  ...this._def,
1639
1639
  checks: [...this._def.checks, { kind: "toLowerCase" }]
1640
1640
  });
1641
1641
  }
1642
1642
  toUpperCase() {
1643
- return new Nt({
1643
+ return new Ft({
1644
1644
  ...this._def,
1645
1645
  checks: [...this._def.checks, { kind: "toUpperCase" }]
1646
1646
  });
@@ -1700,9 +1700,9 @@ class Nt extends ne {
1700
1700
  return e;
1701
1701
  }
1702
1702
  }
1703
- Nt.create = (n) => {
1703
+ Ft.create = (n) => {
1704
1704
  var e;
1705
- return new Nt({
1705
+ return new Ft({
1706
1706
  checks: [],
1707
1707
  typeName: j.ZodString,
1708
1708
  coerce: (e = n == null ? void 0 : n.coerce) !== null && e !== void 0 ? e : !1,
@@ -2184,7 +2184,7 @@ Si.create = (n) => new Si({
2184
2184
  typeName: j.ZodUnknown,
2185
2185
  ...$(n)
2186
2186
  });
2187
- class Vn extends ne {
2187
+ class Xn extends ne {
2188
2188
  _parse(e) {
2189
2189
  const t = this._getOrReturnCtx(e);
2190
2190
  return F(t, {
@@ -2194,7 +2194,7 @@ class Vn extends ne {
2194
2194
  }), E;
2195
2195
  }
2196
2196
  }
2197
- Vn.create = (n) => new Vn({
2197
+ Xn.create = (n) => new Xn({
2198
2198
  typeName: j.ZodNever,
2199
2199
  ...$(n)
2200
2200
  });
@@ -2215,7 +2215,7 @@ ur.create = (n) => new ur({
2215
2215
  typeName: j.ZodVoid,
2216
2216
  ...$(n)
2217
2217
  });
2218
- class Kt extends ne {
2218
+ class _t extends ne {
2219
2219
  _parse(e) {
2220
2220
  const { ctx: t, status: i } = this._processInputParams(e), o = this._def;
2221
2221
  if (t.parsedType !== _.array)
@@ -2251,27 +2251,27 @@ class Kt extends ne {
2251
2251
  exact: !1,
2252
2252
  message: o.maxLength.message
2253
2253
  }), i.dirty()), t.common.async)
2254
- return Promise.all([...t.data].map((a, r) => o.type._parseAsync(new nn(t, a, t.path, r)))).then((a) => Qe.mergeArray(i, a));
2255
- const s = [...t.data].map((a, r) => o.type._parseSync(new nn(t, a, t.path, r)));
2254
+ return Promise.all([...t.data].map((a, r) => o.type._parseAsync(new on(t, a, t.path, r)))).then((a) => Qe.mergeArray(i, a));
2255
+ const s = [...t.data].map((a, r) => o.type._parseSync(new on(t, a, t.path, r)));
2256
2256
  return Qe.mergeArray(i, s);
2257
2257
  }
2258
2258
  get element() {
2259
2259
  return this._def.type;
2260
2260
  }
2261
2261
  min(e, t) {
2262
- return new Kt({
2262
+ return new _t({
2263
2263
  ...this._def,
2264
2264
  minLength: { value: e, message: O.toString(t) }
2265
2265
  });
2266
2266
  }
2267
2267
  max(e, t) {
2268
- return new Kt({
2268
+ return new _t({
2269
2269
  ...this._def,
2270
2270
  maxLength: { value: e, message: O.toString(t) }
2271
2271
  });
2272
2272
  }
2273
2273
  length(e, t) {
2274
- return new Kt({
2274
+ return new _t({
2275
2275
  ...this._def,
2276
2276
  exactLength: { value: e, message: O.toString(t) }
2277
2277
  });
@@ -2280,7 +2280,7 @@ class Kt extends ne {
2280
2280
  return this.min(1, e);
2281
2281
  }
2282
2282
  }
2283
- Kt.create = (n, e) => new Kt({
2283
+ _t.create = (n, e) => new _t({
2284
2284
  type: n,
2285
2285
  minLength: null,
2286
2286
  maxLength: null,
@@ -2293,16 +2293,16 @@ function ho(n) {
2293
2293
  const e = {};
2294
2294
  for (const t in n.shape) {
2295
2295
  const i = n.shape[t];
2296
- e[t] = Qt.create(ho(i));
2296
+ e[t] = $t.create(ho(i));
2297
2297
  }
2298
2298
  return new xe({
2299
2299
  ...n._def,
2300
2300
  shape: () => e
2301
2301
  });
2302
- } else return n instanceof Kt ? new Kt({
2302
+ } else return n instanceof _t ? new _t({
2303
2303
  ...n._def,
2304
2304
  type: ho(n.element)
2305
- }) : n instanceof Qt ? Qt.create(ho(n.unwrap())) : n instanceof oi ? oi.create(ho(n.unwrap())) : n instanceof on ? on.create(n.items.map((e) => ho(e))) : n;
2305
+ }) : n instanceof $t ? $t.create(ho(n.unwrap())) : n instanceof oi ? oi.create(ho(n.unwrap())) : n instanceof sn ? sn.create(n.items.map((e) => ho(e))) : n;
2306
2306
  }
2307
2307
  class xe extends ne {
2308
2308
  constructor() {
@@ -2324,7 +2324,7 @@ class xe extends ne {
2324
2324
  }), E;
2325
2325
  }
2326
2326
  const { status: i, ctx: o } = this._processInputParams(e), { shape: s, keys: a } = this._getCached(), r = [];
2327
- if (!(this._def.catchall instanceof Vn && this._def.unknownKeys === "strip"))
2327
+ if (!(this._def.catchall instanceof Xn && this._def.unknownKeys === "strip"))
2328
2328
  for (const g in o.data)
2329
2329
  a.includes(g) || r.push(g);
2330
2330
  const l = [];
@@ -2332,11 +2332,11 @@ class xe extends ne {
2332
2332
  const c = s[g], d = o.data[g];
2333
2333
  l.push({
2334
2334
  key: { status: "valid", value: g },
2335
- value: c._parse(new nn(o, d, o.path, g)),
2335
+ value: c._parse(new on(o, d, o.path, g)),
2336
2336
  alwaysSet: g in o.data
2337
2337
  });
2338
2338
  }
2339
- if (this._def.catchall instanceof Vn) {
2339
+ if (this._def.catchall instanceof Xn) {
2340
2340
  const g = this._def.unknownKeys;
2341
2341
  if (g === "passthrough")
2342
2342
  for (const c of r)
@@ -2357,7 +2357,7 @@ class xe extends ne {
2357
2357
  l.push({
2358
2358
  key: { status: "valid", value: c },
2359
2359
  value: g._parse(
2360
- new nn(o, d, o.path, c)
2360
+ new on(o, d, o.path, c)
2361
2361
  //, ctx.child(key), value, getParsedType(value)
2362
2362
  ),
2363
2363
  alwaysSet: c in o.data
@@ -2557,7 +2557,7 @@ class xe extends ne {
2557
2557
  t[i] = this.shape[i];
2558
2558
  else {
2559
2559
  let s = this.shape[i];
2560
- for (; s instanceof Qt; )
2560
+ for (; s instanceof $t; )
2561
2561
  s = s._def.innerType;
2562
2562
  t[i] = s;
2563
2563
  }
@@ -2573,21 +2573,21 @@ class xe extends ne {
2573
2573
  xe.create = (n, e) => new xe({
2574
2574
  shape: () => n,
2575
2575
  unknownKeys: "strip",
2576
- catchall: Vn.create(),
2576
+ catchall: Xn.create(),
2577
2577
  typeName: j.ZodObject,
2578
2578
  ...$(e)
2579
2579
  });
2580
2580
  xe.strictCreate = (n, e) => new xe({
2581
2581
  shape: () => n,
2582
2582
  unknownKeys: "strict",
2583
- catchall: Vn.create(),
2583
+ catchall: Xn.create(),
2584
2584
  typeName: j.ZodObject,
2585
2585
  ...$(e)
2586
2586
  });
2587
2587
  xe.lazycreate = (n, e) => new xe({
2588
2588
  shape: n,
2589
2589
  unknownKeys: "strip",
2590
- catchall: Vn.create(),
2590
+ catchall: Xn.create(),
2591
2591
  typeName: j.ZodObject,
2592
2592
  ...$(e)
2593
2593
  });
@@ -2664,7 +2664,7 @@ Ks.create = (n, e) => new Ks({
2664
2664
  typeName: j.ZodUnion,
2665
2665
  ...$(e)
2666
2666
  });
2667
- const fn = (n) => n instanceof Ms ? fn(n.schema) : n instanceof _t ? fn(n.innerType()) : n instanceof Ls ? [n.value] : n instanceof ii ? n.options : n instanceof Ts ? re.objectValues(n.enum) : n instanceof Js ? fn(n._def.innerType) : n instanceof Ns ? [void 0] : n instanceof Fs ? [null] : n instanceof Qt ? [void 0, ...fn(n.unwrap())] : n instanceof oi ? [null, ...fn(n.unwrap())] : n instanceof sc || n instanceof Os ? fn(n.unwrap()) : n instanceof Ds ? fn(n._def.innerType) : [];
2667
+ const mn = (n) => n instanceof Ms ? mn(n.schema) : n instanceof zt ? mn(n.innerType()) : n instanceof Ls ? [n.value] : n instanceof ii ? n.options : n instanceof Ts ? re.objectValues(n.enum) : n instanceof Js ? mn(n._def.innerType) : n instanceof Ns ? [void 0] : n instanceof Fs ? [null] : n instanceof $t ? [void 0, ...mn(n.unwrap())] : n instanceof oi ? [null, ...mn(n.unwrap())] : n instanceof sc || n instanceof Os ? mn(n.unwrap()) : n instanceof Ds ? mn(n._def.innerType) : [];
2668
2668
  class Mr extends ne {
2669
2669
  _parse(e) {
2670
2670
  const { ctx: t } = this._processInputParams(e);
@@ -2709,7 +2709,7 @@ class Mr extends ne {
2709
2709
  static create(e, t, i) {
2710
2710
  const o = /* @__PURE__ */ new Map();
2711
2711
  for (const s of t) {
2712
- const a = fn(s.shape[e]);
2712
+ const a = mn(s.shape[e]);
2713
2713
  if (!a.length)
2714
2714
  throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);
2715
2715
  for (const r of a) {
@@ -2791,7 +2791,7 @@ _s.create = (n, e, t) => new _s({
2791
2791
  typeName: j.ZodIntersection,
2792
2792
  ...$(t)
2793
2793
  });
2794
- class on extends ne {
2794
+ class sn extends ne {
2795
2795
  _parse(e) {
2796
2796
  const { status: t, ctx: i } = this._processInputParams(e);
2797
2797
  if (i.parsedType !== _.array)
@@ -2817,7 +2817,7 @@ class on extends ne {
2817
2817
  }), t.dirty());
2818
2818
  const s = [...i.data].map((a, r) => {
2819
2819
  const l = this._def.items[r] || this._def.rest;
2820
- return l ? l._parse(new nn(i, a, i.path, r)) : null;
2820
+ return l ? l._parse(new on(i, a, i.path, r)) : null;
2821
2821
  }).filter((a) => !!a);
2822
2822
  return i.common.async ? Promise.all(s).then((a) => Qe.mergeArray(t, a)) : Qe.mergeArray(t, s);
2823
2823
  }
@@ -2825,16 +2825,16 @@ class on extends ne {
2825
2825
  return this._def.items;
2826
2826
  }
2827
2827
  rest(e) {
2828
- return new on({
2828
+ return new sn({
2829
2829
  ...this._def,
2830
2830
  rest: e
2831
2831
  });
2832
2832
  }
2833
2833
  }
2834
- on.create = (n, e) => {
2834
+ sn.create = (n, e) => {
2835
2835
  if (!Array.isArray(n))
2836
2836
  throw new Error("You must pass an array of schemas to z.tuple([ ... ])");
2837
- return new on({
2837
+ return new sn({
2838
2838
  items: n,
2839
2839
  typeName: j.ZodTuple,
2840
2840
  rest: null,
@@ -2859,8 +2859,8 @@ class zs extends ne {
2859
2859
  const o = [], s = this._def.keyType, a = this._def.valueType;
2860
2860
  for (const r in i.data)
2861
2861
  o.push({
2862
- key: s._parse(new nn(i, r, i.path, r)),
2863
- value: a._parse(new nn(i, i.data[r], i.path, r)),
2862
+ key: s._parse(new on(i, r, i.path, r)),
2863
+ value: a._parse(new on(i, i.data[r], i.path, r)),
2864
2864
  alwaysSet: r in i.data
2865
2865
  });
2866
2866
  return i.common.async ? Qe.mergeObjectAsync(t, o) : Qe.mergeObjectSync(t, o);
@@ -2875,7 +2875,7 @@ class zs extends ne {
2875
2875
  typeName: j.ZodRecord,
2876
2876
  ...$(i)
2877
2877
  }) : new zs({
2878
- keyType: Nt.create(),
2878
+ keyType: Ft.create(),
2879
2879
  valueType: e,
2880
2880
  typeName: j.ZodRecord,
2881
2881
  ...$(t)
@@ -2898,8 +2898,8 @@ class Cr extends ne {
2898
2898
  received: i.parsedType
2899
2899
  }), E;
2900
2900
  const o = this._def.keyType, s = this._def.valueType, a = [...i.data.entries()].map(([r, l], g) => ({
2901
- key: o._parse(new nn(i, r, i.path, [g, "key"])),
2902
- value: s._parse(new nn(i, l, i.path, [g, "value"]))
2901
+ key: o._parse(new on(i, r, i.path, [g, "key"])),
2902
+ value: s._parse(new on(i, l, i.path, [g, "value"]))
2903
2903
  }));
2904
2904
  if (i.common.async) {
2905
2905
  const r = /* @__PURE__ */ new Map();
@@ -2965,7 +2965,7 @@ class Ti extends ne {
2965
2965
  }
2966
2966
  return { status: t.value, value: g };
2967
2967
  }
2968
- const r = [...i.data.values()].map((l, g) => s._parse(new nn(i, l, i.path, g)));
2968
+ const r = [...i.data.values()].map((l, g) => s._parse(new on(i, l, i.path, g)));
2969
2969
  return i.common.async ? Promise.all(r).then((l) => a(l)) : a(r);
2970
2970
  }
2971
2971
  min(e, t) {
@@ -3071,7 +3071,7 @@ class vo extends ne {
3071
3071
  args(...e) {
3072
3072
  return new vo({
3073
3073
  ...this._def,
3074
- args: on.create(e).rest(Si.create())
3074
+ args: sn.create(e).rest(Si.create())
3075
3075
  });
3076
3076
  }
3077
3077
  returns(e) {
@@ -3088,7 +3088,7 @@ class vo extends ne {
3088
3088
  }
3089
3089
  static create(e, t, i) {
3090
3090
  return new vo({
3091
- args: e || on.create([]).rest(Si.create()),
3091
+ args: e || sn.create([]).rest(Si.create()),
3092
3092
  returns: t || Si.create(),
3093
3093
  typeName: j.ZodFunction,
3094
3094
  ...$(i)
@@ -3254,7 +3254,7 @@ Yo.create = (n, e) => new Yo({
3254
3254
  typeName: j.ZodPromise,
3255
3255
  ...$(e)
3256
3256
  });
3257
- class _t extends ne {
3257
+ class zt extends ne {
3258
3258
  innerType() {
3259
3259
  return this._def.schema;
3260
3260
  }
@@ -3331,19 +3331,19 @@ class _t extends ne {
3331
3331
  re.assertNever(o);
3332
3332
  }
3333
3333
  }
3334
- _t.create = (n, e, t) => new _t({
3334
+ zt.create = (n, e, t) => new zt({
3335
3335
  schema: n,
3336
3336
  typeName: j.ZodEffects,
3337
3337
  effect: e,
3338
3338
  ...$(t)
3339
3339
  });
3340
- _t.createWithPreprocess = (n, e, t) => new _t({
3340
+ zt.createWithPreprocess = (n, e, t) => new zt({
3341
3341
  schema: e,
3342
3342
  effect: { type: "preprocess", transform: n },
3343
3343
  typeName: j.ZodEffects,
3344
3344
  ...$(t)
3345
3345
  });
3346
- class Qt extends ne {
3346
+ class $t extends ne {
3347
3347
  _parse(e) {
3348
3348
  return this._getType(e) === _.undefined ? it(void 0) : this._def.innerType._parse(e);
3349
3349
  }
@@ -3351,7 +3351,7 @@ class Qt extends ne {
3351
3351
  return this._def.innerType;
3352
3352
  }
3353
3353
  }
3354
- Qt.create = (n, e) => new Qt({
3354
+ $t.create = (n, e) => new $t({
3355
3355
  innerType: n,
3356
3356
  typeName: j.ZodOptional,
3357
3357
  ...$(e)
@@ -3535,8 +3535,8 @@ var j;
3535
3535
  })(j || (j = {}));
3536
3536
  const _f = (n, e = {
3537
3537
  message: `Input not instance of ${n.name}`
3538
- }) => mC((t) => t instanceof n, e), bC = Nt.create, yC = ti.create, zf = hr.create, Mf = ni.create, ZC = Ys.create, Lf = Li.create, Tf = Ir.create, Jf = Ns.create, Df = Fs.create, Of = So.create, jf = Si.create, Ef = Vn.create, Pf = ur.create, Uf = Kt.create, Qf = xe.create, $f = xe.strictCreate, qf = Ks.create, em = Mr.create, tm = _s.create, nm = on.create, im = zs.create, om = Cr.create, sm = Ti.create, am = vo.create, rm = Ms.create, lm = Ls.create, gm = ii.create, cm = Ts.create, dm = Yo.create, Bd = _t.create, Im = Qt.create, um = oi.create, Cm = _t.createWithPreprocess, hm = ga.create, Am = () => bC().optional(), pm = () => yC().optional(), fm = () => ZC().optional(), mm = {
3539
- string: (n) => Nt.create({ ...n, coerce: !0 }),
3538
+ }) => mC((t) => t instanceof n, e), bC = Ft.create, yC = ti.create, zf = hr.create, Mf = ni.create, ZC = Ys.create, Lf = Li.create, Tf = Ir.create, Jf = Ns.create, Df = Fs.create, Of = So.create, jf = Si.create, Ef = Xn.create, Pf = ur.create, Uf = _t.create, Qf = xe.create, $f = xe.strictCreate, qf = Ks.create, em = Mr.create, tm = _s.create, nm = sn.create, im = zs.create, om = Cr.create, sm = Ti.create, am = vo.create, rm = Ms.create, lm = Ls.create, gm = ii.create, cm = Ts.create, dm = Yo.create, Bd = zt.create, Im = $t.create, um = oi.create, Cm = zt.createWithPreprocess, hm = ga.create, Am = () => bC().optional(), pm = () => yC().optional(), fm = () => ZC().optional(), mm = {
3539
+ string: (n) => Ft.create({ ...n, coerce: !0 }),
3540
3540
  number: (n) => ti.create({ ...n, coerce: !0 }),
3541
3541
  boolean: (n) => Ys.create({
3542
3542
  ...n,
@@ -3571,7 +3571,7 @@ var T = /* @__PURE__ */ Object.freeze({
3571
3571
  getParsedType: Ln,
3572
3572
  ZodType: ne,
3573
3573
  datetimeRegex: pC,
3574
- ZodString: Nt,
3574
+ ZodString: Ft,
3575
3575
  ZodNumber: ti,
3576
3576
  ZodBigInt: ni,
3577
3577
  ZodBoolean: Ys,
@@ -3581,14 +3581,14 @@ var T = /* @__PURE__ */ Object.freeze({
3581
3581
  ZodNull: Fs,
3582
3582
  ZodAny: So,
3583
3583
  ZodUnknown: Si,
3584
- ZodNever: Vn,
3584
+ ZodNever: Xn,
3585
3585
  ZodVoid: ur,
3586
- ZodArray: Kt,
3586
+ ZodArray: _t,
3587
3587
  ZodObject: xe,
3588
3588
  ZodUnion: Ks,
3589
3589
  ZodDiscriminatedUnion: Mr,
3590
3590
  ZodIntersection: _s,
3591
- ZodTuple: on,
3591
+ ZodTuple: sn,
3592
3592
  ZodRecord: zs,
3593
3593
  ZodMap: Cr,
3594
3594
  ZodSet: Ti,
@@ -3598,9 +3598,9 @@ var T = /* @__PURE__ */ Object.freeze({
3598
3598
  ZodEnum: ii,
3599
3599
  ZodNativeEnum: Ts,
3600
3600
  ZodPromise: Yo,
3601
- ZodEffects: _t,
3602
- ZodTransformer: _t,
3603
- ZodOptional: Qt,
3601
+ ZodEffects: zt,
3602
+ ZodTransformer: zt,
3603
+ ZodOptional: $t,
3604
3604
  ZodNullable: oi,
3605
3605
  ZodDefault: Js,
3606
3606
  ZodCatch: Ds,
@@ -4007,7 +4007,7 @@ function Ua(n, e, t, i, o) {
4007
4007
  var s = { type: n, props: e, key: t, ref: i, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: o ?? ++SC };
4008
4008
  return o == null && te.vnode != null && te.vnode(s), s;
4009
4009
  }
4010
- function Ut(n) {
4010
+ function Qt(n) {
4011
4011
  return n.children;
4012
4012
  }
4013
4013
  function Qa(n, e) {
@@ -4041,7 +4041,7 @@ function fr() {
4041
4041
  }
4042
4042
  function zC(n, e, t, i, o, s, a, r, l, g) {
4043
4043
  var c, d, I, u, C, A, p, m = i && i.__k || FC, b = m.length;
4044
- for (t.__k = [], c = 0; c < e.length; c++) if ((u = t.__k[c] = (u = e[c]) == null || typeof u == "boolean" ? null : typeof u == "string" || typeof u == "number" || typeof u == "bigint" ? Ua(null, u, null, null, u) : Array.isArray(u) ? Ua(Ut, { children: u }, null, null, null) : u.__b > 0 ? Ua(u.type, u.props, u.key, u.ref ? u.ref : null, u.__v) : u) != null) {
4044
+ for (t.__k = [], c = 0; c < e.length; c++) if ((u = t.__k[c] = (u = e[c]) == null || typeof u == "boolean" ? null : typeof u == "string" || typeof u == "number" || typeof u == "bigint" ? Ua(null, u, null, null, u) : Array.isArray(u) ? Ua(Qt, { children: u }, null, null, null) : u.__b > 0 ? Ua(u.type, u.props, u.key, u.ref ? u.ref : null, u.__v) : u) != null) {
4045
4045
  if (u.__ = t, u.__b = t.__b + 1, (I = m[c]) === null || I && u.key == I.key && u.type === I.type) m[c] = void 0;
4046
4046
  else for (d = 0; d < b; d++) {
4047
4047
  if ((I = m[d]) && u.key == I.key && u.type === I.type) {
@@ -4121,7 +4121,7 @@ function cc(n, e, t, i, o, s, a, r, l) {
4121
4121
  } else do
4122
4122
  c.__d = !1, w && w(e), g = c.render(c.props, c.state, c.context), c.state = c.__s;
4123
4123
  while (c.__d && ++v < 25);
4124
- c.state = c.__s, c.getChildContext != null && (i = Jn(Jn({}, i), c.getChildContext())), d || c.getSnapshotBeforeUpdate == null || (C = c.getSnapshotBeforeUpdate(I, u)), V = g != null && g.type === Ut && g.key == null ? g.props.children : g, zC(n, Array.isArray(V) ? V : [V], e, t, i, o, s, a, r, l), c.base = e.__e, e.__h = null, c.__h.length && a.push(c), A && (c.__E = c.__ = null), c.__e = !1;
4124
+ c.state = c.__s, c.getChildContext != null && (i = Jn(Jn({}, i), c.getChildContext())), d || c.getSnapshotBeforeUpdate == null || (C = c.getSnapshotBeforeUpdate(I, u)), V = g != null && g.type === Qt && g.key == null ? g.props.children : g, zC(n, Array.isArray(V) ? V : [V], e, t, i, o, s, a, r, l), c.base = e.__e, e.__h = null, c.__h.length && a.push(c), A && (c.__E = c.__ = null), c.__e = !1;
4125
4125
  } else s == null && e.__v === t.__v ? (e.__k = t.__k, e.__e = t.__e) : e.__e = Rm(t.__e, e, t, i, o, s, a, l);
4126
4126
  (g = te.diffed) && g(e);
4127
4127
  } catch (k) {
@@ -4192,7 +4192,7 @@ function xm(n, e, t) {
4192
4192
  }
4193
4193
  function ys(n, e, t) {
4194
4194
  var i, o, s;
4195
- te.__ && te.__(n, e), o = (i = typeof t == "function") ? null : e.__k, s = [], cc(e, n = (!i && t || e).__k = z(Ut, null, [n]), o || pr, pr, e.ownerSVGElement !== void 0, !i && t ? [t] : o ? null : e.firstChild ? Tr.call(e.childNodes) : null, s, !i && t ? t : o ? o.__e : e.firstChild, i), TC(s, n);
4195
+ te.__ && te.__(n, e), o = (i = typeof t == "function") ? null : e.__k, s = [], cc(e, n = (!i && t || e).__k = z(Qt, null, [n]), o || pr, pr, e.ownerSVGElement !== void 0, !i && t ? [t] : o ? null : e.firstChild ? Tr.call(e.childNodes) : null, s, !i && t ? t : o ? o.__e : e.firstChild, i), TC(s, n);
4196
4196
  }
4197
4197
  function OC() {
4198
4198
  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(n) {
@@ -4214,7 +4214,7 @@ Tr = FC.slice, te = { __e: function(n, e, t, i) {
4214
4214
  t = this.__s != null && this.__s !== this.state ? this.__s : this.__s = Jn({}, this.state), typeof n == "function" && (n = n(Jn({}, t), this.props)), n && Jn(t, n), n != null && this.__v && (e && this._sb.push(e), Ag(this));
4215
4215
  }, Qa.prototype.forceUpdate = function(n) {
4216
4216
  this.__v && (this.__e = !0, n && this.__h.push(n), Ag(this));
4217
- }, Qa.prototype.render = Ut, bs = [], fr.__r = 0, NC = 0;
4217
+ }, Qa.prototype.render = Qt, bs = [], fr.__r = 0, NC = 0;
4218
4218
  var Jr = /* @__PURE__ */ function() {
4219
4219
  function n(e) {
4220
4220
  this._id = void 0, this._id = e || OC();
@@ -4339,7 +4339,7 @@ function $a(n, e) {
4339
4339
  (function(n) {
4340
4340
  n[n.Initiator = 0] = "Initiator", n[n.ServerFilter = 1] = "ServerFilter", n[n.ServerSort = 2] = "ServerSort", n[n.ServerLimit = 3] = "ServerLimit", n[n.Extractor = 4] = "Extractor", n[n.Transformer = 5] = "Transformer", n[n.Filter = 6] = "Filter", n[n.Sort = 7] = "Sort", n[n.Limit = 8] = "Limit";
4341
4341
  })(Ue || (Ue = {}));
4342
- var cn = /* @__PURE__ */ function(n) {
4342
+ var dn = /* @__PURE__ */ function(n) {
4343
4343
  function e(i) {
4344
4344
  var o;
4345
4345
  return (o = n.call(this) || this).id = void 0, o._props = void 0, o._props = {}, o.id = OC(), i && o.setProps(i), o;
@@ -4378,7 +4378,7 @@ var cn = /* @__PURE__ */ function(n) {
4378
4378
  }, qe(e, [{ key: "type", get: function() {
4379
4379
  return Ue.Filter;
4380
4380
  } }]), e;
4381
- }(cn);
4381
+ }(dn);
4382
4382
  function le() {
4383
4383
  var n = "gridjs";
4384
4384
  return "" + n + [].slice.call(arguments).reduce(function(e, t) {
@@ -4405,7 +4405,7 @@ var ca, Ne, xl, Nd, Fd = /* @__PURE__ */ function(n) {
4405
4405
  }, qe(e, [{ key: "type", get: function() {
4406
4406
  return Ue.ServerFilter;
4407
4407
  } }]), e;
4408
- }(cn), Ps = 0, EC = [], qa = [], Kd = te.__b, _d = te.__r, zd = te.diffed, Md = te.__c, Ld = te.unmount;
4408
+ }(dn), Ps = 0, EC = [], qa = [], Kd = te.__b, _d = te.__r, zd = te.diffed, Md = te.__c, Ld = te.unmount;
4409
4409
  function Or(n, e) {
4410
4410
  te.__h && te.__h(Ne, n, Ps || e), Ps = 0;
4411
4411
  var t = Ne.__H || (Ne.__H = { __: [], __h: [] });
@@ -4565,7 +4565,7 @@ var Dd = function(n) {
4565
4565
  function jo() {
4566
4566
  return ot().store;
4567
4567
  }
4568
- function $t(n) {
4568
+ function qt(n) {
4569
4569
  var e = jo(), t = si(n(e.getState())), i = t[0], o = t[1];
4570
4570
  return dt(function() {
4571
4571
  return e.subscribe(function() {
@@ -4575,7 +4575,7 @@ function $t(n) {
4575
4575
  }, []), i;
4576
4576
  }
4577
4577
  function Km() {
4578
- var n, e = si(void 0), t = e[0], i = e[1], o = ot(), s = o.search, a = jr(), r = jo().dispatch, l = $t(function(u) {
4578
+ var n, e = si(void 0), t = e[0], i = e[1], o = ot(), s = o.search, a = jr(), r = jo().dispatch, l = qt(function(u) {
4579
4579
  return u.search;
4580
4580
  });
4581
4581
  dt(function() {
@@ -4617,7 +4617,7 @@ var Od = /* @__PURE__ */ function(n) {
4617
4617
  }, qe(e, [{ key: "type", get: function() {
4618
4618
  return Ue.Limit;
4619
4619
  } }]), e;
4620
- }(cn), jd = /* @__PURE__ */ function(n) {
4620
+ }(dn), jd = /* @__PURE__ */ function(n) {
4621
4621
  function e() {
4622
4622
  return n.apply(this, arguments) || this;
4623
4623
  }
@@ -4627,7 +4627,7 @@ var Od = /* @__PURE__ */ function(n) {
4627
4627
  }, qe(e, [{ key: "type", get: function() {
4628
4628
  return Ue.ServerLimit;
4629
4629
  } }]), e;
4630
- }(cn);
4630
+ }(dn);
4631
4631
  function _m() {
4632
4632
  var n = ot(), e = n.pagination, t = e.server, i = e.summary, o = i === void 0 || i, s = e.nextButton, a = s === void 0 || s, r = e.prevButton, l = r === void 0 || r, g = e.buttonsCount, c = g === void 0 ? 3 : g, d = e.limit, I = d === void 0 ? 10 : d, u = e.page, C = u === void 0 ? 0 : u, A = e.resetPageOnUpdate, p = A === void 0 || A, m = da(null), b = si(C), Z = b[0], w = b[1], v = si(0), W = v[0], V = v[1], B = jr();
4633
4633
  dt(function() {
@@ -4649,12 +4649,12 @@ function _m() {
4649
4649
  if (N >= R() || N < 0 || N === Z) return null;
4650
4650
  w(N), m.current.setProps({ page: N });
4651
4651
  };
4652
- return z("div", { className: ye(le("pagination"), n.className.pagination) }, z(Ut, null, o && W > 0 && z("div", { role: "status", "aria-live": "polite", className: ye(le("summary"), n.className.paginationSummary), title: B("pagination.navigate", Z + 1, R()) }, B("pagination.showing"), " ", z("b", null, B("" + (Z * I + 1))), " ", B("pagination.to"), " ", z("b", null, B("" + Math.min((Z + 1) * I, W))), " ", B("pagination.of"), " ", z("b", null, B("" + W)), " ", B("pagination.results"))), z("div", { className: le("pages") }, l && z("button", { tabIndex: 0, role: "button", disabled: Z === 0, onClick: function() {
4652
+ return z("div", { className: ye(le("pagination"), n.className.pagination) }, z(Qt, null, o && W > 0 && z("div", { role: "status", "aria-live": "polite", className: ye(le("summary"), n.className.paginationSummary), title: B("pagination.navigate", Z + 1, R()) }, B("pagination.showing"), " ", z("b", null, B("" + (Z * I + 1))), " ", B("pagination.to"), " ", z("b", null, B("" + Math.min((Z + 1) * I, W))), " ", B("pagination.of"), " ", z("b", null, B("" + W)), " ", B("pagination.results"))), z("div", { className: le("pages") }, l && z("button", { tabIndex: 0, role: "button", disabled: Z === 0, onClick: function() {
4653
4653
  return M(Z - 1);
4654
4654
  }, title: B("pagination.previous"), "aria-label": B("pagination.previous"), className: ye(n.className.paginationButton, n.className.paginationButtonPrev) }, B("pagination.previous")), function() {
4655
4655
  if (c <= 0) return null;
4656
4656
  var N = Math.min(R(), c), P = Math.min(Z, Math.floor(N / 2));
4657
- return Z + Math.floor(N / 2) >= R() && (P = N - (R() - Z)), z(Ut, null, R() > N && Z - P > 0 && z(Ut, null, z("button", { tabIndex: 0, role: "button", onClick: function() {
4657
+ return Z + Math.floor(N / 2) >= R() && (P = N - (R() - Z)), z(Qt, null, R() > N && Z - P > 0 && z(Qt, null, z("button", { tabIndex: 0, role: "button", onClick: function() {
4658
4658
  return M(0);
4659
4659
  }, title: B("pagination.firstPage"), "aria-label": B("pagination.firstPage"), className: n.className.paginationButton }, B("1")), z("button", { tabIndex: -1, className: ye(le("spread"), n.className.paginationButton) }, "...")), Array.from(Array(N).keys()).map(function(ee) {
4660
4660
  return Z + (ee - P);
@@ -4662,7 +4662,7 @@ function _m() {
4662
4662
  return z("button", { tabIndex: 0, role: "button", onClick: function() {
4663
4663
  return M(ee);
4664
4664
  }, className: ye(Z === ee ? ye(le("currentPage"), n.className.paginationButtonCurrent) : null, n.className.paginationButton), title: B("pagination.page", ee + 1), "aria-label": B("pagination.page", ee + 1) }, B("" + (ee + 1)));
4665
- }), R() > N && R() > Z + P + 1 && z(Ut, null, z("button", { tabIndex: -1, className: ye(le("spread"), n.className.paginationButton) }, "..."), z("button", { tabIndex: 0, role: "button", onClick: function() {
4665
+ }), R() > N && R() > Z + P + 1 && z(Qt, null, z("button", { tabIndex: -1, className: ye(le("spread"), n.className.paginationButton) }, "..."), z("button", { tabIndex: 0, role: "button", onClick: function() {
4666
4666
  return M(R() - 1);
4667
4667
  }, title: B("pagination.page", R()), "aria-label": B("pagination.page", R()), className: n.className.paginationButton }, B("" + R()))));
4668
4668
  }(), a && z("button", { tabIndex: 0, role: "button", disabled: R() === Z + 1 || R() === 0, onClick: function() {
@@ -4735,9 +4735,9 @@ function Er(n) {
4735
4735
  var e = this, t = ot();
4736
4736
  if (n.pluginId) {
4737
4737
  var i = t.plugin.get(n.pluginId);
4738
- return i ? z(Ut, {}, z(i.component, ge({ plugin: i }, n.props))) : null;
4738
+ return i ? z(Qt, {}, z(i.component, ge({ plugin: i }, n.props))) : null;
4739
4739
  }
4740
- return n.position !== void 0 ? z(Ut, {}, t.plugin.list(n.position).map(function(o) {
4740
+ return n.position !== void 0 ? z(Qt, {}, t.plugin.list(n.position).map(function(o) {
4741
4741
  return z(o.component, ge({ plugin: o }, e.props.props));
4742
4742
  })) : null;
4743
4743
  }
@@ -5093,7 +5093,7 @@ var Jm = /* @__PURE__ */ function(n) {
5093
5093
  }, qe(e, [{ key: "type", get: function() {
5094
5094
  return Ue.Extractor;
5095
5095
  } }]), e;
5096
- }(cn), Om = /* @__PURE__ */ function(n) {
5096
+ }(dn), Om = /* @__PURE__ */ function(n) {
5097
5097
  function e() {
5098
5098
  return n.apply(this, arguments) || this;
5099
5099
  }
@@ -5103,7 +5103,7 @@ var Jm = /* @__PURE__ */ function(n) {
5103
5103
  }, qe(e, [{ key: "type", get: function() {
5104
5104
  return Ue.Transformer;
5105
5105
  } }]), e;
5106
- }(cn), jm = /* @__PURE__ */ function(n) {
5106
+ }(dn), jm = /* @__PURE__ */ function(n) {
5107
5107
  function e() {
5108
5108
  return n.apply(this, arguments) || this;
5109
5109
  }
@@ -5117,7 +5117,7 @@ var Jm = /* @__PURE__ */ function(n) {
5117
5117
  }, qe(e, [{ key: "type", get: function() {
5118
5118
  return Ue.Initiator;
5119
5119
  } }]), e;
5120
- }(cn), Em = /* @__PURE__ */ function(n) {
5120
+ }(dn), Em = /* @__PURE__ */ function(n) {
5121
5121
  function e() {
5122
5122
  return n.apply(this, arguments) || this;
5123
5123
  }
@@ -5143,7 +5143,7 @@ var Jm = /* @__PURE__ */ function(n) {
5143
5143
  }, qe(e, [{ key: "type", get: function() {
5144
5144
  return Ue.Transformer;
5145
5145
  } }]), e;
5146
- }(cn), Pm = /* @__PURE__ */ function() {
5146
+ }(dn), Pm = /* @__PURE__ */ function() {
5147
5147
  function n() {
5148
5148
  }
5149
5149
  return n.createFromConfig = function(e) {
@@ -5219,7 +5219,7 @@ function eh(n) {
5219
5219
  } }, (e = n.column) ? typeof e.attributes == "function" ? e.attributes(n.cell.data, n.row, n.column) : e.attributes : {}), n.column && typeof n.column.formatter == "function" ? n.column.formatter(n.cell.data, n.row, n.column) : n.column && n.column.plugin ? z(Er, { pluginId: n.column.id, props: { column: n.column, cell: n.cell, row: n.row } }) : n.cell.data);
5220
5220
  }
5221
5221
  function uc(n) {
5222
- var e = ot(), t = $t(function(i) {
5222
+ var e = ot(), t = qt(function(i) {
5223
5223
  return i.header;
5224
5224
  });
5225
5225
  return z("tr", { className: ye(le("tr"), e.className.tr), onClick: function(i) {
@@ -5239,11 +5239,11 @@ function Hl(n) {
5239
5239
  return z(uc, { messageRow: !0 }, z(eh, { role: "alert", colSpan: n.colSpan, messageCell: !0, cell: new dc(n.message), className: ye(le("message"), n.className ? n.className : null) }));
5240
5240
  }
5241
5241
  function $m() {
5242
- var n = ot(), e = $t(function(a) {
5242
+ var n = ot(), e = qt(function(a) {
5243
5243
  return a.data;
5244
- }), t = $t(function(a) {
5244
+ }), t = qt(function(a) {
5245
5245
  return a.status;
5246
- }), i = $t(function(a) {
5246
+ }), i = qt(function(a) {
5247
5247
  return a.header;
5248
5248
  }), o = jr(), s = function() {
5249
5249
  return i ? i.visibleColumns.length : 0;
@@ -5281,7 +5281,7 @@ var qm = /* @__PURE__ */ function(n) {
5281
5281
  }, qe(e, [{ key: "type", get: function() {
5282
5282
  return Ue.Sort;
5283
5283
  } }]), e;
5284
- }(cn), $d = function(n, e, t, i) {
5284
+ }(dn), $d = function(n, e, t, i) {
5285
5285
  return function(o) {
5286
5286
  var s, a = (s = o.sort) != null && s.columns ? o.sort.columns.map(function(A) {
5287
5287
  return ge({}, A);
@@ -5315,9 +5315,9 @@ var qm = /* @__PURE__ */ function(n) {
5315
5315
  }, qe(e, [{ key: "type", get: function() {
5316
5316
  return Ue.ServerSort;
5317
5317
  } }]), e;
5318
- }(cn);
5318
+ }(dn);
5319
5319
  function tb(n) {
5320
- var e = ot(), t = jo().dispatch, i = jr(), o = si(0), s = o[0], a = o[1], r = e.sort, l = $t(function(d) {
5320
+ var e = ot(), t = jo().dispatch, i = jr(), o = si(0), s = o[0], a = o[1], r = e.sort, l = qt(function(d) {
5321
5321
  return d.sort;
5322
5322
  }), g = typeof (r == null ? void 0 : r.server) == "object" ? Ue.ServerSort : Ue.Sort, c = function() {
5323
5323
  var d = e.pipeline.getStepsByType(g);
@@ -5395,7 +5395,7 @@ function ib(n) {
5395
5395
  }, rowSpan: n.rowSpan > 1 ? n.rowSpan : void 0, colSpan: n.colSpan > 1 ? n.colSpan : void 0 }, (r = n.column) ? typeof r.attributes == "function" ? r.attributes(null, null, n.column) : r.attributes : {}, l() ? { tabIndex: 0 } : {}), z("div", { className: le("th", "content") }, n.column.name !== void 0 ? n.column.name : n.column.plugin !== void 0 ? z(Er, { pluginId: n.column.plugin.id, props: { column: n.column } }) : null), l() && z(tb, ge({ index: n.index }, n.column.sort)), n.column.resizable && n.index < e.header.visibleColumns.length - 1 && z(nb, { column: n.column, thRef: t }));
5396
5396
  }
5397
5397
  function ob() {
5398
- var n, e = ot(), t = $t(function(i) {
5398
+ var n, e = ot(), t = qt(function(i) {
5399
5399
  return i.header;
5400
5400
  });
5401
5401
  return t ? z("thead", { key: t.id, className: ye(le("thead"), e.className.thead) }, (n = Go.tabularFormat(t.columns)).map(function(i, o) {
@@ -5441,11 +5441,11 @@ function rb() {
5441
5441
  }, [n]), t ? z("div", { ref: n, className: ye(le("footer"), o.className.footer), style: ge({}, o.style.footer) }, z(Er, { position: Ji.Footer })) : null;
5442
5442
  }
5443
5443
  function lb() {
5444
- var n = ot(), e = jo().dispatch, t = $t(function(r) {
5444
+ var n = ot(), e = jo().dispatch, t = qt(function(r) {
5445
5445
  return r.status;
5446
- }), i = $t(function(r) {
5446
+ }), i = qt(function(r) {
5447
5447
  return r.data;
5448
- }), o = $t(function(r) {
5448
+ }), o = qt(function(r) {
5449
5449
  return r.tableRef;
5450
5450
  }), s = { current: null }, a = nh(function() {
5451
5451
  try {
@@ -5523,7 +5523,7 @@ function us(n) {
5523
5523
  function $n(n) {
5524
5524
  return Dn(Ia(n * 255), 0, 255);
5525
5525
  }
5526
- function yn(n) {
5526
+ function Zn(n) {
5527
5527
  return Dn(Ia(n / 2.55) / 100, 0, 1);
5528
5528
  }
5529
5529
  function eI(n) {
@@ -5610,7 +5610,7 @@ function vb(n) {
5610
5610
  if (!n)
5611
5611
  return;
5612
5612
  const e = Cc(n), t = e[0], i = eI(e[1]), o = eI(e[2]);
5613
- return n.a < 255 ? `hsla(${t}, ${i}%, ${o}%, ${yn(n.a)})` : `hsl(${t}, ${i}%, ${o}%)`;
5613
+ return n.a < 255 ? `hsla(${t}, ${i}%, ${o}%, ${Zn(n.a)})` : `hsl(${t}, ${i}%, ${o}%)`;
5614
5614
  }
5615
5615
  const tI = {
5616
5616
  x: "dark",
@@ -5829,15 +5829,15 @@ function Vb(n) {
5829
5829
  }
5830
5830
  }
5831
5831
  function Xb(n) {
5832
- return n && (n.a < 255 ? `rgba(${n.r}, ${n.g}, ${n.b}, ${yn(n.a)})` : `rgb(${n.r}, ${n.g}, ${n.b})`);
5832
+ return n && (n.a < 255 ? `rgba(${n.r}, ${n.g}, ${n.b}, ${Zn(n.a)})` : `rgb(${n.r}, ${n.g}, ${n.b})`);
5833
5833
  }
5834
5834
  const Sl = (n) => n <= 31308e-7 ? n * 12.92 : Math.pow(n, 1 / 2.4) * 1.055 - 0.055, uo = (n) => n <= 0.04045 ? n / 12.92 : Math.pow((n + 0.055) / 1.055, 2.4);
5835
5835
  function Rb(n, e, t) {
5836
- const i = uo(yn(n.r)), o = uo(yn(n.g)), s = uo(yn(n.b));
5836
+ const i = uo(Zn(n.r)), o = uo(Zn(n.g)), s = uo(Zn(n.b));
5837
5837
  return {
5838
- r: $n(Sl(i + t * (uo(yn(e.r)) - i))),
5839
- g: $n(Sl(o + t * (uo(yn(e.g)) - o))),
5840
- b: $n(Sl(s + t * (uo(yn(e.b)) - s))),
5838
+ r: $n(Sl(i + t * (uo(Zn(e.r)) - i))),
5839
+ g: $n(Sl(o + t * (uo(Zn(e.g)) - o))),
5840
+ b: $n(Sl(s + t * (uo(Zn(e.b)) - s))),
5841
5841
  a: n.a + t * (e.a - n.a)
5842
5842
  };
5843
5843
  }
@@ -5870,7 +5870,7 @@ class Us {
5870
5870
  }
5871
5871
  get rgb() {
5872
5872
  var e = sh(this._rgb);
5873
- return e && (e.a = yn(e.a)), e;
5873
+ return e && (e.a = Zn(e.a)), e;
5874
5874
  }
5875
5875
  set rgb(e) {
5876
5876
  this._rgb = iI(e);
@@ -5940,7 +5940,7 @@ class Us {
5940
5940
  * (c) 2024 Chart.js Contributors
5941
5941
  * Released under the MIT License
5942
5942
  */
5943
- function pn() {
5943
+ function fn() {
5944
5944
  }
5945
5945
  const kb = /* @__PURE__ */ (() => {
5946
5946
  let n = 0;
@@ -6086,7 +6086,7 @@ const Qs = (n) => typeof n < "u", ri = (n) => typeof n == "function", sI = (n, e
6086
6086
  function Kb(n) {
6087
6087
  return n.type === "mouseup" || n.type === "click" || n.type === "contextmenu";
6088
6088
  }
6089
- const Ge = Math.PI, ve = 2 * Ge, _b = ve + Ge, yr = Number.POSITIVE_INFINITY, zb = Ge / 180, Fe = Ge / 2, Zi = Ge / 4, aI = Ge * 2 / 3, On = Math.log10, qt = Math.sign;
6089
+ const Ge = Math.PI, ve = 2 * Ge, _b = ve + Ge, yr = Number.POSITIVE_INFINITY, zb = Ge / 180, Fe = Ge / 2, Zi = Ge / 4, aI = Ge * 2 / 3, On = Math.log10, en = Math.sign;
6090
6090
  function ws(n, e, t) {
6091
6091
  return Math.abs(n - e) < t;
6092
6092
  }
@@ -6115,7 +6115,7 @@ function lh(n, e, t) {
6115
6115
  for (i = 0, o = n.length; i < o; i++)
6116
6116
  s = n[i][t], isNaN(s) || (e.min = Math.min(e.min, s), e.max = Math.max(e.max, s));
6117
6117
  }
6118
- function Ft(n) {
6118
+ function Kt(n) {
6119
6119
  return n * (Ge / 180);
6120
6120
  }
6121
6121
  function fc(n) {
@@ -6156,7 +6156,7 @@ function Je(n, e, t) {
6156
6156
  function Jb(n) {
6157
6157
  return Je(n, -32768, 32767);
6158
6158
  }
6159
- function vn(n, e, t, i = 1e-6) {
6159
+ function Gn(n, e, t, i = 1e-6) {
6160
6160
  return n >= Math.min(e, t) - i && n <= Math.max(e, t) + i;
6161
6161
  }
6162
6162
  function mc(n, e, t) {
@@ -6169,7 +6169,7 @@ function mc(n, e, t) {
6169
6169
  hi: i
6170
6170
  };
6171
6171
  }
6172
- const Gn = (n, e, t, i) => mc(n, t, i ? (o) => {
6172
+ const Bn = (n, e, t, i) => mc(n, t, i ? (o) => {
6173
6173
  const s = n[o][e];
6174
6174
  return s < t || s === t && n[o + 1][e] === t;
6175
6175
  } : (o) => n[o][e] < t), Db = (n, e, t) => mc(n, t, (i) => n[i][e] >= t);
@@ -6255,14 +6255,14 @@ function Ch(n, e, t) {
6255
6255
  const { iScale: a, _parsed: r } = n, l = a.axis, { min: g, max: c, minDefined: d, maxDefined: I } = a.getUserBounds();
6256
6256
  d && (o = Je(Math.min(
6257
6257
  // @ts-expect-error Need to type _parsed
6258
- Gn(r, l, g).lo,
6258
+ Bn(r, l, g).lo,
6259
6259
  // @ts-expect-error Need to fix types on _lookupByKey
6260
- t ? i : Gn(e, l, a.getPixelForValue(g)).lo
6260
+ t ? i : Bn(e, l, a.getPixelForValue(g)).lo
6261
6261
  ), 0, i - 1)), I ? s = Je(Math.max(
6262
6262
  // @ts-expect-error Need to type _parsed
6263
- Gn(r, a.axis, c, !0).hi + 1,
6263
+ Bn(r, a.axis, c, !0).hi + 1,
6264
6264
  // @ts-expect-error Need to fix types on _lookupByKey
6265
- t ? 0 : Gn(e, l, a.getPixelForValue(c), !0).hi + 1
6265
+ t ? 0 : Bn(e, l, a.getPixelForValue(c), !0).hi + 1
6266
6266
  ), o, i) - o : s = i - o;
6267
6267
  }
6268
6268
  return {
@@ -6709,7 +6709,7 @@ function ph(n, e, t, i, o) {
6709
6709
  n.fill(), e.borderWidth > 0 && n.stroke();
6710
6710
  }
6711
6711
  }
6712
- function Bn(n, e, t) {
6712
+ function Wn(n, e, t) {
6713
6713
  return t = t || 0.5, !e || n && n.x > e.left - t && n.x < e.right + t && n.y > e.top - t && n.y < e.bottom + t;
6714
6714
  }
6715
6715
  function Ur(n, e) {
@@ -7124,7 +7124,7 @@ function X0(n, e = "x") {
7124
7124
  const c = g[e] - l[e];
7125
7125
  o[a] = c !== 0 ? (g[t] - l[t]) / c : 0;
7126
7126
  }
7127
- s[a] = r ? g ? qt(o[a - 1]) !== qt(o[a]) ? 0 : (o[a - 1] + o[a]) / 2 : o[a - 1] : o[a];
7127
+ s[a] = r ? g ? en(o[a - 1]) !== en(o[a]) ? 0 : (o[a - 1] + o[a]) / 2 : o[a - 1] : o[a];
7128
7128
  }
7129
7129
  W0(n, o, s), V0(n, s, e);
7130
7130
  }
@@ -7132,9 +7132,9 @@ function ka(n, e, t) {
7132
7132
  return Math.max(Math.min(n, t), e);
7133
7133
  }
7134
7134
  function R0(n, e) {
7135
- let t, i, o, s, a, r = Bn(n[0], e);
7135
+ let t, i, o, s, a, r = Wn(n[0], e);
7136
7136
  for (t = 0, i = n.length; t < i; ++t)
7137
- a = s, s = r, r = t < i - 1 && Bn(n[t + 1], e), s && (o = n[t], a && (o.cp1x = ka(o.cp1x, e.left, e.right), o.cp1y = ka(o.cp1y, e.top, e.bottom)), r && (o.cp2x = ka(o.cp2x, e.left, e.right), o.cp2y = ka(o.cp2y, e.top, e.bottom)));
7137
+ a = s, s = r, r = t < i - 1 && Wn(n[t + 1], e), s && (o = n[t], a && (o.cp1x = ka(o.cp1x, e.left, e.right), o.cp1y = ka(o.cp1y, e.top, e.bottom)), r && (o.cp2x = ka(o.cp2x, e.left, e.right), o.cp2y = ka(o.cp2y, e.top, e.bottom)));
7138
7138
  }
7139
7139
  function x0(n, e, t, i, o) {
7140
7140
  let s, a, r, l;
@@ -7334,7 +7334,7 @@ function Wh(n) {
7334
7334
  compare: Tb,
7335
7335
  normalize: ft
7336
7336
  } : {
7337
- between: vn,
7337
+ between: Gn,
7338
7338
  compare: (e, t) => e - t,
7339
7339
  normalize: (e) => e
7340
7340
  };
@@ -7581,7 +7581,7 @@ class P0 {
7581
7581
  return this._charts.delete(e);
7582
7582
  }
7583
7583
  }
7584
- var mn = /* @__PURE__ */ new P0();
7584
+ var bn = /* @__PURE__ */ new P0();
7585
7585
  const yI = "transparent", U0 = {
7586
7586
  boolean(n, e, t) {
7587
7587
  return t > 0.5 ? e : n;
@@ -7727,7 +7727,7 @@ class Rh {
7727
7727
  }
7728
7728
  const i = this._createAnimations(e, t);
7729
7729
  if (i.length)
7730
- return mn.add(this._chart, i), !0;
7730
+ return bn.add(this._chart, i), !0;
7731
7731
  }
7732
7732
  }
7733
7733
  function $0(n, e) {
@@ -7798,7 +7798,7 @@ function wI(n, e, t, i = {}) {
7798
7798
  continue;
7799
7799
  break;
7800
7800
  }
7801
- g = n.values[l], He(g) && (s || e === 0 || qt(e) === qt(g)) && (e += g);
7801
+ g = n.values[l], He(g) && (s || e === 0 || en(e) === en(g)) && (e += g);
7802
7802
  }
7803
7803
  return !c && !i.all ? 0 : e;
7804
7804
  }
@@ -8316,7 +8316,7 @@ function zl(n) {
8316
8316
  return n && n.barStart !== void 0 && n.barEnd !== void 0;
8317
8317
  }
8318
8318
  function Cy(n, e, t) {
8319
- return n !== 0 ? qt(n) : (e.isHorizontal() ? 1 : -1) * (e.min >= t ? 1 : -1);
8319
+ return n !== 0 ? en(n) : (e.isHorizontal() ? 1 : -1) * (e.min >= t ? 1 : -1);
8320
8320
  }
8321
8321
  function hy(n) {
8322
8322
  let e, t, i, o, s;
@@ -8455,7 +8455,7 @@ class qn extends Wt {
8455
8455
  _calculateBarValuePixels(e) {
8456
8456
  const { _cachedMeta: { vScale: t, _stacked: i, index: o }, options: { base: s, minBarLength: a } } = this, r = s || 0, l = this.getParsed(e), g = l._custom, c = zl(g);
8457
8457
  let d = l[t.axis], I = 0, u = i ? this.applyStack(t, l, i) : d, C, A;
8458
- u !== d && (I = u - d, u = d), c && (d = g.barStart, u = g.barEnd - g.barStart, d !== 0 && qt(d) !== qt(g.barEnd) && (I = 0), I += d);
8458
+ u !== d && (I = u - d, u = d), c && (d = g.barStart, u = g.barEnd - g.barStart, d !== 0 && en(d) !== en(g.barEnd) && (I = 0), I += d);
8459
8459
  const p = !ce(s) && !c ? s : I;
8460
8460
  let m = t.getPixelForValue(p);
8461
8461
  if (this.chart.getDataVisibility(e) ? C = t.getPixelForValue(I + u) : C = m, A = C - m, Math.abs(A) < a) {
@@ -8464,7 +8464,7 @@ class qn extends Wt {
8464
8464
  m = Math.max(Math.min(m, v), w), C = m + A, i && !c && (l._stacks[t.axis]._visualValues[o] = t.getValueForPixel(C) - t.getValueForPixel(m));
8465
8465
  }
8466
8466
  if (m === t.getPixelForValue(r)) {
8467
- const b = qt(A) * t.getLineWidthForValue(r) / 2;
8467
+ const b = en(A) * t.getLineWidthForValue(r) / 2;
8468
8468
  m += b, A -= b;
8469
8469
  }
8470
8470
  return {
@@ -8649,10 +8649,10 @@ class Hi extends Wt {
8649
8649
  }
8650
8650
  }
8651
8651
  _getRotation() {
8652
- return Ft(this.options.rotation - 90);
8652
+ return Kt(this.options.rotation - 90);
8653
8653
  }
8654
8654
  _getCircumference() {
8655
- return Ft(this.options.circumference);
8655
+ return Kt(this.options.circumference);
8656
8656
  }
8657
8657
  _getRotationExtents() {
8658
8658
  let e = ve, t = -ve;
@@ -8815,7 +8815,7 @@ S(Hi, "id", "doughnut"), S(Hi, "defaults", {
8815
8815
  }
8816
8816
  }
8817
8817
  });
8818
- class Wn extends Wt {
8818
+ class Vn extends Wt {
8819
8819
  initialize() {
8820
8820
  this.enableOptionSharing = !0, this.supportsDecimation = !0, super.initialize();
8821
8821
  }
@@ -8854,12 +8854,12 @@ class Wn extends Wt {
8854
8854
  e.dataset.updateControlPoints(this.chart.chartArea, e.iScale.axis), super.draw();
8855
8855
  }
8856
8856
  }
8857
- S(Wn, "id", "line"), S(Wn, "defaults", {
8857
+ S(Vn, "id", "line"), S(Vn, "defaults", {
8858
8858
  datasetElementType: "line",
8859
8859
  dataElementType: "point",
8860
8860
  showLine: !0,
8861
8861
  spanGaps: !1
8862
- }), S(Wn, "overrides", {
8862
+ }), S(Vn, "overrides", {
8863
8863
  scales: {
8864
8864
  _index_: {
8865
8865
  type: "category"
@@ -8869,7 +8869,7 @@ S(Wn, "id", "line"), S(Wn, "defaults", {
8869
8869
  }
8870
8870
  }
8871
8871
  });
8872
- class en extends Wt {
8872
+ class tn extends Wt {
8873
8873
  constructor(e, t) {
8874
8874
  super(e, t), this.innerRadius = void 0, this.outerRadius = void 0;
8875
8875
  }
@@ -8931,10 +8931,10 @@ class en extends Wt {
8931
8931
  }), t;
8932
8932
  }
8933
8933
  _computeAngle(e, t, i) {
8934
- return this.chart.getDataVisibility(e) ? Ft(this.resolveDataElementOptions(e, t).angle || i) : 0;
8934
+ return this.chart.getDataVisibility(e) ? Kt(this.resolveDataElementOptions(e, t).angle || i) : 0;
8935
8935
  }
8936
8936
  }
8937
- S(en, "id", "polarArea"), S(en, "defaults", {
8937
+ S(tn, "id", "polarArea"), S(tn, "defaults", {
8938
8938
  dataElementType: "arc",
8939
8939
  animation: {
8940
8940
  animateRotate: !0,
@@ -8955,7 +8955,7 @@ S(en, "id", "polarArea"), S(en, "defaults", {
8955
8955
  },
8956
8956
  indexAxis: "r",
8957
8957
  startAngle: 0
8958
- }), S(en, "overrides", {
8958
+ }), S(tn, "overrides", {
8959
8959
  aspectRatio: 1,
8960
8960
  plugins: {
8961
8961
  legend: {
@@ -9142,9 +9142,9 @@ var by = /* @__PURE__ */ Object.freeze({
9142
9142
  BarController: qn,
9143
9143
  BubbleController: tr,
9144
9144
  DoughnutController: Hi,
9145
- LineController: Wn,
9145
+ LineController: Vn,
9146
9146
  PieController: Zg,
9147
- PolarAreaController: en,
9147
+ PolarAreaController: tn,
9148
9148
  RadarController: nr,
9149
9149
  ScatterController: Fi
9150
9150
  });
@@ -9200,7 +9200,7 @@ var yy = {
9200
9200
  function Zy(n, e, t, i) {
9201
9201
  const { controller: o, data: s, _sorted: a } = n, r = o._cachedMeta.iScale;
9202
9202
  if (r && e === r.axis && e !== "r" && a && s.length) {
9203
- const l = r._reversePixels ? Db : Gn;
9203
+ const l = r._reversePixels ? Db : Bn;
9204
9204
  if (i) {
9205
9205
  if (o._sharedOptions) {
9206
9206
  const g = s[0], c = typeof g.getRange == "function" && g.getRange(e);
@@ -9239,7 +9239,7 @@ function wy(n) {
9239
9239
  function Ml(n, e, t, i, o) {
9240
9240
  const s = [];
9241
9241
  return !o && !n.isPointInArea(e) || Ca(n, t, e, function(r, l, g) {
9242
- !o && !Bn(r, n.chartArea, 0) || r.inRange(e.x, e.y, i) && s.push({
9242
+ !o && !Wn(r, n.chartArea, 0) || r.inRange(e.x, e.y, i) && s.push({
9243
9243
  element: r,
9244
9244
  datasetIndex: l,
9245
9245
  index: g
@@ -9779,7 +9779,7 @@ function jy(n) {
9779
9779
  return !Bc() || typeof OffscreenCanvas < "u" && n instanceof OffscreenCanvas ? Sy : Oy;
9780
9780
  }
9781
9781
  var Oa;
9782
- let dn = (Oa = class {
9782
+ let In = (Oa = class {
9783
9783
  constructor() {
9784
9784
  S(this, "x");
9785
9785
  S(this, "y");
@@ -9945,7 +9945,7 @@ function aZ(n, e, t, i) {
9945
9945
  rotation: d
9946
9946
  };
9947
9947
  }
9948
- class Ii extends dn {
9948
+ class Ii extends In {
9949
9949
  constructor(e) {
9950
9950
  super(), this.id = e.id, this.type = e.type, this.options = void 0, this.ctx = e.ctx, this.chart = e.chart, this.top = void 0, this.bottom = void 0, this.left = void 0, this.right = void 0, this.width = void 0, this.height = void 0, this._margins = {
9951
9951
  left: 0,
@@ -10120,7 +10120,7 @@ class Ii extends dn {
10120
10120
  if (a) {
10121
10121
  const l = _I(o, t.options.font);
10122
10122
  if (r ? (e.width = this.maxWidth, e.height = rs(s) + l) : (e.height = this.maxHeight, e.width = rs(s) + l), i.display && this.ticks.length) {
10123
- const { first: g, last: c, widest: d, highest: I } = this._getLabelSizes(), u = i.padding * 2, C = Ft(this.labelRotation), A = Math.cos(C), p = Math.sin(C);
10123
+ const { first: g, last: c, widest: d, highest: I } = this._getLabelSizes(), u = i.padding * 2, C = Kt(this.labelRotation), A = Math.cos(C), p = Math.sin(C);
10124
10124
  if (r) {
10125
10125
  const m = i.mirror ? 0 : p * d.width + A * I.height;
10126
10126
  e.height = Math.min(this.maxHeight, e.height + m + u);
@@ -10240,7 +10240,7 @@ class Ii extends dn {
10240
10240
  return this.$context || (this.$context = iZ(this.chart.getContext(), this));
10241
10241
  }
10242
10242
  _tickSize() {
10243
- const e = this.options.ticks, t = Ft(this.labelRotation), i = Math.abs(Math.cos(t)), o = Math.abs(Math.sin(t)), s = this._getLabelSizes(), a = e.autoSkipPadding || 0, r = s ? s.widest.width + a : 0, l = s ? s.highest.height + a : 0;
10243
+ const e = this.options.ticks, t = Kt(this.labelRotation), i = Math.abs(Math.cos(t)), o = Math.abs(Math.sin(t)), s = this._getLabelSizes(), a = e.autoSkipPadding || 0, r = s ? s.widest.width + a : 0, l = s ? s.highest.height + a : 0;
10244
10244
  return this.isHorizontal() ? l * i > r * o ? r / i : l / o : l * o < r * i ? l / i : r / o;
10245
10245
  }
10246
10246
  _isVisible() {
@@ -10279,7 +10279,7 @@ class Ii extends dn {
10279
10279
  }
10280
10280
  const ee = Q(o.ticks.maxTicksLimit, d), se = Math.max(1, Math.ceil(d / ee));
10281
10281
  for (Z = 0; Z < d; Z += se) {
10282
- const de = this.getContext(Z), ue = s.setContext(de), Xe = r.setContext(de), Ae = ue.lineWidth, Ot = ue.color, _n = Xe.dash || [], zn = Xe.dashOffset, mi = ue.tickWidth, hn = ue.tickColor, kt = ue.tickBorderDash || [], Ht = ue.tickBorderDashOffset;
10282
+ const de = this.getContext(Z), ue = s.setContext(de), Xe = r.setContext(de), Ae = ue.lineWidth, jt = ue.color, _n = Xe.dash || [], zn = Xe.dashOffset, mi = ue.tickWidth, An = ue.tickColor, Ht = ue.tickBorderDash || [], St = ue.tickBorderDashOffset;
10283
10283
  w = tZ(this, Z, l), w !== void 0 && (v = wi(i, w, Ae), g ? W = B = R = N = v : V = k = M = P = v, u.push({
10284
10284
  tx1: W,
10285
10285
  ty1: V,
@@ -10290,19 +10290,19 @@ class Ii extends dn {
10290
10290
  x2: N,
10291
10291
  y2: P,
10292
10292
  width: Ae,
10293
- color: Ot,
10293
+ color: jt,
10294
10294
  borderDash: _n,
10295
10295
  borderDashOffset: zn,
10296
10296
  tickWidth: mi,
10297
- tickColor: hn,
10298
- tickBorderDash: kt,
10299
- tickBorderDashOffset: Ht
10297
+ tickColor: An,
10298
+ tickBorderDash: Ht,
10299
+ tickBorderDashOffset: St
10300
10300
  }));
10301
10301
  }
10302
10302
  return this._ticksLength = d, this._borderValue = b, u;
10303
10303
  }
10304
10304
  _computeLabelItems(e) {
10305
- const t = this.axis, i = this.options, { position: o, ticks: s } = i, a = this.isHorizontal(), r = this.ticks, { align: l, crossAlign: g, padding: c, mirror: d } = s, I = rs(i.grid), u = I + c, C = d ? -c : u, A = -Ft(this.labelRotation), p = [];
10305
+ const t = this.axis, i = this.options, { position: o, ticks: s } = i, a = this.isHorizontal(), r = this.ticks, { align: l, crossAlign: g, padding: c, mirror: d } = s, I = rs(i.grid), u = I + c, C = d ? -c : u, A = -Kt(this.labelRotation), p = [];
10306
10306
  let m, b, Z, w, v, W, V, B, k, R, M, N, P = "middle";
10307
10307
  if (o === "top")
10308
10308
  W = this.bottom - C, V = this._getXAxisLabelAlignment();
@@ -10338,35 +10338,35 @@ class Ii extends dn {
10338
10338
  const se = s.setContext(this.getContext(m));
10339
10339
  B = this.getPixelForTick(m) + s.labelOffset, k = this._resolveTickFontOptions(m), R = k.lineHeight, M = We(w) ? w.length : 1;
10340
10340
  const de = M / 2, ue = se.color, Xe = se.textStrokeColor, Ae = se.textStrokeWidth;
10341
- let Ot = V;
10342
- a ? (v = B, V === "inner" && (m === b - 1 ? Ot = this.options.reverse ? "left" : "right" : m === 0 ? Ot = this.options.reverse ? "right" : "left" : Ot = "center"), o === "top" ? g === "near" || A !== 0 ? N = -M * R + R / 2 : g === "center" ? N = -ee.highest.height / 2 - de * R + R : N = -ee.highest.height + R / 2 : g === "near" || A !== 0 ? N = R / 2 : g === "center" ? N = ee.highest.height / 2 - de * R : N = ee.highest.height - M * R, d && (N *= -1), A !== 0 && !se.showLabelBackdrop && (v += R / 2 * Math.sin(A))) : (W = B, N = (1 - M) * R / 2);
10341
+ let jt = V;
10342
+ a ? (v = B, V === "inner" && (m === b - 1 ? jt = this.options.reverse ? "left" : "right" : m === 0 ? jt = this.options.reverse ? "right" : "left" : jt = "center"), o === "top" ? g === "near" || A !== 0 ? N = -M * R + R / 2 : g === "center" ? N = -ee.highest.height / 2 - de * R + R : N = -ee.highest.height + R / 2 : g === "near" || A !== 0 ? N = R / 2 : g === "center" ? N = ee.highest.height / 2 - de * R : N = ee.highest.height - M * R, d && (N *= -1), A !== 0 && !se.showLabelBackdrop && (v += R / 2 * Math.sin(A))) : (W = B, N = (1 - M) * R / 2);
10343
10343
  let _n;
10344
10344
  if (se.showLabelBackdrop) {
10345
- const zn = $e(se.backdropPadding), mi = ee.heights[m], hn = ee.widths[m];
10346
- let kt = N - zn.top, Ht = 0 - zn.left;
10345
+ const zn = $e(se.backdropPadding), mi = ee.heights[m], An = ee.widths[m];
10346
+ let Ht = N - zn.top, St = 0 - zn.left;
10347
10347
  switch (P) {
10348
10348
  case "middle":
10349
- kt -= mi / 2;
10349
+ Ht -= mi / 2;
10350
10350
  break;
10351
10351
  case "bottom":
10352
- kt -= mi;
10352
+ Ht -= mi;
10353
10353
  break;
10354
10354
  }
10355
10355
  switch (V) {
10356
10356
  case "center":
10357
- Ht -= hn / 2;
10357
+ St -= An / 2;
10358
10358
  break;
10359
10359
  case "right":
10360
- Ht -= hn;
10360
+ St -= An;
10361
10361
  break;
10362
10362
  case "inner":
10363
- m === b - 1 ? Ht -= hn : m > 0 && (Ht -= hn / 2);
10363
+ m === b - 1 ? St -= An : m > 0 && (St -= An / 2);
10364
10364
  break;
10365
10365
  }
10366
10366
  _n = {
10367
- left: Ht,
10368
- top: kt,
10369
- width: hn + zn.width,
10367
+ left: St,
10368
+ top: Ht,
10369
+ width: An + zn.width,
10370
10370
  height: mi + zn.height,
10371
10371
  color: se.backdropColor
10372
10372
  };
@@ -10380,7 +10380,7 @@ class Ii extends dn {
10380
10380
  color: ue,
10381
10381
  strokeColor: Xe,
10382
10382
  strokeWidth: Ae,
10383
- textAlign: Ot,
10383
+ textAlign: jt,
10384
10384
  textBaseline: P,
10385
10385
  translation: [
10386
10386
  v,
@@ -10394,7 +10394,7 @@ class Ii extends dn {
10394
10394
  }
10395
10395
  _getXAxisLabelAlignment() {
10396
10396
  const { position: e, ticks: t } = this.options;
10397
- if (-Ft(this.labelRotation))
10397
+ if (-Kt(this.labelRotation))
10398
10398
  return e === "top" ? "left" : "right";
10399
10399
  let o = "center";
10400
10400
  return t.align === "start" ? o = "left" : t.align === "end" ? o = "right" : t.align === "inner" && (o = "inner"), o;
@@ -10602,7 +10602,7 @@ function gZ(n) {
10602
10602
  }
10603
10603
  class cZ {
10604
10604
  constructor() {
10605
- this.controllers = new Na(Wt, "datasets", !0), this.elements = new Na(dn, "elements"), this.plugins = new Na(Object, "plugins"), this.scales = new Na(Ii, "scales"), this._typedRegistries = [
10605
+ this.controllers = new Na(Wt, "datasets", !0), this.elements = new Na(In, "elements"), this.plugins = new Na(Object, "plugins"), this.scales = new Na(Ii, "scales"), this._typedRegistries = [
10606
10606
  this.controllers,
10607
10607
  this.scales,
10608
10608
  this.elements
@@ -11089,7 +11089,7 @@ class ke {
11089
11089
  console.error("Failed to create chart: can't acquire context from the given item");
11090
11090
  return;
11091
11091
  }
11092
- mn.listen(this, "complete", OI), mn.listen(this, "progress", WZ), this._initialize(), this.attached && this.update();
11092
+ bn.listen(this, "complete", OI), bn.listen(this, "progress", WZ), this._initialize(), this.attached && this.update();
11093
11093
  }
11094
11094
  get aspectRatio() {
11095
11095
  const { options: { aspectRatio: e, maintainAspectRatio: t }, width: i, height: o, _aspectRatio: s } = this;
@@ -11117,10 +11117,10 @@ class ke {
11117
11117
  return uI(this.canvas, this.ctx), this;
11118
11118
  }
11119
11119
  stop() {
11120
- return mn.stop(this), this;
11120
+ return bn.stop(this), this;
11121
11121
  }
11122
11122
  resize(e, t) {
11123
- mn.running(this) ? this._resizeBeforeDraw = {
11123
+ bn.running(this) ? this._resizeBeforeDraw = {
11124
11124
  width: e,
11125
11125
  height: t
11126
11126
  } : this._resize(e, t);
@@ -11310,7 +11310,7 @@ class ke {
11310
11310
  render() {
11311
11311
  this.notifyPlugins("beforeRender", {
11312
11312
  cancelable: !0
11313
- }) !== !1 && (mn.has(this) ? this.attached && !mn.running(this) && mn.start(this) : (this.draw(), OI({
11313
+ }) !== !1 && (bn.has(this) ? this.attached && !bn.running(this) && bn.start(this) : (this.draw(), OI({
11314
11314
  chart: this
11315
11315
  })));
11316
11316
  }
@@ -11367,7 +11367,7 @@ class ke {
11367
11367
  }), e.controller.draw(), o && Qr(t), a.cancelable = !1, this.notifyPlugins("afterDatasetDraw", a));
11368
11368
  }
11369
11369
  isPointInArea(e) {
11370
- return Bn(e, this.chartArea, this._minPadding);
11370
+ return Wn(e, this.chartArea, this._minPadding);
11371
11371
  }
11372
11372
  getElementsAtEventForMode(e, t, i, o) {
11373
11373
  const s = By.modes[t];
@@ -11435,7 +11435,7 @@ class ke {
11435
11435
  }
11436
11436
  _stop() {
11437
11437
  let e, t;
11438
- for (this.stop(), mn.remove(this), e = 0, t = this.data.datasets.length; e < t; ++e)
11438
+ for (this.stop(), bn.remove(this), e = 0, t = this.data.datasets.length; e < t; ++e)
11439
11439
  this._destroyDatasetMeta(e);
11440
11440
  }
11441
11441
  destroy() {
@@ -11650,7 +11650,7 @@ function YZ(n, e, t, i, o) {
11650
11650
  }
11651
11651
  u && xZ(n, e, C), s || (Br(n, e, t, i, C, o), n.stroke());
11652
11652
  }
11653
- class jn extends dn {
11653
+ class jn extends In {
11654
11654
  constructor(t) {
11655
11655
  super();
11656
11656
  S(this, "circumference");
@@ -11675,7 +11675,7 @@ class jn extends dn {
11675
11675
  "innerRadius",
11676
11676
  "outerRadius",
11677
11677
  "circumference"
11678
- ], o), u = (this.options.spacing + this.options.borderWidth) / 2, C = Q(I, g - l), A = $s(a, l, g) && l !== g, p = C >= ve || A, m = vn(r, c + u, d + u);
11678
+ ], o), u = (this.options.spacing + this.options.borderWidth) / 2, C = Q(I, g - l), A = $s(a, l, g) && l !== g, p = C >= ve || A, m = Gn(r, c + u, d + u);
11679
11679
  return p && m;
11680
11680
  }
11681
11681
  getCenterPoint(t) {
@@ -11786,7 +11786,7 @@ const TZ = typeof Path2D == "function";
11786
11786
  function JZ(n, e, t, i) {
11787
11787
  TZ && !e.options.segment ? MZ(n, e, t, i) : LZ(n, e, t, i);
11788
11788
  }
11789
- class En extends dn {
11789
+ class En extends In {
11790
11790
  constructor(e) {
11791
11791
  super(), this.animated = !0, this.options = void 0, this._chart = void 0, this._loop = void 0, this._fullLoop = void 0, this._path = void 0, this._points = void 0, this._segments = void 0, this._decimated = !1, this._pointsUpdated = !1, this._datasetIndex = void 0, e && Object.assign(this, e);
11792
11792
  }
@@ -11879,7 +11879,7 @@ function PI(n, e, t, i) {
11879
11879
  ], i);
11880
11880
  return Math.abs(e - s) < o.radius + o.hitRadius;
11881
11881
  }
11882
- class Ki extends dn {
11882
+ class Ki extends In {
11883
11883
  constructor(t) {
11884
11884
  super();
11885
11885
  S(this, "parsed");
@@ -11919,7 +11919,7 @@ class Ki extends dn {
11919
11919
  }
11920
11920
  draw(t, i) {
11921
11921
  const o = this.options;
11922
- this.skip || o.radius < 0.1 || !Bn(this, i, this.size(o) / 2) || (t.strokeStyle = o.borderColor, t.lineWidth = o.borderWidth, t.fillStyle = o.backgroundColor, yg(t, o, this.x, this.y));
11922
+ this.skip || o.radius < 0.1 || !Wn(this, i, this.size(o) / 2) || (t.strokeStyle = o.borderColor, t.lineWidth = o.borderWidth, t.fillStyle = o.backgroundColor, yg(t, o, this.x, this.y));
11923
11923
  }
11924
11924
  getRange() {
11925
11925
  const t = this.options || {};
@@ -12009,7 +12009,7 @@ function jZ(n) {
12009
12009
  }
12010
12010
  function Jl(n, e, t, i) {
12011
12011
  const o = e === null, s = t === null, r = n && !(o && s) && Jh(n, i);
12012
- return r && (o || vn(e, r.left, r.right)) && (s || vn(t, r.top, r.bottom));
12012
+ return r && (o || Gn(e, r.left, r.right)) && (s || Gn(t, r.top, r.bottom));
12013
12013
  }
12014
12014
  function EZ(n) {
12015
12015
  return n.topLeft || n.topRight || n.bottomLeft || n.bottomRight;
@@ -12027,7 +12027,7 @@ function Dl(n, e, t = {}) {
12027
12027
  radius: n.radius
12028
12028
  };
12029
12029
  }
12030
- class ei extends dn {
12030
+ class ei extends In {
12031
12031
  constructor(e) {
12032
12032
  super(), this.options = void 0, this.horizontal = void 0, this.base = void 0, this.width = void 0, this.height = void 0, this.inflateAmount = void 0, e && Object.assign(this, e);
12033
12033
  }
@@ -12106,7 +12106,7 @@ function ew(n) {
12106
12106
  let e = 0;
12107
12107
  return (t, i) => {
12108
12108
  const o = n.getDatasetMeta(i).controller;
12109
- o instanceof Hi ? e = $Z(t, e) : o instanceof en ? e = qZ(t, e) : o && (e = QZ(t, e));
12109
+ o instanceof Hi ? e = $Z(t, e) : o instanceof tn ? e = qZ(t, e) : o && (e = QZ(t, e));
12110
12110
  };
12111
12111
  }
12112
12112
  function QI(n) {
@@ -12204,7 +12204,7 @@ function aw(n, e) {
12204
12204
  const t = e.length;
12205
12205
  let i = 0, o;
12206
12206
  const { iScale: s } = n, { min: a, max: r, minDefined: l, maxDefined: g } = s.getUserBounds();
12207
- return l && (i = Je(Gn(e, s.axis, a).lo, 0, t - 1)), g ? o = Je(Gn(e, s.axis, r).hi + 1, i, t) - i : o = t - i, {
12207
+ return l && (i = Je(Bn(e, s.axis, a).lo, 0, t - 1)), g ? o = Je(Bn(e, s.axis, r).hi + 1, i, t) - i : o = t - i, {
12208
12208
  start: i,
12209
12209
  count: o
12210
12210
  };
@@ -12448,7 +12448,7 @@ function mw(n, e, t) {
12448
12448
  let r = !1, l = !1;
12449
12449
  for (let g = 0; g < s.length; g++) {
12450
12450
  const c = s[g], d = a[c.start][t], I = a[c.end][t];
12451
- if (vn(o, d, I)) {
12451
+ if (Gn(o, d, I)) {
12452
12452
  r = o === d, l = o === I;
12453
12453
  break;
12454
12454
  }
@@ -12639,7 +12639,7 @@ const ou = (n, e) => {
12639
12639
  itemHeight: Math.max(e, t)
12640
12640
  };
12641
12641
  }, Vw = (n, e) => n !== null && e !== null && n.datasetIndex === e.datasetIndex && n.index === e.index;
12642
- class su extends dn {
12642
+ class su extends In {
12643
12643
  constructor(e) {
12644
12644
  super(), this._added = !1, this.legendHitBoxes = [], this._hoveredItem = null, this.doughnutMode = !1, this.chart = e.chart, this.options = e.options, this.ctx = e.ctx, this.legendItems = void 0, this.columnSizes = void 0, this.lineWidths = void 0, this.maxHeight = void 0, this.maxWidth = void 0, this.top = void 0, this.bottom = void 0, this.left = void 0, this.right = void 0, this.height = void 0, this.width = void 0, this._margins = void 0, this.position = void 0, this.weight = void 0, this.fullSize = void 0;
12645
12645
  }
@@ -12807,9 +12807,9 @@ class su extends dn {
12807
12807
  }
12808
12808
  _getLegendItemAt(e, t) {
12809
12809
  let i, o, s;
12810
- if (vn(e, this.left, this.right) && vn(t, this.top, this.bottom)) {
12810
+ if (Gn(e, this.left, this.right) && Gn(t, this.top, this.bottom)) {
12811
12811
  for (s = this.legendHitBoxes, i = 0; i < s.length; ++i)
12812
- if (o = s[i], vn(e, o.left, o.left + o.width) && vn(t, o.top, o.top + o.height))
12812
+ if (o = s[i], Gn(e, o.left, o.left + o.width) && Gn(t, o.top, o.top + o.height))
12813
12813
  return this.legendItems[i];
12814
12814
  }
12815
12815
  return null;
@@ -12943,7 +12943,7 @@ var Hw = {
12943
12943
  }
12944
12944
  }
12945
12945
  };
12946
- class Rc extends dn {
12946
+ class Rc extends In {
12947
12947
  constructor(e) {
12948
12948
  super(), this.chart = e.chart, this.options = e.options, this.ctx = e.ctx, this._padding = void 0, this.top = void 0, this.bottom = void 0, this.left = void 0, this.right = void 0, this.width = void 0, this.height = void 0, this.position = void 0, this.weight = void 0, this.fullSize = void 0;
12949
12949
  }
@@ -13111,10 +13111,10 @@ const As = {
13111
13111
  };
13112
13112
  }
13113
13113
  };
13114
- function Et(n, e) {
13114
+ function Pt(n, e) {
13115
13115
  return e && (We(e) ? Array.prototype.push.apply(n, e) : n.push(e)), n;
13116
13116
  }
13117
- function bn(n) {
13117
+ function yn(n) {
13118
13118
  return (typeof n == "string" || n instanceof String) && n.indexOf(`
13119
13119
  `) > -1 ? n.split(`
13120
13120
  `) : n;
@@ -13195,7 +13195,7 @@ function za(n, e, t) {
13195
13195
  return e === "center" ? n.x + n.width / 2 : e === "right" ? n.x + n.width - i.right : n.x + i.left;
13196
13196
  }
13197
13197
  function gu(n) {
13198
- return Et([], bn(n));
13198
+ return Pt([], yn(n));
13199
13199
  }
13200
13200
  function Tw(n, e, t) {
13201
13201
  return di(n, {
@@ -13209,7 +13209,7 @@ function cu(n, e) {
13209
13209
  return t ? n.override(t) : n;
13210
13210
  }
13211
13211
  const Qh = {
13212
- beforeTitle: pn,
13212
+ beforeTitle: fn,
13213
13213
  title(n) {
13214
13214
  if (n.length > 0) {
13215
13215
  const e = n[0], t = e.chart.data.labels, i = t ? t.length : 0;
@@ -13222,9 +13222,9 @@ const Qh = {
13222
13222
  }
13223
13223
  return "";
13224
13224
  },
13225
- afterTitle: pn,
13226
- beforeBody: pn,
13227
- beforeLabel: pn,
13225
+ afterTitle: fn,
13226
+ beforeBody: fn,
13227
+ beforeLabel: fn,
13228
13228
  label(n) {
13229
13229
  if (this && this.options && this.options.mode === "dataset")
13230
13230
  return n.label + ": " + n.formattedValue || n.formattedValue;
@@ -13254,18 +13254,18 @@ const Qh = {
13254
13254
  rotation: t.rotation
13255
13255
  };
13256
13256
  },
13257
- afterLabel: pn,
13258
- afterBody: pn,
13259
- beforeFooter: pn,
13260
- footer: pn,
13261
- afterFooter: pn
13257
+ afterLabel: fn,
13258
+ afterBody: fn,
13259
+ beforeFooter: fn,
13260
+ footer: fn,
13261
+ afterFooter: fn
13262
13262
  };
13263
13263
  function at(n, e, t, i) {
13264
13264
  const o = n[e].call(t, i);
13265
13265
  return typeof o > "u" ? Qh[e].call(t, i) : o;
13266
13266
  }
13267
13267
  var og;
13268
- let du = (og = class extends dn {
13268
+ let du = (og = class extends In {
13269
13269
  constructor(e) {
13270
13270
  super(), this.opacity = 0, this._active = [], this._eventPosition = void 0, this._size = void 0, this._cachedAnimations = void 0, this._tooltipItems = [], this.$animations = void 0, this.$context = void 0, this.chart = e.chart, this.options = e.options, this.dataPoints = void 0, this.title = void 0, this.beforeBody = void 0, this.body = void 0, this.afterBody = void 0, this.footer = void 0, this.xAlign = void 0, this.yAlign = void 0, this.x = void 0, this.y = void 0, this.height = void 0, this.width = void 0, this.caretX = void 0, this.caretY = void 0, this.labelColors = void 0, this.labelPointStyles = void 0, this.labelTextColors = void 0;
13271
13271
  }
@@ -13285,7 +13285,7 @@ let du = (og = class extends dn {
13285
13285
  getTitle(e, t) {
13286
13286
  const { callbacks: i } = t, o = at(i, "beforeTitle", this, e), s = at(i, "title", this, e), a = at(i, "afterTitle", this, e);
13287
13287
  let r = [];
13288
- return r = Et(r, bn(o)), r = Et(r, bn(s)), r = Et(r, bn(a)), r;
13288
+ return r = Pt(r, yn(o)), r = Pt(r, yn(s)), r = Pt(r, yn(a)), r;
13289
13289
  }
13290
13290
  getBeforeBody(e, t) {
13291
13291
  return gu(at(t.callbacks, "beforeBody", this, e));
@@ -13298,7 +13298,7 @@ let du = (og = class extends dn {
13298
13298
  lines: [],
13299
13299
  after: []
13300
13300
  }, r = cu(i, s);
13301
- Et(a.before, bn(at(r, "beforeLabel", this, s))), Et(a.lines, at(r, "label", this, s)), Et(a.after, bn(at(r, "afterLabel", this, s))), o.push(a);
13301
+ Pt(a.before, yn(at(r, "beforeLabel", this, s))), Pt(a.lines, at(r, "label", this, s)), Pt(a.after, yn(at(r, "afterLabel", this, s))), o.push(a);
13302
13302
  }), o;
13303
13303
  }
13304
13304
  getAfterBody(e, t) {
@@ -13307,7 +13307,7 @@ let du = (og = class extends dn {
13307
13307
  getFooter(e, t) {
13308
13308
  const { callbacks: i } = t, o = at(i, "beforeFooter", this, e), s = at(i, "footer", this, e), a = at(i, "afterFooter", this, e);
13309
13309
  let r = [];
13310
- return r = Et(r, bn(o)), r = Et(r, bn(s)), r = Et(r, bn(a)), r;
13310
+ return r = Pt(r, yn(o)), r = Pt(r, yn(s)), r = Pt(r, yn(a)), r;
13311
13311
  }
13312
13312
  _createItems(e) {
13313
13313
  const t = this._active, i = this.chart.data, o = [], s = [], a = [];
@@ -13731,7 +13731,7 @@ function Ew(n, e) {
13731
13731
  }), t;
13732
13732
  }
13733
13733
  function uu(n, e, { horizontal: t, minRotation: i }) {
13734
- const o = Ft(i), s = (t ? Math.sin(o) : Math.cos(o)) || 1e-3, a = 0.75 * e * ("" + n).length;
13734
+ const o = Kt(i), s = (t ? Math.sin(o) : Math.cos(o)) || 1e-3, a = 0.75 * e * ("" + n).length;
13735
13735
  return Math.min(e / s, a);
13736
13736
  }
13737
13737
  class Wr extends Ii {
@@ -13746,7 +13746,7 @@ class Wr extends Ii {
13746
13746
  let { min: o, max: s } = this;
13747
13747
  const a = (l) => o = t ? o : l, r = (l) => s = i ? s : l;
13748
13748
  if (e) {
13749
- const l = qt(o), g = qt(s);
13749
+ const l = en(o), g = en(s);
13750
13750
  l < 0 && g < 0 ? r(0) : l > 0 && g > 0 && a(0);
13751
13751
  }
13752
13752
  if (o === s) {
@@ -13801,7 +13801,7 @@ class ji extends Wr {
13801
13801
  this.min = He(e) ? e : 0, this.max = He(t) ? t : 1, this.handleTickRangeOptions();
13802
13802
  }
13803
13803
  computeTickLimit() {
13804
- const e = this.isHorizontal(), t = e ? this.width : this.height, i = Ft(this.options.ticks.minRotation), o = (e ? Math.sin(i) : Math.cos(i)) || 1e-3, s = this._resolveTickFontOptions(0);
13804
+ const e = this.isHorizontal(), t = e ? this.width : this.height, i = Kt(this.options.ticks.minRotation), o = (e ? Math.sin(i) : Math.cos(i)) || 1e-3, s = this._resolveTickFontOptions(0);
13805
13805
  return Math.ceil(t / Math.min(40, s.lineHeight / o));
13806
13806
  }
13807
13807
  getPixelForValue(e) {
@@ -13974,16 +13974,16 @@ function tv(n, e) {
13974
13974
  if (!e)
13975
13975
  return !0;
13976
13976
  const { left: t, top: i, right: o, bottom: s } = n;
13977
- return !(Bn({
13977
+ return !(Wn({
13978
13978
  x: t,
13979
13979
  y: i
13980
- }, e) || Bn({
13980
+ }, e) || Wn({
13981
13981
  x: t,
13982
13982
  y: s
13983
- }, e) || Bn({
13983
+ }, e) || Wn({
13984
13984
  x: o,
13985
13985
  y: i
13986
- }, e) || Bn({
13986
+ }, e) || Wn({
13987
13987
  x: o,
13988
13988
  y: s
13989
13989
  }, e));
@@ -14096,7 +14096,7 @@ class fo extends Wr {
14096
14096
  }
14097
14097
  getIndexAngle(e) {
14098
14098
  const t = ve / (this._pointLabels.length || 1), i = this.options.startAngle || 0;
14099
- return ft(e * t + Ft(i));
14099
+ return ft(e * t + Kt(i));
14100
14100
  }
14101
14101
  getDistanceFromCenterForValue(e) {
14102
14102
  if (ce(e))
@@ -14441,7 +14441,7 @@ class ia extends Ii {
14441
14441
  return this.min + i * (this.max - this.min);
14442
14442
  }
14443
14443
  _getLabelSize(e) {
14444
- const t = this.options.ticks, i = this.ctx.measureText(e).width, o = Ft(this.isHorizontal() ? t.maxRotation : t.minRotation), s = Math.cos(o), a = Math.sin(o), r = this._resolveTickFontOptions(0).size;
14444
+ const t = this.options.ticks, i = this.ctx.measureText(e).width, o = Kt(this.isHorizontal() ? t.maxRotation : t.minRotation), s = Math.cos(o), a = Math.sin(o), r = this._resolveTickFontOptions(0).size;
14445
14445
  return {
14446
14446
  w: i * s + r * a,
14447
14447
  h: i * a + r * s
@@ -14499,7 +14499,7 @@ S(ia, "id", "time"), S(ia, "defaults", {
14499
14499
  });
14500
14500
  function Ma(n, e, t) {
14501
14501
  let i = 0, o = n.length - 1, s, a, r, l;
14502
- t ? (e >= n[i].pos && e <= n[o].pos && ({ lo: i, hi: o } = Gn(n, "pos", e)), { pos: s, time: r } = n[i], { pos: a, time: l } = n[o]) : (e >= n[i].time && e <= n[o].time && ({ lo: i, hi: o } = Gn(n, "time", e)), { time: s, pos: r } = n[i], { time: a, pos: l } = n[o]);
14502
+ t ? (e >= n[i].pos && e <= n[o].pos && ({ lo: i, hi: o } = Bn(n, "pos", e)), { pos: s, time: r } = n[i], { pos: a, time: l } = n[o]) : (e >= n[i].time && e <= n[o].time && ({ lo: i, hi: o } = Bn(n, "time", e)), { time: s, pos: r } = n[i], { time: a, pos: l } = n[o]);
14503
14503
  const g = a - s;
14504
14504
  return g ? r + (l - r) * (e - s) / g : r;
14505
14505
  }
@@ -14607,7 +14607,7 @@ function Hg(n, e, t) {
14607
14607
  for (var i = 0; i < e.length; ++i)
14608
14608
  n[i] = e[i] * t;
14609
14609
  }
14610
- function wn(n, e, t, i, o) {
14610
+ function vn(n, e, t, i, o) {
14611
14611
  for (var s = 0; s < n.length; ++s)
14612
14612
  n[s] = e * t[s] + i * o[s];
14613
14613
  }
@@ -14651,14 +14651,14 @@ function eA(n, e, t) {
14651
14651
  Z[A] /= u;
14652
14652
  }
14653
14653
  var R = C[u];
14654
- if (wn(w, 1 + l, Z, -l, R), w.fx = n(w), w.fx < C[0].fx)
14655
- wn(W, 1 + g, Z, -g, R), W.fx = n(W), W.fx < w.fx ? m(W) : m(w);
14654
+ if (vn(w, 1 + l, Z, -l, R), w.fx = n(w), w.fx < C[0].fx)
14655
+ vn(W, 1 + g, Z, -g, R), W.fx = n(W), W.fx < w.fx ? m(W) : m(w);
14656
14656
  else if (w.fx >= C[u - 1].fx) {
14657
14657
  var M = !1;
14658
- if (w.fx > R.fx ? (wn(v, 1 + c, Z, -c, R), v.fx = n(v), v.fx < R.fx ? m(v) : M = !0) : (wn(v, 1 - c * l, Z, c * l, R), v.fx = n(v), v.fx < w.fx ? m(v) : M = !0), M) {
14658
+ if (w.fx > R.fx ? (vn(v, 1 + c, Z, -c, R), v.fx = n(v), v.fx < R.fx ? m(v) : M = !0) : (vn(v, 1 - c * l, Z, c * l, R), v.fx = n(v), v.fx < w.fx ? m(v) : M = !0), M) {
14659
14659
  if (d >= 1) break;
14660
14660
  for (A = 1; A < C.length; ++A)
14661
- wn(C[A], 1 - d, C[0], d, C[A]), C[A].fx = n(C[A]);
14661
+ vn(C[A], 1 - d, C[0], d, C[A]), C[A].fx = n(C[A]);
14662
14662
  }
14663
14663
  } else
14664
14664
  m(w);
@@ -14673,7 +14673,7 @@ function hv(n, e, t, i, o, s, a) {
14673
14673
  o = o || 1, s = s || 1e-6, a = a || 0.1;
14674
14674
  function u(A, p, m) {
14675
14675
  for (var b = 0; b < 16; ++b)
14676
- if (o = (A + p) / 2, wn(i.x, 1, t.x, o, e), g = i.fx = n(i.x, i.fxprime), d = Wo(i.fxprime, e), g > r + s * o * l || g >= m)
14676
+ if (o = (A + p) / 2, vn(i.x, 1, t.x, o, e), g = i.fx = n(i.x, i.fxprime), d = Wo(i.fxprime, e), g > r + s * o * l || g >= m)
14677
14677
  p = o;
14678
14678
  else {
14679
14679
  if (Math.abs(d) <= -a * l)
@@ -14683,7 +14683,7 @@ function hv(n, e, t, i, o, s, a) {
14683
14683
  return 0;
14684
14684
  }
14685
14685
  for (var C = 0; C < 10; ++C) {
14686
- if (wn(i.x, 1, t.x, o, e), g = i.fx = n(i.x, i.fxprime), d = Wo(i.fxprime, e), g > r + s * o * l || C && g >= c)
14686
+ if (vn(i.x, 1, t.x, o, e), g = i.fx = n(i.x, i.fxprime), d = Wo(i.fxprime, e), g > r + s * o * l || C && g >= c)
14687
14687
  return u(I, o, c);
14688
14688
  if (Math.abs(d) <= -a * l)
14689
14689
  return o;
@@ -14705,9 +14705,9 @@ function Av(n, e, t) {
14705
14705
  }), !l)
14706
14706
  Hg(a, i.fxprime, -1);
14707
14707
  else {
14708
- wn(s, 1, o.fxprime, -1, i.fxprime);
14708
+ vn(s, 1, o.fxprime, -1, i.fxprime);
14709
14709
  var d = Wo(i.fxprime, i.fxprime), I = Math.max(0, Wo(s, o.fxprime) / d);
14710
- wn(a, I, a, -1, o.fxprime), r = i, i = o, o = r;
14710
+ vn(a, I, a, -1, o.fxprime), r = i, i = o, o = r;
14711
14711
  }
14712
14712
  if (kg(i.fxprime) <= 1e-5)
14713
14713
  break;
@@ -15345,7 +15345,7 @@ function zv(n, e, t, i) {
15345
15345
  y: e + Math.sin(i * Fg) * t
15346
15346
  };
15347
15347
  }
15348
- class no extends dn {
15348
+ class no extends In {
15349
15349
  inRange(e, t) {
15350
15350
  var i;
15351
15351
  const o = this.getProps(["arcs", "refs", "sets"]), s = new Set(o.sets);
@@ -18205,7 +18205,7 @@ function pG(n, e = {}) {
18205
18205
  ]
18206
18206
  };
18207
18207
  }
18208
- const Vr = Math.min, _i = Math.max, Xr = Math.round, La = Math.floor, tn = (n) => ({
18208
+ const Vr = Math.min, _i = Math.max, Xr = Math.round, La = Math.floor, nn = (n) => ({
18209
18209
  x: n,
18210
18210
  y: n
18211
18211
  }), fG = {
@@ -18525,7 +18525,7 @@ const WG = function(n) {
18525
18525
  Ae === "y";
18526
18526
  }
18527
18527
  return !0;
18528
- }).map((Xe) => [Xe.placement, Xe.overflows.filter((Ae) => Ae > 0).reduce((Ae, Ot) => Ae + Ot, 0)]).sort((Xe, Ae) => Xe[1] - Ae[1])[0]) == null ? void 0 : P[0];
18528
+ }).map((Xe) => [Xe.placement, Xe.overflows.filter((Ae) => Ae > 0).reduce((Ae, jt) => Ae + jt, 0)]).sort((Xe, Ae) => Xe[1] - Ae[1])[0]) == null ? void 0 : P[0];
18529
18529
  ue && (de = ue);
18530
18530
  break;
18531
18531
  }
@@ -18657,17 +18657,17 @@ function bt(n) {
18657
18657
  var e;
18658
18658
  return (n == null || (e = n.ownerDocument) == null ? void 0 : e.defaultView) || window;
18659
18659
  }
18660
- function In(n) {
18660
+ function un(n) {
18661
18661
  var e;
18662
18662
  return (e = (uA(n) ? n.ownerDocument : n.document) || window.document) == null ? void 0 : e.documentElement;
18663
18663
  }
18664
18664
  function uA(n) {
18665
18665
  return sl() ? n instanceof Node || n instanceof bt(n).Node : !1;
18666
18666
  }
18667
- function zt(n) {
18667
+ function Mt(n) {
18668
18668
  return sl() ? n instanceof Element || n instanceof bt(n).Element : !1;
18669
18669
  }
18670
- function sn(n) {
18670
+ function an(n) {
18671
18671
  return sl() ? n instanceof HTMLElement || n instanceof bt(n).HTMLElement : !1;
18672
18672
  }
18673
18673
  function Bu(n) {
@@ -18679,7 +18679,7 @@ function ha(n) {
18679
18679
  overflowX: t,
18680
18680
  overflowY: i,
18681
18681
  display: o
18682
- } = Mt(n);
18682
+ } = Lt(n);
18683
18683
  return /auto|scroll|overlay|hidden|clip/.test(e + i + t) && !["inline", "contents"].includes(o);
18684
18684
  }
18685
18685
  function xG(n) {
@@ -18695,12 +18695,12 @@ function al(n) {
18695
18695
  });
18696
18696
  }
18697
18697
  function kc(n) {
18698
- const e = Hc(), t = zt(n) ? Mt(n) : n;
18698
+ const e = Hc(), t = Mt(n) ? Lt(n) : n;
18699
18699
  return t.transform !== "none" || t.perspective !== "none" || (t.containerType ? t.containerType !== "normal" : !1) || !e && (t.backdropFilter ? t.backdropFilter !== "none" : !1) || !e && (t.filter ? t.filter !== "none" : !1) || ["transform", "perspective", "filter"].some((i) => (t.willChange || "").includes(i)) || ["paint", "layout", "strict", "content"].some((i) => (t.contain || "").includes(i));
18700
18700
  }
18701
18701
  function kG(n) {
18702
18702
  let e = li(n);
18703
- for (; sn(e) && !Mo(e); ) {
18703
+ for (; an(e) && !Mo(e); ) {
18704
18704
  if (kc(e))
18705
18705
  return e;
18706
18706
  if (al(e))
@@ -18715,11 +18715,11 @@ function Hc() {
18715
18715
  function Mo(n) {
18716
18716
  return ["html", "body", "#document"].includes(Eo(n));
18717
18717
  }
18718
- function Mt(n) {
18718
+ function Lt(n) {
18719
18719
  return bt(n).getComputedStyle(n);
18720
18720
  }
18721
18721
  function rl(n) {
18722
- return zt(n) ? {
18722
+ return Mt(n) ? {
18723
18723
  scrollLeft: n.scrollLeft,
18724
18724
  scrollTop: n.scrollTop
18725
18725
  } : {
@@ -18735,13 +18735,13 @@ function li(n) {
18735
18735
  n.assignedSlot || // DOM Element detected.
18736
18736
  n.parentNode || // ShadowRoot detected.
18737
18737
  Bu(n) && n.host || // Fallback.
18738
- In(n)
18738
+ un(n)
18739
18739
  );
18740
18740
  return Bu(e) ? e.host : e;
18741
18741
  }
18742
18742
  function CA(n) {
18743
18743
  const e = li(n);
18744
- return Mo(e) ? n.ownerDocument ? n.ownerDocument.body : n.body : sn(e) && ha(e) ? e : CA(e);
18744
+ return Mo(e) ? n.ownerDocument ? n.ownerDocument.body : n.body : an(e) && ha(e) ? e : CA(e);
18745
18745
  }
18746
18746
  function oa(n, e, t) {
18747
18747
  var i;
@@ -18757,9 +18757,9 @@ function _g(n) {
18757
18757
  return n.parent && Object.getPrototypeOf(n.parent) ? n.frameElement : null;
18758
18758
  }
18759
18759
  function hA(n) {
18760
- const e = Mt(n);
18760
+ const e = Lt(n);
18761
18761
  let t = parseFloat(e.width) || 0, i = parseFloat(e.height) || 0;
18762
- const o = sn(n), s = o ? n.offsetWidth : t, a = o ? n.offsetHeight : i, r = Xr(t) !== s || Xr(i) !== a;
18762
+ const o = an(n), s = o ? n.offsetWidth : t, a = o ? n.offsetHeight : i, r = Xr(t) !== s || Xr(i) !== a;
18763
18763
  return r && (t = s, i = a), {
18764
18764
  width: t,
18765
18765
  height: i,
@@ -18767,12 +18767,12 @@ function hA(n) {
18767
18767
  };
18768
18768
  }
18769
18769
  function Sc(n) {
18770
- return zt(n) ? n : n.contextElement;
18770
+ return Mt(n) ? n : n.contextElement;
18771
18771
  }
18772
18772
  function Vo(n) {
18773
18773
  const e = Sc(n);
18774
- if (!sn(e))
18775
- return tn(1);
18774
+ if (!an(e))
18775
+ return nn(1);
18776
18776
  const t = e.getBoundingClientRect(), {
18777
18777
  width: i,
18778
18778
  height: o,
@@ -18784,7 +18784,7 @@ function Vo(n) {
18784
18784
  y: r
18785
18785
  };
18786
18786
  }
18787
- const HG = /* @__PURE__ */ tn(0);
18787
+ const HG = /* @__PURE__ */ nn(0);
18788
18788
  function AA(n) {
18789
18789
  const e = bt(n);
18790
18790
  return !Hc() || !e.visualViewport ? HG : {
@@ -18798,15 +18798,15 @@ function SG(n, e, t) {
18798
18798
  function Pi(n, e, t, i) {
18799
18799
  e === void 0 && (e = !1), t === void 0 && (t = !1);
18800
18800
  const o = n.getBoundingClientRect(), s = Sc(n);
18801
- let a = tn(1);
18802
- e && (i ? zt(i) && (a = Vo(i)) : a = Vo(n));
18803
- const r = SG(s, t, i) ? AA(s) : tn(0);
18801
+ let a = nn(1);
18802
+ e && (i ? Mt(i) && (a = Vo(i)) : a = Vo(n));
18803
+ const r = SG(s, t, i) ? AA(s) : nn(0);
18804
18804
  let l = (o.left + r.x) / a.x, g = (o.top + r.y) / a.y, c = o.width / a.x, d = o.height / a.y;
18805
18805
  if (s) {
18806
- const I = bt(s), u = i && zt(i) ? bt(i) : i;
18806
+ const I = bt(s), u = i && Mt(i) ? bt(i) : i;
18807
18807
  let C = I, A = _g(C);
18808
18808
  for (; A && i && u !== C; ) {
18809
- const p = Vo(A), m = A.getBoundingClientRect(), b = Mt(A), Z = m.left + (A.clientLeft + parseFloat(b.paddingLeft)) * p.x, w = m.top + (A.clientTop + parseFloat(b.paddingTop)) * p.y;
18809
+ const p = Vo(A), m = A.getBoundingClientRect(), b = Lt(A), Z = m.left + (A.clientLeft + parseFloat(b.paddingLeft)) * p.x, w = m.top + (A.clientTop + parseFloat(b.paddingTop)) * p.y;
18810
18810
  l *= p.x, g *= p.y, c *= p.x, d *= p.y, l += Z, g += w, C = bt(A), A = _g(C);
18811
18811
  }
18812
18812
  }
@@ -18819,7 +18819,7 @@ function Pi(n, e, t, i) {
18819
18819
  }
18820
18820
  function Yc(n, e) {
18821
18821
  const t = rl(n).scrollLeft;
18822
- return e ? e.left + t : Pi(In(n)).left + t;
18822
+ return e ? e.left + t : Pi(un(n)).left + t;
18823
18823
  }
18824
18824
  function pA(n, e, t) {
18825
18825
  t === void 0 && (t = !1);
@@ -18839,19 +18839,19 @@ function YG(n) {
18839
18839
  offsetParent: i,
18840
18840
  strategy: o
18841
18841
  } = n;
18842
- const s = o === "fixed", a = In(i), r = e ? al(e.floating) : !1;
18842
+ const s = o === "fixed", a = un(i), r = e ? al(e.floating) : !1;
18843
18843
  if (i === a || r && s)
18844
18844
  return t;
18845
18845
  let l = {
18846
18846
  scrollLeft: 0,
18847
18847
  scrollTop: 0
18848
- }, g = tn(1);
18849
- const c = tn(0), d = sn(i);
18850
- if ((d || !d && !s) && ((Eo(i) !== "body" || ha(a)) && (l = rl(i)), sn(i))) {
18848
+ }, g = nn(1);
18849
+ const c = nn(0), d = an(i);
18850
+ if ((d || !d && !s) && ((Eo(i) !== "body" || ha(a)) && (l = rl(i)), an(i))) {
18851
18851
  const u = Pi(i);
18852
18852
  g = Vo(i), c.x = u.x + i.clientLeft, c.y = u.y + i.clientTop;
18853
18853
  }
18854
- const I = a && !d && !s ? pA(a, l, !0) : tn(0);
18854
+ const I = a && !d && !s ? pA(a, l, !0) : nn(0);
18855
18855
  return {
18856
18856
  width: t.width * g.x,
18857
18857
  height: t.height * g.y,
@@ -18863,10 +18863,10 @@ function NG(n) {
18863
18863
  return Array.from(n.getClientRects());
18864
18864
  }
18865
18865
  function FG(n) {
18866
- const e = In(n), t = rl(n), i = n.ownerDocument.body, o = _i(e.scrollWidth, e.clientWidth, i.scrollWidth, i.clientWidth), s = _i(e.scrollHeight, e.clientHeight, i.scrollHeight, i.clientHeight);
18866
+ const e = un(n), t = rl(n), i = n.ownerDocument.body, o = _i(e.scrollWidth, e.clientWidth, i.scrollWidth, i.clientWidth), s = _i(e.scrollHeight, e.clientHeight, i.scrollHeight, i.clientHeight);
18867
18867
  let a = -t.scrollLeft + Yc(n);
18868
18868
  const r = -t.scrollTop;
18869
- return Mt(i).direction === "rtl" && (a += _i(e.clientWidth, i.clientWidth) - o), {
18869
+ return Lt(i).direction === "rtl" && (a += _i(e.clientWidth, i.clientWidth) - o), {
18870
18870
  width: o,
18871
18871
  height: s,
18872
18872
  x: a,
@@ -18874,7 +18874,7 @@ function FG(n) {
18874
18874
  };
18875
18875
  }
18876
18876
  function KG(n, e) {
18877
- const t = bt(n), i = In(n), o = t.visualViewport;
18877
+ const t = bt(n), i = un(n), o = t.visualViewport;
18878
18878
  let s = i.clientWidth, a = i.clientHeight, r = 0, l = 0;
18879
18879
  if (o) {
18880
18880
  s = o.width, a = o.height;
@@ -18889,7 +18889,7 @@ function KG(n, e) {
18889
18889
  };
18890
18890
  }
18891
18891
  function _G(n, e) {
18892
- const t = Pi(n, !0, e === "fixed"), i = t.top + n.clientTop, o = t.left + n.clientLeft, s = sn(n) ? Vo(n) : tn(1), a = n.clientWidth * s.x, r = n.clientHeight * s.y, l = o * s.x, g = i * s.y;
18892
+ const t = Pi(n, !0, e === "fixed"), i = t.top + n.clientTop, o = t.left + n.clientLeft, s = an(n) ? Vo(n) : nn(1), a = n.clientWidth * s.x, r = n.clientHeight * s.y, l = o * s.x, g = i * s.y;
18893
18893
  return {
18894
18894
  width: a,
18895
18895
  height: r,
@@ -18902,8 +18902,8 @@ function Wu(n, e, t) {
18902
18902
  if (e === "viewport")
18903
18903
  i = KG(n, t);
18904
18904
  else if (e === "document")
18905
- i = FG(In(n));
18906
- else if (zt(e))
18905
+ i = FG(un(n));
18906
+ else if (Mt(e))
18907
18907
  i = _G(e, t);
18908
18908
  else {
18909
18909
  const o = AA(n);
@@ -18918,17 +18918,17 @@ function Wu(n, e, t) {
18918
18918
  }
18919
18919
  function fA(n, e) {
18920
18920
  const t = li(n);
18921
- return t === e || !zt(t) || Mo(t) ? !1 : Mt(t).position === "fixed" || fA(t, e);
18921
+ return t === e || !Mt(t) || Mo(t) ? !1 : Lt(t).position === "fixed" || fA(t, e);
18922
18922
  }
18923
18923
  function zG(n, e) {
18924
18924
  const t = e.get(n);
18925
18925
  if (t)
18926
18926
  return t;
18927
- let i = oa(n, [], !1).filter((r) => zt(r) && Eo(r) !== "body"), o = null;
18928
- const s = Mt(n).position === "fixed";
18927
+ let i = oa(n, [], !1).filter((r) => Mt(r) && Eo(r) !== "body"), o = null;
18928
+ const s = Lt(n).position === "fixed";
18929
18929
  let a = s ? li(n) : n;
18930
- for (; zt(a) && !Mo(a); ) {
18931
- const r = Mt(a), l = kc(a);
18930
+ for (; Mt(a) && !Mo(a); ) {
18931
+ const r = Lt(a), l = kc(a);
18932
18932
  !l && r.position === "fixed" && (o = null), (s ? !l && !o : !l && r.position === "static" && !!o && ["absolute", "fixed"].includes(o.position) || ha(a) && !l && fA(n, a)) ? i = i.filter((c) => c !== a) : o = r, a = li(a);
18933
18933
  }
18934
18934
  return e.set(n, i), i;
@@ -18962,18 +18962,18 @@ function LG(n) {
18962
18962
  };
18963
18963
  }
18964
18964
  function TG(n, e, t) {
18965
- const i = sn(e), o = In(e), s = t === "fixed", a = Pi(n, !0, s, e);
18965
+ const i = an(e), o = un(e), s = t === "fixed", a = Pi(n, !0, s, e);
18966
18966
  let r = {
18967
18967
  scrollLeft: 0,
18968
18968
  scrollTop: 0
18969
18969
  };
18970
- const l = tn(0);
18970
+ const l = nn(0);
18971
18971
  if (i || !i && !s)
18972
18972
  if ((Eo(e) !== "body" || ha(o)) && (r = rl(e)), i) {
18973
18973
  const I = Pi(e, !0, s, e);
18974
18974
  l.x = I.x + e.clientLeft, l.y = I.y + e.clientTop;
18975
18975
  } else o && (l.x = Yc(o));
18976
- const g = o && !i && !s ? pA(o, r) : tn(0), c = a.left + r.scrollLeft - l.x - g.x, d = a.top + r.scrollTop - l.y - g.y;
18976
+ const g = o && !i && !s ? pA(o, r) : nn(0), c = a.left + r.scrollLeft - l.x - g.x, d = a.top + r.scrollTop - l.y - g.y;
18977
18977
  return {
18978
18978
  x: c,
18979
18979
  y: d,
@@ -18982,24 +18982,24 @@ function TG(n, e, t) {
18982
18982
  };
18983
18983
  }
18984
18984
  function El(n) {
18985
- return Mt(n).position === "static";
18985
+ return Lt(n).position === "static";
18986
18986
  }
18987
18987
  function Vu(n, e) {
18988
- if (!sn(n) || Mt(n).position === "fixed")
18988
+ if (!an(n) || Lt(n).position === "fixed")
18989
18989
  return null;
18990
18990
  if (e)
18991
18991
  return e(n);
18992
18992
  let t = n.offsetParent;
18993
- return In(n) === t && (t = t.ownerDocument.body), t;
18993
+ return un(n) === t && (t = t.ownerDocument.body), t;
18994
18994
  }
18995
18995
  function mA(n, e) {
18996
18996
  const t = bt(n);
18997
18997
  if (al(n))
18998
18998
  return t;
18999
- if (!sn(n)) {
18999
+ if (!an(n)) {
19000
19000
  let o = li(n);
19001
19001
  for (; o && !Mo(o); ) {
19002
- if (zt(o) && !El(o))
19002
+ if (Mt(o) && !El(o))
19003
19003
  return o;
19004
19004
  o = li(o);
19005
19005
  }
@@ -19023,23 +19023,23 @@ const JG = async function(n) {
19023
19023
  };
19024
19024
  };
19025
19025
  function DG(n) {
19026
- return Mt(n).direction === "rtl";
19026
+ return Lt(n).direction === "rtl";
19027
19027
  }
19028
19028
  const OG = {
19029
19029
  convertOffsetParentRelativeRectToViewportRelativeRect: YG,
19030
- getDocumentElement: In,
19030
+ getDocumentElement: un,
19031
19031
  getClippingRect: MG,
19032
19032
  getOffsetParent: mA,
19033
19033
  getElementRects: JG,
19034
19034
  getClientRects: NG,
19035
19035
  getDimensions: LG,
19036
19036
  getScale: Vo,
19037
- isElement: zt,
19037
+ isElement: Mt,
19038
19038
  isRTL: DG
19039
19039
  };
19040
19040
  function jG(n, e) {
19041
19041
  let t = null, i;
19042
- const o = In(n);
19042
+ const o = un(n);
19043
19043
  function s() {
19044
19044
  var r;
19045
19045
  clearTimeout(i), (r = t) == null || r.disconnect(), t = null;
@@ -19264,7 +19264,7 @@ function s2(n) {
19264
19264
  return `(${t(n.label, !0)}, ${t(n.parsed.y, !1)})`;
19265
19265
  }
19266
19266
  function a2(n) {
19267
- const e = en.overrides.plugins.tooltip.callbacks.label.call(this, n), t = n.chart.data.datasets[n.datasetIndex].data[n.dataIndex], i = ["rMin", "rMax"];
19267
+ const e = tn.overrides.plugins.tooltip.callbacks.label.call(this, n), t = n.chart.data.datasets[n.datasetIndex].data[n.dataIndex], i = ["rMin", "rMax"];
19268
19268
  return t == null || i.every((o) => t[o] == null) ? e : `${e} [${_c(t[i[0]])} .. ${t[i[1]]}]`;
19269
19269
  }
19270
19270
  const wA = {
@@ -19386,7 +19386,7 @@ class g2 extends ke {
19386
19386
  }
19387
19387
  }
19388
19388
  g2.id = Ci.id;
19389
- class Uo extends Wn {
19389
+ class Uo extends Vn {
19390
19390
  getMinMax(e, t) {
19391
19391
  return cl(e, (i) => super.getMinMax(i, t));
19392
19392
  }
@@ -19422,14 +19422,14 @@ class Uo extends Wn {
19422
19422
  }
19423
19423
  Uo.id = "lineWithErrorBars";
19424
19424
  Uo.defaults = yt({}, [
19425
- Wn.defaults,
19425
+ Vn.defaults,
19426
19426
  gl,
19427
19427
  {
19428
19428
  dataElementType: Xt.id
19429
19429
  }
19430
19430
  ]);
19431
19431
  Uo.overrides = yt({}, [
19432
- Wn.overrides,
19432
+ Vn.overrides,
19433
19433
  {
19434
19434
  plugins: {
19435
19435
  tooltip: {
@@ -19440,7 +19440,7 @@ Uo.overrides = yt({}, [
19440
19440
  }
19441
19441
  }
19442
19442
  ]);
19443
- Uo.defaultRoutes = Wn.defaultRoutes;
19443
+ Uo.defaultRoutes = Vn.defaultRoutes;
19444
19444
  class c2 extends ke {
19445
19445
  constructor(e, t) {
19446
19446
  super(e, dl("lineWithErrorBars", t, Uo, Xt, [
@@ -19500,14 +19500,14 @@ Qo.overrides = yt({}, [
19500
19500
  }
19501
19501
  }
19502
19502
  ]);
19503
- Qo.defaultRoutes = Wn.defaultRoutes;
19503
+ Qo.defaultRoutes = Vn.defaultRoutes;
19504
19504
  class d2 extends ke {
19505
19505
  constructor(e, t) {
19506
19506
  super(e, dl("scatterWithErrorBars", t, Qo, Xt, [ji]));
19507
19507
  }
19508
19508
  }
19509
19509
  d2.id = Qo.id;
19510
- class $o extends en {
19510
+ class $o extends tn {
19511
19511
  getMinMaxImpl(e) {
19512
19512
  const t = this._cachedMeta, i = {
19513
19513
  min: Number.POSITIVE_INFINITY,
@@ -19555,14 +19555,14 @@ class $o extends en {
19555
19555
  }
19556
19556
  $o.id = "polarAreaWithErrorBars";
19557
19557
  $o.defaults = yt({}, [
19558
- en.defaults,
19558
+ tn.defaults,
19559
19559
  gl,
19560
19560
  {
19561
19561
  dataElementType: Po.id
19562
19562
  }
19563
19563
  ]);
19564
19564
  $o.overrides = yt({}, [
19565
- en.overrides,
19565
+ tn.overrides,
19566
19566
  {
19567
19567
  plugins: {
19568
19568
  tooltip: {
@@ -19573,7 +19573,7 @@ $o.overrides = yt({}, [
19573
19573
  }
19574
19574
  }
19575
19575
  ]);
19576
- $o.defaultRoutes = en.defaultRoutes;
19576
+ $o.defaultRoutes = tn.defaultRoutes;
19577
19577
  class I2 extends ke {
19578
19578
  constructor(e, t) {
19579
19579
  super(e, dl("polarAreaWithErrorBars", t, $o, Po, [
@@ -20054,7 +20054,7 @@ function f2(n, e) {
20054
20054
  config: Ee(Ee({}, Xo), Ye.defaultConfig),
20055
20055
  l10n: aa
20056
20056
  };
20057
- t.parseDate = Lg({ config: t.config, l10n: t.l10n }), t._handlers = [], t.pluginElements = [], t.loadedPlugins = [], t._bind = A, t._setHoursFromDate = I, t._positionCalendar = wa, t.changeMonth = _n, t.changeYear = ba, t.clear = zn, t.close = mi, t.onMouseOver = Za, t._createElement = Ie, t.createDay = W, t.destroy = hn, t.isEnabled = bi, t.jumpToDate = b, t.updateValue = An, t.open = vp, t.redraw = rd, t.set = Vp, t.setDate = Xp, t.toggle = Hp;
20057
+ t.parseDate = Lg({ config: t.config, l10n: t.l10n }), t._handlers = [], t.pluginElements = [], t.loadedPlugins = [], t._bind = A, t._setHoursFromDate = I, t._positionCalendar = wa, t.changeMonth = _n, t.changeYear = ba, t.clear = zn, t.close = mi, t.onMouseOver = Za, t._createElement = Ie, t.createDay = W, t.destroy = An, t.isEnabled = bi, t.jumpToDate = b, t.updateValue = pn, t.open = vp, t.redraw = rd, t.set = Vp, t.setDate = Xp, t.toggle = Hp;
20058
20058
  function i() {
20059
20059
  t.utils = {
20060
20060
  getDaysInMonth: function(f, y) {
@@ -20063,7 +20063,7 @@ function f2(n, e) {
20063
20063
  };
20064
20064
  }
20065
20065
  function o() {
20066
- t.element = t.input = n, t.isOpen = !1, Gp(), ad(), xp(), Rp(), i(), t.isMobile || v(), m(), (t.selectedDates.length || t.config.noCalendar) && (t.config.enableTime && I(t.config.noCalendar ? t.latestSelectedDateObj : void 0), An(!1)), r();
20066
+ t.element = t.input = n, t.isOpen = !1, Gp(), ad(), xp(), Rp(), i(), t.isMobile || v(), m(), (t.selectedDates.length || t.config.noCalendar) && (t.config.enableTime && I(t.config.noCalendar ? t.latestSelectedDateObj : void 0), pn(!1)), r();
20067
20067
  var f = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
20068
20068
  !t.isMobile && f && wa(), Re("onReady");
20069
20069
  }
@@ -20090,7 +20090,7 @@ function f2(n, e) {
20090
20090
  }
20091
20091
  f !== void 0 && f.type !== "blur" && Np(f);
20092
20092
  var X = t._input.value;
20093
- d(), An(), t._input.value !== X && t._debouncedChange();
20093
+ d(), pn(), t._input.value !== X && t._debouncedChange();
20094
20094
  }
20095
20095
  function g(f, y) {
20096
20096
  return f % 12 + 12 * Gt(y === t.l10n.amPM[1]);
@@ -20169,7 +20169,7 @@ function f2(n, e) {
20169
20169
  var f = xu(wp, 50);
20170
20170
  if (t._debouncedChange = xu(p, p2), t.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent) && A(t.daysContainer, "mouseover", function(G) {
20171
20171
  t.config.mode === "range" && Za(ht(G));
20172
- }), A(t._input, "keydown", id), t.calendarContainer !== void 0 && A(t.calendarContainer, "keydown", id), !t.config.inline && !t.config.static && A(window, "resize", f), window.ontouchstart !== void 0 ? A(window.document, "touchstart", Ht) : A(window.document, "mousedown", Ht), A(window.document, "focus", Ht, { capture: !0 }), t.config.clickOpens === !0 && (A(t._input, "focus", t.open), A(t._input, "click", t.open)), t.daysContainer !== void 0 && (A(t.monthNav, "click", Yp), A(t.monthNav, ["keyup", "increment"], C), A(t.daysContainer, "click", ld)), t.timeContainer !== void 0 && t.minuteElement !== void 0 && t.hourElement !== void 0) {
20172
+ }), A(t._input, "keydown", id), t.calendarContainer !== void 0 && A(t.calendarContainer, "keydown", id), !t.config.inline && !t.config.static && A(window, "resize", f), window.ontouchstart !== void 0 ? A(window.document, "touchstart", St) : A(window.document, "mousedown", St), A(window.document, "focus", St, { capture: !0 }), t.config.clickOpens === !0 && (A(t._input, "focus", t.open), A(t._input, "click", t.open)), t.daysContainer !== void 0 && (A(t.monthNav, "click", Yp), A(t.monthNav, ["keyup", "increment"], C), A(t.daysContainer, "click", ld)), t.timeContainer !== void 0 && t.minuteElement !== void 0 && t.hourElement !== void 0) {
20173
20173
  var y = function(G) {
20174
20174
  return ht(G).select();
20175
20175
  };
@@ -20202,7 +20202,7 @@ function f2(n, e) {
20202
20202
  var f = window.document.createDocumentFragment();
20203
20203
  if (t.calendarContainer = Ie("div", "flatpickr-calendar"), t.calendarContainer.tabIndex = -1, !t.config.noCalendar) {
20204
20204
  if (f.appendChild(de()), t.innerContainer = Ie("div", "flatpickr-innerContainer"), t.config.weekNumbers) {
20205
- var y = Ot(), G = y.weekWrapper, X = y.weekNumbers;
20205
+ var y = jt(), G = y.weekWrapper, X = y.weekNumbers;
20206
20206
  t.innerContainer.appendChild(G), t.weekNumbers = X, t.weekWrapper = G;
20207
20207
  }
20208
20208
  t.rContainer = Ie("div", "flatpickr-rContainer"), t.rContainer.appendChild(Xe()), t.daysContainer || (t.daysContainer = Ie("div", "flatpickr-days"), t.daysContainer.tabIndex = -1), N(), t.rContainer.appendChild(t.daysContainer), t.innerContainer.appendChild(t.rContainer), f.appendChild(t.innerContainer);
@@ -20250,8 +20250,8 @@ function f2(n, e) {
20250
20250
  K.appendChild(W("flatpickr-day", new Date(f, y, L), L, U));
20251
20251
  for (var fe = H + 1; fe <= 42 - G && (t.config.showMonths === 1 || U % 7 !== 0); fe++, U++)
20252
20252
  K.appendChild(W("flatpickr-day " + ie, new Date(f, y + 1, fe % H), fe, U));
20253
- var jt = Ie("div", "dayContainer");
20254
- return jt.appendChild(K), jt;
20253
+ var Et = Ie("div", "dayContainer");
20254
+ return Et.appendChild(K), Et;
20255
20255
  }
20256
20256
  function N() {
20257
20257
  if (t.daysContainer !== void 0) {
@@ -20354,7 +20354,7 @@ function f2(n, e) {
20354
20354
  `;
20355
20355
  }
20356
20356
  }
20357
- function Ot() {
20357
+ function jt() {
20358
20358
  t.calendarContainer.classList.add("hasWeeks");
20359
20359
  var f = Ie("div", "flatpickr-weekwrapper");
20360
20360
  f.appendChild(Ie("span", "flatpickr-weekday", t.l10n.weekAbbreviation));
@@ -20379,7 +20379,7 @@ function f2(n, e) {
20379
20379
  function mi() {
20380
20380
  t.isOpen = !1, t.isMobile || (t.calendarContainer !== void 0 && t.calendarContainer.classList.remove("open"), t._input !== void 0 && t._input.classList.remove("active")), Re("onClose");
20381
20381
  }
20382
- function hn() {
20382
+ function An() {
20383
20383
  t.config !== void 0 && Re("onDestroy");
20384
20384
  for (var f = t._handlers.length; f--; )
20385
20385
  t._handlers[f].remove();
@@ -20432,12 +20432,12 @@ function f2(n, e) {
20432
20432
  }
20433
20433
  });
20434
20434
  }
20435
- function kt(f) {
20435
+ function Ht(f) {
20436
20436
  return t.calendarContainer.contains(f);
20437
20437
  }
20438
- function Ht(f) {
20438
+ function St(f) {
20439
20439
  if (t.isOpen && !t.config.inline) {
20440
- var y = ht(f), G = kt(y), X = y === t.input || y === t.altInput || t.element.contains(y) || f.path && f.path.indexOf && (~f.path.indexOf(t.input) || ~f.path.indexOf(t.altInput)), H = !X && !G && !kt(f.relatedTarget), K = !t.config.ignoredFocusElements.some(function(q) {
20440
+ var y = ht(f), G = Ht(y), X = y === t.input || y === t.altInput || t.element.contains(y) || f.path && f.path.indexOf && (~f.path.indexOf(t.input) || ~f.path.indexOf(t.altInput)), H = !X && !G && !Ht(f.relatedTarget), K = !t.config.ignoredFocusElements.some(function(q) {
20441
20441
  return q.contains(y);
20442
20442
  });
20443
20443
  H && K && (t.config.allowInput && t.setDate(t._input.value, !1, t.config.altInput ? t.config.altFormat : t.config.dateFormat), t.timeContainer !== void 0 && t.minuteElement !== void 0 && t.hourElement !== void 0 && t.input.value !== "" && t.input.value !== void 0 && l(), t.close(), t.config && t.config.mode === "range" && t.selectedDates.length === 1 && t.clear(!1));
@@ -20477,7 +20477,7 @@ function f2(n, e) {
20477
20477
  }
20478
20478
  function Zp(f) {
20479
20479
  var y = f.target === t._input, G = t._input.value.trimEnd() !== wl();
20480
- y && G && !(f.relatedTarget && kt(f.relatedTarget)) && t.setDate(t._input.value, !0, f.target === t.altInput ? t.config.altFormat : t.config.dateFormat);
20480
+ y && G && !(f.relatedTarget && Ht(f.relatedTarget)) && t.setDate(t._input.value, !0, f.target === t.altInput ? t.config.altFormat : t.config.dateFormat);
20481
20481
  }
20482
20482
  function id(f) {
20483
20483
  var y = ht(f), G = t.config.wrap ? n.contains(y) : y === t._input, X = t.config.allowInput, H = t.isOpen && (!X || !G), K = t.config.inline && G && !X;
@@ -20485,7 +20485,7 @@ function f2(n, e) {
20485
20485
  if (X)
20486
20486
  return t.setDate(t._input.value, !0, y === t.altInput ? t.config.altFormat : t.config.dateFormat), t.close(), y.blur();
20487
20487
  t.open();
20488
- } else if (kt(y) || H || K) {
20488
+ } else if (Ht(y) || H || K) {
20489
20489
  var q = !!t.timeContainer && t.timeContainer.contains(y);
20490
20490
  switch (f.keyCode) {
20491
20491
  case 13:
@@ -20526,8 +20526,8 @@ function f2(n, e) {
20526
20526
  return Ct;
20527
20527
  }), fe = U.indexOf(y);
20528
20528
  if (fe !== -1) {
20529
- var jt = U[fe + (f.shiftKey ? -1 : 1)];
20530
- f.preventDefault(), (jt || t._input).focus();
20529
+ var Et = U[fe + (f.shiftKey ? -1 : 1)];
20530
+ f.preventDefault(), (Et || t._input).focus();
20531
20531
  }
20532
20532
  } else !t.config.noCalendar && t.daysContainer && t.daysContainer.contains(y) && f.shiftKey && (f.preventDefault(), t._input.focus());
20533
20533
  break;
@@ -20537,14 +20537,14 @@ function f2(n, e) {
20537
20537
  switch (f.key) {
20538
20538
  case t.l10n.amPM[0].charAt(0):
20539
20539
  case t.l10n.amPM[0].charAt(0).toLowerCase():
20540
- t.amPM.textContent = t.l10n.amPM[0], d(), An();
20540
+ t.amPM.textContent = t.l10n.amPM[0], d(), pn();
20541
20541
  break;
20542
20542
  case t.l10n.amPM[1].charAt(0):
20543
20543
  case t.l10n.amPM[1].charAt(0).toLowerCase():
20544
- t.amPM.textContent = t.l10n.amPM[1], d(), An();
20544
+ t.amPM.textContent = t.l10n.amPM[1], d(), pn();
20545
20545
  break;
20546
20546
  }
20547
- (G || kt(y)) && Re("onKeyDown", f);
20547
+ (G || Ht(y)) && Re("onKeyDown", f);
20548
20548
  }
20549
20549
  function Za(f, y) {
20550
20550
  if (y === void 0 && (y = "flatpickr-day"), !(t.selectedDates.length !== 1 || f && (!f.classList.contains(y) || f.classList.contains("flatpickr-disabled")))) {
@@ -20552,7 +20552,7 @@ function f2(n, e) {
20552
20552
  bi(new Date(L), !0) || (q = q || L > H && L < K, L < X && (!J || L > J) ? J = L : L > X && (!ie || L < ie) && (ie = L));
20553
20553
  var U = Array.from(t.rContainer.querySelectorAll("*:nth-child(-n+" + t.config.showMonths + ") > ." + y));
20554
20554
  U.forEach(function(fe) {
20555
- var jt = fe.dateObj, Ct = jt.getTime(), ns = J > 0 && Ct < J || ie > 0 && Ct > ie;
20555
+ var Et = fe.dateObj, Ct = Et.getTime(), ns = J > 0 && Ct < J || ie > 0 && Ct > ie;
20556
20556
  if (ns) {
20557
20557
  fe.classList.add("notAllowed"), ["inRange", "startRange", "endRange"].forEach(function(Io) {
20558
20558
  fe.classList.remove(Io);
@@ -20590,7 +20590,7 @@ function f2(n, e) {
20590
20590
  var G = t.config["_" + f + "Date"] = t.parseDate(y, t.config.dateFormat), X = t.config["_" + (f === "min" ? "max" : "min") + "Date"];
20591
20591
  G !== void 0 && (t[f === "min" ? "minDateHasTime" : "maxDateHasTime"] = G.getHours() > 0 || G.getMinutes() > 0 || G.getSeconds() > 0), t.selectedDates && (t.selectedDates = t.selectedDates.filter(function(H) {
20592
20592
  return bi(H);
20593
- }), !t.selectedDates.length && f === "min" && I(G), An()), t.daysContainer && (rd(), G !== void 0 ? t.currentYearElement[f] = G.getFullYear().toString() : t.currentYearElement.removeAttribute(f), t.currentYearElement.disabled = !!X && G !== void 0 && X.getFullYear() === G.getFullYear());
20593
+ }), !t.selectedDates.length && f === "min" && I(G), pn()), t.daysContainer && (rd(), G !== void 0 ? t.currentYearElement[f] = G.getFullYear().toString() : t.currentYearElement.removeAttribute(f), t.currentYearElement.disabled = !!X && G !== void 0 && X.getFullYear() === G.getFullYear());
20594
20594
  };
20595
20595
  }
20596
20596
  function Gp() {
@@ -20692,8 +20692,8 @@ function f2(n, e) {
20692
20692
  return Jp + Dp.offsetHeight;
20693
20693
  }, 0), X = t.calendarContainer.offsetWidth, H = t.config.position.split(" "), K = H[0], q = H.length > 1 ? H[1] : null, J = y.getBoundingClientRect(), ie = window.innerHeight - J.bottom, L = K === "above" || K !== "below" && ie < G && J.top > G, U = window.pageYOffset + J.top + (L ? -G - 2 : y.offsetHeight + 2);
20694
20694
  if (et(t.calendarContainer, "arrowTop", !L), et(t.calendarContainer, "arrowBottom", L), !t.config.inline) {
20695
- var fe = window.pageXOffset + J.left, jt = !1, Ct = !1;
20696
- q === "center" ? (fe -= (X - J.width) / 2, jt = !0) : q === "right" && (fe -= X - J.width, Ct = !0), et(t.calendarContainer, "arrowLeft", !jt && !Ct), et(t.calendarContainer, "arrowCenter", jt), et(t.calendarContainer, "arrowRight", Ct);
20695
+ var fe = window.pageXOffset + J.left, Et = !1, Ct = !1;
20696
+ q === "center" ? (fe -= (X - J.width) / 2, Et = !0) : q === "right" && (fe -= X - J.width, Ct = !0), et(t.calendarContainer, "arrowLeft", !Et && !Ct), et(t.calendarContainer, "arrowCenter", Et), et(t.calendarContainer, "arrowRight", Ct);
20697
20697
  var ns = window.document.body.offsetWidth - (window.pageXOffset + J.right), Io = fe + X > window.document.body.offsetWidth, Fp = ns + X > window.document.body.offsetWidth;
20698
20698
  if (et(t.calendarContainer, "rightMost", Io), !t.config.static)
20699
20699
  if (t.calendarContainer.style.top = U + "px", !Io)
@@ -20754,7 +20754,7 @@ function f2(n, e) {
20754
20754
  var J = t.currentYear !== H.getFullYear();
20755
20755
  t.currentYear = H.getFullYear(), t.currentMonth = H.getMonth(), J && (Re("onYearChange"), P()), Re("onMonthChange");
20756
20756
  }
20757
- if (Ga(), N(), An(), !K && t.config.mode !== "range" && t.config.showMonths === 1 ? V(X) : t.selectedDateElem !== void 0 && t.hourElement === void 0 && t.selectedDateElem && t.selectedDateElem.focus(), t.hourElement !== void 0 && t.hourElement !== void 0 && t.hourElement.focus(), t.config.closeOnSelect) {
20757
+ if (Ga(), N(), pn(), !K && t.config.mode !== "range" && t.config.showMonths === 1 ? V(X) : t.selectedDateElem !== void 0 && t.hourElement === void 0 && t.selectedDateElem && t.selectedDateElem.focus(), t.hourElement !== void 0 && t.hourElement !== void 0 && t.hourElement.focus(), t.config.closeOnSelect) {
20758
20758
  var ie = t.config.mode === "single" && !t.config.enableTime, L = t.config.mode === "range" && t.selectedDates.length === 2 && !t.config.enableTime;
20759
20759
  (ie || L) && bl();
20760
20760
  }
@@ -20784,7 +20784,7 @@ function f2(n, e) {
20784
20784
  t.config[f] = y, va[f] !== void 0 ? va[f].forEach(function(X) {
20785
20785
  return X();
20786
20786
  }) : Pl.indexOf(f) > -1 && (t.config[f] = Ul(y));
20787
- t.redraw(), An(!0);
20787
+ t.redraw(), pn(!0);
20788
20788
  }
20789
20789
  function gd(f, y) {
20790
20790
  var G = [];
@@ -20822,7 +20822,7 @@ function f2(n, e) {
20822
20822
  function Xp(f, y, G) {
20823
20823
  if (y === void 0 && (y = !1), G === void 0 && (G = t.config.dateFormat), f !== 0 && !f || f instanceof Array && f.length === 0)
20824
20824
  return t.clear(y);
20825
- gd(f, G), t.latestSelectedDateObj = t.selectedDates[t.selectedDates.length - 1], t.redraw(), b(void 0, y), I(), t.selectedDates.length === 0 && t.clear(!1), An(y), y && Re("onChange");
20825
+ gd(f, G), t.latestSelectedDateObj = t.selectedDates[t.selectedDates.length - 1], t.redraw(), b(void 0, y), I(), t.selectedDates.length === 0 && t.clear(!1), pn(y), y && Re("onChange");
20826
20826
  }
20827
20827
  function cd(f) {
20828
20828
  return f.slice().map(function(y) {
@@ -20903,7 +20903,7 @@ function f2(n, e) {
20903
20903
  return t.config.mode !== "range" || t.config.enableTime || H.indexOf(G) === X;
20904
20904
  }).join(t.config.mode !== "range" ? t.config.conjunction : t.l10n.rangeSeparator);
20905
20905
  }
20906
- function An(f) {
20906
+ function pn(f) {
20907
20907
  f === void 0 && (f = !0), t.mobileInput !== void 0 && t.mobileFormatStr && (t.mobileInput.value = t.latestSelectedDateObj !== void 0 ? t.formatDate(t.latestSelectedDateObj, t.mobileFormatStr) : ""), t.input.value = wl(t.config.dateFormat), t.altInput !== void 0 && (t.altInput.value = wl(t.config.altFormat)), f !== !1 && Re("onValueUpdate");
20908
20908
  }
20909
20909
  function Yp(f) {
@@ -21512,11 +21512,11 @@ function st(n, e) {
21512
21512
  !_e.__s && SA(t.__H, e) && (t.__ = n, t.i = e, Ze.__H.__h.push(t));
21513
21513
  }
21514
21514
  function Ke(n) {
21515
- return Yr = 5, an(function() {
21515
+ return Yr = 5, rn(function() {
21516
21516
  return { current: n };
21517
21517
  }, []);
21518
21518
  }
21519
- function an(n, e) {
21519
+ function rn(n, e) {
21520
21520
  var t = Aa(Qi++, 7);
21521
21521
  return SA(t.__H, e) && (t.__ = n(), t.__H = e, t.__h = n), t.__;
21522
21522
  }
@@ -21810,7 +21810,7 @@ const IB = ({
21810
21810
  data: n,
21811
21811
  proportionInterval: e
21812
21812
  }) => {
21813
- const t = Ke(null), i = "You have no elements selected. Click in the venn diagram to select.", [o, s] = oe(null), a = an(
21813
+ const t = Ke(null), i = "You have no elements selected. Click in the venn diagram to select.", [o, s] = oe(null), a = rn(
21814
21814
  () => pG(
21815
21815
  n.content.map((l) => ({
21816
21816
  displayName: l.displayName,
@@ -21834,7 +21834,7 @@ const IB = ({
21834
21834
  const l = a.datasets[0].data[o].values, g = a.datasets[0].data[o].label;
21835
21835
  t.current.innerText = `${g}: ${l.join(", ")}` || "";
21836
21836
  }, [t, o, a]);
21837
- const r = an(
21837
+ const r = rn(
21838
21838
  () => ({
21839
21839
  type: "venn",
21840
21840
  data: a,
@@ -21979,7 +21979,7 @@ class rr extends Error {
21979
21979
  super(t), this.headline = e, this.name = "UserFacingError";
21980
21980
  }
21981
21981
  }
21982
- const Tt = ({ error: n }) => {
21982
+ const Jt = ({ error: n }) => {
21983
21983
  console.error(n);
21984
21984
  const e = Ke(null), t = Ke(null);
21985
21985
  st(() => {
@@ -22037,9 +22037,9 @@ function mB(n) {
22037
22037
  }
22038
22038
  } : { headline: "Error", details: void 0 };
22039
22039
  }
22040
- const Jt = ({ children: n, size: e }) => /* @__PURE__ */ h("div", { style: e, className: "bg-white", children: n }), xt = ({ size: n, children: e }) => {
22040
+ const Dt = ({ children: n, size: e }) => /* @__PURE__ */ h("div", { style: e, className: "bg-white", children: n }), xt = ({ size: n, children: e }) => {
22041
22041
  const [t] = tB();
22042
- return t ? /* @__PURE__ */ h(Jt, { size: n, children: /* @__PURE__ */ h(Tt, { error: t }) }) : /* @__PURE__ */ h(Be, { children: e });
22042
+ return t ? /* @__PURE__ */ h(Dt, { size: n, children: /* @__PURE__ */ h(Jt, { error: t }) }) : /* @__PURE__ */ h(Be, { children: e });
22043
22043
  }, ao = () => {
22044
22044
  const n = Ke(null), e = ZB();
22045
22045
  return /* @__PURE__ */ h(
@@ -22102,7 +22102,7 @@ const hi = ({ children: n }) => {
22102
22102
  /* @__PURE__ */ h("form", { method: "dialog", className: "modal-backdrop", children: /* @__PURE__ */ h("button", { children: "Helper to close when clicked outside" }) })
22103
22103
  ] })
22104
22104
  ] });
22105
- }, Ai = ({ children: n }) => /* @__PURE__ */ h("h1", { className: "text-lg font-bold", children: n }), Pt = ({ children: n }) => /* @__PURE__ */ h("h2", { className: "text-base font-bold mt-4", children: n }), Ce = ({ children: n }) => /* @__PURE__ */ h("p", { className: "text-justify my-1", children: n }), Vs = ({ children: n, href: e }) => /* @__PURE__ */ h("a", { className: "text-blue-600 hover:text-blue-800", href: e, target: "_blank", rel: "noopener noreferrer", children: n }), ro = ({ componentName: n, params: e, lapisUrl: t }) => {
22105
+ }, Ai = ({ children: n }) => /* @__PURE__ */ h("h1", { className: "text-lg font-bold", children: n }), Ut = ({ children: n }) => /* @__PURE__ */ h("h2", { className: "text-base font-bold mt-4", children: n }), Ce = ({ children: n }) => /* @__PURE__ */ h("p", { className: "text-justify my-1", children: n }), Vs = ({ children: n, href: e }) => /* @__PURE__ */ h("a", { className: "text-blue-600 hover:text-blue-800", href: e, target: "_blank", rel: "noopener noreferrer", children: n }), ro = ({ componentName: n, params: e, lapisUrl: t }) => {
22106
22106
  const i = wB(n, e, t), o = {
22107
22107
  title: "GenSpectrum dashboard component",
22108
22108
  html: vB(i, n),
@@ -22110,7 +22110,7 @@ const hi = ({ children: n }) => {
22110
22110
  editors: "100"
22111
22111
  };
22112
22112
  return /* @__PURE__ */ h(Be, { children: [
22113
- /* @__PURE__ */ h(Pt, { children: "Use this component yourself" }),
22113
+ /* @__PURE__ */ h(Ut, { children: "Use this component yourself" }),
22114
22114
  /* @__PURE__ */ h(Ce, { children: [
22115
22115
  "This component was created using the following parameters:",
22116
22116
  /* @__PURE__ */ h("div", { className: "p-4 border border-gray-200 rounded-lg overflow-x-auto", children: /* @__PURE__ */ h("pre", { children: /* @__PURE__ */ h("code", { children: i }) }) })
@@ -22167,7 +22167,7 @@ function LA(n, e) {
22167
22167
  `).map((i) => t + i).join(`
22168
22168
  `);
22169
22169
  }
22170
- const Dt = () => /* @__PURE__ */ h(
22170
+ const Ot = () => /* @__PURE__ */ h(
22171
22171
  "div",
22172
22172
  {
22173
22173
  "aria-label": "Loading",
@@ -22288,7 +22288,7 @@ const VB = "z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200
22288
22288
  return "Del.";
22289
22289
  }
22290
22290
  }).join(", ") : e.map((t) => t.label).join(", ");
22291
- }, Sn = () => /* @__PURE__ */ h("div", { className: "h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center", children: /* @__PURE__ */ h("div", { children: "No data available." }) }), JA = ({
22291
+ }, kt = () => /* @__PURE__ */ h("div", { className: "h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center", children: /* @__PURE__ */ h("div", { children: "No data available." }) }), JA = ({
22292
22292
  min: n,
22293
22293
  max: e,
22294
22294
  setMin: t,
@@ -22527,15 +22527,15 @@ function Yn(n, e) {
22527
22527
  }
22528
22528
  const kB = (n) => {
22529
22529
  const { width: e, height: t } = n, i = { height: t, width: e };
22530
- return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Jt, { size: i, children: /* @__PURE__ */ h(HB, { ...n }) }) });
22530
+ return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(HB, { ...n }) }) });
22531
22531
  }, HB = (n) => {
22532
22532
  const { lapisFilters: e, sequenceType: t } = n, i = Se(De), { data: o, error: s, isLoading: a } = Yn(async () => CB(e, t, i), [e, t, i]);
22533
- return a ? /* @__PURE__ */ h(Dt, {}) : s !== null ? /* @__PURE__ */ h(Tt, { error: s }) : o === null ? /* @__PURE__ */ h(Sn, {}) : /* @__PURE__ */ h(SB, { data: o.mutationData, originalComponentProps: n });
22533
+ return a ? /* @__PURE__ */ h(Ot, {}) : s !== null ? /* @__PURE__ */ h(Jt, { error: s }) : o === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(SB, { data: o.mutationData, originalComponentProps: n });
22534
22534
  }, SB = ({ data: n, originalComponentProps: e }) => {
22535
22535
  const [t, i] = oe({ min: 0.5, max: 1 }), [o, s] = oe([
22536
22536
  { label: "Substitutions", checked: !0, type: "substitution" },
22537
22537
  { label: "Deletions", checked: !0, type: "deletion" }
22538
- ]), [a, r] = Ec(e.sequenceType), l = an(
22538
+ ]), [a, r] = Ec(e.sequenceType), l = rn(
22539
22539
  () => hB(n, a, o),
22540
22540
  [n, a, o]
22541
22541
  ), g = (d) => {
@@ -26041,16 +26041,16 @@ const MB = _r(_B), LB = _r(KB), OA = class extends Vi {
26041
26041
  }
26042
26042
  };
26043
26043
  OA.styles = [MB, LB];
26044
- let un = OA;
26044
+ let Cn = OA;
26045
26045
  DA([
26046
26046
  sC({ context: XA })
26047
- ], un.prototype, "lapis");
26047
+ ], Cn.prototype, "lapis");
26048
26048
  DA([
26049
26049
  sC({ context: RA, subscribe: !0 })
26050
- ], un.prototype, "referenceGenome");
26051
- const TB = _r(FB), jA = class extends un {
26050
+ ], Cn.prototype, "referenceGenome");
26051
+ const TB = _r(FB), jA = class extends Cn {
26052
26052
  };
26053
- jA.styles = [...un.styles, TB];
26053
+ jA.styles = [...Cn.styles, TB];
26054
26054
  let es = jA;
26055
26055
  var JB = Object.defineProperty, DB = Object.getOwnPropertyDescriptor, go = (n, e, t, i) => {
26056
26056
  for (var o = i > 1 ? void 0 : i ? DB(e, t) : e, s = n.length - 1, a; s >= 0; s--)
@@ -26178,7 +26178,7 @@ const Pu = /(?:([A-Za-z0-9]+):)?(\d+)$/, UA = (n, e) => {
26178
26178
  ...FA.td,
26179
26179
  color: "gray"
26180
26180
  }
26181
- } : {}, r = an(
26181
+ } : {}, r = rn(
26182
26182
  () => OB(n, e, t).map((l) => Object.values(l)),
26183
26183
  [n, t, e]
26184
26184
  );
@@ -26263,10 +26263,10 @@ function nW(n, e, t) {
26263
26263
  }
26264
26264
  const iW = (n) => {
26265
26265
  const { width: e, height: t } = n, i = { height: t, width: e };
26266
- return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Jt, { size: i, children: /* @__PURE__ */ h(oW, { ...n }) }) });
26266
+ return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(oW, { ...n }) }) });
26267
26267
  }, oW = (n) => {
26268
26268
  const e = Se(De), { lapisFilter: t, sequenceType: i } = n, { data: o, error: s, isLoading: a } = Yn(async () => tW(t, i, e), [t, i, e]);
26269
- return a ? /* @__PURE__ */ h(Dt, {}) : s !== null ? /* @__PURE__ */ h(Tt, { error: s }) : o === null ? /* @__PURE__ */ h(Sn, {}) : /* @__PURE__ */ h(sW, { mutationsData: o, originalComponentProps: n });
26269
+ return a ? /* @__PURE__ */ h(Ot, {}) : s !== null ? /* @__PURE__ */ h(Jt, { error: s }) : o === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(sW, { mutationsData: o, originalComponentProps: n });
26270
26270
  }, sW = ({ mutationsData: n, originalComponentProps: e }) => {
26271
26271
  const [t, i] = oe({ min: 0.05, max: 1 }), [o, s] = Ec(e.sequenceType), [a, r] = oe([
26272
26272
  { label: "Substitutions", checked: !0, type: "substitution" },
@@ -26385,7 +26385,7 @@ const iW = (n) => {
26385
26385
  /* @__PURE__ */ h(Vs, { href: "https://www.genome.gov/genetics-glossary/Insertion", children: "insertions" }),
26386
26386
  "."
26387
26387
  ] }),
26388
- /* @__PURE__ */ h(Pt, { children: "Proportion calculation" }),
26388
+ /* @__PURE__ */ h(Ut, { children: "Proportion calculation" }),
26389
26389
  /* @__PURE__ */ h(Ce, { children: "The proportion of a mutation is calculated by dividing the number of sequences with the mutation by the total number of sequences with a non-ambiguous symbol at the position." }),
26390
26390
  /* @__PURE__ */ h(Ce, { children: [
26391
26391
  /* @__PURE__ */ h("b", { children: "Example:" }),
@@ -26530,10 +26530,13 @@ const cW = ({
26530
26530
  confidenceIntervalMethod: t,
26531
26531
  yAxisMaxConfig: i
26532
26532
  }) => {
26533
- const o = n.map((l) => ({
26533
+ const o = n.filter((l) => l.content.length > 0).map((l) => ({
26534
26534
  content: l.content.sort($A),
26535
26535
  displayName: l.displayName
26536
- })), s = o.map((l, g) => dW(l, g, t)), a = e !== "logit" ? Al(ed(o), i == null ? void 0 : i[e]) : void 0, r = {
26536
+ }));
26537
+ if (o.length === 0)
26538
+ return /* @__PURE__ */ h(kt, {});
26539
+ const s = o.map((l, g) => dW(l, g, t)), a = e !== "logit" ? Al(ed(o), i == null ? void 0 : i[e]) : void 0, r = {
26537
26540
  type: Ci.id,
26538
26541
  data: {
26539
26542
  datasets: s
@@ -26595,7 +26598,7 @@ const cW = ({
26595
26598
  return e;
26596
26599
  }
26597
26600
  };
26598
- var tp = 60, np = tp * 60, ip = np * 24, hW = ip * 7, To = 1e3, tg = tp * To, Uu = np * To, AW = ip * To, pW = hW * To, Pc = "millisecond", mo = "second", bo = "minute", yo = "hour", Yt = "day", Xs = "week", St = "month", op = "quarter", Zn = "year", Zo = "date", sp = "YYYY-MM-DDTHH:mm:ssZ", Qu = "Invalid Date", fW = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, mW = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
26601
+ var tp = 60, np = tp * 60, ip = np * 24, hW = ip * 7, To = 1e3, tg = tp * To, Uu = np * To, AW = ip * To, pW = hW * To, Pc = "millisecond", mo = "second", bo = "minute", yo = "hour", Nt = "day", Xs = "week", Yt = "month", op = "quarter", wn = "year", Zo = "date", sp = "YYYY-MM-DDTHH:mm:ssZ", Qu = "Invalid Date", fW = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, mW = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;
26599
26602
  const bW = {
26600
26603
  name: "en",
26601
26604
  weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
@@ -26613,16 +26616,16 @@ var Eg = function(e, t, i) {
26613
26616
  return (t <= 0 ? "+" : "-") + Eg(o, 2, "0") + ":" + Eg(s, 2, "0");
26614
26617
  }, ZW = function n(e, t) {
26615
26618
  if (e.date() < t.date()) return -n(t, e);
26616
- var i = (t.year() - e.year()) * 12 + (t.month() - e.month()), o = e.clone().add(i, St), s = t - o < 0, a = e.clone().add(i + (s ? -1 : 1), St);
26619
+ var i = (t.year() - e.year()) * 12 + (t.month() - e.month()), o = e.clone().add(i, Yt), s = t - o < 0, a = e.clone().add(i + (s ? -1 : 1), Yt);
26617
26620
  return +(-(i + (t - o) / (s ? o - a : a - o)) || 0);
26618
26621
  }, wW = function(e) {
26619
26622
  return e < 0 ? Math.ceil(e) || 0 : Math.floor(e);
26620
26623
  }, vW = function(e) {
26621
26624
  var t = {
26622
- M: St,
26623
- y: Zn,
26625
+ M: Yt,
26626
+ y: wn,
26624
26627
  w: Xs,
26625
- d: Yt,
26628
+ d: Nt,
26626
26629
  D: Zo,
26627
26630
  h: yo,
26628
26631
  m: bo,
@@ -26720,7 +26723,7 @@ var VW = function(e) {
26720
26723
  }, e.startOf = function(i, o) {
26721
26724
  var s = this, a = pe.u(o) ? !0 : o, r = pe.p(i), l = function(m, b) {
26722
26725
  var Z = pe.w(s.$u ? Date.UTC(s.$y, b, m) : new Date(s.$y, b, m), s);
26723
- return a ? Z : Z.endOf(Yt);
26726
+ return a ? Z : Z.endOf(Nt);
26724
26727
  }, g = function(m, b) {
26725
26728
  var Z = [0, 0, 0, 0], w = [23, 59, 59, 999];
26726
26729
  return pe.w(s.toDate()[m].apply(
@@ -26730,15 +26733,15 @@ var VW = function(e) {
26730
26733
  ), s);
26731
26734
  }, c = this.$W, d = this.$M, I = this.$D, u = "set" + (this.$u ? "UTC" : "");
26732
26735
  switch (r) {
26733
- case Zn:
26736
+ case wn:
26734
26737
  return a ? l(1, 0) : l(31, 11);
26735
- case St:
26738
+ case Yt:
26736
26739
  return a ? l(1, d) : l(0, d + 1);
26737
26740
  case Xs: {
26738
26741
  var C = this.$locale().weekStart || 0, A = (c < C ? c + 7 : c) - C;
26739
26742
  return l(a ? I - A : I + (6 - A), d);
26740
26743
  }
26741
- case Yt:
26744
+ case Nt:
26742
26745
  case Zo:
26743
26746
  return g(u + "Hours", 0);
26744
26747
  case yo:
@@ -26753,8 +26756,8 @@ var VW = function(e) {
26753
26756
  }, e.endOf = function(i) {
26754
26757
  return this.startOf(i, !1);
26755
26758
  }, e.$set = function(i, o) {
26756
- var s, a = pe.p(i), r = "set" + (this.$u ? "UTC" : ""), l = (s = {}, s[Yt] = r + "Date", s[Zo] = r + "Date", s[St] = r + "Month", s[Zn] = r + "FullYear", s[yo] = r + "Hours", s[bo] = r + "Minutes", s[mo] = r + "Seconds", s[Pc] = r + "Milliseconds", s)[a], g = a === Yt ? this.$D + (o - this.$W) : o;
26757
- if (a === St || a === Zn) {
26759
+ var s, a = pe.p(i), r = "set" + (this.$u ? "UTC" : ""), l = (s = {}, s[Nt] = r + "Date", s[Zo] = r + "Date", s[Yt] = r + "Month", s[wn] = r + "FullYear", s[yo] = r + "Hours", s[bo] = r + "Minutes", s[mo] = r + "Seconds", s[Pc] = r + "Milliseconds", s)[a], g = a === Nt ? this.$D + (o - this.$W) : o;
26760
+ if (a === Yt || a === wn) {
26758
26761
  var c = this.clone().set(Zo, 1);
26759
26762
  c.$d[l](g), c.init(), this.$d = c.set(Zo, Math.min(this.$D, c.daysInMonth())).$d;
26760
26763
  } else l && this.$d[l](g);
@@ -26770,11 +26773,11 @@ var VW = function(e) {
26770
26773
  var u = we(s);
26771
26774
  return pe.w(u.date(u.date() + Math.round(I * i)), s);
26772
26775
  };
26773
- if (r === St)
26774
- return this.set(St, this.$M + i);
26775
- if (r === Zn)
26776
- return this.set(Zn, this.$y + i);
26777
26776
  if (r === Yt)
26777
+ return this.set(Yt, this.$M + i);
26778
+ if (r === wn)
26779
+ return this.set(wn, this.$y + i);
26780
+ if (r === Nt)
26778
26781
  return l(1);
26779
26782
  if (r === Xs)
26780
26783
  return l(7);
@@ -26855,10 +26858,10 @@ var VW = function(e) {
26855
26858
  return pe.m(a, l);
26856
26859
  }, I;
26857
26860
  switch (r) {
26858
- case Zn:
26861
+ case wn:
26859
26862
  I = d() / 12;
26860
26863
  break;
26861
- case St:
26864
+ case Yt:
26862
26865
  I = d();
26863
26866
  break;
26864
26867
  case op:
@@ -26867,7 +26870,7 @@ var VW = function(e) {
26867
26870
  case Xs:
26868
26871
  I = (c - g) / pW;
26869
26872
  break;
26870
- case Yt:
26873
+ case Nt:
26871
26874
  I = (c - g) / AW;
26872
26875
  break;
26873
26876
  case yo:
@@ -26885,7 +26888,7 @@ var VW = function(e) {
26885
26888
  }
26886
26889
  return s ? I : pe.a(I);
26887
26890
  }, e.daysInMonth = function() {
26888
- return this.endOf(St).$D;
26891
+ return this.endOf(Yt).$D;
26889
26892
  }, e.$locale = function() {
26890
26893
  return zi[this.$L];
26891
26894
  }, e.locale = function(i, o) {
@@ -26905,7 +26908,7 @@ var VW = function(e) {
26905
26908
  }, n;
26906
26909
  }(), rp = pl.prototype;
26907
26910
  we.prototype = rp;
26908
- [["$ms", Pc], ["$s", mo], ["$m", bo], ["$H", yo], ["$W", Yt], ["$M", St], ["$y", Zn], ["$D", Zo]].forEach(function(n) {
26911
+ [["$ms", Pc], ["$s", mo], ["$m", bo], ["$H", yo], ["$W", Nt], ["$M", Yt], ["$y", wn], ["$D", Zo]].forEach(function(n) {
26909
26912
  rp[n[1]] = function(e) {
26910
26913
  return this.$g(e, n[0], n[1]);
26911
26914
  };
@@ -26966,17 +26969,17 @@ const XW = function(n, e) {
26966
26969
  var RW = "isoweek";
26967
26970
  const xW = function(n, e, t) {
26968
26971
  var i = function(l, g) {
26969
- var c = (g ? t.utc : t)().year(l).startOf(Zn), d = 4 - c.isoWeekday();
26970
- return c.isoWeekday() > 4 && (d += 7), c.add(d, Yt);
26972
+ var c = (g ? t.utc : t)().year(l).startOf(wn), d = 4 - c.isoWeekday();
26973
+ return c.isoWeekday() > 4 && (d += 7), c.add(d, Nt);
26971
26974
  }, o = function(l) {
26972
- return l.add(4 - l.isoWeekday(), Yt);
26975
+ return l.add(4 - l.isoWeekday(), Nt);
26973
26976
  }, s = e.prototype;
26974
26977
  s.isoWeekYear = function() {
26975
26978
  var r = o(this);
26976
26979
  return r.year();
26977
26980
  }, s.isoWeek = function(r) {
26978
26981
  if (!this.$utils().u(r))
26979
- return this.add((r - this.isoWeek()) * 7, Yt);
26982
+ return this.add((r - this.isoWeek()) * 7, Nt);
26980
26983
  var l = o(this), g = i(this.isoWeekYear(), this.$u);
26981
26984
  return l.diff(g, Xs) + 1;
26982
26985
  }, s.isoWeekday = function(r) {
@@ -26995,16 +26998,16 @@ const Pg = "GGGG-[W]WW", Ug = class {
26995
26998
  this.yearMonthDayCache = /* @__PURE__ */ new Map(), this.yearWeekCache = /* @__PURE__ */ new Map(), this.yearMonthCache = /* @__PURE__ */ new Map(), this.yearCache = /* @__PURE__ */ new Map();
26996
26999
  }
26997
27000
  getYearMonthDay(e) {
26998
- return this.yearMonthDayCache.has(e) || this.yearMonthDayCache.set(e, rn.parse(e, this)), this.yearMonthDayCache.get(e);
27001
+ return this.yearMonthDayCache.has(e) || this.yearMonthDayCache.set(e, ln.parse(e, this)), this.yearMonthDayCache.get(e);
26999
27002
  }
27000
27003
  getYearMonth(e) {
27001
- return this.yearMonthCache.has(e) || this.yearMonthCache.set(e, Rn.parse(e, this)), this.yearMonthCache.get(e);
27004
+ return this.yearMonthCache.has(e) || this.yearMonthCache.set(e, xn.parse(e, this)), this.yearMonthCache.get(e);
27002
27005
  }
27003
27006
  getYearWeek(e) {
27004
- return this.yearWeekCache.has(e) || this.yearWeekCache.set(e, Xn.parse(e, this)), this.yearWeekCache.get(e);
27007
+ return this.yearWeekCache.has(e) || this.yearWeekCache.set(e, Rn.parse(e, this)), this.yearWeekCache.get(e);
27005
27008
  }
27006
27009
  getYear(e) {
27007
- return this.yearCache.has(e) || this.yearCache.set(e, xn.parse(e, this)), this.yearCache.get(e);
27010
+ return this.yearCache.has(e) || this.yearCache.set(e, kn.parse(e, this)), this.yearCache.get(e);
27008
27011
  }
27009
27012
  static getInstance() {
27010
27013
  return this.instance;
@@ -27012,7 +27015,7 @@ const Pg = "GGGG-[W]WW", Ug = class {
27012
27015
  };
27013
27016
  Ug.instance = new Ug();
27014
27017
  let wo = Ug;
27015
- class rn {
27018
+ class ln {
27016
27019
  constructor(e, t, i, o) {
27017
27020
  this.yearNumber = e, this.monthNumber = t, this.dayNumber = i, this.cache = o, this.type = "YearMonthDay", this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber), this.dayjs = we(this.date), this.dateString = this.toString();
27018
27021
  }
@@ -27049,10 +27052,10 @@ class rn {
27049
27052
  }
27050
27053
  static parse(e, t) {
27051
27054
  const [i, o, s] = e.split("-").map((a) => parseInt(a, 10));
27052
- return new rn(i, o, s, t);
27055
+ return new ln(i, o, s, t);
27053
27056
  }
27054
27057
  }
27055
- class Xn {
27058
+ class Rn {
27056
27059
  constructor(e, t, i) {
27057
27060
  this.isoYearNumber = e, this.isoWeekNumber = t, this.cache = i, this.type = "YearWeek", this.dateString = this.toString();
27058
27061
  }
@@ -27085,10 +27088,10 @@ class Xn {
27085
27088
  }
27086
27089
  static parse(e, t) {
27087
27090
  const [i, o] = e.split("-W").map((s) => parseInt(s, 10));
27088
- return new Xn(i, o, t);
27091
+ return new Rn(i, o, t);
27089
27092
  }
27090
27093
  }
27091
- class Rn {
27094
+ class xn {
27092
27095
  constructor(e, t, i) {
27093
27096
  this.yearNumber = e, this.monthNumber = t, this.cache = i, this.type = "YearMonth", this.dateString = this.toString();
27094
27097
  }
@@ -27121,10 +27124,10 @@ class Rn {
27121
27124
  }
27122
27125
  static parse(e, t) {
27123
27126
  const [i, o] = e.split("-").map((s) => parseInt(s, 10));
27124
- return new Rn(i, o, t);
27127
+ return new xn(i, o, t);
27125
27128
  }
27126
27129
  }
27127
- class xn {
27130
+ class kn {
27128
27131
  constructor(e, t) {
27129
27132
  this.year = e, this.cache = t, this.type = "Year", this.dateString = this.toString();
27130
27133
  }
@@ -27158,7 +27161,7 @@ class xn {
27158
27161
  }
27159
27162
  static parse(e, t) {
27160
27163
  const i = parseInt(e, 10);
27161
- return new xn(i, t);
27164
+ return new kn(i, t);
27162
27165
  }
27163
27166
  }
27164
27167
  function kW(n) {
@@ -27167,18 +27170,18 @@ function kW(n) {
27167
27170
  function lp(n) {
27168
27171
  switch (n.type) {
27169
27172
  case "YearMonthDay":
27170
- return new rn(
27173
+ return new ln(
27171
27174
  n.yearNumber,
27172
27175
  n.monthNumber,
27173
27176
  n.dayNumber,
27174
27177
  wo.getInstance()
27175
27178
  );
27176
27179
  case "YearWeek":
27177
- return new Xn(n.isoYearNumber, n.isoWeekNumber, wo.getInstance());
27180
+ return new Rn(n.isoYearNumber, n.isoWeekNumber, wo.getInstance());
27178
27181
  case "YearMonth":
27179
- return new Rn(n.yearNumber, n.monthNumber, wo.getInstance());
27182
+ return new xn(n.yearNumber, n.monthNumber, wo.getInstance());
27180
27183
  case "Year":
27181
- return new xn(n.year, wo.getInstance());
27184
+ return new kn(n.year, wo.getInstance());
27182
27185
  }
27183
27186
  }
27184
27187
  function HW(n, e) {
@@ -27208,18 +27211,18 @@ function NW(n, e) {
27208
27211
  function gp(n, e) {
27209
27212
  if (n === null || e === null)
27210
27213
  return [];
27211
- if (n instanceof rn && e instanceof rn)
27214
+ if (n instanceof ln && e instanceof ln)
27212
27215
  return HW(n, e);
27213
- if (n instanceof Xn && e instanceof Xn)
27214
- return SW(n, e);
27215
27216
  if (n instanceof Rn && e instanceof Rn)
27216
- return YW(n, e);
27217
+ return SW(n, e);
27217
27218
  if (n instanceof xn && e instanceof xn)
27219
+ return YW(n, e);
27220
+ if (n instanceof kn && e instanceof kn)
27218
27221
  return NW(n, e);
27219
27222
  throw new Error(`Invalid arguments: start and end must be of the same type: ${n}, ${e}`);
27220
27223
  }
27221
27224
  function cp(n, e) {
27222
- if (n instanceof rn && e instanceof rn || n instanceof Xn && e instanceof Xn || n instanceof Rn && e instanceof Rn || n instanceof xn && e instanceof xn)
27225
+ if (n instanceof ln && e instanceof ln || n instanceof Rn && e instanceof Rn || n instanceof xn && e instanceof xn || n instanceof kn && e instanceof kn)
27223
27226
  return n.minus(e);
27224
27227
  throw new Error(`Cannot compare ${n} and ${e}`);
27225
27228
  }
@@ -27238,13 +27241,13 @@ function Qc(n) {
27238
27241
  return e === null || t === null ? { min: null, max: null } : { min: e, max: t };
27239
27242
  }
27240
27243
  function FW(n, e) {
27241
- if (n instanceof rn)
27244
+ if (n instanceof ln)
27242
27245
  return n.addDays(e);
27243
- if (n instanceof Xn)
27244
- return n.addWeeks(e);
27245
27246
  if (n instanceof Rn)
27246
- return n.addMonths(e);
27247
+ return n.addWeeks(e);
27247
27248
  if (n instanceof xn)
27249
+ return n.addMonths(e);
27250
+ if (n instanceof kn)
27248
27251
  return n.addYears(e);
27249
27252
  throw new Error(`Invalid argument: ${n}`);
27250
27253
  }
@@ -27279,10 +27282,13 @@ const MW = ({
27279
27282
  yAxisScaleType: e,
27280
27283
  yAxisMaxConfig: t
27281
27284
  }) => {
27282
- const i = n.map((d) => ({
27285
+ const i = n.filter((d) => d.content.length > 0).map((d) => ({
27283
27286
  content: d.content.filter((I) => I.dateRange !== null),
27284
27287
  displayName: d.displayName
27285
- })), o = i[0].content[0].dateRange, s = i.map((d) => d.content.map((I) => I.total)).flat(), [a, r] = zW(s), l = (d) => (d - a) / (r - a) * 4.5 + 0.5, g = e !== "logit" ? Al(ed(i), t == null ? void 0 : t[e]) : void 0, c = {
27288
+ }));
27289
+ if (i.length === 0)
27290
+ return /* @__PURE__ */ h(kt, {});
27291
+ const o = i[0].content[0].dateRange, s = i.map((d) => d.content.map((I) => I.total)).flat(), [a, r] = zW(s), l = (d) => (d - a) / (r - a) * 4.5 + 0.5, g = e !== "logit" ? Al(ed(i), t == null ? void 0 : t[e]) : void 0, c = {
27286
27292
  type: "bubble",
27287
27293
  data: {
27288
27294
  datasets: i.map((d, I) => ({
@@ -27339,10 +27345,13 @@ const LW = ({
27339
27345
  confidenceIntervalMethod: t,
27340
27346
  yAxisMaxConfig: i
27341
27347
  }) => {
27342
- const o = n.map((l) => ({
27348
+ const o = n.filter((l) => l.content.length > 0).map((l) => ({
27343
27349
  content: l.content.filter((g) => g.dateRange !== null),
27344
27350
  displayName: l.displayName
27345
- })), s = o.map((l, g) => TW(l, g, t)).flat(), a = e !== "logit" ? Al(ed(o), i == null ? void 0 : i[e]) : void 0, r = {
27351
+ }));
27352
+ if (o.length === 0)
27353
+ return /* @__PURE__ */ h(kt, {});
27354
+ const s = o.map((l, g) => TW(l, g, t)).flat(), a = e !== "logit" ? Al(ed(o), i == null ? void 0 : i[e]) : void 0, r = {
27346
27355
  type: "line",
27347
27356
  data: {
27348
27357
  datasets: s
@@ -27565,7 +27574,10 @@ class qW {
27565
27574
  throw new Error("Window size must be at least 1");
27566
27575
  }
27567
27576
  async evaluate(e, t) {
27568
- const i = await this.child.evaluate(e, t), o = new Array(), s = Math.max(i.content.length - this.windowSize, 0) + 1;
27577
+ const i = await this.child.evaluate(e, t), o = new Array();
27578
+ if (i.content.length === 0)
27579
+ return { content: o };
27580
+ const s = Math.max(i.content.length - this.windowSize, 0) + 1;
27569
27581
  for (let a = 0; a < s; a++)
27570
27582
  o.push(this.aggregate(i.content.slice(a, a + this.windowSize)));
27571
27583
  return { content: o };
@@ -27691,7 +27703,7 @@ const $c = ({ items: n, selected: e, onChange: t, selectStyle: i }) => /* @__PUR
27691
27703
  );
27692
27704
  }, aV = (n) => {
27693
27705
  const { width: e, height: t } = n, i = { height: t, width: e };
27694
- return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Jt, { size: i, children: /* @__PURE__ */ h(rV, { ...n }) }) });
27706
+ return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(rV, { ...n }) }) });
27695
27707
  }, rV = (n) => {
27696
27708
  const { numeratorFilter: e, denominatorFilter: t, granularity: i, smoothingWindow: o, lapisDateField: s } = n, a = Se(De), { data: r, error: l, isLoading: g } = Yn(
27697
27709
  () => iV(
@@ -27704,7 +27716,7 @@ const $c = ({ items: n, selected: e, onChange: t, selectStyle: i }) => /* @__PUR
27704
27716
  ),
27705
27717
  [a, e, t, i, o, s]
27706
27718
  );
27707
- return g ? /* @__PURE__ */ h(Dt, {}) : l !== null ? /* @__PURE__ */ h(Tt, { error: l }) : r === null ? /* @__PURE__ */ h(Sn, {}) : /* @__PURE__ */ h(lV, { data: r, ...n });
27719
+ return g ? /* @__PURE__ */ h(Ot, {}) : l !== null ? /* @__PURE__ */ h(Jt, { error: l }) : r === null || r.every((c) => c.content.length === 0) ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(lV, { data: r, ...n });
27708
27720
  }, lV = ({ data: n, ...e }) => {
27709
27721
  const { views: t, granularity: i, confidenceIntervalMethods: o, pageSize: s, yAxisMaxLinear: a, yAxisMaxLogarithmic: r } = e, [l, g] = oe("linear"), [c, d] = oe(
27710
27722
  o.length > 0 ? o[0] : "none"
@@ -27812,7 +27824,7 @@ const $c = ({ items: n, selected: e, onChange: t, selectStyle: i }) => /* @__PUR
27812
27824
  ] }),
27813
27825
  /* @__PURE__ */ h(Ce, { children: 'Sequences that have no assigned date will not be shown in the line and bubble chart. They will show up in the bar and table view with date "unknown".' }),
27814
27826
  i.includes("bubble") && /* @__PURE__ */ h(Be, { children: [
27815
- /* @__PURE__ */ h(Pt, { children: "Bubble chart" }),
27827
+ /* @__PURE__ */ h(Ut, { children: "Bubble chart" }),
27816
27828
  /* @__PURE__ */ h(Ce, { children: [
27817
27829
  "The size of the bubble scales with the total number of available sequences from the",
27818
27830
  " ",
@@ -28064,13 +28076,13 @@ function qu(n) {
28064
28076
  }
28065
28077
  const fV = (n) => {
28066
28078
  const { width: e, height: t } = n, i = { height: t, width: e };
28067
- return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Jt, { size: i, children: /* @__PURE__ */ h(mV, { ...n }) }) });
28079
+ return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(mV, { ...n }) }) });
28068
28080
  }, mV = (n) => {
28069
28081
  const e = Se(De), { numeratorFilter: t, denominatorFilter: i, generationTime: o, lapisDateField: s } = n, [a, r] = oe("linear"), { data: l, error: g, isLoading: c } = Yn(
28070
28082
  () => pV(t, i, o, e, s),
28071
28083
  [e, t, i, o, s]
28072
28084
  );
28073
- return c ? /* @__PURE__ */ h(Dt, {}) : g !== null ? /* @__PURE__ */ h(Tt, { error: g }) : l === null ? /* @__PURE__ */ h(Sn, {}) : /* @__PURE__ */ h(
28085
+ return c ? /* @__PURE__ */ h(Ot, {}) : g !== null ? /* @__PURE__ */ h(Jt, { error: g }) : l === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(
28074
28086
  bV,
28075
28087
  {
28076
28088
  data: l,
@@ -28137,7 +28149,7 @@ const fV = (n) => {
28137
28149
  t,
28138
28150
  " days from today, we expect the number of new infections from the focal variant to be 15."
28139
28151
  ] }),
28140
- /* @__PURE__ */ h(Pt, { children: "Reference" }),
28152
+ /* @__PURE__ */ h(Ut, { children: "Reference" }),
28141
28153
  /* @__PURE__ */ h(Ce, { children: [
28142
28154
  'Chen, Chaoran, et al. "Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland." Epidemics (2021); doi:',
28143
28155
  " ",
@@ -28153,12 +28165,12 @@ const fV = (n) => {
28153
28165
  )
28154
28166
  ] });
28155
28167
  };
28156
- var wV = Object.defineProperty, vV = Object.getOwnPropertyDescriptor, Cn = (n, e, t, i) => {
28168
+ var wV = Object.defineProperty, vV = Object.getOwnPropertyDescriptor, hn = (n, e, t, i) => {
28157
28169
  for (var o = i > 1 ? void 0 : i ? vV(e, t) : e, s = n.length - 1, a; s >= 0; s--)
28158
28170
  (a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
28159
28171
  return i && o && wV(e, t, o), o;
28160
28172
  };
28161
- let Lt = class extends un {
28173
+ let Tt = class extends Cn {
28162
28174
  constructor() {
28163
28175
  super(...arguments), this.numeratorFilter = {}, this.denominatorFilter = {}, this.generationTime = 7, this.views = ["line"], this.width = "100%", this.height = "700px", this.lapisDateField = "date", this.yAxisMaxLinear = 1, this.yAxisMaxLogarithmic = 1;
28164
28176
  }
@@ -28181,36 +28193,36 @@ let Lt = class extends un {
28181
28193
  );
28182
28194
  }
28183
28195
  };
28184
- Cn([
28196
+ hn([
28185
28197
  Y({ type: Object })
28186
- ], Lt.prototype, "numeratorFilter", 2);
28187
- Cn([
28198
+ ], Tt.prototype, "numeratorFilter", 2);
28199
+ hn([
28188
28200
  Y({ type: Object })
28189
- ], Lt.prototype, "denominatorFilter", 2);
28190
- Cn([
28201
+ ], Tt.prototype, "denominatorFilter", 2);
28202
+ hn([
28191
28203
  Y({ type: Number })
28192
- ], Lt.prototype, "generationTime", 2);
28193
- Cn([
28204
+ ], Tt.prototype, "generationTime", 2);
28205
+ hn([
28194
28206
  Y({ type: Array })
28195
- ], Lt.prototype, "views", 2);
28196
- Cn([
28207
+ ], Tt.prototype, "views", 2);
28208
+ hn([
28197
28209
  Y({ type: String })
28198
- ], Lt.prototype, "width", 2);
28199
- Cn([
28210
+ ], Tt.prototype, "width", 2);
28211
+ hn([
28200
28212
  Y({ type: String })
28201
- ], Lt.prototype, "height", 2);
28202
- Cn([
28213
+ ], Tt.prototype, "height", 2);
28214
+ hn([
28203
28215
  Y({ type: String })
28204
- ], Lt.prototype, "lapisDateField", 2);
28205
- Cn([
28216
+ ], Tt.prototype, "lapisDateField", 2);
28217
+ hn([
28206
28218
  Y({ type: String })
28207
- ], Lt.prototype, "yAxisMaxLinear", 2);
28208
- Cn([
28219
+ ], Tt.prototype, "yAxisMaxLinear", 2);
28220
+ hn([
28209
28221
  Y({ type: String })
28210
- ], Lt.prototype, "yAxisMaxLogarithmic", 2);
28211
- Lt = Cn([
28222
+ ], Tt.prototype, "yAxisMaxLogarithmic", 2);
28223
+ Tt = hn([
28212
28224
  Zt("gs-relative-growth-advantage")
28213
- ], Lt);
28225
+ ], Tt);
28214
28226
  const ec = (n, e) => {
28215
28227
  if (typeof n == "number" && typeof e == "number")
28216
28228
  return n - e;
@@ -28250,10 +28262,10 @@ const BV = ({ data: n, fields: e, pageSize: t }) => {
28250
28262
  return /* @__PURE__ */ h(oo, { data: n, columns: i, pageSize: t });
28251
28263
  }, WV = (n) => {
28252
28264
  const { width: e, height: t } = n, i = { height: t, width: e };
28253
- return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Jt, { size: i, children: /* @__PURE__ */ h(VV, { ...n }) }) });
28265
+ return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(VV, { ...n }) }) });
28254
28266
  }, VV = (n) => {
28255
28267
  const { fields: e, filter: t, initialSortField: i, initialSortDirection: o } = n, s = Se(De), { data: a, error: r, isLoading: l } = Yn(async () => GV(t, e, s, { field: i, direction: o }), [t, e, s]);
28256
- return l ? /* @__PURE__ */ h(Dt, {}) : r !== null ? /* @__PURE__ */ h(Tt, { error: r }) : a === null ? /* @__PURE__ */ h(Sn, {}) : /* @__PURE__ */ h(XV, { data: a, originalComponentProps: n });
28268
+ return l ? /* @__PURE__ */ h(Ot, {}) : r !== null ? /* @__PURE__ */ h(Jt, { error: r }) : a === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(XV, { data: a, originalComponentProps: n });
28257
28269
  }, XV = ({ data: n, originalComponentProps: e }) => {
28258
28270
  const t = (o) => {
28259
28271
  switch (o) {
@@ -28294,7 +28306,7 @@ var kV = Object.defineProperty, HV = Object.getOwnPropertyDescriptor, Nn = (n, e
28294
28306
  (a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
28295
28307
  return i && o && kV(e, t, o), o;
28296
28308
  };
28297
- let ln = class extends es {
28309
+ let gn = class extends es {
28298
28310
  constructor() {
28299
28311
  super(...arguments), this.fields = [], this.views = ["table"], this.filter = {}, this.width = "100%", this.height = "700px", this.initialSortField = "count", this.initialSortDirection = "descending", this.pageSize = !1;
28300
28312
  }
@@ -28316,31 +28328,31 @@ let ln = class extends es {
28316
28328
  };
28317
28329
  Nn([
28318
28330
  Y({ type: Array })
28319
- ], ln.prototype, "fields", 2);
28331
+ ], gn.prototype, "fields", 2);
28320
28332
  Nn([
28321
28333
  Y({ type: Array })
28322
- ], ln.prototype, "views", 2);
28334
+ ], gn.prototype, "views", 2);
28323
28335
  Nn([
28324
28336
  Y({ type: Object })
28325
- ], ln.prototype, "filter", 2);
28337
+ ], gn.prototype, "filter", 2);
28326
28338
  Nn([
28327
28339
  Y({ type: String })
28328
- ], ln.prototype, "width", 2);
28340
+ ], gn.prototype, "width", 2);
28329
28341
  Nn([
28330
28342
  Y({ type: String })
28331
- ], ln.prototype, "height", 2);
28343
+ ], gn.prototype, "height", 2);
28332
28344
  Nn([
28333
28345
  Y({ type: String })
28334
- ], ln.prototype, "initialSortField", 2);
28346
+ ], gn.prototype, "initialSortField", 2);
28335
28347
  Nn([
28336
28348
  Y({ type: String })
28337
- ], ln.prototype, "initialSortDirection", 2);
28349
+ ], gn.prototype, "initialSortDirection", 2);
28338
28350
  Nn([
28339
28351
  Y({ type: Object })
28340
- ], ln.prototype, "pageSize", 2);
28341
- ln = Nn([
28352
+ ], gn.prototype, "pageSize", 2);
28353
+ gn = Nn([
28342
28354
  Zt("gs-aggregate")
28343
- ], ln);
28355
+ ], gn);
28344
28356
  const fl = (n, e) => {
28345
28357
  const t = n.map(({ displayName: a, content: r }) => ({
28346
28358
  displayName: a,
@@ -28365,7 +28377,7 @@ const fl = (n, e) => {
28365
28377
  };
28366
28378
  ke.register(...to);
28367
28379
  const SV = ({ data: n, yAxisScaleType: e }) => {
28368
- const t = an(
28380
+ const t = rn(
28369
28381
  () => ({
28370
28382
  type: "bar",
28371
28383
  data: {
@@ -28410,7 +28422,7 @@ const SV = ({ data: n, yAxisScaleType: e }) => {
28410
28422
  };
28411
28423
  ke.register(...to);
28412
28424
  const NV = ({ data: n, yAxisScaleType: e }) => {
28413
- const t = an(
28425
+ const t = rn(
28414
28426
  () => ({
28415
28427
  type: "line",
28416
28428
  data: {
@@ -28463,7 +28475,7 @@ const NV = ({ data: n, yAxisScaleType: e }) => {
28463
28475
  name: s.displayName,
28464
28476
  sort: !0
28465
28477
  }))
28466
- ], o = an(() => {
28478
+ ], o = rn(() => {
28467
28479
  const s = fl(n, e);
28468
28480
  return Object.values(s).map((a) => Object.values(a));
28469
28481
  }, [n, e]);
@@ -28486,13 +28498,13 @@ async function _V(n, e, t, i, o) {
28486
28498
  }
28487
28499
  const zV = (n) => {
28488
28500
  const { width: e, height: t } = n, i = { height: t, width: e };
28489
- return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Jt, { size: i, children: /* @__PURE__ */ h(MV, { ...n }) }) });
28501
+ return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(MV, { ...n }) }) });
28490
28502
  }, MV = (n) => {
28491
28503
  const { lapisFilter: e, lapisDateField: t, granularity: i, smoothingWindow: o } = n, s = Se(De), { data: a, error: r, isLoading: l } = Yn(
28492
28504
  () => _V(s, e, t, i, o),
28493
28505
  [s, e, t, i, o]
28494
28506
  );
28495
- return l ? /* @__PURE__ */ h(Dt, {}) : r !== null ? /* @__PURE__ */ h(Tt, { error: r }) : a === null ? /* @__PURE__ */ h(Sn, {}) : /* @__PURE__ */ h(LV, { data: a, originalComponentProps: n });
28507
+ return l ? /* @__PURE__ */ h(Ot, {}) : r !== null ? /* @__PURE__ */ h(Jt, { error: r }) : a === null ? /* @__PURE__ */ h(kt, {}) : /* @__PURE__ */ h(LV, { data: a, originalComponentProps: n });
28496
28508
  }, LV = ({ data: n, originalComponentProps: e }) => {
28497
28509
  const [t, i] = oe("linear"), o = (s) => {
28498
28510
  switch (s) {
@@ -28585,7 +28597,7 @@ var DV = Object.defineProperty, OV = Object.getOwnPropertyDescriptor, Fn = (n, e
28585
28597
  (a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
28586
28598
  return i && o && DV(e, t, o), o;
28587
28599
  };
28588
- let gn = class extends es {
28600
+ let cn = class extends es {
28589
28601
  constructor() {
28590
28602
  super(...arguments), this.lapisFilter = { displayName: "", lapisFilter: {} }, this.lapisDateField = "date", this.views = ["bar", "line", "table"], this.width = "100%", this.height = "700px", this.granularity = "day", this.smoothingWindow = 0, this.pageSize = !1;
28591
28603
  }
@@ -28607,31 +28619,31 @@ let gn = class extends es {
28607
28619
  };
28608
28620
  Fn([
28609
28621
  Y({ type: Object })
28610
- ], gn.prototype, "lapisFilter", 2);
28622
+ ], cn.prototype, "lapisFilter", 2);
28611
28623
  Fn([
28612
28624
  Y({ type: String })
28613
- ], gn.prototype, "lapisDateField", 2);
28625
+ ], cn.prototype, "lapisDateField", 2);
28614
28626
  Fn([
28615
28627
  Y({ type: Array })
28616
- ], gn.prototype, "views", 2);
28628
+ ], cn.prototype, "views", 2);
28617
28629
  Fn([
28618
28630
  Y({ type: String })
28619
- ], gn.prototype, "width", 2);
28631
+ ], cn.prototype, "width", 2);
28620
28632
  Fn([
28621
28633
  Y({ type: String })
28622
- ], gn.prototype, "height", 2);
28634
+ ], cn.prototype, "height", 2);
28623
28635
  Fn([
28624
28636
  Y({ type: String })
28625
- ], gn.prototype, "granularity", 2);
28637
+ ], cn.prototype, "granularity", 2);
28626
28638
  Fn([
28627
28639
  Y({ type: Number })
28628
- ], gn.prototype, "smoothingWindow", 2);
28640
+ ], cn.prototype, "smoothingWindow", 2);
28629
28641
  Fn([
28630
28642
  Y({ type: Object })
28631
- ], gn.prototype, "pageSize", 2);
28632
- gn = Fn([
28643
+ ], cn.prototype, "pageSize", 2);
28644
+ cn = Fn([
28633
28645
  Zt("gs-number-sequences-over-time")
28634
- ], gn);
28646
+ ], cn);
28635
28647
  const Ip = "KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgdXRpbDsKICAoZnVuY3Rpb24odXRpbDIpIHsKICAgIHV0aWwyLmFzc2VydEVxdWFsID0gKHZhbCkgPT4gdmFsOwogICAgZnVuY3Rpb24gYXNzZXJ0SXMoX2FyZykgewogICAgfQogICAgdXRpbDIuYXNzZXJ0SXMgPSBhc3NlcnRJczsKICAgIGZ1bmN0aW9uIGFzc2VydE5ldmVyKF94KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgfQogICAgdXRpbDIuYXNzZXJ0TmV2ZXIgPSBhc3NlcnROZXZlcjsKICAgIHV0aWwyLmFycmF5VG9FbnVtID0gKGl0ZW1zKSA9PiB7CiAgICAgIGNvbnN0IG9iaiA9IHt9OwogICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgICAgICBvYmpbaXRlbV0gPSBpdGVtOwogICAgICB9CiAgICAgIHJldHVybiBvYmo7CiAgICB9OwogICAgdXRpbDIuZ2V0VmFsaWRFbnVtVmFsdWVzID0gKG9iaikgPT4gewogICAgICBjb25zdCB2YWxpZEtleXMgPSB1dGlsMi5vYmplY3RLZXlzKG9iaikuZmlsdGVyKChrMikgPT4gdHlwZW9mIG9ialtvYmpbazJdXSAhPT0gIm51bWJlciIpOwogICAgICBjb25zdCBmaWx0ZXJlZCA9IHt9OwogICAgICBmb3IgKGNvbnN0IGsyIG9mIHZhbGlkS2V5cykgewogICAgICAgIGZpbHRlcmVkW2syXSA9IG9ialtrMl07CiAgICAgIH0KICAgICAgcmV0dXJuIHV0aWwyLm9iamVjdFZhbHVlcyhmaWx0ZXJlZCk7CiAgICB9OwogICAgdXRpbDIub2JqZWN0VmFsdWVzID0gKG9iaikgPT4gewogICAgICByZXR1cm4gdXRpbDIub2JqZWN0S2V5cyhvYmopLm1hcChmdW5jdGlvbihlMikgewogICAgICAgIHJldHVybiBvYmpbZTJdOwogICAgICB9KTsKICAgIH07CiAgICB1dGlsMi5vYmplY3RLZXlzID0gdHlwZW9mIE9iamVjdC5rZXlzID09PSAiZnVuY3Rpb24iID8gKG9iaikgPT4gT2JqZWN0LmtleXMob2JqKSA6IChvYmplY3QpID0+IHsKICAgICAgY29uc3Qga2V5cyA9IFtdOwogICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHsKICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkgewogICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBrZXlzOwogICAgfTsKICAgIHV0aWwyLmZpbmQgPSAoYXJyLCBjaGVja2VyKSA9PiB7CiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnIpIHsKICAgICAgICBpZiAoY2hlY2tlcihpdGVtKSkKICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICB9CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9OwogICAgdXRpbDIuaXNJbnRlZ2VyID0gdHlwZW9mIE51bWJlci5pc0ludGVnZXIgPT09ICJmdW5jdGlvbiIgPyAodmFsKSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHZhbCkgOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAibnVtYmVyIiAmJiBpc0Zpbml0ZSh2YWwpICYmIE1hdGguZmxvb3IodmFsKSA9PT0gdmFsOwogICAgZnVuY3Rpb24gam9pblZhbHVlcyhhcnJheSwgc2VwYXJhdG9yID0gIiB8ICIpIHsKICAgICAgcmV0dXJuIGFycmF5Lm1hcCgodmFsKSA9PiB0eXBlb2YgdmFsID09PSAic3RyaW5nIiA/IGAnJHt2YWx9J2AgOiB2YWwpLmpvaW4oc2VwYXJhdG9yKTsKICAgIH0KICAgIHV0aWwyLmpvaW5WYWx1ZXMgPSBqb2luVmFsdWVzOwogICAgdXRpbDIuanNvblN0cmluZ2lmeVJlcGxhY2VyID0gKF8sIHZhbHVlKSA9PiB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICJiaWdpbnQiKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlOwogICAgfTsKICB9KSh1dGlsIHx8ICh1dGlsID0ge30pKTsKICB2YXIgb2JqZWN0VXRpbDsKICAoZnVuY3Rpb24ob2JqZWN0VXRpbDIpIHsKICAgIG9iamVjdFV0aWwyLm1lcmdlU2hhcGVzID0gKGZpcnN0LCBzZWNvbmQpID0+IHsKICAgICAgcmV0dXJuIHsKICAgICAgICAuLi5maXJzdCwKICAgICAgICAuLi5zZWNvbmQKICAgICAgICAvLyBzZWNvbmQgb3ZlcndyaXRlcyBmaXJzdAogICAgICB9OwogICAgfTsKICB9KShvYmplY3RVdGlsIHx8IChvYmplY3RVdGlsID0ge30pKTsKICBjb25zdCBab2RQYXJzZWRUeXBlID0gdXRpbC5hcnJheVRvRW51bShbCiAgICAic3RyaW5nIiwKICAgICJuYW4iLAogICAgIm51bWJlciIsCiAgICAiaW50ZWdlciIsCiAgICAiZmxvYXQiLAogICAgImJvb2xlYW4iLAogICAgImRhdGUiLAogICAgImJpZ2ludCIsCiAgICAic3ltYm9sIiwKICAgICJmdW5jdGlvbiIsCiAgICAidW5kZWZpbmVkIiwKICAgICJudWxsIiwKICAgICJhcnJheSIsCiAgICAib2JqZWN0IiwKICAgICJ1bmtub3duIiwKICAgICJwcm9taXNlIiwKICAgICJ2b2lkIiwKICAgICJuZXZlciIsCiAgICAibWFwIiwKICAgICJzZXQiCiAgXSk7CiAgY29uc3QgZ2V0UGFyc2VkVHlwZSA9IChkYXRhKSA9PiB7CiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7CiAgICBzd2l0Y2ggKHQpIHsKICAgICAgY2FzZSAidW5kZWZpbmVkIjoKICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQ7CiAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3RyaW5nOwogICAgICBjYXNlICJudW1iZXIiOgogICAgICAgIHJldHVybiBpc05hTihkYXRhKSA/IFpvZFBhcnNlZFR5cGUubmFuIDogWm9kUGFyc2VkVHlwZS5udW1iZXI7CiAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmJvb2xlYW47CiAgICAgIGNhc2UgImZ1bmN0aW9uIjoKICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbjsKICAgICAgY2FzZSAiYmlnaW50IjoKICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5iaWdpbnQ7CiAgICAgIGNhc2UgInN5bWJvbCI6CiAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3ltYm9sOwogICAgICBjYXNlICJvYmplY3QiOgogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5hcnJheTsKICAgICAgICB9CiAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLm51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChkYXRhLnRoZW4gJiYgdHlwZW9mIGRhdGEudGhlbiA9PT0gImZ1bmN0aW9uIiAmJiBkYXRhLmNhdGNoICYmIHR5cGVvZiBkYXRhLmNhdGNoID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5wcm9taXNlOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIE1hcCAhPT0gInVuZGVmaW5lZCIgJiYgZGF0YSBpbnN0YW5jZW9mIE1hcCkgewogICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUubWFwOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIFNldCAhPT0gInVuZGVmaW5lZCIgJiYgZGF0YSBpbnN0YW5jZW9mIFNldCkgewogICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc2V0OwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIERhdGUgIT09ICJ1bmRlZmluZWQiICYmIGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7CiAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5kYXRlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5vYmplY3Q7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUudW5rbm93bjsKICAgIH0KICB9OwogIGNvbnN0IFpvZElzc3VlQ29kZSA9IHV0aWwuYXJyYXlUb0VudW0oWwogICAgImludmFsaWRfdHlwZSIsCiAgICAiaW52YWxpZF9saXRlcmFsIiwKICAgICJjdXN0b20iLAogICAgImludmFsaWRfdW5pb24iLAogICAgImludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvciIsCiAgICAiaW52YWxpZF9lbnVtX3ZhbHVlIiwKICAgICJ1bnJlY29nbml6ZWRfa2V5cyIsCiAgICAiaW52YWxpZF9hcmd1bWVudHMiLAogICAgImludmFsaWRfcmV0dXJuX3R5cGUiLAogICAgImludmFsaWRfZGF0ZSIsCiAgICAiaW52YWxpZF9zdHJpbmciLAogICAgInRvb19zbWFsbCIsCiAgICAidG9vX2JpZyIsCiAgICAiaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXMiLAogICAgIm5vdF9tdWx0aXBsZV9vZiIsCiAgICAibm90X2Zpbml0ZSIKICBdKTsKICBjb25zdCBxdW90ZWxlc3NKc29uID0gKG9iaikgPT4gewogICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7CiAgICByZXR1cm4ganNvbi5yZXBsYWNlKC8iKFteIl0rKSI6L2csICIkMToiKTsKICB9OwogIGNsYXNzIFpvZEVycm9yIGV4dGVuZHMgRXJyb3IgewogICAgY29uc3RydWN0b3IoaXNzdWVzKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuaXNzdWVzID0gW107CiAgICAgIHRoaXMuYWRkSXNzdWUgPSAoc3ViKSA9PiB7CiAgICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIHN1Yl07CiAgICAgIH07CiAgICAgIHRoaXMuYWRkSXNzdWVzID0gKHN1YnMgPSBbXSkgPT4gewogICAgICAgIHRoaXMuaXNzdWVzID0gWy4uLnRoaXMuaXNzdWVzLCAuLi5zdWJzXTsKICAgICAgfTsKICAgICAgY29uc3QgYWN0dWFsUHJvdG8gPSBuZXcudGFyZ2V0LnByb3RvdHlwZTsKICAgICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikgewogICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBhY3R1YWxQcm90byk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fX3Byb3RvX18gPSBhY3R1YWxQcm90bzsKICAgICAgfQogICAgICB0aGlzLm5hbWUgPSAiWm9kRXJyb3IiOwogICAgICB0aGlzLmlzc3VlcyA9IGlzc3VlczsKICAgIH0KICAgIGdldCBlcnJvcnMoKSB7CiAgICAgIHJldHVybiB0aGlzLmlzc3VlczsKICAgIH0KICAgIGZvcm1hdChfbWFwcGVyKSB7CiAgICAgIGNvbnN0IG1hcHBlciA9IF9tYXBwZXIgfHwgZnVuY3Rpb24oaXNzdWUpIHsKICAgICAgICByZXR1cm4gaXNzdWUubWVzc2FnZTsKICAgICAgfTsKICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7IF9lcnJvcnM6IFtdIH07CiAgICAgIGNvbnN0IHByb2Nlc3NFcnJvciA9IChlcnJvcikgPT4gewogICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKSB7CiAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gImludmFsaWRfdW5pb24iKSB7CiAgICAgICAgICAgIGlzc3VlLnVuaW9uRXJyb3JzLm1hcChwcm9jZXNzRXJyb3IpOwogICAgICAgICAgfSBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSAiaW52YWxpZF9yZXR1cm5fdHlwZSIpIHsKICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLnJldHVyblR5cGVFcnJvcik7CiAgICAgICAgICB9IGVsc2UgaWYgKGlzc3VlLmNvZGUgPT09ICJpbnZhbGlkX2FyZ3VtZW50cyIpIHsKICAgICAgICAgICAgcHJvY2Vzc0Vycm9yKGlzc3VlLmFyZ3VtZW50c0Vycm9yKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaXNzdWUucGF0aC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgZmllbGRFcnJvcnMuX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IGN1cnIgPSBmaWVsZEVycm9yczsKICAgICAgICAgICAgbGV0IGkyID0gMDsKICAgICAgICAgICAgd2hpbGUgKGkyIDwgaXNzdWUucGF0aC5sZW5ndGgpIHsKICAgICAgICAgICAgICBjb25zdCBlbCA9IGlzc3VlLnBhdGhbaTJdOwogICAgICAgICAgICAgIGNvbnN0IHRlcm1pbmFsID0gaTIgPT09IGlzc3VlLnBhdGgubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsKSB7CiAgICAgICAgICAgICAgICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IHsgX2Vycm9yczogW10gfTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07CiAgICAgICAgICAgICAgICBjdXJyW2VsXS5fZXJyb3JzLnB1c2gobWFwcGVyKGlzc3VlKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGN1cnIgPSBjdXJyW2VsXTsKICAgICAgICAgICAgICBpMisrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBwcm9jZXNzRXJyb3IodGhpcyk7CiAgICAgIHJldHVybiBmaWVsZEVycm9yczsKICAgIH0KICAgIHN0YXRpYyBhc3NlcnQodmFsdWUpIHsKICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBab2RFcnJvcikpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBhIFpvZEVycm9yOiAke3ZhbHVlfWApOwogICAgICB9CiAgICB9CiAgICB0b1N0cmluZygpIHsKICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTsKICAgIH0KICAgIGdldCBtZXNzYWdlKCkgewogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5pc3N1ZXMsIHV0aWwuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTsKICAgIH0KICAgIGdldCBpc0VtcHR5KCkgewogICAgICByZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoID09PSAwOwogICAgfQogICAgZmxhdHRlbihtYXBwZXIgPSAoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpIHsKICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTsKICAgICAgY29uc3QgZm9ybUVycm9ycyA9IFtdOwogICAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLmlzc3VlcykgewogICAgICAgIGlmIChzdWIucGF0aC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gPSBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0gfHwgW107CiAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0ucHVzaChtYXBwZXIoc3ViKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvcm1FcnJvcnMucHVzaChtYXBwZXIoc3ViKSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7IGZvcm1FcnJvcnMsIGZpZWxkRXJyb3JzIH07CiAgICB9CiAgICBnZXQgZm9ybUVycm9ycygpIHsKICAgICAgcmV0dXJuIHRoaXMuZmxhdHRlbigpOwogICAgfQogIH0KICBab2RFcnJvci5jcmVhdGUgPSAoaXNzdWVzKSA9PiB7CiAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihpc3N1ZXMpOwogICAgcmV0dXJuIGVycm9yOwogIH07CiAgY29uc3QgZXJyb3JNYXAgPSAoaXNzdWUsIF9jdHgpID0+IHsKICAgIGxldCBtZXNzYWdlOwogICAgc3dpdGNoIChpc3N1ZS5jb2RlKSB7CiAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZToKICAgICAgICBpZiAoaXNzdWUucmVjZWl2ZWQgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7CiAgICAgICAgICBtZXNzYWdlID0gIlJlcXVpcmVkIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWVzc2FnZSA9IGBFeHBlY3RlZCAke2lzc3VlLmV4cGVjdGVkfSwgcmVjZWl2ZWQgJHtpc3N1ZS5yZWNlaXZlZH1gOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsOgogICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KGlzc3VlLmV4cGVjdGVkLCB1dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlcil9YDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudW5yZWNvZ25pemVkX2tleXM6CiAgICAgICAgbWVzc2FnZSA9IGBVbnJlY29nbml6ZWQga2V5KHMpIGluIG9iamVjdDogJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUua2V5cywgIiwgIil9YDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbjoKICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXRgOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uX2Rpc2NyaW1pbmF0b3I6CiAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7dXRpbC5qb2luVmFsdWVzKGlzc3VlLm9wdGlvbnMpfWA7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZToKICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHt1dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9LCByZWNlaXZlZCAnJHtpc3N1ZS5yZWNlaXZlZH0nYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHM6CiAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIGFyZ3VtZW50c2A7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmludmFsaWRfcmV0dXJuX3R5cGU6CiAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9kYXRlOgogICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkYXRlYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmc6CiAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uID09PSAib2JqZWN0IikgewogICAgICAgICAgaWYgKCJpbmNsdWRlcyIgaW4gaXNzdWUudmFsaWRhdGlvbikgewogICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgaW5jbHVkZSAiJHtpc3N1ZS52YWxpZGF0aW9uLmluY2x1ZGVzfSJgOwogICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlLnZhbGlkYXRpb24ucG9zaXRpb24gPT09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgbWVzc2FnZSA9IGAke21lc3NhZ2V9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9ufWA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoInN0YXJ0c1dpdGgiIGluIGlzc3VlLnZhbGlkYXRpb24pIHsKICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggIiR7aXNzdWUudmFsaWRhdGlvbi5zdGFydHNXaXRofSJgOwogICAgICAgICAgfSBlbHNlIGlmICgiZW5kc1dpdGgiIGluIGlzc3VlLnZhbGlkYXRpb24pIHsKICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGVuZCB3aXRoICIke2lzc3VlLnZhbGlkYXRpb24uZW5kc1dpdGh9ImA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGlzc3VlLnZhbGlkYXRpb24pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoaXNzdWUudmFsaWRhdGlvbiAhPT0gInJlZ2V4IikgewogICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkICR7aXNzdWUudmFsaWRhdGlvbn1gOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtZXNzYWdlID0gIkludmFsaWQiOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudG9vX3NtYWxsOgogICAgICAgIGlmIChpc3N1ZS50eXBlID09PSAiYXJyYXkiKQogICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/ICJleGFjdGx5IiA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBsZWFzdGAgOiBgbW9yZSB0aGFuYH0gJHtpc3N1ZS5taW5pbXVtfSBlbGVtZW50KHMpYDsKICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSAic3RyaW5nIikKICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gImV4YWN0bHkiIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IGxlYXN0YCA6IGBvdmVyYH0gJHtpc3N1ZS5taW5pbXVtfSBjaGFyYWN0ZXIocylgOwogICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09ICJudW1iZXIiKQogICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHkgZXF1YWwgdG8gYCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYCA6IGBncmVhdGVyIHRoYW4gYH0ke2lzc3VlLm1pbmltdW19YDsKICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSAiZGF0ZSIpCiAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHkgZXF1YWwgdG8gYCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYCA6IGBncmVhdGVyIHRoYW4gYH0ke25ldyBEYXRlKE51bWJlcihpc3N1ZS5taW5pbXVtKSl9YDsKICAgICAgICBlbHNlCiAgICAgICAgICBtZXNzYWdlID0gIkludmFsaWQgaW5wdXQiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFpvZElzc3VlQ29kZS50b29fYmlnOgogICAgICAgIGlmIChpc3N1ZS50eXBlID09PSAiYXJyYXkiKQogICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBtb3N0YCA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19IGVsZW1lbnQocylgOwogICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09ICJzdHJpbmciKQogICAgICAgICAgbWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbW9zdGAgOiBgdW5kZXJgfSAke2lzc3VlLm1heGltdW19IGNoYXJhY3RlcihzKWA7CiAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gIm51bWJlciIpCiAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvYCA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19YDsKICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSAiYmlnaW50IikKICAgICAgICAgIG1lc3NhZ2UgPSBgQmlnSW50IG11c3QgYmUgJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBsZXNzIHRoYW4gb3IgZXF1YWwgdG9gIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX1gOwogICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09ICJkYXRlIikKICAgICAgICAgIG1lc3NhZ2UgPSBgRGF0ZSBtdXN0IGJlICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvYCA6IGBzbWFsbGVyIHRoYW5gfSAke25ldyBEYXRlKE51bWJlcihpc3N1ZS5tYXhpbXVtKSl9YDsKICAgICAgICBlbHNlCiAgICAgICAgICBtZXNzYWdlID0gIkludmFsaWQgaW5wdXQiOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFpvZElzc3VlQ29kZS5jdXN0b206CiAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0YDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXM6CiAgICAgICAgbWVzc2FnZSA9IGBJbnRlcnNlY3Rpb24gcmVzdWx0cyBjb3VsZCBub3QgYmUgbWVyZ2VkYDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mOgogICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAke2lzc3VlLm11bHRpcGxlT2Z9YDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBab2RJc3N1ZUNvZGUubm90X2Zpbml0ZToKICAgICAgICBtZXNzYWdlID0gIk51bWJlciBtdXN0IGJlIGZpbml0ZSI7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgbWVzc2FnZSA9IF9jdHguZGVmYXVsdEVycm9yOwogICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUpOwogICAgfQogICAgcmV0dXJuIHsgbWVzc2FnZSB9OwogIH07CiAgbGV0IG92ZXJyaWRlRXJyb3JNYXAgPSBlcnJvck1hcDsKICBmdW5jdGlvbiBzZXRFcnJvck1hcChtYXApIHsKICAgIG92ZXJyaWRlRXJyb3JNYXAgPSBtYXA7CiAgfQogIGZ1bmN0aW9uIGdldEVycm9yTWFwKCkgewogICAgcmV0dXJuIG92ZXJyaWRlRXJyb3JNYXA7CiAgfQogIGNvbnN0IG1ha2VJc3N1ZSA9IChwYXJhbXMpID0+IHsKICAgIGNvbnN0IHsgZGF0YSwgcGF0aCwgZXJyb3JNYXBzLCBpc3N1ZURhdGEgfSA9IHBhcmFtczsKICAgIGNvbnN0IGZ1bGxQYXRoID0gWy4uLnBhdGgsIC4uLmlzc3VlRGF0YS5wYXRoIHx8IFtdXTsKICAgIGNvbnN0IGZ1bGxJc3N1ZSA9IHsKICAgICAgLi4uaXNzdWVEYXRhLAogICAgICBwYXRoOiBmdWxsUGF0aAogICAgfTsKICAgIGlmIChpc3N1ZURhdGEubWVzc2FnZSAhPT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgLi4uaXNzdWVEYXRhLAogICAgICAgIHBhdGg6IGZ1bGxQYXRoLAogICAgICAgIG1lc3NhZ2U6IGlzc3VlRGF0YS5tZXNzYWdlCiAgICAgIH07CiAgICB9CiAgICBsZXQgZXJyb3JNZXNzYWdlID0gIiI7CiAgICBjb25zdCBtYXBzID0gZXJyb3JNYXBzLmZpbHRlcigobTIpID0+ICEhbTIpLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgZm9yIChjb25zdCBtYXAgb2YgbWFwcykgewogICAgICBlcnJvck1lc3NhZ2UgPSBtYXAoZnVsbElzc3VlLCB7IGRhdGEsIGRlZmF1bHRFcnJvcjogZXJyb3JNZXNzYWdlIH0pLm1lc3NhZ2U7CiAgICB9CiAgICByZXR1cm4gewogICAgICAuLi5pc3N1ZURhdGEsCiAgICAgIHBhdGg6IGZ1bGxQYXRoLAogICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UKICAgIH07CiAgfTsKICBjb25zdCBFTVBUWV9QQVRIID0gW107CiAgZnVuY3Rpb24gYWRkSXNzdWVUb0NvbnRleHQoY3R4LCBpc3N1ZURhdGEpIHsKICAgIGNvbnN0IG92ZXJyaWRlTWFwID0gZ2V0RXJyb3JNYXAoKTsKICAgIGNvbnN0IGlzc3VlID0gbWFrZUlzc3VlKHsKICAgICAgaXNzdWVEYXRhLAogICAgICBkYXRhOiBjdHguZGF0YSwKICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgIGVycm9yTWFwczogWwogICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLAogICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCwKICAgICAgICBvdmVycmlkZU1hcCwKICAgICAgICBvdmVycmlkZU1hcCA9PT0gZXJyb3JNYXAgPyB2b2lkIDAgOiBlcnJvck1hcAogICAgICAgIC8vIHRoZW4gZ2xvYmFsIGRlZmF1bHQgbWFwCiAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpCiAgICB9KTsKICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goaXNzdWUpOwogIH0KICBjbGFzcyBQYXJzZVN0YXR1cyB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgdGhpcy52YWx1ZSA9ICJ2YWxpZCI7CiAgICB9CiAgICBkaXJ0eSgpIHsKICAgICAgaWYgKHRoaXMudmFsdWUgPT09ICJ2YWxpZCIpCiAgICAgICAgdGhpcy52YWx1ZSA9ICJkaXJ0eSI7CiAgICB9CiAgICBhYm9ydCgpIHsKICAgICAgaWYgKHRoaXMudmFsdWUgIT09ICJhYm9ydGVkIikKICAgICAgICB0aGlzLnZhbHVlID0gImFib3J0ZWQiOwogICAgfQogICAgc3RhdGljIG1lcmdlQXJyYXkoc3RhdHVzLCByZXN1bHRzKSB7CiAgICAgIGNvbnN0IGFycmF5VmFsdWUgPSBbXTsKICAgICAgZm9yIChjb25zdCBzMiBvZiByZXN1bHRzKSB7CiAgICAgICAgaWYgKHMyLnN0YXR1cyA9PT0gImFib3J0ZWQiKQogICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgaWYgKHMyLnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgIGFycmF5VmFsdWUucHVzaChzMi52YWx1ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBhcnJheVZhbHVlIH07CiAgICB9CiAgICBzdGF0aWMgYXN5bmMgbWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKSB7CiAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdOwogICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHsKICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTsKICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7CiAgICAgICAgc3luY1BhaXJzLnB1c2goewogICAgICAgICAga2V5LAogICAgICAgICAgdmFsdWUKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgc3luY1BhaXJzKTsKICAgIH0KICAgIHN0YXRpYyBtZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycykgewogICAgICBjb25zdCBmaW5hbE9iamVjdCA9IHt9OwogICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHsKICAgICAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IHBhaXI7CiAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09ICJhYm9ydGVkIikKICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09ICJhYm9ydGVkIikKICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgIGlmIChrZXkuc3RhdHVzID09PSAiZGlydHkiKQogICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgaWYgKHZhbHVlLnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgIGlmIChrZXkudmFsdWUgIT09ICJfX3Byb3RvX18iICYmICh0eXBlb2YgdmFsdWUudmFsdWUgIT09ICJ1bmRlZmluZWQiIHx8IHBhaXIuYWx3YXlzU2V0KSkgewogICAgICAgICAgZmluYWxPYmplY3Rba2V5LnZhbHVlXSA9IHZhbHVlLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsT2JqZWN0IH07CiAgICB9CiAgfQogIGNvbnN0IElOVkFMSUQgPSBPYmplY3QuZnJlZXplKHsKICAgIHN0YXR1czogImFib3J0ZWQiCiAgfSk7CiAgY29uc3QgRElSVFkgPSAodmFsdWUpID0+ICh7IHN0YXR1czogImRpcnR5IiwgdmFsdWUgfSk7CiAgY29uc3QgT0sgPSAodmFsdWUpID0+ICh7IHN0YXR1czogInZhbGlkIiwgdmFsdWUgfSk7CiAgY29uc3QgaXNBYm9ydGVkID0gKHgpID0+IHguc3RhdHVzID09PSAiYWJvcnRlZCI7CiAgY29uc3QgaXNEaXJ0eSA9ICh4KSA9PiB4LnN0YXR1cyA9PT0gImRpcnR5IjsKICBjb25zdCBpc1ZhbGlkID0gKHgpID0+IHguc3RhdHVzID09PSAidmFsaWQiOwogIGNvbnN0IGlzQXN5bmMgPSAoeCkgPT4gdHlwZW9mIFByb21pc2UgIT09ICJ1bmRlZmluZWQiICYmIHggaW5zdGFuY2VvZiBQcm9taXNlOwogIGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmMikgewogICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZjIgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0Iik7CiAgICByZXR1cm4gc3RhdGUuZ2V0KHJlY2VpdmVyKTsKICB9CiAgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmMikgewogICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gImZ1bmN0aW9uIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZjIgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXQiKTsKICAgIHJldHVybiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSwgdmFsdWU7CiAgfQogIHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09ICJmdW5jdGlvbiIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbihlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkgewogICAgdmFyIGUyID0gbmV3IEVycm9yKG1lc3NhZ2UpOwogICAgcmV0dXJuIGUyLm5hbWUgPSAiU3VwcHJlc3NlZEVycm9yIiwgZTIuZXJyb3IgPSBlcnJvciwgZTIuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGUyOwogIH07CiAgdmFyIGVycm9yVXRpbDsKICAoZnVuY3Rpb24oZXJyb3JVdGlsMikgewogICAgZXJyb3JVdGlsMi5lcnJUb09iaiA9IChtZXNzYWdlKSA9PiB0eXBlb2YgbWVzc2FnZSA9PT0gInN0cmluZyIgPyB7IG1lc3NhZ2UgfSA6IG1lc3NhZ2UgfHwge307CiAgICBlcnJvclV0aWwyLnRvU3RyaW5nID0gKG1lc3NhZ2UpID0+IHR5cGVvZiBtZXNzYWdlID09PSAic3RyaW5nIiA/IG1lc3NhZ2UgOiBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UubWVzc2FnZTsKICB9KShlcnJvclV0aWwgfHwgKGVycm9yVXRpbCA9IHt9KSk7CiAgdmFyIF9ab2RFbnVtX2NhY2hlLCBfWm9kTmF0aXZlRW51bV9jYWNoZTsKICBjbGFzcyBQYXJzZUlucHV0TGF6eVBhdGggewogICAgY29uc3RydWN0b3IocGFyZW50LCB2YWx1ZSwgcGF0aCwga2V5KSB7CiAgICAgIHRoaXMuX2NhY2hlZFBhdGggPSBbXTsKICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIHRoaXMuZGF0YSA9IHZhbHVlOwogICAgICB0aGlzLl9wYXRoID0gcGF0aDsKICAgICAgdGhpcy5fa2V5ID0ga2V5OwogICAgfQogICAgZ2V0IHBhdGgoKSB7CiAgICAgIGlmICghdGhpcy5fY2FjaGVkUGF0aC5sZW5ndGgpIHsKICAgICAgICBpZiAodGhpcy5fa2V5IGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCAuLi50aGlzLl9rZXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgdGhpcy5fa2V5KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFBhdGg7CiAgICB9CiAgfQogIGNvbnN0IGhhbmRsZVJlc3VsdCA9IChjdHgsIHJlc3VsdCkgPT4gewogICAgaWYgKGlzVmFsaWQocmVzdWx0KSkgewogICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHQudmFsdWUgfTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLiIpOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgc3VjY2VzczogZmFsc2UsCiAgICAgICAgZ2V0IGVycm9yKCkgewogICAgICAgICAgaWYgKHRoaXMuX2Vycm9yKQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7CiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihjdHguY29tbW9uLmlzc3Vlcyk7CiAgICAgICAgICB0aGlzLl9lcnJvciA9IGVycm9yOwogICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIHByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSB7CiAgICBpZiAoIXBhcmFtcykKICAgICAgcmV0dXJuIHt9OwogICAgY29uc3QgeyBlcnJvck1hcDogZXJyb3JNYXAyLCBpbnZhbGlkX3R5cGVfZXJyb3IsIHJlcXVpcmVkX2Vycm9yLCBkZXNjcmlwdGlvbiB9ID0gcGFyYW1zOwogICAgaWYgKGVycm9yTWFwMiAmJiAoaW52YWxpZF90eXBlX2Vycm9yIHx8IHJlcXVpcmVkX2Vycm9yKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHVzZSAiaW52YWxpZF90eXBlX2Vycm9yIiBvciAicmVxdWlyZWRfZXJyb3IiIGluIGNvbmp1bmN0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1hcC5gKTsKICAgIH0KICAgIGlmIChlcnJvck1hcDIpCiAgICAgIHJldHVybiB7IGVycm9yTWFwOiBlcnJvck1hcDIsIGRlc2NyaXB0aW9uIH07CiAgICBjb25zdCBjdXN0b21NYXAgPSAoaXNzLCBjdHgpID0+IHsKICAgICAgdmFyIF9hLCBfYjsKICAgICAgY29uc3QgeyBtZXNzYWdlIH0gPSBwYXJhbXM7CiAgICAgIGlmIChpc3MuY29kZSA9PT0gImludmFsaWRfZW51bV92YWx1ZSIpIHsKICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBtZXNzYWdlICE9PSBudWxsICYmIG1lc3NhZ2UgIT09IHZvaWQgMCA/IG1lc3NhZ2UgOiBjdHguZGVmYXVsdEVycm9yIH07CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBjdHguZGF0YSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICByZXR1cm4geyBtZXNzYWdlOiAoX2EgPSBtZXNzYWdlICE9PSBudWxsICYmIG1lc3NhZ2UgIT09IHZvaWQgMCA/IG1lc3NhZ2UgOiByZXF1aXJlZF9lcnJvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY3R4LmRlZmF1bHRFcnJvciB9OwogICAgICB9CiAgICAgIGlmIChpc3MuY29kZSAhPT0gImludmFsaWRfdHlwZSIpCiAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogY3R4LmRlZmF1bHRFcnJvciB9OwogICAgICByZXR1cm4geyBtZXNzYWdlOiAoX2IgPSBtZXNzYWdlICE9PSBudWxsICYmIG1lc3NhZ2UgIT09IHZvaWQgMCA/IG1lc3NhZ2UgOiBpbnZhbGlkX3R5cGVfZXJyb3IpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGN0eC5kZWZhdWx0RXJyb3IgfTsKICAgIH07CiAgICByZXR1cm4geyBlcnJvck1hcDogY3VzdG9tTWFwLCBkZXNjcmlwdGlvbiB9OwogIH0KICBjbGFzcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKGRlZikgewogICAgICB0aGlzLnNwYSA9IHRoaXMuc2FmZVBhcnNlQXN5bmM7CiAgICAgIHRoaXMuX2RlZiA9IGRlZjsKICAgICAgdGhpcy5wYXJzZSA9IHRoaXMucGFyc2UuYmluZCh0aGlzKTsKICAgICAgdGhpcy5zYWZlUGFyc2UgPSB0aGlzLnNhZmVQYXJzZS5iaW5kKHRoaXMpOwogICAgICB0aGlzLnBhcnNlQXN5bmMgPSB0aGlzLnBhcnNlQXN5bmMuYmluZCh0aGlzKTsKICAgICAgdGhpcy5zYWZlUGFyc2VBc3luYyA9IHRoaXMuc2FmZVBhcnNlQXN5bmMuYmluZCh0aGlzKTsKICAgICAgdGhpcy5zcGEgPSB0aGlzLnNwYS5iaW5kKHRoaXMpOwogICAgICB0aGlzLnJlZmluZSA9IHRoaXMucmVmaW5lLmJpbmQodGhpcyk7CiAgICAgIHRoaXMucmVmaW5lbWVudCA9IHRoaXMucmVmaW5lbWVudC5iaW5kKHRoaXMpOwogICAgICB0aGlzLnN1cGVyUmVmaW5lID0gdGhpcy5zdXBlclJlZmluZS5iaW5kKHRoaXMpOwogICAgICB0aGlzLm9wdGlvbmFsID0gdGhpcy5vcHRpb25hbC5iaW5kKHRoaXMpOwogICAgICB0aGlzLm51bGxhYmxlID0gdGhpcy5udWxsYWJsZS5iaW5kKHRoaXMpOwogICAgICB0aGlzLm51bGxpc2ggPSB0aGlzLm51bGxpc2guYmluZCh0aGlzKTsKICAgICAgdGhpcy5hcnJheSA9IHRoaXMuYXJyYXkuYmluZCh0aGlzKTsKICAgICAgdGhpcy5wcm9taXNlID0gdGhpcy5wcm9taXNlLmJpbmQodGhpcyk7CiAgICAgIHRoaXMub3IgPSB0aGlzLm9yLmJpbmQodGhpcyk7CiAgICAgIHRoaXMuYW5kID0gdGhpcy5hbmQuYmluZCh0aGlzKTsKICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybS5iaW5kKHRoaXMpOwogICAgICB0aGlzLmJyYW5kID0gdGhpcy5icmFuZC5iaW5kKHRoaXMpOwogICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlZmF1bHQuYmluZCh0aGlzKTsKICAgICAgdGhpcy5jYXRjaCA9IHRoaXMuY2F0Y2guYmluZCh0aGlzKTsKICAgICAgdGhpcy5kZXNjcmliZSA9IHRoaXMuZGVzY3JpYmUuYmluZCh0aGlzKTsKICAgICAgdGhpcy5waXBlID0gdGhpcy5waXBlLmJpbmQodGhpcyk7CiAgICAgIHRoaXMucmVhZG9ubHkgPSB0aGlzLnJlYWRvbmx5LmJpbmQodGhpcyk7CiAgICAgIHRoaXMuaXNOdWxsYWJsZSA9IHRoaXMuaXNOdWxsYWJsZS5iaW5kKHRoaXMpOwogICAgICB0aGlzLmlzT3B0aW9uYWwgPSB0aGlzLmlzT3B0aW9uYWwuYmluZCh0aGlzKTsKICAgIH0KICAgIGdldCBkZXNjcmlwdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kZXNjcmlwdGlvbjsKICAgIH0KICAgIF9nZXRUeXBlKGlucHV0KSB7CiAgICAgIHJldHVybiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpOwogICAgfQogICAgX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpIHsKICAgICAgcmV0dXJuIGN0eCB8fCB7CiAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLAogICAgICAgIGRhdGE6IGlucHV0LmRhdGEsCiAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKSwKICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLAogICAgICAgIHBhdGg6IGlucHV0LnBhdGgsCiAgICAgICAgcGFyZW50OiBpbnB1dC5wYXJlbnQKICAgICAgfTsKICAgIH0KICAgIF9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBzdGF0dXM6IG5ldyBQYXJzZVN0YXR1cygpLAogICAgICAgIGN0eDogewogICAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLAogICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSwKICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoaW5wdXQuZGF0YSksCiAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLAogICAgICAgICAgcGF0aDogaW5wdXQucGF0aCwKICAgICAgICAgIHBhcmVudDogaW5wdXQucGFyZW50CiAgICAgICAgfQogICAgICB9OwogICAgfQogICAgX3BhcnNlU3luYyhpbnB1dCkgewogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZShpbnB1dCk7CiAgICAgIGlmIChpc0FzeW5jKHJlc3VsdCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN5bmNocm9ub3VzIHBhcnNlIGVuY291bnRlcmVkIHByb21pc2UuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIF9wYXJzZUFzeW5jKGlucHV0KSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlKGlucHV0KTsKICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpOwogICAgfQogICAgcGFyc2UoZGF0YSwgcGFyYW1zKSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2FmZVBhcnNlKGRhdGEsIHBhcmFtcyk7CiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykKICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7CiAgICAgIHRocm93IHJlc3VsdC5lcnJvcjsKICAgIH0KICAgIHNhZmVQYXJzZShkYXRhLCBwYXJhbXMpIHsKICAgICAgdmFyIF9hOwogICAgICBjb25zdCBjdHggPSB7CiAgICAgICAgY29tbW9uOiB7CiAgICAgICAgICBpc3N1ZXM6IFtdLAogICAgICAgICAgYXN5bmM6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5hc3luYykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsCiAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcAogICAgICAgIH0sCiAgICAgICAgcGF0aDogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYXRoKSB8fCBbXSwKICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLAogICAgICAgIHBhcmVudDogbnVsbCwKICAgICAgICBkYXRhLAogICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoZGF0YSkKICAgICAgfTsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VTeW5jKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pOwogICAgICByZXR1cm4gaGFuZGxlUmVzdWx0KGN0eCwgcmVzdWx0KTsKICAgIH0KICAgIGFzeW5jIHBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKTsKICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKQogICAgICAgIHJldHVybiByZXN1bHQuZGF0YTsKICAgICAgdGhyb3cgcmVzdWx0LmVycm9yOwogICAgfQogICAgYXN5bmMgc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7CiAgICAgIGNvbnN0IGN0eCA9IHsKICAgICAgICBjb21tb246IHsKICAgICAgICAgIGlzc3VlczogW10sCiAgICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5lcnJvck1hcCwKICAgICAgICAgIGFzeW5jOiB0cnVlCiAgICAgICAgfSwKICAgICAgICBwYXRoOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLnBhdGgpIHx8IFtdLAogICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsCiAgICAgICAgcGFyZW50OiBudWxsLAogICAgICAgIGRhdGEsCiAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShkYXRhKQogICAgICB9OwogICAgICBjb25zdCBtYXliZUFzeW5jUmVzdWx0ID0gdGhpcy5fcGFyc2UoeyBkYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7CiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChpc0FzeW5jKG1heWJlQXN5bmNSZXN1bHQpID8gbWF5YmVBc3luY1Jlc3VsdCA6IFByb21pc2UucmVzb2x2ZShtYXliZUFzeW5jUmVzdWx0KSk7CiAgICAgIHJldHVybiBoYW5kbGVSZXN1bHQoY3R4LCByZXN1bHQpOwogICAgfQogICAgcmVmaW5lKGNoZWNrLCBtZXNzYWdlKSB7CiAgICAgIGNvbnN0IGdldElzc3VlUHJvcGVydGllcyA9ICh2YWwpID0+IHsKICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICJzdHJpbmciIHx8IHR5cGVvZiBtZXNzYWdlID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgcmV0dXJuIHsgbWVzc2FnZSB9OwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHJldHVybiBtZXNzYWdlKHZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2sodmFsKTsKICAgICAgICBjb25zdCBzZXRFcnJvciA9ICgpID0+IGN0eC5hZGRJc3N1ZSh7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuY3VzdG9tLAogICAgICAgICAgLi4uZ2V0SXNzdWVQcm9wZXJ0aWVzKHZhbCkKICAgICAgICB9KTsKICAgICAgICBpZiAodHlwZW9mIFByb21pc2UgIT09ICJ1bmRlZmluZWQiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigoZGF0YSkgPT4gewogICAgICAgICAgICBpZiAoIWRhdGEpIHsKICAgICAgICAgICAgICBzZXRFcnJvcigpOwogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICBzZXRFcnJvcigpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgcmVmaW5lbWVudChjaGVjaywgcmVmaW5lbWVudERhdGEpIHsKICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7CiAgICAgICAgaWYgKCFjaGVjayh2YWwpKSB7CiAgICAgICAgICBjdHguYWRkSXNzdWUodHlwZW9mIHJlZmluZW1lbnREYXRhID09PSAiZnVuY3Rpb24iID8gcmVmaW5lbWVudERhdGEodmFsLCBjdHgpIDogcmVmaW5lbWVudERhdGEpOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogICAgX3JlZmluZW1lbnQocmVmaW5lbWVudCkgewogICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoewogICAgICAgIHNjaGVtYTogdGhpcywKICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsCiAgICAgICAgZWZmZWN0OiB7IHR5cGU6ICJyZWZpbmVtZW50IiwgcmVmaW5lbWVudCB9CiAgICAgIH0pOwogICAgfQogICAgc3VwZXJSZWZpbmUocmVmaW5lbWVudCkgewogICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudChyZWZpbmVtZW50KTsKICAgIH0KICAgIG9wdGlvbmFsKCkgewogICAgICByZXR1cm4gWm9kT3B0aW9uYWwuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7CiAgICB9CiAgICBudWxsYWJsZSgpIHsKICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpOwogICAgfQogICAgbnVsbGlzaCgpIHsKICAgICAgcmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpOwogICAgfQogICAgYXJyYXkoKSB7CiAgICAgIHJldHVybiBab2RBcnJheS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTsKICAgIH0KICAgIHByb21pc2UoKSB7CiAgICAgIHJldHVybiBab2RQcm9taXNlLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpOwogICAgfQogICAgb3Iob3B0aW9uKSB7CiAgICAgIHJldHVybiBab2RVbmlvbi5jcmVhdGUoW3RoaXMsIG9wdGlvbl0sIHRoaXMuX2RlZik7CiAgICB9CiAgICBhbmQoaW5jb21pbmcpIHsKICAgICAgcmV0dXJuIFpvZEludGVyc2VjdGlvbi5jcmVhdGUodGhpcywgaW5jb21pbmcsIHRoaXMuX2RlZik7CiAgICB9CiAgICB0cmFuc2Zvcm0odHJhbnNmb3JtKSB7CiAgICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7CiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLAogICAgICAgIHNjaGVtYTogdGhpcywKICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsCiAgICAgICAgZWZmZWN0OiB7IHR5cGU6ICJ0cmFuc2Zvcm0iLCB0cmFuc2Zvcm0gfQogICAgICB9KTsKICAgIH0KICAgIGRlZmF1bHQoZGVmKSB7CiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZUZ1bmMgPSB0eXBlb2YgZGVmID09PSAiZnVuY3Rpb24iID8gZGVmIDogKCkgPT4gZGVmOwogICAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoewogICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSwKICAgICAgICBpbm5lclR5cGU6IHRoaXMsCiAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWVGdW5jLAogICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdAogICAgICB9KTsKICAgIH0KICAgIGJyYW5kKCkgewogICAgICByZXR1cm4gbmV3IFpvZEJyYW5kZWQoewogICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQnJhbmRlZCwKICAgICAgICB0eXBlOiB0aGlzLAogICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKQogICAgICB9KTsKICAgIH0KICAgIGNhdGNoKGRlZikgewogICAgICBjb25zdCBjYXRjaFZhbHVlRnVuYyA9IHR5cGVvZiBkZWYgPT09ICJmdW5jdGlvbiIgPyBkZWYgOiAoKSA9PiBkZWY7CiAgICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goewogICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSwKICAgICAgICBpbm5lclR5cGU6IHRoaXMsCiAgICAgICAgY2F0Y2hWYWx1ZTogY2F0Y2hWYWx1ZUZ1bmMsCiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RDYXRjaAogICAgICB9KTsKICAgIH0KICAgIGRlc2NyaWJlKGRlc2NyaXB0aW9uKSB7CiAgICAgIGNvbnN0IFRoaXMgPSB0aGlzLmNvbnN0cnVjdG9yOwogICAgICByZXR1cm4gbmV3IFRoaXMoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBkZXNjcmlwdGlvbgogICAgICB9KTsKICAgIH0KICAgIHBpcGUodGFyZ2V0KSB7CiAgICAgIHJldHVybiBab2RQaXBlbGluZS5jcmVhdGUodGhpcywgdGFyZ2V0KTsKICAgIH0KICAgIHJlYWRvbmx5KCkgewogICAgICByZXR1cm4gWm9kUmVhZG9ubHkuY3JlYXRlKHRoaXMpOwogICAgfQogICAgaXNPcHRpb25hbCgpIHsKICAgICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKHZvaWQgMCkuc3VjY2VzczsKICAgIH0KICAgIGlzTnVsbGFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzOwogICAgfQogIH0KICBjb25zdCBjdWlkUmVnZXggPSAvXmNbXlxzLV17OCx9JC9pOwogIGNvbnN0IGN1aWQyUmVnZXggPSAvXlswLTlhLXpdKyQvOwogIGNvbnN0IHVsaWRSZWdleCA9IC9eWzAtOUEtSEpLTU5QLVRWLVpdezI2fSQvOwogIGNvbnN0IHV1aWRSZWdleCA9IC9eWzAtOWEtZkEtRl17OH1cYi1bMC05YS1mQS1GXXs0fVxiLVswLTlhLWZBLUZdezR9XGItWzAtOWEtZkEtRl17NH1cYi1bMC05YS1mQS1GXXsxMn0kL2k7CiAgY29uc3QgbmFub2lkUmVnZXggPSAvXlthLXowLTlfLV17MjF9JC9pOwogIGNvbnN0IGR1cmF0aW9uUmVnZXggPSAvXlstK10/UCg/ISQpKD86KD86Wy0rXT9cZCtZKXwoPzpbLStdP1xkK1suLF1cZCtZJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzooPzpbLStdP1xkK1cpfCg/OlstK10/XGQrWy4sXVxkK1ckKSk/KD86KD86Wy0rXT9cZCtEKXwoPzpbLStdP1xkK1suLF1cZCtEJCkpPyg/OlQoPz1bXGQrLV0pKD86KD86Wy0rXT9cZCtIKXwoPzpbLStdP1xkK1suLF1cZCtIJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzpbLStdP1xkKyg/OlsuLF1cZCspP1MpPyk/PyQvOwogIGNvbnN0IGVtYWlsUmVnZXggPSAvXig/IVwuKSg/IS4qXC5cLikoW0EtWjAtOV8nK1wtXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XC1dKlwuKStbQS1aXXsyLH0kL2k7CiAgY29uc3QgX2Vtb2ppUmVnZXggPSBgXihcXHB7RXh0ZW5kZWRfUGljdG9ncmFwaGljfXxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7CiAgbGV0IGVtb2ppUmVnZXg7CiAgY29uc3QgaXB2NFJlZ2V4ID0gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSQvOwogIGNvbnN0IGlwdjZSZWdleCA9IC9eKChbYS1mMC05XXsxLDR9Oil7N318OjooW2EtZjAtOV17MSw0fTopezAsNn18KFthLWYwLTldezEsNH06KXsxfTooW2EtZjAtOV17MSw0fTopezAsNX18KFthLWYwLTldezEsNH06KXsyfTooW2EtZjAtOV17MSw0fTopezAsNH18KFthLWYwLTldezEsNH06KXszfTooW2EtZjAtOV17MSw0fTopezAsM318KFthLWYwLTldezEsNH06KXs0fTooW2EtZjAtOV17MSw0fTopezAsMn18KFthLWYwLTldezEsNH06KXs1fTooW2EtZjAtOV17MSw0fTopezAsMX0pKFthLWYwLTldezEsNH18KCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSkpJC87CiAgY29uc3QgYmFzZTY0UmVnZXggPSAvXihbMC05YS16QS1aKy9dezR9KSooKFswLTlhLXpBLVorL117Mn09PSl8KFswLTlhLXpBLVorL117M309KSk/JC87CiAgY29uc3QgZGF0ZVJlZ2V4U291cmNlID0gYCgoXFxkXFxkWzI0NjhdWzA0OF18XFxkXFxkWzEzNTc5XVsyNl18XFxkXFxkMFs0OF18WzAyNDY4XVswNDhdMDB8WzEzNTc5XVsyNl0wMCktMDItMjl8XFxkezR9LSgoMFsxMzU3OF18MVswMl0pLSgwWzEtOV18WzEyXVxcZHwzWzAxXSl8KDBbNDY5XXwxMSktKDBbMS05XXxbMTJdXFxkfDMwKXwoMDIpLSgwWzEtOV18MVxcZHwyWzAtOF0pKSlgOwogIGNvbnN0IGRhdGVSZWdleCA9IG5ldyBSZWdFeHAoYF4ke2RhdGVSZWdleFNvdXJjZX0kYCk7CiAgZnVuY3Rpb24gdGltZVJlZ2V4U291cmNlKGFyZ3MpIHsKICAgIGxldCByZWdleCA9IGAoWzAxXVxcZHwyWzAtM10pOlswLTVdXFxkOlswLTVdXFxkYDsKICAgIGlmIChhcmdzLnByZWNpc2lvbikgewogICAgICByZWdleCA9IGAke3JlZ2V4fVxcLlxcZHske2FyZ3MucHJlY2lzaW9ufX1gOwogICAgfSBlbHNlIGlmIChhcmdzLnByZWNpc2lvbiA9PSBudWxsKSB7CiAgICAgIHJlZ2V4ID0gYCR7cmVnZXh9KFxcLlxcZCspP2A7CiAgICB9CiAgICByZXR1cm4gcmVnZXg7CiAgfQogIGZ1bmN0aW9uIHRpbWVSZWdleChhcmdzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7dGltZVJlZ2V4U291cmNlKGFyZ3MpfSRgKTsKICB9CiAgZnVuY3Rpb24gZGF0ZXRpbWVSZWdleChhcmdzKSB7CiAgICBsZXQgcmVnZXggPSBgJHtkYXRlUmVnZXhTb3VyY2V9VCR7dGltZVJlZ2V4U291cmNlKGFyZ3MpfWA7CiAgICBjb25zdCBvcHRzID0gW107CiAgICBvcHRzLnB1c2goYXJncy5sb2NhbCA/IGBaP2AgOiBgWmApOwogICAgaWYgKGFyZ3Mub2Zmc2V0KQogICAgICBvcHRzLnB1c2goYChbKy1dXFxkezJ9Oj9cXGR7Mn0pYCk7CiAgICByZWdleCA9IGAke3JlZ2V4fSgke29wdHMuam9pbigifCIpfSlgOwogICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4fSRgKTsKICB9CiAgZnVuY3Rpb24gaXNWYWxpZElQKGlwLCB2ZXJzaW9uKSB7CiAgICBpZiAoKHZlcnNpb24gPT09ICJ2NCIgfHwgIXZlcnNpb24pICYmIGlwdjRSZWdleC50ZXN0KGlwKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGlmICgodmVyc2lvbiA9PT0gInY2IiB8fCAhdmVyc2lvbikgJiYgaXB2NlJlZ2V4LnRlc3QoaXApKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBjbGFzcyBab2RTdHJpbmcgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkgewogICAgICAgIGlucHV0LmRhdGEgPSBTdHJpbmcoaW5wdXQuZGF0YSk7CiAgICAgIH0KICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpOwogICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcpIHsKICAgICAgICBjb25zdCBjdHgyID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpOwogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eDIsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsCiAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zdHJpbmcsCiAgICAgICAgICByZWNlaXZlZDogY3R4Mi5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7CiAgICAgIGxldCBjdHggPSB2b2lkIDA7CiAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykgewogICAgICAgIGlmIChjaGVjay5raW5kID09PSAibWluIikgewogICAgICAgICAgaWYgKGlucHV0LmRhdGEubGVuZ3RoIDwgY2hlY2sudmFsdWUpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsCiAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPiBjaGVjay52YWx1ZSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsCiAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgdHlwZTogInN0cmluZyIsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJsZW5ndGgiKSB7CiAgICAgICAgICBjb25zdCB0b29CaWcgPSBpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlOwogICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlOwogICAgICAgICAgaWYgKHRvb0JpZyB8fCB0b29TbWFsbCkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgaWYgKHRvb0JpZykgewogICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsCiAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSwKICAgICAgICAgICAgICAgIHR5cGU6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9vU21hbGwpIHsKICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsCiAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSwKICAgICAgICAgICAgICAgIHR5cGU6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiZW1haWwiKSB7CiAgICAgICAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogImVtYWlsIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiZW1vamkiKSB7CiAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgpIHsKICAgICAgICAgICAgZW1vamlSZWdleCA9IG5ldyBSZWdFeHAoX2Vtb2ppUmVnZXgsICJ1Iik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogImVtb2ppIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAidXVpZCIpIHsKICAgICAgICAgIGlmICghdXVpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJ1dWlkIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAibmFub2lkIikgewogICAgICAgICAgaWYgKCFuYW5vaWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICB2YWxpZGF0aW9uOiAibmFub2lkIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiY3VpZCIpIHsKICAgICAgICAgIGlmICghY3VpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJjdWlkIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiY3VpZDIiKSB7CiAgICAgICAgICBpZiAoIWN1aWQyUmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogImN1aWQyIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAidWxpZCIpIHsKICAgICAgICAgIGlmICghdWxpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJ1bGlkIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAidXJsIikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbmV3IFVSTChpbnB1dC5kYXRhKTsKICAgICAgICAgIH0gY2F0Y2ggKF9hKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICB2YWxpZGF0aW9uOiAidXJsIiwKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAicmVnZXgiKSB7CiAgICAgICAgICBjaGVjay5yZWdleC5sYXN0SW5kZXggPSAwOwogICAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IGNoZWNrLnJlZ2V4LnRlc3QoaW5wdXQuZGF0YSk7CiAgICAgICAgICBpZiAoIXRlc3RSZXN1bHQpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJyZWdleCIsCiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gInRyaW0iKSB7CiAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50cmltKCk7CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiaW5jbHVkZXMiKSB7CiAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuaW5jbHVkZXMoY2hlY2sudmFsdWUsIGNoZWNrLnBvc2l0aW9uKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgaW5jbHVkZXM6IGNoZWNrLnZhbHVlLCBwb3NpdGlvbjogY2hlY2sucG9zaXRpb24gfSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJ0b0xvd2VyQ2FzZSIpIHsKICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAidG9VcHBlckNhc2UiKSB7CiAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b1VwcGVyQ2FzZSgpOwogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gInN0YXJ0c1dpdGgiKSB7CiAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuc3RhcnRzV2l0aChjaGVjay52YWx1ZSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZywKICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IHN0YXJ0c1dpdGg6IGNoZWNrLnZhbHVlIH0sCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAiZW5kc1dpdGgiKSB7CiAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuZW5kc1dpdGgoY2hlY2sudmFsdWUpKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBlbmRzV2l0aDogY2hlY2sudmFsdWUgfSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJkYXRldGltZSIpIHsKICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gZGF0ZXRpbWVSZWdleChjaGVjayk7CiAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZywKICAgICAgICAgICAgICB2YWxpZGF0aW9uOiAiZGF0ZXRpbWUiLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gImRhdGUiKSB7CiAgICAgICAgICBjb25zdCByZWdleCA9IGRhdGVSZWdleDsKICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJkYXRlIiwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJ0aW1lIikgewogICAgICAgICAgY29uc3QgcmVnZXggPSB0aW1lUmVnZXgoY2hlY2spOwogICAgICAgICAgaWYgKCFyZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsCiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogInRpbWUiLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gImR1cmF0aW9uIikgewogICAgICAgICAgaWYgKCFkdXJhdGlvblJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJkdXJhdGlvbiIsCiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gImlwIikgewogICAgICAgICAgaWYgKCFpc1ZhbGlkSVAoaW5wdXQuZGF0YSwgY2hlY2sudmVyc2lvbikpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIHZhbGlkYXRpb246ICJpcCIsCiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gImJhc2U2NCIpIHsKICAgICAgICAgIGlmICghYmFzZTY0UmVnZXgudGVzdChpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgdmFsaWRhdGlvbjogImJhc2U2NCIsCiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07CiAgICB9CiAgICBfcmVnZXgocmVnZXgsIHZhbGlkYXRpb24sIG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMucmVmaW5lbWVudCgoZGF0YSkgPT4gcmVnZXgudGVzdChkYXRhKSwgewogICAgICAgIHZhbGlkYXRpb24sCiAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLAogICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIF9hZGRDaGVjayhjaGVjaykgewogICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXQogICAgICB9KTsKICAgIH0KICAgIGVtYWlsKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImVtYWlsIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgdXJsKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogInVybCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTsKICAgIH0KICAgIGVtb2ppKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImVtb2ppIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgdXVpZChtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6ICJ1dWlkIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgbmFub2lkKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogIm5hbm9pZCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTsKICAgIH0KICAgIGN1aWQobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiAiY3VpZCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTsKICAgIH0KICAgIGN1aWQyKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImN1aWQyIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgdWxpZChtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6ICJ1bGlkIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgYmFzZTY0KG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImJhc2U2NCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTsKICAgIH0KICAgIGlwKG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImlwIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMpIH0pOwogICAgfQogICAgZGF0ZXRpbWUob3B0aW9ucykgewogICAgICB2YXIgX2EsIF9iOwogICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICAgIGtpbmQ6ICJkYXRldGltZSIsCiAgICAgICAgICBwcmVjaXNpb246IG51bGwsCiAgICAgICAgICBvZmZzZXQ6IGZhbHNlLAogICAgICAgICAgbG9jYWw6IGZhbHNlLAogICAgICAgICAgbWVzc2FnZTogb3B0aW9ucwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogImRhdGV0aW1lIiwKICAgICAgICBwcmVjaXNpb246IHR5cGVvZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbikgPT09ICJ1bmRlZmluZWQiID8gbnVsbCA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sCiAgICAgICAgb2Zmc2V0OiAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMub2Zmc2V0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZSwKICAgICAgICBsb2NhbDogKF9iID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxvY2FsKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZSwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1lc3NhZ2UpCiAgICAgIH0pOwogICAgfQogICAgZGF0ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6ICJkYXRlIiwgbWVzc2FnZSB9KTsKICAgIH0KICAgIHRpbWUob3B0aW9ucykgewogICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICAgIGtpbmQ6ICJ0aW1lIiwKICAgICAgICAgIHByZWNpc2lvbjogbnVsbCwKICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJ0aW1lIiwKICAgICAgICBwcmVjaXNpb246IHR5cGVvZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbikgPT09ICJ1bmRlZmluZWQiID8gbnVsbCA6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVjaXNpb24sCiAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIGR1cmF0aW9uKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogImR1cmF0aW9uIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pOwogICAgfQogICAgcmVnZXgocmVnZXgsIG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICBraW5kOiAicmVnZXgiLAogICAgICAgIHJlZ2V4LAogICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIGluY2x1ZGVzKHZhbHVlLCBvcHRpb25zKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogImluY2x1ZGVzIiwKICAgICAgICB2YWx1ZSwKICAgICAgICBwb3NpdGlvbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBzdGFydHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogInN0YXJ0c1dpdGgiLAogICAgICAgIHZhbHVlLAogICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIGVuZHNXaXRoKHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogImVuZHNXaXRoIiwKICAgICAgICB2YWx1ZSwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1pbiIsCiAgICAgICAgdmFsdWU6IG1pbkxlbmd0aCwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IG1heExlbmd0aCwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogImxlbmd0aCIsCiAgICAgICAgdmFsdWU6IGxlbiwKICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkIFVzZSB6LnN0cmluZygpLm1pbigxKSBpbnN0ZWFkLgogICAgICogQHNlZSB7QGxpbmsgWm9kU3RyaW5nLm1pbn0KICAgICAqLwogICAgbm9uZW1wdHkobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5taW4oMSwgZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpKTsKICAgIH0KICAgIHRyaW0oKSB7CiAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiAidHJpbSIgfV0KICAgICAgfSk7CiAgICB9CiAgICB0b0xvd2VyQ2FzZSgpIHsKICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6ICJ0b0xvd2VyQ2FzZSIgfV0KICAgICAgfSk7CiAgICB9CiAgICB0b1VwcGVyQ2FzZSgpIHsKICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6ICJ0b1VwcGVyQ2FzZSIgfV0KICAgICAgfSk7CiAgICB9CiAgICBnZXQgaXNEYXRldGltZSgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gImRhdGV0aW1lIik7CiAgICB9CiAgICBnZXQgaXNEYXRlKCkgewogICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSAiZGF0ZSIpOwogICAgfQogICAgZ2V0IGlzVGltZSgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gInRpbWUiKTsKICAgIH0KICAgIGdldCBpc0R1cmF0aW9uKCkgewogICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSAiZHVyYXRpb24iKTsKICAgIH0KICAgIGdldCBpc0VtYWlsKCkgewogICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSAiZW1haWwiKTsKICAgIH0KICAgIGdldCBpc1VSTCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gInVybCIpOwogICAgfQogICAgZ2V0IGlzRW1vamkoKSB7CiAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09ICJlbW9qaSIpOwogICAgfQogICAgZ2V0IGlzVVVJRCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gInV1aWQiKTsKICAgIH0KICAgIGdldCBpc05BTk9JRCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gIm5hbm9pZCIpOwogICAgfQogICAgZ2V0IGlzQ1VJRCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gImN1aWQiKTsKICAgIH0KICAgIGdldCBpc0NVSUQyKCkgewogICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSAiY3VpZDIiKTsKICAgIH0KICAgIGdldCBpc1VMSUQoKSB7CiAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09ICJ1bGlkIik7CiAgICB9CiAgICBnZXQgaXNJUCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gImlwIik7CiAgICB9CiAgICBnZXQgaXNCYXNlNjQoKSB7CiAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09ICJiYXNlNjQiKTsKICAgIH0KICAgIGdldCBtaW5MZW5ndGgoKSB7CiAgICAgIGxldCBtaW4gPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2gua2luZCA9PT0gIm1pbiIpIHsKICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pCiAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWluOwogICAgfQogICAgZ2V0IG1heExlbmd0aCgpIHsKICAgICAgbGV0IG1heCA9IG51bGw7CiAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykgewogICAgICAgIGlmIChjaC5raW5kID09PSAibWF4IikgewogICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heCkKICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBtYXg7CiAgICB9CiAgfQogIFpvZFN0cmluZy5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICB2YXIgX2E7CiAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7CiAgICAgIGNoZWNrczogW10sCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3RyaW5nLAogICAgICBjb2VyY2U6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgZnVuY3Rpb24gZmxvYXRTYWZlUmVtYWluZGVyKHZhbCwgc3RlcCkgewogICAgY29uc3QgdmFsRGVjQ291bnQgPSAodmFsLnRvU3RyaW5nKCkuc3BsaXQoIi4iKVsxXSB8fCAiIikubGVuZ3RoOwogICAgY29uc3Qgc3RlcERlY0NvdW50ID0gKHN0ZXAudG9TdHJpbmcoKS5zcGxpdCgiLiIpWzFdIHx8ICIiKS5sZW5ndGg7CiAgICBjb25zdCBkZWNDb3VudCA9IHZhbERlY0NvdW50ID4gc3RlcERlY0NvdW50ID8gdmFsRGVjQ291bnQgOiBzdGVwRGVjQ291bnQ7CiAgICBjb25zdCB2YWxJbnQgPSBwYXJzZUludCh2YWwudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZSgiLiIsICIiKSk7CiAgICBjb25zdCBzdGVwSW50ID0gcGFyc2VJbnQoc3RlcC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKCIuIiwgIiIpKTsKICAgIHJldHVybiB2YWxJbnQgJSBzdGVwSW50IC8gTWF0aC5wb3coMTAsIGRlY0NvdW50KTsKICB9CiAgY2xhc3MgWm9kTnVtYmVyIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgdGhpcy5taW4gPSB0aGlzLmd0ZTsKICAgICAgdGhpcy5tYXggPSB0aGlzLmx0ZTsKICAgICAgdGhpcy5zdGVwID0gdGhpcy5tdWx0aXBsZU9mOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7CiAgICAgICAgaW5wdXQuZGF0YSA9IE51bWJlcihpbnB1dC5kYXRhKTsKICAgICAgfQogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bWJlcikgewogICAgICAgIGNvbnN0IGN0eDIgPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4MiwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm51bWJlciwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgyLnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICBsZXQgY3R4ID0gdm9pZCAwOwogICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTsKICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09ICJpbnQiKSB7CiAgICAgICAgICBpZiAoIXV0aWwuaXNJbnRlZ2VyKGlucHV0LmRhdGEpKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgICAgIGV4cGVjdGVkOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgcmVjZWl2ZWQ6ICJmbG9hdCIsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAibWluIikgewogICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBjaGVjay5pbmNsdXNpdmUgPyBpbnB1dC5kYXRhIDwgY2hlY2sudmFsdWUgOiBpbnB1dC5kYXRhIDw9IGNoZWNrLnZhbHVlOwogICAgICAgICAgaWYgKHRvb1NtYWxsKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLAogICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLAogICAgICAgICAgICAgIHR5cGU6ICJudW1iZXIiLAogICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLAogICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmUgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWUgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlOwogICAgICAgICAgaWYgKHRvb0JpZykgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsCiAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgdHlwZTogIm51bWJlciIsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsCiAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gIm11bHRpcGxlT2YiKSB7CiAgICAgICAgICBpZiAoZmxvYXRTYWZlUmVtYWluZGVyKGlucHV0LmRhdGEsIGNoZWNrLnZhbHVlKSAhPT0gMCkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZiwKICAgICAgICAgICAgICBtdWx0aXBsZU9mOiBjaGVjay52YWx1ZSwKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09ICJmaW5pdGUiKSB7CiAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbnB1dC5kYXRhKSkgewogICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTsKICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9maW5pdGUsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTsKICAgIH0KICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7CiAgICB9CiAgICBndCh2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpOwogICAgfQogICAgbHRlKHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTsKICAgIH0KICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7CiAgICB9CiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbCiAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLAogICAgICAgICAgewogICAgICAgICAgICBraW5kLAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgaW5jbHVzaXZlLAogICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0pOwogICAgfQogICAgX2FkZENoZWNrKGNoZWNrKSB7CiAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdCiAgICAgIH0pOwogICAgfQogICAgaW50KG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICBraW5kOiAiaW50IiwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBwb3NpdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1pbiIsCiAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBuZWdhdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBub25wb3NpdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIG5vbm5lZ2F0aXZlKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICBraW5kOiAibWluIiwKICAgICAgICB2YWx1ZTogMCwKICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpCiAgICAgIH0pOwogICAgfQogICAgbXVsdGlwbGVPZih2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJtdWx0aXBsZU9mIiwKICAgICAgICB2YWx1ZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBmaW5pdGUobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJmaW5pdGUiLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIHNhZmUobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJtaW4iLAogICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICB2YWx1ZTogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsCiAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpCiAgICAgIH0pLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgIHZhbHVlOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBnZXQgbWluVmFsdWUoKSB7CiAgICAgIGxldCBtaW4gPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2gua2luZCA9PT0gIm1pbiIpIHsKICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pCiAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWluOwogICAgfQogICAgZ2V0IG1heFZhbHVlKCkgewogICAgICBsZXQgbWF4ID0gbnVsbDsKICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KQogICAgICAgICAgICBtYXggPSBjaC52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG1heDsKICAgIH0KICAgIGdldCBpc0ludCgpIHsKICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gImludCIgfHwgY2gua2luZCA9PT0gIm11bHRpcGxlT2YiICYmIHV0aWwuaXNJbnRlZ2VyKGNoLnZhbHVlKSk7CiAgICB9CiAgICBnZXQgaXNGaW5pdGUoKSB7CiAgICAgIGxldCBtYXggPSBudWxsLCBtaW4gPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2gua2luZCA9PT0gImZpbml0ZSIgfHwgY2gua2luZCA9PT0gImludCIgfHwgY2gua2luZCA9PT0gIm11bHRpcGxlT2YiKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKGNoLmtpbmQgPT09ICJtaW4iKSB7CiAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKQogICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTsKICAgICAgICB9IGVsc2UgaWYgKGNoLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KQogICAgICAgICAgICBtYXggPSBjaC52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShtaW4pICYmIE51bWJlci5pc0Zpbml0ZShtYXgpOwogICAgfQogIH0KICBab2ROdW1iZXIuY3JlYXRlID0gKHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2ROdW1iZXIoewogICAgICBjaGVja3M6IFtdLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bWJlciwKICAgICAgY29lcmNlOiAocGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgfHwgZmFsc2UsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RCaWdJbnQgZXh0ZW5kcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICB0aGlzLm1pbiA9IHRoaXMuZ3RlOwogICAgICB0aGlzLm1heCA9IHRoaXMubHRlOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7CiAgICAgICAgaW5wdXQuZGF0YSA9IEJpZ0ludChpbnB1dC5kYXRhKTsKICAgICAgfQogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJpZ2ludCkgewogICAgICAgIGNvbnN0IGN0eDIgPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4MiwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmJpZ2ludCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgyLnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICBsZXQgY3R4ID0gdm9pZCAwOwogICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTsKICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09ICJtaW4iKSB7CiAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGNoZWNrLmluY2x1c2l2ZSA/IGlucHV0LmRhdGEgPCBjaGVjay52YWx1ZSA6IGlucHV0LmRhdGEgPD0gY2hlY2sudmFsdWU7CiAgICAgICAgICBpZiAodG9vU21hbGwpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsCiAgICAgICAgICAgICAgdHlwZTogImJpZ2ludCIsCiAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaGVjay5raW5kID09PSAibWF4IikgewogICAgICAgICAgY29uc3QgdG9vQmlnID0gY2hlY2suaW5jbHVzaXZlID8gaW5wdXQuZGF0YSA+IGNoZWNrLnZhbHVlIDogaW5wdXQuZGF0YSA+PSBjaGVjay52YWx1ZTsKICAgICAgICAgIGlmICh0b29CaWcpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLAogICAgICAgICAgICAgIHR5cGU6ICJiaWdpbnQiLAogICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLAogICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gIm11bHRpcGxlT2YiKSB7CiAgICAgICAgICBpZiAoaW5wdXQuZGF0YSAlIGNoZWNrLnZhbHVlICE9PSBCaWdJbnQoMCkpIHsKICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2YsCiAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTsKICAgIH0KICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7CiAgICB9CiAgICBndCh2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdCgibWluIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpOwogICAgfQogICAgbHRlKHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTsKICAgIH0KICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KCJtYXgiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7CiAgICB9CiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbCiAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLAogICAgICAgICAgewogICAgICAgICAgICBraW5kLAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgaW5jbHVzaXZlLAogICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgICAgIH0KICAgICAgICBdCiAgICAgIH0pOwogICAgfQogICAgX2FkZENoZWNrKGNoZWNrKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdCiAgICAgIH0pOwogICAgfQogICAgcG9zaXRpdmUobWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJtaW4iLAogICAgICAgIHZhbHVlOiBCaWdJbnQoMCksCiAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBuZWdhdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSwKICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIG5vbnBvc2l0aXZlKG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsKICAgICAgICBraW5kOiAibWF4IiwKICAgICAgICB2YWx1ZTogQmlnSW50KDApLAogICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1pbiIsCiAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSwKICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpCiAgICAgIH0pOwogICAgfQogICAgbXVsdGlwbGVPZih2YWx1ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soewogICAgICAgIGtpbmQ6ICJtdWx0aXBsZU9mIiwKICAgICAgICB2YWx1ZSwKICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkKICAgICAgfSk7CiAgICB9CiAgICBnZXQgbWluVmFsdWUoKSB7CiAgICAgIGxldCBtaW4gPSBudWxsOwogICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2gua2luZCA9PT0gIm1pbiIpIHsKICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pCiAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbWluOwogICAgfQogICAgZ2V0IG1heFZhbHVlKCkgewogICAgICBsZXQgbWF4ID0gbnVsbDsKICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoLmtpbmQgPT09ICJtYXgiKSB7CiAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KQogICAgICAgICAgICBtYXggPSBjaC52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG1heDsKICAgIH0KICB9CiAgWm9kQmlnSW50LmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHZhciBfYTsKICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHsKICAgICAgY2hlY2tzOiBbXSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCaWdJbnQsCiAgICAgIGNvZXJjZTogKF9hID0gcGFyYW1zID09PSBudWxsIHx8IHBhcmFtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyYW1zLmNvZXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RCb29sZWFuIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHsKICAgICAgICBpbnB1dC5kYXRhID0gQm9vbGVhbihpbnB1dC5kYXRhKTsKICAgICAgfQogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmJvb2xlYW4pIHsKICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuYm9vbGVhbiwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTsKICAgIH0KICB9CiAgWm9kQm9vbGVhbi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZEJvb2xlYW4oewogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJvb2xlYW4sCiAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kRGF0ZSBleHRlbmRzIFpvZFR5cGUgewogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7CiAgICAgICAgaW5wdXQuZGF0YSA9IG5ldyBEYXRlKGlucHV0LmRhdGEpOwogICAgICB9CiAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTsKICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuZGF0ZSkgewogICAgICAgIGNvbnN0IGN0eDIgPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4MiwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmRhdGUsCiAgICAgICAgICByZWNlaXZlZDogY3R4Mi5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgaWYgKGlzTmFOKGlucHV0LmRhdGEuZ2V0VGltZSgpKSkgewogICAgICAgIGNvbnN0IGN0eDIgPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4MiwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBQYXJzZVN0YXR1cygpOwogICAgICBsZXQgY3R4ID0gdm9pZCAwOwogICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHsKICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gIm1pbiIpIHsKICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA8IGNoZWNrLnZhbHVlKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLAogICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsCiAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSwKICAgICAgICAgICAgICB0eXBlOiAiZGF0ZSIKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gIm1heCIpIHsKICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA+IGNoZWNrLnZhbHVlKSB7CiAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpOwogICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZywKICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLAogICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICAgICAgICBleGFjdDogZmFsc2UsCiAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsCiAgICAgICAgICAgICAgdHlwZTogImRhdGUiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgc3RhdHVzOiBzdGF0dXMudmFsdWUsCiAgICAgICAgdmFsdWU6IG5ldyBEYXRlKGlucHV0LmRhdGEuZ2V0VGltZSgpKQogICAgICB9OwogICAgfQogICAgX2FkZENoZWNrKGNoZWNrKSB7CiAgICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXQogICAgICB9KTsKICAgIH0KICAgIG1pbihtaW5EYXRlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1pbiIsCiAgICAgICAgdmFsdWU6IG1pbkRhdGUuZ2V0VGltZSgpLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIG1heChtYXhEYXRlLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7CiAgICAgICAga2luZDogIm1heCIsCiAgICAgICAgdmFsdWU6IG1heERhdGUuZ2V0VGltZSgpLAogICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKQogICAgICB9KTsKICAgIH0KICAgIGdldCBtaW5EYXRlKCkgewogICAgICBsZXQgbWluID0gbnVsbDsKICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7CiAgICAgICAgaWYgKGNoLmtpbmQgPT09ICJtaW4iKSB7CiAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKQogICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG1pbiAhPSBudWxsID8gbmV3IERhdGUobWluKSA6IG51bGw7CiAgICB9CiAgICBnZXQgbWF4RGF0ZSgpIHsKICAgICAgbGV0IG1heCA9IG51bGw7CiAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykgewogICAgICAgIGlmIChjaC5raW5kID09PSAibWF4IikgewogICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heCkKICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBtYXggIT0gbnVsbCA/IG5ldyBEYXRlKG1heCkgOiBudWxsOwogICAgfQogIH0KICBab2REYXRlLmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7CiAgICAgIGNoZWNrczogW10sCiAgICAgIGNvZXJjZTogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpIHx8IGZhbHNlLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERhdGUsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RTeW1ib2wgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN5bWJvbCkgewogICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsCiAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zeW1ib2wsCiAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7CiAgICB9CiAgfQogIFpvZFN5bWJvbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZFN5bWJvbCh7CiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3ltYm9sLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kVW5kZWZpbmVkIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpOwogICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHsKICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkLAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpOwogICAgfQogIH0KICBab2RVbmRlZmluZWQuY3JlYXRlID0gKHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RVbmRlZmluZWQoewogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVuZGVmaW5lZCwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZE51bGwgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bGwpIHsKICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVsbCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTsKICAgIH0KICB9CiAgWm9kTnVsbC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE51bGwoewogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGwsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RBbnkgZXh0ZW5kcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICB0aGlzLl9hbnkgPSB0cnVlOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTsKICAgIH0KICB9CiAgWm9kQW55LmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kQW55KHsKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBbnksCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RVbmtub3duIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgdGhpcy5fdW5rbm93biA9IHRydWU7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpOwogICAgfQogIH0KICBab2RVbmtub3duLmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kVW5rbm93bih7CiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5rbm93biwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZE5ldmVyIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpOwogICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5ldmVyLAogICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICB9KTsKICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICB9CiAgfQogIFpvZE5ldmVyLmNyZWF0ZSA9IChwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kTmV2ZXIoewogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5ldmVyLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kVm9pZCBleHRlbmRzIFpvZFR5cGUgewogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTsKICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpOwogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnZvaWQsCiAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7CiAgICB9CiAgfQogIFpvZFZvaWQuY3JlYXRlID0gKHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RWb2lkKHsKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RWb2lkLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kQXJyYXkgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IGN0eCwgc3RhdHVzIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBjb25zdCBkZWYgPSB0aGlzLl9kZWY7CiAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5hcnJheSkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmFycmF5LAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgaWYgKGRlZi5leGFjdExlbmd0aCAhPT0gbnVsbCkgewogICAgICAgIGNvbnN0IHRvb0JpZyA9IGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5leGFjdExlbmd0aC52YWx1ZTsKICAgICAgICBjb25zdCB0b29TbWFsbCA9IGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5leGFjdExlbmd0aC52YWx1ZTsKICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7CiAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgY29kZTogdG9vQmlnID8gWm9kSXNzdWVDb2RlLnRvb19iaWcgOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLAogICAgICAgICAgICBtaW5pbXVtOiB0b29TbWFsbCA/IGRlZi5leGFjdExlbmd0aC52YWx1ZSA6IHZvaWQgMCwKICAgICAgICAgICAgbWF4aW11bTogdG9vQmlnID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdm9pZCAwLAogICAgICAgICAgICB0eXBlOiAiYXJyYXkiLAogICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgICAgIGV4YWN0OiB0cnVlLAogICAgICAgICAgICBtZXNzYWdlOiBkZWYuZXhhY3RMZW5ndGgubWVzc2FnZQogICAgICAgICAgfSk7CiAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlZi5taW5MZW5ndGggIT09IG51bGwpIHsKICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoIDwgZGVmLm1pbkxlbmd0aC52YWx1ZSkgewogICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsCiAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5MZW5ndGgudmFsdWUsCiAgICAgICAgICAgIHR5cGU6ICJhcnJheSIsCiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLAogICAgICAgICAgICBtZXNzYWdlOiBkZWYubWluTGVuZ3RoLm1lc3NhZ2UKICAgICAgICAgIH0pOwogICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkZWYubWF4TGVuZ3RoICE9PSBudWxsKSB7CiAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5tYXhMZW5ndGgudmFsdWUpIHsKICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZywKICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heExlbmd0aC52YWx1ZSwKICAgICAgICAgICAgdHlwZTogImFycmF5IiwKICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLAogICAgICAgICAgICBleGFjdDogZmFsc2UsCiAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5tYXhMZW5ndGgubWVzc2FnZQogICAgICAgICAgfSk7CiAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoWy4uLmN0eC5kYXRhXS5tYXAoKGl0ZW0sIGkyKSA9PiB7CiAgICAgICAgICByZXR1cm4gZGVmLnR5cGUuX3BhcnNlQXN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpMikpOwogICAgICAgIH0pKS50aGVuKChyZXN1bHQyKSA9PiB7CiAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdDIpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5jdHguZGF0YV0ubWFwKChpdGVtLCBpMikgPT4gewogICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VTeW5jKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaTIpKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0KTsKICAgIH0KICAgIGdldCBlbGVtZW50KCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7CiAgICB9CiAgICBtaW4obWluTGVuZ3RoLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IG1pbkxlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0KICAgICAgfSk7CiAgICB9CiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBtYXhMZW5ndGg6IHsgdmFsdWU6IG1heExlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0KICAgICAgfSk7CiAgICB9CiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBleGFjdExlbmd0aDogeyB2YWx1ZTogbGVuLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfQogICAgICB9KTsKICAgIH0KICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHsKICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpOwogICAgfQogIH0KICBab2RBcnJheS5jcmVhdGUgPSAoc2NoZW1hLCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kQXJyYXkoewogICAgICB0eXBlOiBzY2hlbWEsCiAgICAgIG1pbkxlbmd0aDogbnVsbCwKICAgICAgbWF4TGVuZ3RoOiBudWxsLAogICAgICBleGFjdExlbmd0aDogbnVsbCwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RBcnJheSwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGZ1bmN0aW9uIGRlZXBQYXJ0aWFsaWZ5KHNjaGVtYSkgewogICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9iamVjdCkgewogICAgICBjb25zdCBuZXdTaGFwZSA9IHt9OwogICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuc2hhcGUpIHsKICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHNjaGVtYS5zaGFwZVtrZXldOwogICAgICAgIG5ld1NoYXBlW2tleV0gPSBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoZmllbGRTY2hlbWEpKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgICAgLi4uc2NoZW1hLl9kZWYsCiAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RBcnJheSkgewogICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHsKICAgICAgICAuLi5zY2hlbWEuX2RlZiwKICAgICAgICB0eXBlOiBkZWVwUGFydGlhbGlmeShzY2hlbWEuZWxlbWVudCkKICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7CiAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7CiAgICB9IGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7CiAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUoZGVlcFBhcnRpYWxpZnkoc2NoZW1hLnVud3JhcCgpKSk7CiAgICB9IGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZFR1cGxlKSB7CiAgICAgIHJldHVybiBab2RUdXBsZS5jcmVhdGUoc2NoZW1hLml0ZW1zLm1hcCgoaXRlbSkgPT4gZGVlcFBhcnRpYWxpZnkoaXRlbSkpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBzY2hlbWE7CiAgICB9CiAgfQogIGNsYXNzIFpvZE9iamVjdCBleHRlbmRzIFpvZFR5cGUgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgIHRoaXMuX2NhY2hlZCA9IG51bGw7CiAgICAgIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaDsKICAgICAgdGhpcy5hdWdtZW50ID0gdGhpcy5leHRlbmQ7CiAgICB9CiAgICBfZ2V0Q2FjaGVkKCkgewogICAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKQogICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWQ7CiAgICAgIGNvbnN0IHNoYXBlID0gdGhpcy5fZGVmLnNoYXBlKCk7CiAgICAgIGNvbnN0IGtleXMgPSB1dGlsLm9iamVjdEtleXMoc2hhcGUpOwogICAgICByZXR1cm4gdGhpcy5fY2FjaGVkID0geyBzaGFwZSwga2V5cyB9OwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTsKICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7CiAgICAgICAgY29uc3QgY3R4MiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgyLCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUub2JqZWN0LAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eDIucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7CiAgICAgIGNvbnN0IHsgc2hhcGUsIGtleXM6IHNoYXBlS2V5cyB9ID0gdGhpcy5fZ2V0Q2FjaGVkKCk7CiAgICAgIGNvbnN0IGV4dHJhS2V5cyA9IFtdOwogICAgICBpZiAoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlciAmJiB0aGlzLl9kZWYudW5rbm93bktleXMgPT09ICJzdHJpcCIpKSB7CiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHsKICAgICAgICAgIGlmICghc2hhcGVLZXlzLmluY2x1ZGVzKGtleSkpIHsKICAgICAgICAgICAgZXh0cmFLZXlzLnB1c2goa2V5KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgcGFpcnMgPSBbXTsKICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcGVLZXlzKSB7CiAgICAgICAgY29uc3Qga2V5VmFsaWRhdG9yID0gc2hhcGVba2V5XTsKICAgICAgICBjb25zdCB2YWx1ZSA9IGN0eC5kYXRhW2tleV07CiAgICAgICAgcGFpcnMucHVzaCh7CiAgICAgICAgICBrZXk6IHsgc3RhdHVzOiAidmFsaWQiLCB2YWx1ZToga2V5IH0sCiAgICAgICAgICB2YWx1ZToga2V5VmFsaWRhdG9yLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBrZXkpKSwKICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuX2RlZi5jYXRjaGFsbCBpbnN0YW5jZW9mIFpvZE5ldmVyKSB7CiAgICAgICAgY29uc3QgdW5rbm93bktleXMgPSB0aGlzLl9kZWYudW5rbm93bktleXM7CiAgICAgICAgaWYgKHVua25vd25LZXlzID09PSAicGFzc3Rocm91Z2giKSB7CiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHsKICAgICAgICAgICAgcGFpcnMucHVzaCh7CiAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogInZhbGlkIiwgdmFsdWU6IGtleSB9LAogICAgICAgICAgICAgIHZhbHVlOiB7IHN0YXR1czogInZhbGlkIiwgdmFsdWU6IGN0eC5kYXRhW2tleV0gfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHVua25vd25LZXlzID09PSAic3RyaWN0IikgewogICAgICAgICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5cywKICAgICAgICAgICAgICBrZXlzOiBleHRyYUtleXMKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodW5rbm93bktleXMgPT09ICJzdHJpcCIpIDsKICAgICAgICBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgWm9kT2JqZWN0IGVycm9yOiBpbnZhbGlkIHVua25vd25LZXlzIHZhbHVlLmApOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBjYXRjaGFsbCA9IHRoaXMuX2RlZi5jYXRjaGFsbDsKICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTsKICAgICAgICAgIHBhaXJzLnB1c2goewogICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiAidmFsaWQiLCB2YWx1ZToga2V5IH0sCiAgICAgICAgICAgIHZhbHVlOiBjYXRjaGFsbC5fcGFyc2UoCiAgICAgICAgICAgICAgbmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KQogICAgICAgICAgICAgIC8vLCBjdHguY2hpbGQoa2V5KSwgdmFsdWUsIGdldFBhcnNlZFR5cGUodmFsdWUpCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7CiAgICAgICAgICBjb25zdCBzeW5jUGFpcnMgPSBbXTsKICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykgewogICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTsKICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwYWlyLnZhbHVlOwogICAgICAgICAgICBzeW5jUGFpcnMucHVzaCh7CiAgICAgICAgICAgICAga2V5LAogICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgIGFsd2F5c1NldDogcGFpci5hbHdheXNTZXQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3luY1BhaXJzOwogICAgICAgIH0pLnRoZW4oKHN5bmNQYWlycykgPT4gewogICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKTsKICAgICAgfQogICAgfQogICAgZ2V0IHNoYXBlKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCk7CiAgICB9CiAgICBzdHJpY3QobWVzc2FnZSkgewogICAgICBlcnJvclV0aWwuZXJyVG9PYmo7CiAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgdW5rbm93bktleXM6ICJzdHJpY3QiLAogICAgICAgIC4uLm1lc3NhZ2UgIT09IHZvaWQgMCA/IHsKICAgICAgICAgIGVycm9yTWFwOiAoaXNzdWUsIGN0eCkgPT4gewogICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRFcnJvciA9IChfYyA9IChfYiA9IChfYSA9IHRoaXMuX2RlZikuZXJyb3JNYXApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBpc3N1ZSwgY3R4KS5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdHguZGVmYXVsdEVycm9yOwogICAgICAgICAgICBpZiAoaXNzdWUuY29kZSA9PT0gInVucmVjb2duaXplZF9rZXlzIikKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbWVzc2FnZTogKF9kID0gZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLm1lc3NhZ2UpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGRlZmF1bHRFcnJvcgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgbWVzc2FnZTogZGVmYXVsdEVycm9yCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfSA6IHt9CiAgICAgIH0pOwogICAgfQogICAgc3RyaXAoKSB7CiAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgdW5rbm93bktleXM6ICJzdHJpcCIKICAgICAgfSk7CiAgICB9CiAgICBwYXNzdGhyb3VnaCgpIHsKICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3QoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICB1bmtub3duS2V5czogInBhc3N0aHJvdWdoIgogICAgICB9KTsKICAgIH0KICAgIC8vIGNvbnN0IEF1Z21lbnRGYWN0b3J5ID0KICAgIC8vICAgPERlZiBleHRlbmRzIFpvZE9iamVjdERlZj4oZGVmOiBEZWYpID0+CiAgICAvLyAgIDxBdWdtZW50YXRpb24gZXh0ZW5kcyBab2RSYXdTaGFwZT4oCiAgICAvLyAgICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb24KICAgIC8vICAgKTogWm9kT2JqZWN0PAogICAgLy8gICAgIGV4dGVuZFNoYXBlPFJldHVyblR5cGU8RGVmWyJzaGFwZSJdPiwgQXVnbWVudGF0aW9uPiwKICAgIC8vICAgICBEZWZbInVua25vd25LZXlzIl0sCiAgICAvLyAgICAgRGVmWyJjYXRjaGFsbCJdCiAgICAvLyAgID4gPT4gewogICAgLy8gICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgIC8vICAgICAgIC4uLmRlZiwKICAgIC8vICAgICAgIHNoYXBlOiAoKSA9PiAoewogICAgLy8gICAgICAgICAuLi5kZWYuc2hhcGUoKSwKICAgIC8vICAgICAgICAgLi4uYXVnbWVudGF0aW9uLAogICAgLy8gICAgICAgfSksCiAgICAvLyAgICAgfSkgYXMgYW55OwogICAgLy8gICB9OwogICAgZXh0ZW5kKGF1Z21lbnRhdGlvbikgewogICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIHNoYXBlOiAoKSA9PiAoewogICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksCiAgICAgICAgICAuLi5hdWdtZW50YXRpb24KICAgICAgICB9KQogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogUHJpb3IgdG8gem9kQDEuMC4xMiB0aGVyZSB3YXMgYSBidWcgaW4gdGhlCiAgICAgKiBpbmZlcnJlZCB0eXBlIG9mIG1lcmdlZCBvYmplY3RzLiBQbGVhc2UKICAgICAqIHVwZ3JhZGUgaWYgeW91IGFyZSBleHBlcmllbmNpbmcgaXNzdWVzLgogICAgICovCiAgICBtZXJnZShtZXJnaW5nKSB7CiAgICAgIGNvbnN0IG1lcmdlZCA9IG5ldyBab2RPYmplY3QoewogICAgICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsCiAgICAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCwKICAgICAgICBzaGFwZTogKCkgPT4gKHsKICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLAogICAgICAgICAgLi4ubWVyZ2luZy5fZGVmLnNoYXBlKCkKICAgICAgICB9KSwKICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdAogICAgICB9KTsKICAgICAgcmV0dXJuIG1lcmdlZDsKICAgIH0KICAgIC8vIG1lcmdlPAogICAgLy8gICBJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdCwKICAgIC8vICAgQXVnbWVudGF0aW9uIGV4dGVuZHMgSW5jb21pbmdbInNoYXBlIl0sCiAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHsKICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uCiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVsiX291dHB1dCJdCiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXQKICAgIC8vICAgICAgID8gT3V0cHV0W2tdCiAgICAvLyAgICAgICA6IG5ldmVyOwogICAgLy8gICB9LAogICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHsKICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb24KICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdWyJfaW5wdXQiXQogICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXQKICAgIC8vICAgICAgID8gSW5wdXRba10KICAgIC8vICAgICAgIDogbmV2ZXI7CiAgICAvLyAgIH0KICAgIC8vID4oCiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nCiAgICAvLyApOiBab2RPYmplY3Q8CiAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIFJldHVyblR5cGU8SW5jb21pbmdbIl9kZWYiXVsic2hhcGUiXT4+LAogICAgLy8gICBJbmNvbWluZ1siX2RlZiJdWyJ1bmtub3duS2V5cyJdLAogICAgLy8gICBJbmNvbWluZ1siX2RlZiJdWyJjYXRjaGFsbCJdLAogICAgLy8gICBOZXdPdXRwdXQsCiAgICAvLyAgIE5ld0lucHV0CiAgICAvLyA+IHsKICAgIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHsKICAgIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLAogICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsCiAgICAvLyAgICAgc2hhcGU6ICgpID0+CiAgICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksCiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsCiAgICAvLyAgIH0pIGFzIGFueTsKICAgIC8vICAgcmV0dXJuIG1lcmdlZDsKICAgIC8vIH0KICAgIHNldEtleShrZXksIHNjaGVtYSkgewogICAgICByZXR1cm4gdGhpcy5hdWdtZW50KHsgW2tleV06IHNjaGVtYSB9KTsKICAgIH0KICAgIC8vIG1lcmdlPEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0PigKICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmcKICAgIC8vICk6IC8vWm9kT2JqZWN0PFQgJiBJbmNvbWluZ1siX3NoYXBlIl0sIFVua25vd25LZXlzLCBDYXRjaGFsbD4gPSAobWVyZ2luZykgPT4gewogICAgLy8gWm9kT2JqZWN0PAogICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nWyJfZGVmIl1bInNoYXBlIl0+PiwKICAgIC8vICAgSW5jb21pbmdbIl9kZWYiXVsidW5rbm93bktleXMiXSwKICAgIC8vICAgSW5jb21pbmdbIl9kZWYiXVsiY2F0Y2hhbGwiXQogICAgLy8gPiB7CiAgICAvLyAgIC8vIGNvbnN0IG1lcmdlZFNoYXBlID0gb2JqZWN0VXRpbC5tZXJnZVNoYXBlcygKICAgIC8vICAgLy8gICB0aGlzLl9kZWYuc2hhcGUoKSwKICAgIC8vICAgLy8gICBtZXJnaW5nLl9kZWYuc2hhcGUoKQogICAgLy8gICAvLyApOwogICAgLy8gICBjb25zdCBtZXJnZWQ6IGFueSA9IG5ldyBab2RPYmplY3QoewogICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsCiAgICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCwKICAgIC8vICAgICBzaGFwZTogKCkgPT4KICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSwKICAgIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCwKICAgIC8vICAgfSkgYXMgYW55OwogICAgLy8gICByZXR1cm4gbWVyZ2VkOwogICAgLy8gfQogICAgY2F0Y2hhbGwoaW5kZXgpIHsKICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3QoewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICBjYXRjaGFsbDogaW5kZXgKICAgICAgfSk7CiAgICB9CiAgICBwaWNrKG1hc2spIHsKICAgICAgY29uc3Qgc2hhcGUgPSB7fTsKICAgICAgdXRpbC5vYmplY3RLZXlzKG1hc2spLmZvckVhY2goKGtleSkgPT4gewogICAgICAgIGlmIChtYXNrW2tleV0gJiYgdGhpcy5zaGFwZVtrZXldKSB7CiAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlCiAgICAgIH0pOwogICAgfQogICAgb21pdChtYXNrKSB7CiAgICAgIGNvbnN0IHNoYXBlID0ge307CiAgICAgIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHsKICAgICAgICBpZiAoIW1hc2tba2V5XSkgewogICAgICAgICAgc2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZQogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgZGVlcFBhcnRpYWwoKSB7CiAgICAgIHJldHVybiBkZWVwUGFydGlhbGlmeSh0aGlzKTsKICAgIH0KICAgIHBhcnRpYWwobWFzaykgewogICAgICBjb25zdCBuZXdTaGFwZSA9IHt9OwogICAgICB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkuZm9yRWFjaCgoa2V5KSA9PiB7CiAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07CiAgICAgICAgaWYgKG1hc2sgJiYgIW1hc2tba2V5XSkgewogICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdTaGFwZVtrZXldID0gZmllbGRTY2hlbWEub3B0aW9uYWwoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZQogICAgICB9KTsKICAgIH0KICAgIHJlcXVpcmVkKG1hc2spIHsKICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTsKICAgICAgdXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4gewogICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHsKICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gdGhpcy5zaGFwZVtrZXldOwogICAgICAgICAgbGV0IG5ld0ZpZWxkID0gZmllbGRTY2hlbWE7CiAgICAgICAgICB3aGlsZSAobmV3RmllbGQgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkgewogICAgICAgICAgICBuZXdGaWVsZCA9IG5ld0ZpZWxkLl9kZWYuaW5uZXJUeXBlOwogICAgICAgICAgfQogICAgICAgICAgbmV3U2hhcGVba2V5XSA9IG5ld0ZpZWxkOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlCiAgICAgIH0pOwogICAgfQogICAga2V5b2YoKSB7CiAgICAgIHJldHVybiBjcmVhdGVab2RFbnVtKHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSk7CiAgICB9CiAgfQogIFpvZE9iamVjdC5jcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RPYmplY3QoewogICAgICBzaGFwZTogKCkgPT4gc2hhcGUsCiAgICAgIHVua25vd25LZXlzOiAic3RyaXAiLAogICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgWm9kT2JqZWN0LnN0cmljdENyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7CiAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSwKICAgICAgdW5rbm93bktleXM6ICJzdHJpY3QiLAogICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgWm9kT2JqZWN0LmxhenljcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RPYmplY3QoewogICAgICBzaGFwZSwKICAgICAgdW5rbm93bktleXM6ICJzdHJpcCIsCiAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RVbmlvbiBleHRlbmRzIFpvZFR5cGUgewogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZGVmLm9wdGlvbnM7CiAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdHMocmVzdWx0cykgewogICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHsKICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0LnN0YXR1cyA9PT0gInZhbGlkIikgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykgewogICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQuc3RhdHVzID09PSAiZGlydHkiKSB7CiAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4ucmVzdWx0LmN0eC5jb21tb24uaXNzdWVzKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gbmV3IFpvZEVycm9yKHJlc3VsdC5jdHguY29tbW9uLmlzc3VlcykpOwogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sCiAgICAgICAgICB1bmlvbkVycm9ycwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKG9wdGlvbnMubWFwKGFzeW5jIChvcHRpb24pID0+IHsKICAgICAgICAgIGNvbnN0IGNoaWxkQ3R4ID0gewogICAgICAgICAgICAuLi5jdHgsCiAgICAgICAgICAgIGNvbW1vbjogewogICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sCiAgICAgICAgICAgICAgaXNzdWVzOiBbXQogICAgICAgICAgICB9LAogICAgICAgICAgICBwYXJlbnQ6IG51bGwKICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZXN1bHQ6IGF3YWl0IG9wdGlvbi5fcGFyc2VBc3luYyh7CiAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eAogICAgICAgICAgICB9KSwKICAgICAgICAgICAgY3R4OiBjaGlsZEN0eAogICAgICAgICAgfTsKICAgICAgICB9KSkudGhlbihoYW5kbGVSZXN1bHRzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsZXQgZGlydHkgPSB2b2lkIDA7CiAgICAgICAgY29uc3QgaXNzdWVzID0gW107CiAgICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykgewogICAgICAgICAgY29uc3QgY2hpbGRDdHggPSB7CiAgICAgICAgICAgIC4uLmN0eCwKICAgICAgICAgICAgY29tbW9uOiB7CiAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbiwKICAgICAgICAgICAgICBpc3N1ZXM6IFtdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhcmVudDogbnVsbAogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvbi5fcGFyc2VTeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGNoaWxkQ3R4CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAidmFsaWQiKSB7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICJkaXJ0eSIgJiYgIWRpcnR5KSB7CiAgICAgICAgICAgIGRpcnR5ID0geyByZXN1bHQsIGN0eDogY2hpbGRDdHggfTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaGlsZEN0eC5jb21tb24uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgICBpc3N1ZXMucHVzaChjaGlsZEN0eC5jb21tb24uaXNzdWVzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRpcnR5KSB7CiAgICAgICAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKC4uLmRpcnR5LmN0eC5jb21tb24uaXNzdWVzKTsKICAgICAgICAgIHJldHVybiBkaXJ0eS5yZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gaXNzdWVzLm1hcCgoaXNzdWVzMikgPT4gbmV3IFpvZEVycm9yKGlzc3VlczIpKTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uLAogICAgICAgICAgdW5pb25FcnJvcnMKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgfQogICAgZ2V0IG9wdGlvbnMoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uczsKICAgIH0KICB9CiAgWm9kVW5pb24uY3JlYXRlID0gKHR5cGVzLCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kVW5pb24oewogICAgICBvcHRpb25zOiB0eXBlcywKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmlvbiwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNvbnN0IGdldERpc2NyaW1pbmF0b3IgPSAodHlwZSkgPT4gewogICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMYXp5KSB7CiAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2NoZW1hKTsKICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVmZmVjdHMpIHsKICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5pbm5lclR5cGUoKSk7CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RMaXRlcmFsKSB7CiAgICAgIHJldHVybiBbdHlwZS52YWx1ZV07CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RFbnVtKSB7CiAgICAgIHJldHVybiB0eXBlLm9wdGlvbnM7CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROYXRpdmVFbnVtKSB7CiAgICAgIHJldHVybiB1dGlsLm9iamVjdFZhbHVlcyh0eXBlLmVudW0pOwogICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRGVmYXVsdCkgewogICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTsKICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFVuZGVmaW5lZCkgewogICAgICByZXR1cm4gW3ZvaWQgMF07CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsKSB7CiAgICAgIHJldHVybiBbbnVsbF07CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkgewogICAgICByZXR1cm4gW3ZvaWQgMCwgLi4uZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKV07CiAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2ROdWxsYWJsZSkgewogICAgICByZXR1cm4gW251bGwsIC4uLmdldERpc2NyaW1pbmF0b3IodHlwZS51bndyYXAoKSldOwogICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kQnJhbmRlZCkgewogICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKTsKICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZFJlYWRvbmx5KSB7CiAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpOwogICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kQ2F0Y2gpIHsKICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5fZGVmLmlubmVyVHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gW107CiAgICB9CiAgfTsKICBjbGFzcyBab2REaXNjcmltaW5hdGVkVW5pb24gZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3IgPSB0aGlzLmRpc2NyaW1pbmF0b3I7CiAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZSA9IGN0eC5kYXRhW2Rpc2NyaW1pbmF0b3JdOwogICAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnNNYXAuZ2V0KGRpc2NyaW1pbmF0b3JWYWx1ZSk7CiAgICAgIGlmICghb3B0aW9uKSB7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLAogICAgICAgICAgb3B0aW9uczogQXJyYXkuZnJvbSh0aGlzLm9wdGlvbnNNYXAua2V5cygpKSwKICAgICAgICAgIHBhdGg6IFtkaXNjcmltaW5hdG9yXQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgcmV0dXJuIG9wdGlvbi5fcGFyc2VBc3luYyh7CiAgICAgICAgICBkYXRhOiBjdHguZGF0YSwKICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgcGFyZW50OiBjdHgKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gb3B0aW9uLl9wYXJzZVN5bmMoewogICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgIHBhcmVudDogY3R4CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGdldCBkaXNjcmltaW5hdG9yKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmRpc2NyaW1pbmF0b3I7CiAgICB9CiAgICBnZXQgb3B0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zOwogICAgfQogICAgZ2V0IG9wdGlvbnNNYXAoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcDsKICAgIH0KICAgIC8qKgogICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uIHNjaGVtYS4gSXRzIGJlaGF2aW91ciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgbm9ybWFsIHoudW5pb24oKSBjb25zdHJ1Y3Rvci4KICAgICAqIEhvd2V2ZXIsIGl0IG9ubHkgYWxsb3dzIGEgdW5pb24gb2Ygb2JqZWN0cywgYWxsIG9mIHdoaWNoIG5lZWQgdG8gc2hhcmUgYSBkaXNjcmltaW5hdG9yIHByb3BlcnR5LiBUaGlzIHByb3BlcnR5IG11c3QKICAgICAqIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgZm9yIGVhY2ggb2JqZWN0IGluIHRoZSB1bmlvbi4KICAgICAqIEBwYXJhbSBkaXNjcmltaW5hdG9yIHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5CiAgICAgKiBAcGFyYW0gdHlwZXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHNjaGVtYXMKICAgICAqIEBwYXJhbSBwYXJhbXMKICAgICAqLwogICAgc3RhdGljIGNyZWF0ZShkaXNjcmltaW5hdG9yLCBvcHRpb25zLCBwYXJhbXMpIHsKICAgICAgY29uc3Qgb3B0aW9uc01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7CiAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvclZhbHVlcyA9IGdldERpc2NyaW1pbmF0b3IodHlwZS5zaGFwZVtkaXNjcmltaW5hdG9yXSk7CiAgICAgICAgaWYgKCFkaXNjcmltaW5hdG9yVmFsdWVzLmxlbmd0aCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIGRpc2NyaW1pbmF0b3IgdmFsdWUgZm9yIGtleSBcYCR7ZGlzY3JpbWluYXRvcn1cYCBjb3VsZCBub3QgYmUgZXh0cmFjdGVkIGZyb20gYWxsIHNjaGVtYSBvcHRpb25zYCk7CiAgICAgICAgfQogICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZGlzY3JpbWluYXRvclZhbHVlcykgewogICAgICAgICAgaWYgKG9wdGlvbnNNYXAuaGFzKHZhbHVlKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZGlzY3JpbWluYXRvcil9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcodmFsdWUpfWApOwogICAgICAgICAgfQogICAgICAgICAgb3B0aW9uc01hcC5zZXQodmFsdWUsIHR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbmV3IFpvZERpc2NyaW1pbmF0ZWRVbmlvbih7CiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REaXNjcmltaW5hdGVkVW5pb24sCiAgICAgICAgZGlzY3JpbWluYXRvciwKICAgICAgICBvcHRpb25zLAogICAgICAgIG9wdGlvbnNNYXAsCiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICAgIH0pOwogICAgfQogIH0KICBmdW5jdGlvbiBtZXJnZVZhbHVlcyhhMiwgYikgewogICAgY29uc3QgYVR5cGUgPSBnZXRQYXJzZWRUeXBlKGEyKTsKICAgIGNvbnN0IGJUeXBlID0gZ2V0UGFyc2VkVHlwZShiKTsKICAgIGlmIChhMiA9PT0gYikgewogICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYTIgfTsKICAgIH0gZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUub2JqZWN0ICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLm9iamVjdCkgewogICAgICBjb25zdCBiS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhiKTsKICAgICAgY29uc3Qgc2hhcmVkS2V5cyA9IHV0aWwub2JqZWN0S2V5cyhhMikuZmlsdGVyKChrZXkpID0+IGJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpOwogICAgICBjb25zdCBuZXdPYmogPSB7IC4uLmEyLCAuLi5iIH07CiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHNoYXJlZEtleXMpIHsKICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGEyW2tleV0sIGJba2V5XSk7CiAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkgewogICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07CiAgICAgICAgfQogICAgICAgIG5ld09ialtrZXldID0gc2hhcmVkVmFsdWUuZGF0YTsKICAgICAgfQogICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3T2JqIH07CiAgICB9IGVsc2UgaWYgKGFUeXBlID09PSBab2RQYXJzZWRUeXBlLmFycmF5ICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7CiAgICAgIGlmIChhMi5sZW5ndGggIT09IGIubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07CiAgICAgIH0KICAgICAgY29uc3QgbmV3QXJyYXkgPSBbXTsKICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGEyLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgIGNvbnN0IGl0ZW1BID0gYTJbaW5kZXhdOwogICAgICAgIGNvbnN0IGl0ZW1CID0gYltpbmRleF07CiAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpOwogICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHsKICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9OwogICAgICAgIH0KICAgICAgICBuZXdBcnJheS5wdXNoKHNoYXJlZFZhbHVlLmRhdGEpOwogICAgICB9CiAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBuZXdBcnJheSB9OwogICAgfSBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5kYXRlICYmIGJUeXBlID09PSBab2RQYXJzZWRUeXBlLmRhdGUgJiYgK2EyID09PSArYikgewogICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYTIgfTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9OwogICAgfQogIH0KICBjbGFzcyBab2RJbnRlcnNlY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBjb25zdCBoYW5kbGVQYXJzZWQgPSAocGFyc2VkTGVmdCwgcGFyc2VkUmlnaHQpID0+IHsKICAgICAgICBpZiAoaXNBYm9ydGVkKHBhcnNlZExlZnQpIHx8IGlzQWJvcnRlZChwYXJzZWRSaWdodCkpIHsKICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVZhbHVlcyhwYXJzZWRMZWZ0LnZhbHVlLCBwYXJzZWRSaWdodC52YWx1ZSk7CiAgICAgICAgaWYgKCFtZXJnZWQudmFsaWQpIHsKICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXMKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgfQogICAgICAgIGlmIChpc0RpcnR5KHBhcnNlZExlZnQpIHx8IGlzRGlydHkocGFyc2VkUmlnaHQpKSB7CiAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBtZXJnZWQuZGF0YSB9OwogICAgICB9OwogICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykgewogICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbCiAgICAgICAgICB0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7CiAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLAogICAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgICAgcGFyZW50OiBjdHgKICAgICAgICAgIH0pLAogICAgICAgICAgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZUFzeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgfSkKICAgICAgICBdKS50aGVuKChbbGVmdCwgcmlnaHRdKSA9PiBoYW5kbGVQYXJzZWQobGVmdCwgcmlnaHQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gaGFuZGxlUGFyc2VkKHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZVN5bmMoewogICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgIHBhcmVudDogY3R4CiAgICAgICAgfSksIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHsKICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLAogICAgICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgIH0pKTsKICAgICAgfQogICAgfQogIH0KICBab2RJbnRlcnNlY3Rpb24uY3JlYXRlID0gKGxlZnQsIHJpZ2h0LCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHsKICAgICAgbGVmdCwKICAgICAgcmlnaHQsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kSW50ZXJzZWN0aW9uLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kVHVwbGUgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYXJyYXkpIHsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsCiAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5hcnJheSwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLAogICAgICAgICAgbWluaW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCwKICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgIHR5cGU6ICJhcnJheSIKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICBjb25zdCByZXN0ID0gdGhpcy5fZGVmLnJlc3Q7CiAgICAgIGlmICghcmVzdCAmJiBjdHguZGF0YS5sZW5ndGggPiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZywKICAgICAgICAgIG1heGltdW06IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgsCiAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgICBleGFjdDogZmFsc2UsCiAgICAgICAgICB0eXBlOiAiYXJyYXkiCiAgICAgICAgfSk7CiAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgIH0KICAgICAgY29uc3QgaXRlbXMgPSBbLi4uY3R4LmRhdGFdLm1hcCgoaXRlbSwgaXRlbUluZGV4KSA9PiB7CiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5fZGVmLml0ZW1zW2l0ZW1JbmRleF0gfHwgdGhpcy5fZGVmLnJlc3Q7CiAgICAgICAgaWYgKCFzY2hlbWEpCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gc2NoZW1hLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGl0ZW1JbmRleCkpOwogICAgICB9KS5maWx0ZXIoKHgpID0+ICEheCk7CiAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zKS50aGVuKChyZXN1bHRzKSA9PiB7CiAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZUFycmF5KHN0YXR1cywgaXRlbXMpOwogICAgICB9CiAgICB9CiAgICBnZXQgaXRlbXMoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYuaXRlbXM7CiAgICB9CiAgICByZXN0KHJlc3QpIHsKICAgICAgcmV0dXJuIG5ldyBab2RUdXBsZSh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIHJlc3QKICAgICAgfSk7CiAgICB9CiAgfQogIFpvZFR1cGxlLmNyZWF0ZSA9IChzY2hlbWFzLCBwYXJhbXMpID0+IHsKICAgIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWFzKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pIik7CiAgICB9CiAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHsKICAgICAgaXRlbXM6IHNjaGVtYXMsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVHVwbGUsCiAgICAgIHJlc3Q6IG51bGwsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RSZWNvcmQgZXh0ZW5kcyBab2RUeXBlIHsKICAgIGdldCBrZXlTY2hlbWEoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYua2V5VHlwZTsKICAgIH0KICAgIGdldCB2YWx1ZVNjaGVtYSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IHBhaXJzID0gW107CiAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTsKICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTsKICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHsKICAgICAgICBwYWlycy5wdXNoKHsKICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIGtleSkpLAogICAgICAgICAgdmFsdWU6IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGN0eC5kYXRhW2tleV0sIGN0eC5wYXRoLCBrZXkpKSwKICAgICAgICAgIGFsd2F5c1NldDoga2V5IGluIGN0eC5kYXRhCiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHsKICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpOwogICAgICB9CiAgICB9CiAgICBnZXQgZWxlbWVudCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7CiAgICB9CiAgICBzdGF0aWMgY3JlYXRlKGZpcnN0LCBzZWNvbmQsIHRoaXJkKSB7CiAgICAgIGlmIChzZWNvbmQgaW5zdGFuY2VvZiBab2RUeXBlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoewogICAgICAgICAga2V5VHlwZTogZmlyc3QsCiAgICAgICAgICB2YWx1ZVR5cGU6IHNlY29uZCwKICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLAogICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlyZCkKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7CiAgICAgICAga2V5VHlwZTogWm9kU3RyaW5nLmNyZWF0ZSgpLAogICAgICAgIHZhbHVlVHlwZTogZmlyc3QsCiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWNvcmQsCiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhzZWNvbmQpCiAgICAgIH0pOwogICAgfQogIH0KICBjbGFzcyBab2RNYXAgZXh0ZW5kcyBab2RUeXBlIHsKICAgIGdldCBrZXlTY2hlbWEoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYua2V5VHlwZTsKICAgIH0KICAgIGdldCB2YWx1ZVNjaGVtYSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm1hcCkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm1hcCwKICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTsKICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTsKICAgICAgY29uc3QgcGFpcnMgPSBbLi4uY3R4LmRhdGEuZW50cmllcygpXS5tYXAoKFtrZXksIHZhbHVlXSwgaW5kZXgpID0+IHsKICAgICAgICByZXR1cm4gewogICAgICAgICAga2V5OiBrZXlUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwga2V5LCBjdHgucGF0aCwgW2luZGV4LCAia2V5Il0pKSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIFtpbmRleCwgInZhbHVlIl0pKQogICAgICAgIH07CiAgICAgIH0pOwogICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykgewogICAgICAgIGNvbnN0IGZpbmFsTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7CiAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHsKICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcGFpci5rZXk7CiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFpci52YWx1ZTsKICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09ICJhYm9ydGVkIiB8fCB2YWx1ZS5zdGF0dXMgPT09ICJhYm9ydGVkIikgewogICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSAiZGlydHkiIHx8IHZhbHVlLnN0YXR1cyA9PT0gImRpcnR5IikgewogICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBmaW5hbE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7CiAgICAgICAgICBjb25zdCBrZXkgPSBwYWlyLmtleTsKICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFpci52YWx1ZTsKICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSAiYWJvcnRlZCIgfHwgdmFsdWUuc3RhdHVzID09PSAiYWJvcnRlZCIpIHsKICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gImRpcnR5IiB8fCB2YWx1ZS5zdGF0dXMgPT09ICJkaXJ0eSIpIHsKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICB9CiAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTsKICAgICAgfQogICAgfQogIH0KICBab2RNYXAuY3JlYXRlID0gKGtleVR5cGUsIHZhbHVlVHlwZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE1hcCh7CiAgICAgIHZhbHVlVHlwZSwKICAgICAga2V5VHlwZSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RNYXAsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RTZXQgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc2V0KSB7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLAogICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc2V0LAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmOwogICAgICBpZiAoZGVmLm1pblNpemUgIT09IG51bGwpIHsKICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA8IGRlZi5taW5TaXplLnZhbHVlKSB7CiAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCwKICAgICAgICAgICAgbWluaW11bTogZGVmLm1pblNpemUudmFsdWUsCiAgICAgICAgICAgIHR5cGU6ICJzZXQiLAogICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsCiAgICAgICAgICAgIGV4YWN0OiBmYWxzZSwKICAgICAgICAgICAgbWVzc2FnZTogZGVmLm1pblNpemUubWVzc2FnZQogICAgICAgICAgfSk7CiAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlZi5tYXhTaXplICE9PSBudWxsKSB7CiAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPiBkZWYubWF4U2l6ZS52YWx1ZSkgewogICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLAogICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4U2l6ZS52YWx1ZSwKICAgICAgICAgICAgdHlwZTogInNldCIsCiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSwKICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLAogICAgICAgICAgICBtZXNzYWdlOiBkZWYubWF4U2l6ZS5tZXNzYWdlCiAgICAgICAgICB9KTsKICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlOwogICAgICBmdW5jdGlvbiBmaW5hbGl6ZVNldChlbGVtZW50czIpIHsKICAgICAgICBjb25zdCBwYXJzZWRTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50czIpIHsKICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gImFib3J0ZWQiKQogICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgICAgIGlmIChlbGVtZW50LnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICBwYXJzZWRTZXQuYWRkKGVsZW1lbnQudmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHBhcnNlZFNldCB9OwogICAgICB9CiAgICAgIGNvbnN0IGVsZW1lbnRzID0gWy4uLmN0eC5kYXRhLnZhbHVlcygpXS5tYXAoKGl0ZW0sIGkyKSA9PiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBpdGVtLCBjdHgucGF0aCwgaTIpKSk7CiAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGVsZW1lbnRzKS50aGVuKChlbGVtZW50czIpID0+IGZpbmFsaXplU2V0KGVsZW1lbnRzMikpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmaW5hbGl6ZVNldChlbGVtZW50cyk7CiAgICAgIH0KICAgIH0KICAgIG1pbihtaW5TaXplLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kU2V0KHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgbWluU2l6ZTogeyB2YWx1ZTogbWluU2l6ZSwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0KICAgICAgfSk7CiAgICB9CiAgICBtYXgobWF4U2l6ZSwgbWVzc2FnZSkgewogICAgICByZXR1cm4gbmV3IFpvZFNldCh7CiAgICAgICAgLi4udGhpcy5fZGVmLAogICAgICAgIG1heFNpemU6IHsgdmFsdWU6IG1heFNpemUsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9CiAgICAgIH0pOwogICAgfQogICAgc2l6ZShzaXplLCBtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLm1pbihzaXplLCBtZXNzYWdlKS5tYXgoc2l6ZSwgbWVzc2FnZSk7CiAgICB9CiAgICBub25lbXB0eShtZXNzYWdlKSB7CiAgICAgIHJldHVybiB0aGlzLm1pbigxLCBtZXNzYWdlKTsKICAgIH0KICB9CiAgWm9kU2V0LmNyZWF0ZSA9ICh2YWx1ZVR5cGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RTZXQoewogICAgICB2YWx1ZVR5cGUsCiAgICAgIG1pblNpemU6IG51bGwsCiAgICAgIG1heFNpemU6IG51bGwsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU2V0LAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kRnVuY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICB0aGlzLnZhbGlkYXRlID0gdGhpcy5pbXBsZW1lbnQ7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7CiAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbikgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmZ1bmN0aW9uLAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbWFrZUFyZ3NJc3N1ZShhcmdzLCBlcnJvcikgewogICAgICAgIHJldHVybiBtYWtlSXNzdWUoewogICAgICAgICAgZGF0YTogYXJncywKICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgZXJyb3JNYXBzOiBbCiAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLAogICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsCiAgICAgICAgICAgIGdldEVycm9yTWFwKCksCiAgICAgICAgICAgIGVycm9yTWFwCiAgICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSwKICAgICAgICAgIGlzc3VlRGF0YTogewogICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHMsCiAgICAgICAgICAgIGFyZ3VtZW50c0Vycm9yOiBlcnJvcgogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG1ha2VSZXR1cm5zSXNzdWUocmV0dXJucywgZXJyb3IpIHsKICAgICAgICByZXR1cm4gbWFrZUlzc3VlKHsKICAgICAgICAgIGRhdGE6IHJldHVybnMsCiAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgIGVycm9yTWFwczogWwogICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCwKICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLAogICAgICAgICAgICBnZXRFcnJvck1hcCgpLAogICAgICAgICAgICBlcnJvck1hcAogICAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksCiAgICAgICAgICBpc3N1ZURhdGE6IHsKICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfcmV0dXJuX3R5cGUsCiAgICAgICAgICAgIHJldHVyblR5cGVFcnJvcjogZXJyb3IKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCBwYXJhbXMgPSB7IGVycm9yTWFwOiBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCB9OwogICAgICBjb25zdCBmbiA9IGN0eC5kYXRhOwogICAgICBpZiAodGhpcy5fZGVmLnJldHVybnMgaW5zdGFuY2VvZiBab2RQcm9taXNlKSB7CiAgICAgICAgY29uc3QgbWUgPSB0aGlzOwogICAgICAgIHJldHVybiBPSyhhc3luYyBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcihbXSk7CiAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gYXdhaXQgbWUuX2RlZi5hcmdzLnBhcnNlQXN5bmMoYXJncywgcGFyYW1zKS5jYXRjaCgoZTIpID0+IHsKICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZUFyZ3NJc3N1ZShhcmdzLCBlMikpOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgIH0pOwogICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUmVmbGVjdC5hcHBseShmbiwgdGhpcywgcGFyc2VkQXJncyk7CiAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gYXdhaXQgbWUuX2RlZi5yZXR1cm5zLl9kZWYudHlwZS5wYXJzZUFzeW5jKHJlc3VsdCwgcGFyYW1zKS5jYXRjaCgoZTIpID0+IHsKICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIGUyKSk7CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gcGFyc2VkUmV0dXJuczsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zdCBtZSA9IHRoaXM7CiAgICAgICAgcmV0dXJuIE9LKGZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBtZS5fZGVmLmFyZ3Muc2FmZVBhcnNlKGFyZ3MsIHBhcmFtcyk7CiAgICAgICAgICBpZiAoIXBhcnNlZEFyZ3Muc3VjY2VzcykgewogICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VBcmdzSXNzdWUoYXJncywgcGFyc2VkQXJncy5lcnJvcildKTsKICAgICAgICAgIH0KICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXMsIHBhcnNlZEFyZ3MuZGF0YSk7CiAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gbWUuX2RlZi5yZXR1cm5zLnNhZmVQYXJzZShyZXN1bHQsIHBhcmFtcyk7CiAgICAgICAgICBpZiAoIXBhcnNlZFJldHVybnMuc3VjY2VzcykgewogICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBwYXJzZWRSZXR1cm5zLmVycm9yKV0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHBhcnNlZFJldHVybnMuZGF0YTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcGFyYW1ldGVycygpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5hcmdzOwogICAgfQogICAgcmV0dXJuVHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5yZXR1cm5zOwogICAgfQogICAgYXJncyguLi5pdGVtcykgewogICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgYXJnczogWm9kVHVwbGUuY3JlYXRlKGl0ZW1zKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJucyhyZXR1cm5UeXBlKSB7CiAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICByZXR1cm5zOiByZXR1cm5UeXBlCiAgICAgIH0pOwogICAgfQogICAgaW1wbGVtZW50KGZ1bmMpIHsKICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7CiAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jOwogICAgfQogICAgc3RyaWN0SW1wbGVtZW50KGZ1bmMpIHsKICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7CiAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jOwogICAgfQogICAgc3RhdGljIGNyZWF0ZShhcmdzLCByZXR1cm5zLCBwYXJhbXMpIHsKICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7CiAgICAgICAgYXJnczogYXJncyA/IGFyZ3MgOiBab2RUdXBsZS5jcmVhdGUoW10pLnJlc3QoWm9kVW5rbm93bi5jcmVhdGUoKSksCiAgICAgICAgcmV0dXJuczogcmV0dXJucyB8fCBab2RVbmtub3duLmNyZWF0ZSgpLAogICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRnVuY3Rpb24sCiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICAgIH0pOwogICAgfQogIH0KICBjbGFzcyBab2RMYXp5IGV4dGVuZHMgWm9kVHlwZSB7CiAgICBnZXQgc2NoZW1hKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBjb25zdCBsYXp5U2NoZW1hID0gdGhpcy5fZGVmLmdldHRlcigpOwogICAgICByZXR1cm4gbGF6eVNjaGVtYS5fcGFyc2UoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pOwogICAgfQogIH0KICBab2RMYXp5LmNyZWF0ZSA9IChnZXR0ZXIsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RMYXp5KHsKICAgICAgZ2V0dGVyLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZExhenksCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RMaXRlcmFsIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgaWYgKGlucHV0LmRhdGEgIT09IHRoaXMuX2RlZi52YWx1ZSkgewogICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSwKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2xpdGVyYWwsCiAgICAgICAgICBleHBlY3RlZDogdGhpcy5fZGVmLnZhbHVlCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHsgc3RhdHVzOiAidmFsaWQiLCB2YWx1ZTogaW5wdXQuZGF0YSB9OwogICAgfQogICAgZ2V0IHZhbHVlKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlOwogICAgfQogIH0KICBab2RMaXRlcmFsLmNyZWF0ZSA9ICh2YWx1ZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZExpdGVyYWwoewogICAgICB2YWx1ZSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RMaXRlcmFsLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgZnVuY3Rpb24gY3JlYXRlWm9kRW51bSh2YWx1ZXMsIHBhcmFtcykgewogICAgcmV0dXJuIG5ldyBab2RFbnVtKHsKICAgICAgdmFsdWVzLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVudW0sCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfQogIGNsYXNzIFpvZEVudW0gZXh0ZW5kcyBab2RUeXBlIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICBfWm9kRW51bV9jYWNoZS5zZXQodGhpcywgdm9pZCAwKTsKICAgIH0KICAgIF9wYXJzZShpbnB1dCkgewogICAgICBpZiAodHlwZW9mIGlucHV0LmRhdGEgIT09ICJzdHJpbmciKSB7CiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpOwogICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlczsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLAogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWm9kRW51bV9jYWNoZSkpIHsKICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ab2RFbnVtX2NhY2hlLCBuZXcgU2V0KHRoaXMuX2RlZi52YWx1ZXMpKTsKICAgICAgfQogICAgICBpZiAoIV9fY2xhc3NQcml2YXRlRmllbGRHZXQodGhpcywgX1pvZEVudW1fY2FjaGUpLmhhcyhpbnB1dC5kYXRhKSkgewogICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHRoaXMuX2RlZi52YWx1ZXM7CiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7CiAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsCiAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLAogICAgICAgICAgb3B0aW9uczogZXhwZWN0ZWRWYWx1ZXMKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7CiAgICB9CiAgICBnZXQgb3B0aW9ucygpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7CiAgICB9CiAgICBnZXQgZW51bSgpIHsKICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9OwogICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7CiAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsOwogICAgICB9CiAgICAgIHJldHVybiBlbnVtVmFsdWVzOwogICAgfQogICAgZ2V0IFZhbHVlcygpIHsKICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9OwogICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7CiAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsOwogICAgICB9CiAgICAgIHJldHVybiBlbnVtVmFsdWVzOwogICAgfQogICAgZ2V0IEVudW0oKSB7CiAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTsKICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykgewogICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDsKICAgICAgfQogICAgICByZXR1cm4gZW51bVZhbHVlczsKICAgIH0KICAgIGV4dHJhY3QodmFsdWVzLCBuZXdEZWYgPSB0aGlzLl9kZWYpIHsKICAgICAgcmV0dXJuIFpvZEVudW0uY3JlYXRlKHZhbHVlcywgewogICAgICAgIC4uLnRoaXMuX2RlZiwKICAgICAgICAuLi5uZXdEZWYKICAgICAgfSk7CiAgICB9CiAgICBleGNsdWRlKHZhbHVlcywgbmV3RGVmID0gdGhpcy5fZGVmKSB7CiAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQpID0+ICF2YWx1ZXMuaW5jbHVkZXMob3B0KSksIHsKICAgICAgICAuLi50aGlzLl9kZWYsCiAgICAgICAgLi4ubmV3RGVmCiAgICAgIH0pOwogICAgfQogIH0KICBfWm9kRW51bV9jYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogIFpvZEVudW0uY3JlYXRlID0gY3JlYXRlWm9kRW51bTsKICBjbGFzcyBab2ROYXRpdmVFbnVtIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgX1pvZE5hdGl2ZUVudW1fY2FjaGUuc2V0KHRoaXMsIHZvaWQgMCk7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgbmF0aXZlRW51bVZhbHVlcyA9IHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpOwogICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7CiAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zdHJpbmcgJiYgY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubnVtYmVyKSB7CiAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB1dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLAogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLAogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICB9CiAgICAgIGlmICghX19jbGFzc1ByaXZhdGVGaWVsZEdldCh0aGlzLCBfWm9kTmF0aXZlRW51bV9jYWNoZSkpIHsKICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHRoaXMsIF9ab2ROYXRpdmVFbnVtX2NhY2hlLCBuZXcgU2V0KHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKSk7CiAgICAgIH0KICAgICAgaWYgKCFfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9ab2ROYXRpdmVFbnVtX2NhY2hlKS5oYXMoaW5wdXQuZGF0YSkpIHsKICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHV0aWwub2JqZWN0VmFsdWVzKG5hdGl2ZUVudW1WYWx1ZXMpOwogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5kYXRhLAogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZSwKICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgIH0KICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpOwogICAgfQogICAgZ2V0IGVudW0oKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVzOwogICAgfQogIH0KICBfWm9kTmF0aXZlRW51bV9jYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpOwogIFpvZE5hdGl2ZUVudW0uY3JlYXRlID0gKHZhbHVlcywgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE5hdGl2ZUVudW0oewogICAgICB2YWx1ZXMsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmF0aXZlRW51bSwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZFByb21pc2UgZXh0ZW5kcyBab2RUeXBlIHsKICAgIHVud3JhcCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlOwogICAgfQogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUucHJvbWlzZSAmJiBjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkgewogICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgewogICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSwKICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnByb21pc2UsCiAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICBjb25zdCBwcm9taXNpZmllZCA9IGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnByb21pc2UgPyBjdHguZGF0YSA6IFByb21pc2UucmVzb2x2ZShjdHguZGF0YSk7CiAgICAgIHJldHVybiBPSyhwcm9taXNpZmllZC50aGVuKChkYXRhKSA9PiB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlLnBhcnNlQXN5bmMoZGF0YSwgewogICAgICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgICAgICBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAKICAgICAgICB9KTsKICAgICAgfSkpOwogICAgfQogIH0KICBab2RQcm9taXNlLmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RQcm9taXNlKHsKICAgICAgdHlwZTogc2NoZW1hLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFByb21pc2UsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2RFZmZlY3RzIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBpbm5lclR5cGUoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hOwogICAgfQogICAgc291cmNlVHlwZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMgPyB0aGlzLl9kZWYuc2NoZW1hLnNvdXJjZVR5cGUoKSA6IHRoaXMuX2RlZi5zY2hlbWE7CiAgICB9CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgY29uc3QgZWZmZWN0ID0gdGhpcy5fZGVmLmVmZmVjdCB8fCBudWxsOwogICAgICBjb25zdCBjaGVja0N0eCA9IHsKICAgICAgICBhZGRJc3N1ZTogKGFyZykgPT4gewogICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCBhcmcpOwogICAgICAgICAgaWYgKGFyZy5mYXRhbCkgewogICAgICAgICAgICBzdGF0dXMuYWJvcnQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgICByZXR1cm4gY3R4LnBhdGg7CiAgICAgICAgfQogICAgICB9OwogICAgICBjaGVja0N0eC5hZGRJc3N1ZSA9IGNoZWNrQ3R4LmFkZElzc3VlLmJpbmQoY2hlY2tDdHgpOwogICAgICBpZiAoZWZmZWN0LnR5cGUgPT09ICJwcmVwcm9jZXNzIikgewogICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGVmZmVjdC50cmFuc2Zvcm0oY3R4LmRhdGEsIGNoZWNrQ3R4KTsKICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykgewogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwcm9jZXNzZWQpLnRoZW4oYXN5bmMgKHByb2Nlc3NlZDIpID0+IHsKICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gImFib3J0ZWQiKQogICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsKICAgICAgICAgICAgICBkYXRhOiBwcm9jZXNzZWQyLAogICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICAgIHBhcmVudDogY3R4CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gImFib3J0ZWQiKQogICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gImRpcnR5IikKICAgICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc3RhdHVzLnZhbHVlID09PSAiYWJvcnRlZCIpCiAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHsKICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLAogICAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgICAgcGFyZW50OiBjdHgKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICJhYm9ydGVkIikKICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICBpZiAoc3RhdHVzLnZhbHVlID09PSAiZGlydHkiKQogICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gInJlZmluZW1lbnQiKSB7CiAgICAgICAgY29uc3QgZXhlY3V0ZVJlZmluZW1lbnQgPSAoYWNjKSA9PiB7CiAgICAgICAgICBjb25zdCByZXN1bHQgPSBlZmZlY3QucmVmaW5lbWVudChhY2MsIGNoZWNrQ3R4KTsKICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBhY2M7CiAgICAgICAgfTsKICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHsKICAgICAgICAgIGNvbnN0IGlubmVyID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSAiYWJvcnRlZCIpCiAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gImRpcnR5IikKICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSk7CiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlubmVyLnZhbHVlIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KS50aGVuKChpbm5lcikgPT4gewogICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSAiYWJvcnRlZCIpCiAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09ICJkaXJ0eSIpCiAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICAgIHJldHVybiBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbm5lci52YWx1ZSB9OwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZWZmZWN0LnR5cGUgPT09ICJ0cmFuc2Zvcm0iKSB7CiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7CiAgICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpCiAgICAgICAgICAgIHJldHVybiBiYXNlOwogICAgICAgICAgY29uc3QgcmVzdWx0ID0gZWZmZWN0LnRyYW5zZm9ybShiYXNlLnZhbHVlLCBjaGVja0N0eCk7CiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFzeW5jaHJvbm91cyB0cmFuc2Zvcm0gZW5jb3VudGVyZWQgZHVyaW5nIHN5bmNocm9ub3VzIHBhcnNlIG9wZXJhdGlvbi4gVXNlIC5wYXJzZUFzeW5jIGluc3RlYWQuYCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHJlc3VsdCB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSkudGhlbigoYmFzZSkgPT4gewogICAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpCiAgICAgICAgICAgICAgcmV0dXJuIGJhc2U7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZWZmZWN0LnRyYW5zZm9ybShiYXNlLnZhbHVlLCBjaGVja0N0eCkpLnRoZW4oKHJlc3VsdCkgPT4gKHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiByZXN1bHQgfSkpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoZWZmZWN0KTsKICAgIH0KICB9CiAgWm9kRWZmZWN0cy5jcmVhdGUgPSAoc2NoZW1hLCBlZmZlY3QsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHsKICAgICAgc2NoZW1hLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsCiAgICAgIGVmZmVjdCwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIFpvZEVmZmVjdHMuY3JlYXRlV2l0aFByZXByb2Nlc3MgPSAocHJlcHJvY2Vzcywgc2NoZW1hLCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7CiAgICAgIHNjaGVtYSwKICAgICAgZWZmZWN0OiB7IHR5cGU6ICJwcmVwcm9jZXNzIiwgdHJhbnNmb3JtOiBwcmVwcm9jZXNzIH0sCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cywKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZE9wdGlvbmFsIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpOwogICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gT0sodm9pZCAwKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpOwogICAgfQogICAgdW53cmFwKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTsKICAgIH0KICB9CiAgWm9kT3B0aW9uYWwuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RPcHRpb25hbCh7CiAgICAgIGlubmVyVHlwZTogdHlwZSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPcHRpb25hbCwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGNsYXNzIFpvZE51bGxhYmxlIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpOwogICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5udWxsKSB7CiAgICAgICAgcmV0dXJuIE9LKG51bGwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7CiAgICB9CiAgICB1bndyYXAoKSB7CiAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlOwogICAgfQogIH0KICBab2ROdWxsYWJsZS5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE51bGxhYmxlKHsKICAgICAgaW5uZXJUeXBlOiB0eXBlLAogICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGxhYmxlLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kRGVmYXVsdCBleHRlbmRzIFpvZFR5cGUgewogICAgX3BhcnNlKGlucHV0KSB7CiAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpOwogICAgICBsZXQgZGF0YSA9IGN0eC5kYXRhOwogICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7CiAgICAgICAgZGF0YSA9IHRoaXMuX2RlZi5kZWZhdWx0VmFsdWUoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoewogICAgICAgIGRhdGEsCiAgICAgICAgcGF0aDogY3R4LnBhdGgsCiAgICAgICAgcGFyZW50OiBjdHgKICAgICAgfSk7CiAgICB9CiAgICByZW1vdmVEZWZhdWx0KCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTsKICAgIH0KICB9CiAgWm9kRGVmYXVsdC5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoewogICAgICBpbm5lclR5cGU6IHR5cGUsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCwKICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgcGFyYW1zLmRlZmF1bHQgPT09ICJmdW5jdGlvbiIgPyBwYXJhbXMuZGVmYXVsdCA6ICgpID0+IHBhcmFtcy5kZWZhdWx0LAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY2xhc3MgWm9kQ2F0Y2ggZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgY29uc3QgbmV3Q3R4ID0gewogICAgICAgIC4uLmN0eCwKICAgICAgICBjb21tb246IHsKICAgICAgICAgIC4uLmN0eC5jb21tb24sCiAgICAgICAgICBpc3N1ZXM6IFtdCiAgICAgICAgfQogICAgICB9OwogICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7CiAgICAgICAgZGF0YTogbmV3Q3R4LmRhdGEsCiAgICAgICAgcGF0aDogbmV3Q3R4LnBhdGgsCiAgICAgICAgcGFyZW50OiB7CiAgICAgICAgICAuLi5uZXdDdHgKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoaXNBc3luYyhyZXN1bHQpKSB7CiAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQyKSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdGF0dXM6ICJ2YWxpZCIsCiAgICAgICAgICAgIHZhbHVlOiByZXN1bHQyLnN0YXR1cyA9PT0gInZhbGlkIiA/IHJlc3VsdDIudmFsdWUgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7CiAgICAgICAgICAgICAgZ2V0IGVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEKICAgICAgICAgICAgfSkKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHN0YXR1czogInZhbGlkIiwKICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSAidmFsaWQiID8gcmVzdWx0LnZhbHVlIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoewogICAgICAgICAgICBnZXQgZXJyb3IoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGlucHV0OiBuZXdDdHguZGF0YQogICAgICAgICAgfSkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgICByZW1vdmVDYXRjaCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7CiAgICB9CiAgfQogIFpvZENhdGNoLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goewogICAgICBpbm5lclR5cGU6IHR5cGUsCiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQ2F0Y2gsCiAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBwYXJhbXMuY2F0Y2ggPT09ICJmdW5jdGlvbiIgPyBwYXJhbXMuY2F0Y2ggOiAoKSA9PiBwYXJhbXMuY2F0Y2gsCiAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKQogICAgfSk7CiAgfTsKICBjbGFzcyBab2ROYU4gZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7CiAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm5hbikgewogICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTsKICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHsKICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsCiAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5uYW4sCiAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgfQogICAgICByZXR1cm4geyBzdGF0dXM6ICJ2YWxpZCIsIHZhbHVlOiBpbnB1dC5kYXRhIH07CiAgICB9CiAgfQogIFpvZE5hTi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7CiAgICByZXR1cm4gbmV3IFpvZE5hTih7CiAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmFOLAogICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcykKICAgIH0pOwogIH07CiAgY29uc3QgQlJBTkQgPSBTeW1ib2woInpvZF9icmFuZCIpOwogIGNsYXNzIFpvZEJyYW5kZWQgZXh0ZW5kcyBab2RUeXBlIHsKICAgIF9wYXJzZShpbnB1dCkgewogICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgY29uc3QgZGF0YSA9IGN0eC5kYXRhOwogICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUuX3BhcnNlKHsKICAgICAgICBkYXRhLAogICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgIHBhcmVudDogY3R4CiAgICAgIH0pOwogICAgfQogICAgdW53cmFwKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7CiAgICB9CiAgfQogIGNsYXNzIFpvZFBpcGVsaW5lIGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTsKICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHsKICAgICAgICBjb25zdCBoYW5kbGVBc3luYyA9IGFzeW5jICgpID0+IHsKICAgICAgICAgIGNvbnN0IGluUmVzdWx0ID0gYXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHsKICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLAogICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSAiYWJvcnRlZCIpCiAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gImRpcnR5IikgewogICAgICAgICAgICBzdGF0dXMuZGlydHkoKTsKICAgICAgICAgICAgcmV0dXJuIERJUlRZKGluUmVzdWx0LnZhbHVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYub3V0Ll9wYXJzZUFzeW5jKHsKICAgICAgICAgICAgICBkYXRhOiBpblJlc3VsdC52YWx1ZSwKICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgICAgICBwYXJlbnQ6IGN0eAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBoYW5kbGVBc3luYygpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGluUmVzdWx0ID0gdGhpcy5fZGVmLmluLl9wYXJzZVN5bmMoewogICAgICAgICAgZGF0YTogY3R4LmRhdGEsCiAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgIHBhcmVudDogY3R4CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gImFib3J0ZWQiKQogICAgICAgICAgcmV0dXJuIElOVkFMSUQ7CiAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gImRpcnR5IikgewogICAgICAgICAgc3RhdHVzLmRpcnR5KCk7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdGF0dXM6ICJkaXJ0eSIsCiAgICAgICAgICAgIHZhbHVlOiBpblJlc3VsdC52YWx1ZQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlU3luYyh7CiAgICAgICAgICAgIGRhdGE6IGluUmVzdWx0LnZhbHVlLAogICAgICAgICAgICBwYXRoOiBjdHgucGF0aCwKICAgICAgICAgICAgcGFyZW50OiBjdHgKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc3RhdGljIGNyZWF0ZShhMiwgYikgewogICAgICByZXR1cm4gbmV3IFpvZFBpcGVsaW5lKHsKICAgICAgICBpbjogYTIsCiAgICAgICAgb3V0OiBiLAogICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUGlwZWxpbmUKICAgICAgfSk7CiAgICB9CiAgfQogIGNsYXNzIFpvZFJlYWRvbmx5IGV4dGVuZHMgWm9kVHlwZSB7CiAgICBfcGFyc2UoaW5wdXQpIHsKICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpOwogICAgICBjb25zdCBmcmVlemUgPSAoZGF0YSkgPT4gewogICAgICAgIGlmIChpc1ZhbGlkKGRhdGEpKSB7CiAgICAgICAgICBkYXRhLnZhbHVlID0gT2JqZWN0LmZyZWV6ZShkYXRhLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgIH07CiAgICAgIHJldHVybiBpc0FzeW5jKHJlc3VsdCkgPyByZXN1bHQudGhlbigoZGF0YSkgPT4gZnJlZXplKGRhdGEpKSA6IGZyZWV6ZShyZXN1bHQpOwogICAgfQogICAgdW53cmFwKCkgewogICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTsKICAgIH0KICB9CiAgWm9kUmVhZG9ubHkuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4gewogICAgcmV0dXJuIG5ldyBab2RSZWFkb25seSh7CiAgICAgIGlubmVyVHlwZTogdHlwZSwKICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWFkb25seSwKICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpCiAgICB9KTsKICB9OwogIGZ1bmN0aW9uIGN1c3RvbShjaGVjaywgcGFyYW1zID0ge30sIGZhdGFsKSB7CiAgICBpZiAoY2hlY2spCiAgICAgIHJldHVybiBab2RBbnkuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKGRhdGEsIGN0eCkgPT4gewogICAgICAgIHZhciBfYSwgX2I7CiAgICAgICAgaWYgKCFjaGVjayhkYXRhKSkgewogICAgICAgICAgY29uc3QgcCA9IHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIgPyBwYXJhbXMoZGF0YSkgOiB0eXBlb2YgcGFyYW1zID09PSAic3RyaW5nIiA/IHsgbWVzc2FnZTogcGFyYW1zIH0gOiBwYXJhbXM7CiAgICAgICAgICBjb25zdCBfZmF0YWwgPSAoX2IgPSAoX2EgPSBwLmZhdGFsKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYXRhbCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdHJ1ZTsKICAgICAgICAgIGNvbnN0IHAyID0gdHlwZW9mIHAgPT09ICJzdHJpbmciID8geyBtZXNzYWdlOiBwIH0gOiBwOwogICAgICAgICAgY3R4LmFkZElzc3VlKHsgY29kZTogImN1c3RvbSIsIC4uLnAyLCBmYXRhbDogX2ZhdGFsIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpOwogIH0KICBjb25zdCBsYXRlID0gewogICAgb2JqZWN0OiBab2RPYmplY3QubGF6eWNyZWF0ZQogIH07CiAgdmFyIFpvZEZpcnN0UGFydHlUeXBlS2luZDsKICAoZnVuY3Rpb24oWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMikgewogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kU3RyaW5nIl0gPSAiWm9kU3RyaW5nIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZE51bWJlciJdID0gIlpvZE51bWJlciI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2ROYU4iXSA9ICJab2ROYU4iOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kQmlnSW50Il0gPSAiWm9kQmlnSW50IjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZEJvb2xlYW4iXSA9ICJab2RCb29sZWFuIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZERhdGUiXSA9ICJab2REYXRlIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZFN5bWJvbCJdID0gIlpvZFN5bWJvbCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RVbmRlZmluZWQiXSA9ICJab2RVbmRlZmluZWQiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kTnVsbCJdID0gIlpvZE51bGwiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kQW55Il0gPSAiWm9kQW55IjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZFVua25vd24iXSA9ICJab2RVbmtub3duIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZE5ldmVyIl0gPSAiWm9kTmV2ZXIiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kVm9pZCJdID0gIlpvZFZvaWQiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kQXJyYXkiXSA9ICJab2RBcnJheSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RPYmplY3QiXSA9ICJab2RPYmplY3QiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kVW5pb24iXSA9ICJab2RVbmlvbiI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2REaXNjcmltaW5hdGVkVW5pb24iXSA9ICJab2REaXNjcmltaW5hdGVkVW5pb24iOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kSW50ZXJzZWN0aW9uIl0gPSAiWm9kSW50ZXJzZWN0aW9uIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZFR1cGxlIl0gPSAiWm9kVHVwbGUiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kUmVjb3JkIl0gPSAiWm9kUmVjb3JkIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZE1hcCJdID0gIlpvZE1hcCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RTZXQiXSA9ICJab2RTZXQiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kRnVuY3Rpb24iXSA9ICJab2RGdW5jdGlvbiI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RMYXp5Il0gPSAiWm9kTGF6eSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RMaXRlcmFsIl0gPSAiWm9kTGl0ZXJhbCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RFbnVtIl0gPSAiWm9kRW51bSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RFZmZlY3RzIl0gPSAiWm9kRWZmZWN0cyI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2ROYXRpdmVFbnVtIl0gPSAiWm9kTmF0aXZlRW51bSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RPcHRpb25hbCJdID0gIlpvZE9wdGlvbmFsIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZE51bGxhYmxlIl0gPSAiWm9kTnVsbGFibGUiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kRGVmYXVsdCJdID0gIlpvZERlZmF1bHQiOwogICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kMlsiWm9kQ2F0Y2giXSA9ICJab2RDYXRjaCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RQcm9taXNlIl0gPSAiWm9kUHJvbWlzZSI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RCcmFuZGVkIl0gPSAiWm9kQnJhbmRlZCI7CiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmQyWyJab2RQaXBlbGluZSJdID0gIlpvZFBpcGVsaW5lIjsKICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZDJbIlpvZFJlYWRvbmx5Il0gPSAiWm9kUmVhZG9ubHkiOwogIH0pKFpvZEZpcnN0UGFydHlUeXBlS2luZCB8fCAoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kID0ge30pKTsKICBjb25zdCBpbnN0YW5jZU9mVHlwZSA9IChjbHMsIHBhcmFtcyA9IHsKICAgIG1lc3NhZ2U6IGBJbnB1dCBub3QgaW5zdGFuY2Ugb2YgJHtjbHMubmFtZX1gCiAgfSkgPT4gY3VzdG9tKChkYXRhKSA9PiBkYXRhIGluc3RhbmNlb2YgY2xzLCBwYXJhbXMpOwogIGNvbnN0IHN0cmluZ1R5cGUgPSBab2RTdHJpbmcuY3JlYXRlOwogIGNvbnN0IG51bWJlclR5cGUgPSBab2ROdW1iZXIuY3JlYXRlOwogIGNvbnN0IG5hblR5cGUgPSBab2ROYU4uY3JlYXRlOwogIGNvbnN0IGJpZ0ludFR5cGUgPSBab2RCaWdJbnQuY3JlYXRlOwogIGNvbnN0IGJvb2xlYW5UeXBlID0gWm9kQm9vbGVhbi5jcmVhdGU7CiAgY29uc3QgZGF0ZVR5cGUgPSBab2REYXRlLmNyZWF0ZTsKICBjb25zdCBzeW1ib2xUeXBlID0gWm9kU3ltYm9sLmNyZWF0ZTsKICBjb25zdCB1bmRlZmluZWRUeXBlID0gWm9kVW5kZWZpbmVkLmNyZWF0ZTsKICBjb25zdCBudWxsVHlwZSA9IFpvZE51bGwuY3JlYXRlOwogIGNvbnN0IGFueVR5cGUgPSBab2RBbnkuY3JlYXRlOwogIGNvbnN0IHVua25vd25UeXBlID0gWm9kVW5rbm93bi5jcmVhdGU7CiAgY29uc3QgbmV2ZXJUeXBlID0gWm9kTmV2ZXIuY3JlYXRlOwogIGNvbnN0IHZvaWRUeXBlID0gWm9kVm9pZC5jcmVhdGU7CiAgY29uc3QgYXJyYXlUeXBlID0gWm9kQXJyYXkuY3JlYXRlOwogIGNvbnN0IG9iamVjdFR5cGUgPSBab2RPYmplY3QuY3JlYXRlOwogIGNvbnN0IHN0cmljdE9iamVjdFR5cGUgPSBab2RPYmplY3Quc3RyaWN0Q3JlYXRlOwogIGNvbnN0IHVuaW9uVHlwZSA9IFpvZFVuaW9uLmNyZWF0ZTsKICBjb25zdCBkaXNjcmltaW5hdGVkVW5pb25UeXBlID0gWm9kRGlzY3JpbWluYXRlZFVuaW9uLmNyZWF0ZTsKICBjb25zdCBpbnRlcnNlY3Rpb25UeXBlID0gWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZTsKICBjb25zdCB0dXBsZVR5cGUgPSBab2RUdXBsZS5jcmVhdGU7CiAgY29uc3QgcmVjb3JkVHlwZSA9IFpvZFJlY29yZC5jcmVhdGU7CiAgY29uc3QgbWFwVHlwZSA9IFpvZE1hcC5jcmVhdGU7CiAgY29uc3Qgc2V0VHlwZSA9IFpvZFNldC5jcmVhdGU7CiAgY29uc3QgZnVuY3Rpb25UeXBlID0gWm9kRnVuY3Rpb24uY3JlYXRlOwogIGNvbnN0IGxhenlUeXBlID0gWm9kTGF6eS5jcmVhdGU7CiAgY29uc3QgbGl0ZXJhbFR5cGUgPSBab2RMaXRlcmFsLmNyZWF0ZTsKICBjb25zdCBlbnVtVHlwZSA9IFpvZEVudW0uY3JlYXRlOwogIGNvbnN0IG5hdGl2ZUVudW1UeXBlID0gWm9kTmF0aXZlRW51bS5jcmVhdGU7CiAgY29uc3QgcHJvbWlzZVR5cGUgPSBab2RQcm9taXNlLmNyZWF0ZTsKICBjb25zdCBlZmZlY3RzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlOwogIGNvbnN0IG9wdGlvbmFsVHlwZSA9IFpvZE9wdGlvbmFsLmNyZWF0ZTsKICBjb25zdCBudWxsYWJsZVR5cGUgPSBab2ROdWxsYWJsZS5jcmVhdGU7CiAgY29uc3QgcHJlcHJvY2Vzc1R5cGUgPSBab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzOwogIGNvbnN0IHBpcGVsaW5lVHlwZSA9IFpvZFBpcGVsaW5lLmNyZWF0ZTsKICBjb25zdCBvc3RyaW5nID0gKCkgPT4gc3RyaW5nVHlwZSgpLm9wdGlvbmFsKCk7CiAgY29uc3Qgb251bWJlciA9ICgpID0+IG51bWJlclR5cGUoKS5vcHRpb25hbCgpOwogIGNvbnN0IG9ib29sZWFuID0gKCkgPT4gYm9vbGVhblR5cGUoKS5vcHRpb25hbCgpOwogIGNvbnN0IGNvZXJjZSA9IHsKICAgIHN0cmluZzogKGFyZykgPT4gWm9kU3RyaW5nLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pLAogICAgbnVtYmVyOiAoYXJnKSA9PiBab2ROdW1iZXIuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSksCiAgICBib29sZWFuOiAoYXJnKSA9PiBab2RCb29sZWFuLmNyZWF0ZSh7CiAgICAgIC4uLmFyZywKICAgICAgY29lcmNlOiB0cnVlCiAgICB9KSwKICAgIGJpZ2ludDogKGFyZykgPT4gWm9kQmlnSW50LmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pLAogICAgZGF0ZTogKGFyZykgPT4gWm9kRGF0ZS5jcmVhdGUoeyAuLi5hcmcsIGNvZXJjZTogdHJ1ZSB9KQogIH07CiAgY29uc3QgTkVWRVIgPSBJTlZBTElEOwogIHZhciB6JDEgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmZyZWV6ZSh7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBkZWZhdWx0RXJyb3JNYXA6IGVycm9yTWFwLAogICAgc2V0RXJyb3JNYXAsCiAgICBnZXRFcnJvck1hcCwKICAgIG1ha2VJc3N1ZSwKICAgIEVNUFRZX1BBVEgsCiAgICBhZGRJc3N1ZVRvQ29udGV4dCwKICAgIFBhcnNlU3RhdHVzLAogICAgSU5WQUxJRCwKICAgIERJUlRZLAogICAgT0ssCiAgICBpc0Fib3J0ZWQsCiAgICBpc0RpcnR5LAogICAgaXNWYWxpZCwKICAgIGlzQXN5bmMsCiAgICBnZXQgdXRpbCgpIHsKICAgICAgcmV0dXJuIHV0aWw7CiAgICB9LAogICAgZ2V0IG9iamVjdFV0aWwoKSB7CiAgICAgIHJldHVybiBvYmplY3RVdGlsOwogICAgfSwKICAgIFpvZFBhcnNlZFR5cGUsCiAgICBnZXRQYXJzZWRUeXBlLAogICAgWm9kVHlwZSwKICAgIGRhdGV0aW1lUmVnZXgsCiAgICBab2RTdHJpbmcsCiAgICBab2ROdW1iZXIsCiAgICBab2RCaWdJbnQsCiAgICBab2RCb29sZWFuLAogICAgWm9kRGF0ZSwKICAgIFpvZFN5bWJvbCwKICAgIFpvZFVuZGVmaW5lZCwKICAgIFpvZE51bGwsCiAgICBab2RBbnksCiAgICBab2RVbmtub3duLAogICAgWm9kTmV2ZXIsCiAgICBab2RWb2lkLAogICAgWm9kQXJyYXksCiAgICBab2RPYmplY3QsCiAgICBab2RVbmlvbiwKICAgIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiwKICAgIFpvZEludGVyc2VjdGlvbiwKICAgIFpvZFR1cGxlLAogICAgWm9kUmVjb3JkLAogICAgWm9kTWFwLAogICAgWm9kU2V0LAogICAgWm9kRnVuY3Rpb24sCiAgICBab2RMYXp5LAogICAgWm9kTGl0ZXJhbCwKICAgIFpvZEVudW0sCiAgICBab2ROYXRpdmVFbnVtLAogICAgWm9kUHJvbWlzZSwKICAgIFpvZEVmZmVjdHMsCiAgICBab2RUcmFuc2Zvcm1lcjogWm9kRWZmZWN0cywKICAgIFpvZE9wdGlvbmFsLAogICAgWm9kTnVsbGFibGUsCiAgICBab2REZWZhdWx0LAogICAgWm9kQ2F0Y2gsCiAgICBab2ROYU4sCiAgICBCUkFORCwKICAgIFpvZEJyYW5kZWQsCiAgICBab2RQaXBlbGluZSwKICAgIFpvZFJlYWRvbmx5LAogICAgY3VzdG9tLAogICAgU2NoZW1hOiBab2RUeXBlLAogICAgWm9kU2NoZW1hOiBab2RUeXBlLAogICAgbGF0ZSwKICAgIGdldCBab2RGaXJzdFBhcnR5VHlwZUtpbmQoKSB7CiAgICAgIHJldHVybiBab2RGaXJzdFBhcnR5VHlwZUtpbmQ7CiAgICB9LAogICAgY29lcmNlLAogICAgYW55OiBhbnlUeXBlLAogICAgYXJyYXk6IGFycmF5VHlwZSwKICAgIGJpZ2ludDogYmlnSW50VHlwZSwKICAgIGJvb2xlYW46IGJvb2xlYW5UeXBlLAogICAgZGF0ZTogZGF0ZVR5cGUsCiAgICBkaXNjcmltaW5hdGVkVW5pb246IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUsCiAgICBlZmZlY3Q6IGVmZmVjdHNUeXBlLAogICAgImVudW0iOiBlbnVtVHlwZSwKICAgICJmdW5jdGlvbiI6IGZ1bmN0aW9uVHlwZSwKICAgICJpbnN0YW5jZW9mIjogaW5zdGFuY2VPZlR5cGUsCiAgICBpbnRlcnNlY3Rpb246IGludGVyc2VjdGlvblR5cGUsCiAgICBsYXp5OiBsYXp5VHlwZSwKICAgIGxpdGVyYWw6IGxpdGVyYWxUeXBlLAogICAgbWFwOiBtYXBUeXBlLAogICAgbmFuOiBuYW5UeXBlLAogICAgbmF0aXZlRW51bTogbmF0aXZlRW51bVR5cGUsCiAgICBuZXZlcjogbmV2ZXJUeXBlLAogICAgIm51bGwiOiBudWxsVHlwZSwKICAgIG51bGxhYmxlOiBudWxsYWJsZVR5cGUsCiAgICBudW1iZXI6IG51bWJlclR5cGUsCiAgICBvYmplY3Q6IG9iamVjdFR5cGUsCiAgICBvYm9vbGVhbiwKICAgIG9udW1iZXIsCiAgICBvcHRpb25hbDogb3B0aW9uYWxUeXBlLAogICAgb3N0cmluZywKICAgIHBpcGVsaW5lOiBwaXBlbGluZVR5cGUsCiAgICBwcmVwcm9jZXNzOiBwcmVwcm9jZXNzVHlwZSwKICAgIHByb21pc2U6IHByb21pc2VUeXBlLAogICAgcmVjb3JkOiByZWNvcmRUeXBlLAogICAgc2V0OiBzZXRUeXBlLAogICAgc3RyaWN0T2JqZWN0OiBzdHJpY3RPYmplY3RUeXBlLAogICAgc3RyaW5nOiBzdHJpbmdUeXBlLAogICAgc3ltYm9sOiBzeW1ib2xUeXBlLAogICAgdHJhbnNmb3JtZXI6IGVmZmVjdHNUeXBlLAogICAgdHVwbGU6IHR1cGxlVHlwZSwKICAgICJ1bmRlZmluZWQiOiB1bmRlZmluZWRUeXBlLAogICAgdW5pb246IHVuaW9uVHlwZSwKICAgIHVua25vd246IHVua25vd25UeXBlLAogICAgInZvaWQiOiB2b2lkVHlwZSwKICAgIE5FVkVSLAogICAgWm9kSXNzdWVDb2RlLAogICAgcXVvdGVsZXNzSnNvbiwKICAgIFpvZEVycm9yCiAgfSk7CiAgeiQxLm9iamVjdCh7CiAgICBudWNsZW90aWRlU2VxdWVuY2VzOiB6JDEuYXJyYXkoCiAgICAgIHokMS5vYmplY3QoewogICAgICAgIG5hbWU6IHokMS5zdHJpbmcoKSwKICAgICAgICBzZXF1ZW5jZTogeiQxLnN0cmluZygpCiAgICAgIH0pCiAgICApLAogICAgZ2VuZXM6IHokMS5hcnJheSgKICAgICAgeiQxLm9iamVjdCh7CiAgICAgICAgbmFtZTogeiQxLnN0cmluZygpLAogICAgICAgIHNlcXVlbmNlOiB6JDEuc3RyaW5nKCkKICAgICAgfSkKICAgICkKICB9KTsKICBjb25zdCBvcmRlckJ5VHlwZSA9IHokMS5lbnVtKFsiYXNjZW5kaW5nIiwgImRlc2NlbmRpbmciXSk7CiAgY29uc3Qgb3JkZXJCeSA9IHokMS5vYmplY3QoewogICAgZmllbGQ6IHokMS5zdHJpbmcoKSwKICAgIHR5cGU6IG9yZGVyQnlUeXBlCiAgfSk7CiAgY29uc3QgbGFwaXNCYXNlUmVxdWVzdCA9IHokMS5vYmplY3QoewogICAgbGltaXQ6IHokMS5udW1iZXIoKS5vcHRpb25hbCgpLAogICAgb2Zmc2V0OiB6JDEubnVtYmVyKCkub3B0aW9uYWwoKSwKICAgIGZpZWxkczogeiQxLmFycmF5KHokMS5zdHJpbmcoKSkub3B0aW9uYWwoKSwKICAgIG9yZGVyQnk6IHokMS5hcnJheShvcmRlckJ5KS5vcHRpb25hbCgpCiAgfSkuY2F0Y2hhbGwoeiQxLnVuaW9uKFt6JDEuYm9vbGVhbigpLCB6JDEudW5kZWZpbmVkKCksIHokMS5zdHJpbmcoKSwgeiQxLm51bWJlcigpLCB6JDEubnVsbCgpLCB6JDEuYXJyYXkoeiQxLnN0cmluZygpKV0pKTsKICBsYXBpc0Jhc2VSZXF1ZXN0LmV4dGVuZCh7IG1pblByb3BvcnRpb246IHokMS5udW1iZXIoKS5vcHRpb25hbCgpIH0pOwogIGNvbnN0IG11dGF0aW9uUHJvcG9ydGlvbkNvdW50ID0geiQxLm9iamVjdCh7CiAgICBtdXRhdGlvbjogeiQxLnN0cmluZygpLAogICAgcHJvcG9ydGlvbjogeiQxLm51bWJlcigpLAogICAgY291bnQ6IHokMS5udW1iZXIoKSwKICAgIHNlcXVlbmNlTmFtZTogeiQxLnVuaW9uKFt6JDEuc3RyaW5nKCksIHokMS5udWxsKCldKSwKICAgIG11dGF0aW9uRnJvbTogeiQxLnN0cmluZygpLAogICAgbXV0YXRpb25UbzogeiQxLnN0cmluZygpLAogICAgcG9zaXRpb246IHokMS5udW1iZXIoKQogIH0pOwogIGNvbnN0IG11dGF0aW9uc1Jlc3BvbnNlID0gbWFrZUxhcGlzUmVzcG9uc2UoeiQxLmFycmF5KG11dGF0aW9uUHJvcG9ydGlvbkNvdW50KSk7CiAgY29uc3QgaW5zZXJ0aW9uQ291bnQgPSB6JDEub2JqZWN0KHsKICAgIGluc2VydGlvbjogeiQxLnN0cmluZygpLAogICAgY291bnQ6IHokMS5udW1iZXIoKSwKICAgIGluc2VydGVkU3ltYm9sczogeiQxLnN0cmluZygpLAogICAgcG9zaXRpb246IHokMS5udW1iZXIoKSwKICAgIHNlcXVlbmNlTmFtZTogeiQxLnVuaW9uKFt6JDEuc3RyaW5nKCksIHokMS5udWxsKCldKQogIH0pOwogIG1ha2VMYXBpc1Jlc3BvbnNlKHokMS5hcnJheShpbnNlcnRpb25Db3VudCkpOwogIGNvbnN0IGFnZ3JlZ2F0ZWRJdGVtID0geiQxLm9iamVjdCh7IGNvdW50OiB6JDEubnVtYmVyKCkgfSkuY2F0Y2hhbGwoeiQxLnVuaW9uKFt6JDEuc3RyaW5nKCksIHokMS5udW1iZXIoKSwgeiQxLm51bGwoKV0pKTsKICBjb25zdCBhZ2dyZWdhdGVkUmVzcG9uc2UgPSBtYWtlTGFwaXNSZXNwb25zZSh6JDEuYXJyYXkoYWdncmVnYXRlZEl0ZW0pKTsKICBmdW5jdGlvbiBtYWtlTGFwaXNSZXNwb25zZShkYXRhKSB7CiAgICByZXR1cm4geiQxLm9iamVjdCh7CiAgICAgIGRhdGEKICAgIH0pOwogIH0KICBjb25zdCBwcm9ibGVtRGV0YWlsID0geiQxLm9iamVjdCh7CiAgICB0aXRsZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksCiAgICBzdGF0dXM6IHokMS5udW1iZXIoKSwKICAgIGRldGFpbDogeiQxLnN0cmluZygpLm9wdGlvbmFsKCksCiAgICB0eXBlOiB6JDEuc3RyaW5nKCksCiAgICBpbnN0YW5jZTogeiQxLnN0cmluZygpLm9wdGlvbmFsKCkKICB9KTsKICBjb25zdCBsYXBpc0Vycm9yID0geiQxLm9iamVjdCh7CiAgICBlcnJvcjogcHJvYmxlbURldGFpbAogIH0pOwogIGNsYXNzIFVua25vd25MYXBpc0Vycm9yIGV4dGVuZHMgRXJyb3IgewogICAgY29uc3RydWN0b3IobWVzc2FnZSwgc3RhdHVzLCByZXF1ZXN0ZWREYXRhKSB7CiAgICAgIHN1cGVyKG1lc3NhZ2UpOwogICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKICAgICAgdGhpcy5yZXF1ZXN0ZWREYXRhID0gcmVxdWVzdGVkRGF0YTsKICAgICAgdGhpcy5uYW1lID0gIlVua25vd25MYXBpc0Vycm9yIjsKICAgIH0KICB9CiAgY2xhc3MgTGFwaXNFcnJvciBleHRlbmRzIEVycm9yIHsKICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cywgcHJvYmxlbURldGFpbDIsIHJlcXVlc3RlZERhdGEpIHsKICAgICAgc3VwZXIobWVzc2FnZSk7CiAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwogICAgICB0aGlzLnByb2JsZW1EZXRhaWwgPSBwcm9ibGVtRGV0YWlsMjsKICAgICAgdGhpcy5yZXF1ZXN0ZWREYXRhID0gcmVxdWVzdGVkRGF0YTsKICAgICAgdGhpcy5uYW1lID0gIkxhcGlzRXJyb3IiOwogICAgfQogIH0KICBhc3luYyBmdW5jdGlvbiBmZXRjaEFnZ3JlZ2F0ZWQobGFwaXNVcmwsIGJvZHksIHNpZ25hbCkgewogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhZ2dyZWdhdGVkRW5kcG9pbnQobGFwaXNVcmwpLCB7CiAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICBoZWFkZXJzOiB7CiAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIgogICAgICB9LAogICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgc2lnbmFsCiAgICB9KTsKICAgIGF3YWl0IGhhbmRsZUVycm9ycyhyZXNwb25zZSwgImFnZ3JlZ2F0ZWQgZGF0YSIpOwogICAgcmV0dXJuIGFnZ3JlZ2F0ZWRSZXNwb25zZS5wYXJzZShhd2FpdCByZXNwb25zZS5qc29uKCkpOwogIH0KICBhc3luYyBmdW5jdGlvbiBmZXRjaFN1YnN0aXR1dGlvbnNPckRlbGV0aW9ucyhsYXBpc1VybCwgYm9keSwgc2VxdWVuY2VUeXBlLCBzaWduYWwpIHsKICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goc3Vic3RpdHV0aW9uc09yRGVsZXRpb25zRW5kcG9pbnQobGFwaXNVcmwsIHNlcXVlbmNlVHlwZSksIHsKICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgIGhlYWRlcnM6IHsKICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iCiAgICAgIH0sCiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLAogICAgICBzaWduYWwKICAgIH0pOwogICAgYXdhaXQgaGFuZGxlRXJyb3JzKHJlc3BvbnNlLCBgJHtzZXF1ZW5jZVR5cGV9IG11dGF0aW9uc2ApOwogICAgcmV0dXJuIG11dGF0aW9uc1Jlc3BvbnNlLnBhcnNlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7CiAgfQogIGNvbnN0IGhhbmRsZUVycm9ycyA9IGFzeW5jIChyZXNwb25zZSwgcmVxdWVzdGVkRGF0YSkgPT4gewogICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID49IDQwMCAmJiByZXNwb25zZS5zdGF0dXMgPCA1MDApIHsKICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICAgIGNvbnN0IGxhcGlzRXJyb3JSZXN1bHQgPSBsYXBpc0Vycm9yLnNhZmVQYXJzZShqc29uKTsKICAgICAgICBpZiAobGFwaXNFcnJvclJlc3VsdC5zdWNjZXNzKSB7CiAgICAgICAgICB0aHJvdyBuZXcgTGFwaXNFcnJvcigKICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dCArIGxhcGlzRXJyb3JSZXN1bHQuZGF0YS5lcnJvci5kZXRhaWwsCiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgbGFwaXNFcnJvclJlc3VsdC5kYXRhLmVycm9yLAogICAgICAgICAgICByZXF1ZXN0ZWREYXRhCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCBwcm9ibGVtRGV0YWlsUmVzdWx0ID0gcHJvYmxlbURldGFpbC5zYWZlUGFyc2UoanNvbik7CiAgICAgICAgaWYgKHByb2JsZW1EZXRhaWxSZXN1bHQuc3VjY2VzcykgewogICAgICAgICAgdGhyb3cgbmV3IExhcGlzRXJyb3IoCiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgKyBwcm9ibGVtRGV0YWlsUmVzdWx0LmRhdGEuZGV0YWlsLAogICAgICAgICAgICByZXNwb25zZS5zdGF0dXMsCiAgICAgICAgICAgIHByb2JsZW1EZXRhaWxSZXN1bHQuZGF0YSwKICAgICAgICAgICAgcmVxdWVzdGVkRGF0YQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IFVua25vd25MYXBpc0Vycm9yKAogICAgICAgICAgYCR7cmVzcG9uc2Uuc3RhdHVzVGV4dH06ICR7SlNPTi5zdHJpbmdpZnkoanNvbil9YCwKICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgIHJlcXVlc3RlZERhdGEKICAgICAgICApOwogICAgICB9CiAgICAgIHRocm93IG5ldyBVbmtub3duTGFwaXNFcnJvcihgJHtyZXNwb25zZS5zdGF0dXNUZXh0fTogJHtyZXNwb25zZS5zdGF0dXN9YCwgcmVzcG9uc2Uuc3RhdHVzLCByZXF1ZXN0ZWREYXRhKTsKICAgIH0KICB9OwogIGNvbnN0IGFnZ3JlZ2F0ZWRFbmRwb2ludCA9IChsYXBpc1VybCkgPT4gYCR7bGFwaXNVcmx9L3NhbXBsZS9hZ2dyZWdhdGVkYDsKICBjb25zdCBzdWJzdGl0dXRpb25zT3JEZWxldGlvbnNFbmRwb2ludCA9IChsYXBpc1VybCwgc2VxdWVuY2VUeXBlKSA9PiB7CiAgICByZXR1cm4gc2VxdWVuY2VUeXBlID09PSAiYW1pbm8gYWNpZCIgPyBgJHtsYXBpc1VybH0vc2FtcGxlL2FtaW5vQWNpZE11dGF0aW9uc2AgOiBgJHtsYXBpc1VybH0vc2FtcGxlL251Y2xlb3RpZGVNdXRhdGlvbnNgOwogIH07CiAgY2xhc3MgRmV0Y2hBZ2dyZWdhdGVkT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoZmlsdGVyLCBmaWVsZHMgPSBbXSkgewogICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7CiAgICB9CiAgICBhc3luYyBldmFsdWF0ZShsYXBpc1VybCwgc2lnbmFsKSB7CiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRSZXNwb25zZTIgPSAoYXdhaXQgZmV0Y2hBZ2dyZWdhdGVkKAogICAgICAgIGxhcGlzVXJsLAogICAgICAgIHsKICAgICAgICAgIC4uLnRoaXMuZmlsdGVyLAogICAgICAgICAgZmllbGRzOiB0aGlzLmZpZWxkcwogICAgICAgIH0sCiAgICAgICAgc2lnbmFsCiAgICAgICkpLmRhdGE7CiAgICAgIGlmIChpc0ZpZWxkc0FycmF5V2l0aENvdW50KGFnZ3JlZ2F0ZWRSZXNwb25zZTIpKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGNvbnRlbnQ6IGFnZ3JlZ2F0ZWRSZXNwb25zZTIKICAgICAgICB9OwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcigiQWdncmVnYXRlZCByZXNwb25zZSBkb2VzIG5vdCBoYXZlIGNvdW50Iik7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGlzRmllbGRzQXJyYXlXaXRoQ291bnQoZGF0YSkgewogICAgcmV0dXJuIGRhdGEuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAib2JqZWN0IiAmJiAiY291bnQiIGluIGl0ZW0gJiYgdHlwZW9mIGl0ZW0uY291bnQgPT09ICJudW1iZXIiKTsKICB9CiAgY2xhc3MgR3JvdXBCeU9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNoaWxkLCBmaWVsZCwgYWdncmVnYXRlKSB7CiAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKICAgICAgdGhpcy5maWVsZCA9IGZpZWxkOwogICAgICB0aGlzLmFnZ3JlZ2F0ZSA9IGFnZ3JlZ2F0ZTsKICAgIH0KICAgIGFzeW5jIGV2YWx1YXRlKGxhcGlzLCBzaWduYWwpIHsKICAgICAgY29uc3QgY2hpbGRFdmFsdWF0ZWQgPSBhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGxhcGlzLCBzaWduYWwpOwogICAgICBjb25zdCBncm91cGVkID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgZm9yIChjb25zdCByb3cgb2YgY2hpbGRFdmFsdWF0ZWQuY29udGVudCkgewogICAgICAgIGNvbnN0IGtleSA9IHJvd1t0aGlzLmZpZWxkXTsKICAgICAgICBpZiAoIWdyb3VwZWQuaGFzKGtleSkpIHsKICAgICAgICAgIGdyb3VwZWQuc2V0KGtleSwgW10pOwogICAgICAgIH0KICAgICAgICBncm91cGVkLmdldChrZXkpLnB1c2gocm93KTsKICAgICAgfQogICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoKTsKICAgICAgZm9yIChjb25zdCBbLCB2YWx1ZXNdIG9mIGdyb3VwZWQpIHsKICAgICAgICByZXN1bHQucHVzaCh0aGlzLmFnZ3JlZ2F0ZSh2YWx1ZXMpKTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIGNvbnRlbnQ6IHJlc3VsdAogICAgICB9OwogICAgfQogIH0KICBjbGFzcyBHcm91cEJ5QW5kU3VtT3BlcmF0b3IgZXh0ZW5kcyBHcm91cEJ5T3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoY2hpbGQsIGdyb3VwQnlGaWVsZCwgc3VtRmllbGQpIHsKICAgICAgc3VwZXIoY2hpbGQsIGdyb3VwQnlGaWVsZCwgKHZhbHVlcykgPT4gewogICAgICAgIGxldCBuID0gMDsKICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykgewogICAgICAgICAgbiArPSB2YWx1ZVtzdW1GaWVsZF07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBbZ3JvdXBCeUZpZWxkXTogdmFsdWVzWzBdW2dyb3VwQnlGaWVsZF0sCiAgICAgICAgICBbc3VtRmllbGRdOiBuCiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9CiAgfQogIGNsYXNzIE1hcE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNoaWxkLCBmdW5jKSB7CiAgICAgIHRoaXMuY2hpbGQgPSBjaGlsZDsKICAgICAgdGhpcy5mdW5jID0gZnVuYzsKICAgIH0KICAgIGFzeW5jIGV2YWx1YXRlKGxhcGlzLCBzaWduYWwpIHsKICAgICAgY29uc3QgY2hpbGRFdmFsdWF0ZWQgPSBhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGxhcGlzLCBzaWduYWwpOwogICAgICByZXR1cm4gewogICAgICAgIGNvbnRlbnQ6IGNoaWxkRXZhbHVhdGVkLmNvbnRlbnQubWFwKHRoaXMuZnVuYykKICAgICAgfTsKICAgIH0KICB9CiAgY2xhc3MgUmVuYW1lRmllbGRPcGVyYXRvciBleHRlbmRzIE1hcE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNoaWxkLCBvbGRGaWVsZE5hbWUsIG5ld0ZpZWxkTmFtZSkgewogICAgICBzdXBlcigKICAgICAgICBjaGlsZCwKICAgICAgICAodmFsdWUpID0+ICh7CiAgICAgICAgICAuLi52YWx1ZSwKICAgICAgICAgIFtuZXdGaWVsZE5hbWVdOiB2YWx1ZVtvbGRGaWVsZE5hbWVdCiAgICAgICAgfSkKICAgICAgKTsKICAgIH0KICB9CiAgY2xhc3MgU29ydE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNoaWxkLCBjb21wYXJlRm4pIHsKICAgICAgdGhpcy5jaGlsZCA9IGNoaWxkOwogICAgICB0aGlzLmNvbXBhcmVGbiA9IGNvbXBhcmVGbjsKICAgIH0KICAgIGFzeW5jIGV2YWx1YXRlKGxhcGlzLCBzaWduYWwpIHsKICAgICAgY29uc3QgY2hpbGRFdmFsdWF0ZWQgPSBhd2FpdCB0aGlzLmNoaWxkLmV2YWx1YXRlKGxhcGlzLCBzaWduYWwpOwogICAgICByZXR1cm4gewogICAgICAgIGNvbnRlbnQ6IGNoaWxkRXZhbHVhdGVkLmNvbnRlbnQuc29ydCh0aGlzLmNvbXBhcmVGbikKICAgICAgfTsKICAgIH0KICB9CiAgdmFyIFNFQ09ORFNfQV9NSU5VVEUgPSA2MDsKICB2YXIgU0VDT05EU19BX0hPVVIgPSBTRUNPTkRTX0FfTUlOVVRFICogNjA7CiAgdmFyIFNFQ09ORFNfQV9EQVkgPSBTRUNPTkRTX0FfSE9VUiAqIDI0OwogIHZhciBTRUNPTkRTX0FfV0VFSyA9IFNFQ09ORFNfQV9EQVkgKiA3OwogIHZhciBNSUxMSVNFQ09ORFNfQV9TRUNPTkQgPSAxZTM7CiAgdmFyIE1JTExJU0VDT05EU19BX01JTlVURSA9IFNFQ09ORFNfQV9NSU5VVEUgKiBNSUxMSVNFQ09ORFNfQV9TRUNPTkQ7CiAgdmFyIE1JTExJU0VDT05EU19BX0hPVVIgPSBTRUNPTkRTX0FfSE9VUiAqIE1JTExJU0VDT05EU19BX1NFQ09ORDsKICB2YXIgTUlMTElTRUNPTkRTX0FfREFZID0gU0VDT05EU19BX0RBWSAqIE1JTExJU0VDT05EU19BX1NFQ09ORDsKICB2YXIgTUlMTElTRUNPTkRTX0FfV0VFSyA9IFNFQ09ORFNfQV9XRUVLICogTUlMTElTRUNPTkRTX0FfU0VDT05EOwogIHZhciBNUyA9ICJtaWxsaXNlY29uZCI7CiAgdmFyIFMgPSAic2Vjb25kIjsKICB2YXIgTUlOID0gIm1pbnV0ZSI7CiAgdmFyIEggPSAiaG91ciI7CiAgdmFyIEQgPSAiZGF5IjsKICB2YXIgVyA9ICJ3ZWVrIjsKICB2YXIgTSA9ICJtb250aCI7CiAgdmFyIFEgPSAicXVhcnRlciI7CiAgdmFyIFkgPSAieWVhciI7CiAgdmFyIERBVEUgPSAiZGF0ZSI7CiAgdmFyIEZPUk1BVF9ERUZBVUxUID0gIllZWVktTU0tRERUSEg6bW06c3NaIjsKICB2YXIgSU5WQUxJRF9EQVRFX1NUUklORyA9ICJJbnZhbGlkIERhdGUiOwogIHZhciBSRUdFWF9QQVJTRSA9IC9eKFxkezR9KVstL10/KFxkezEsMn0pP1stL10/KFxkezAsMn0pW1R0XHNdKihcZHsxLDJ9KT86PyhcZHsxLDJ9KT86PyhcZHsxLDJ9KT9bLjpdPyhcZCspPyQvOwogIHZhciBSRUdFWF9GT1JNQVQgPSAvXFsoW15cXV0rKV18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXxBfG17MSwyfXxzezEsMn18WnsxLDJ9fFNTUy9nOwogIHZhciBlbiA9IHsKICAgIG5hbWU6ICJlbiIsCiAgICB3ZWVrZGF5czogIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5Ii5zcGxpdCgiXyIpLAogICAgbW9udGhzOiAiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlciIuc3BsaXQoIl8iKSwKICAgIG9yZGluYWw6IGZ1bmN0aW9uIG9yZGluYWwobikgewogICAgICB2YXIgczIgPSBbInRoIiwgInN0IiwgIm5kIiwgInJkIl07CiAgICAgIHZhciB2MiA9IG4gJSAxMDA7CiAgICAgIHJldHVybiAiWyIgKyBuICsgKHMyWyh2MiAtIDIwKSAlIDEwXSB8fCBzMlt2Ml0gfHwgczJbMF0pICsgIl0iOwogICAgfQogIH07CiAgdmFyIHBhZFN0YXJ0ID0gZnVuY3Rpb24gcGFkU3RhcnQyKHN0cmluZywgbGVuZ3RoLCBwYWQpIHsKICAgIHZhciBzMiA9IFN0cmluZyhzdHJpbmcpOwogICAgaWYgKCFzMiB8fCBzMi5sZW5ndGggPj0gbGVuZ3RoKSByZXR1cm4gc3RyaW5nOwogICAgcmV0dXJuICIiICsgQXJyYXkobGVuZ3RoICsgMSAtIHMyLmxlbmd0aCkuam9pbihwYWQpICsgc3RyaW5nOwogIH07CiAgdmFyIHBhZFpvbmVTdHIgPSBmdW5jdGlvbiBwYWRab25lU3RyMihpbnN0YW5jZSkgewogICAgdmFyIG5lZ01pbnV0ZXMgPSAtaW5zdGFuY2UudXRjT2Zmc2V0KCk7CiAgICB2YXIgbWludXRlcyA9IE1hdGguYWJzKG5lZ01pbnV0ZXMpOwogICAgdmFyIGhvdXJPZmZzZXQgPSBNYXRoLmZsb29yKG1pbnV0ZXMgLyA2MCk7CiAgICB2YXIgbWludXRlT2Zmc2V0ID0gbWludXRlcyAlIDYwOwogICAgcmV0dXJuIChuZWdNaW51dGVzIDw9IDAgPyAiKyIgOiAiLSIpICsgcGFkU3RhcnQoaG91ck9mZnNldCwgMiwgIjAiKSArICI6IiArIHBhZFN0YXJ0KG1pbnV0ZU9mZnNldCwgMiwgIjAiKTsKICB9OwogIHZhciBtb250aERpZmYgPSBmdW5jdGlvbiBtb250aERpZmYyKGEyLCBiKSB7CiAgICBpZiAoYTIuZGF0ZSgpIDwgYi5kYXRlKCkpIHJldHVybiAtbW9udGhEaWZmMihiLCBhMik7CiAgICB2YXIgd2hvbGVNb250aERpZmYgPSAoYi55ZWFyKCkgLSBhMi55ZWFyKCkpICogMTIgKyAoYi5tb250aCgpIC0gYTIubW9udGgoKSk7CiAgICB2YXIgYW5jaG9yID0gYTIuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYsIE0pOwogICAgdmFyIGMyID0gYiAtIGFuY2hvciA8IDA7CiAgICB2YXIgYW5jaG9yMiA9IGEyLmNsb25lKCkuYWRkKHdob2xlTW9udGhEaWZmICsgKGMyID8gLTEgOiAxKSwgTSk7CiAgICByZXR1cm4gKygtKHdob2xlTW9udGhEaWZmICsgKGIgLSBhbmNob3IpIC8gKGMyID8gYW5jaG9yIC0gYW5jaG9yMiA6IGFuY2hvcjIgLSBhbmNob3IpKSB8fCAwKTsKICB9OwogIHZhciBhYnNGbG9vciA9IGZ1bmN0aW9uIGFic0Zsb29yMihuKSB7CiAgICByZXR1cm4gbiA8IDAgPyBNYXRoLmNlaWwobikgfHwgMCA6IE1hdGguZmxvb3Iobik7CiAgfTsKICB2YXIgcHJldHR5VW5pdCA9IGZ1bmN0aW9uIHByZXR0eVVuaXQyKHUyKSB7CiAgICB2YXIgc3BlY2lhbCA9IHsKICAgICAgTSwKICAgICAgeTogWSwKICAgICAgdzogVywKICAgICAgZDogRCwKICAgICAgRDogREFURSwKICAgICAgaDogSCwKICAgICAgbTogTUlOLAogICAgICBzOiBTLAogICAgICBtczogTVMsCiAgICAgIFEKICAgIH07CiAgICByZXR1cm4gc3BlY2lhbFt1Ml0gfHwgU3RyaW5nKHUyIHx8ICIiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLywgIiIpOwogIH07CiAgdmFyIGlzVW5kZWZpbmVkID0gZnVuY3Rpb24gaXNVbmRlZmluZWQyKHMyKSB7CiAgICByZXR1cm4gczIgPT09IHZvaWQgMDsKICB9OwogIHZhciBVID0gewogICAgczogcGFkU3RhcnQsCiAgICB6OiBwYWRab25lU3RyLAogICAgbTogbW9udGhEaWZmLAogICAgYTogYWJzRmxvb3IsCiAgICBwOiBwcmV0dHlVbml0LAogICAgdTogaXNVbmRlZmluZWQKICB9OwogIHZhciBMID0gImVuIjsKICB2YXIgTHMgPSB7fTsKICBMc1tMXSA9IGVuOwogIHZhciBJU19EQVlKUyA9ICIkaXNEYXlqc09iamVjdCI7CiAgdmFyIGlzRGF5anMgPSBmdW5jdGlvbiBpc0RheWpzMihkKSB7CiAgICByZXR1cm4gZCBpbnN0YW5jZW9mIERheWpzIHx8ICEhKGQgJiYgZFtJU19EQVlKU10pOwogIH07CiAgdmFyIHBhcnNlTG9jYWxlID0gZnVuY3Rpb24gcGFyc2VMb2NhbGUyKHByZXNldCwgb2JqZWN0LCBpc0xvY2FsKSB7CiAgICB2YXIgbDI7CiAgICBpZiAoIXByZXNldCkgcmV0dXJuIEw7CiAgICBpZiAodHlwZW9mIHByZXNldCA9PT0gInN0cmluZyIpIHsKICAgICAgdmFyIHByZXNldExvd2VyID0gcHJlc2V0LnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChMc1twcmVzZXRMb3dlcl0pIHsKICAgICAgICBsMiA9IHByZXNldExvd2VyOwogICAgICB9CiAgICAgIGlmIChvYmplY3QpIHsKICAgICAgICBMc1twcmVzZXRMb3dlcl0gPSBvYmplY3Q7CiAgICAgICAgbDIgPSBwcmVzZXRMb3dlcjsKICAgICAgfQogICAgICB2YXIgcHJlc2V0U3BsaXQgPSBwcmVzZXQuc3BsaXQoIi0iKTsKICAgICAgaWYgKCFsMiAmJiBwcmVzZXRTcGxpdC5sZW5ndGggPiAxKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlTG9jYWxlMihwcmVzZXRTcGxpdFswXSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBuYW1lID0gcHJlc2V0Lm5hbWU7CiAgICAgIExzW25hbWVdID0gcHJlc2V0OwogICAgICBsMiA9IG5hbWU7CiAgICB9CiAgICBpZiAoIWlzTG9jYWwgJiYgbDIpIEwgPSBsMjsKICAgIHJldHVybiBsMiB8fCAhaXNMb2NhbCAmJiBMOwogIH07CiAgdmFyIGRheWpzID0gZnVuY3Rpb24gZGF5anMyKGRhdGUsIGMyKSB7CiAgICBpZiAoaXNEYXlqcyhkYXRlKSkgewogICAgICByZXR1cm4gZGF0ZS5jbG9uZSgpOwogICAgfQogICAgdmFyIGNmZyA9IHR5cGVvZiBjMiA9PT0gIm9iamVjdCIgPyBjMiA6IHt9OwogICAgY2ZnLmRhdGUgPSBkYXRlOwogICAgY2ZnLmFyZ3MgPSBhcmd1bWVudHM7CiAgICByZXR1cm4gbmV3IERheWpzKGNmZyk7CiAgfTsKICB2YXIgd3JhcHBlciA9IGZ1bmN0aW9uIHdyYXBwZXIyKGRhdGUsIGluc3RhbmNlKSB7CiAgICByZXR1cm4gZGF5anMoZGF0ZSwgewogICAgICBsb2NhbGU6IGluc3RhbmNlLiRMLAogICAgICB1dGM6IGluc3RhbmNlLiR1LAogICAgICB4OiBpbnN0YW5jZS4keCwKICAgICAgJG9mZnNldDogaW5zdGFuY2UuJG9mZnNldAogICAgICAvLyB0b2RvOiByZWZhY3RvcjsgZG8gbm90IHVzZSB0aGlzLiRvZmZzZXQgaW4geW91IGNvZGUKICAgIH0pOwogIH07CiAgdmFyIFV0aWxzID0gVTsKICBVdGlscy5sID0gcGFyc2VMb2NhbGU7CiAgVXRpbHMuaSA9IGlzRGF5anM7CiAgVXRpbHMudyA9IHdyYXBwZXI7CiAgdmFyIHBhcnNlRGF0ZSA9IGZ1bmN0aW9uIHBhcnNlRGF0ZTIoY2ZnKSB7CiAgICB2YXIgZGF0ZSA9IGNmZy5kYXRlLCB1dGMgPSBjZmcudXRjOwogICAgaWYgKGRhdGUgPT09IG51bGwpIHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IERhdGUoTmFOKTsKICAgIGlmIChVdGlscy51KGRhdGUpKSByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCk7CiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgRGF0ZShkYXRlKTsKICAgIGlmICh0eXBlb2YgZGF0ZSA9PT0gInN0cmluZyIgJiYgIS9aJC9pLnRlc3QoZGF0ZSkpIHsKICAgICAgdmFyIGQgPSBkYXRlLm1hdGNoKFJFR0VYX1BBUlNFKTsKICAgICAgaWYgKGQpIHsKICAgICAgICB2YXIgbTIgPSBkWzJdIC0gMSB8fCAwOwogICAgICAgIHZhciBtcyA9IChkWzddIHx8ICIwIikuc3Vic3RyaW5nKDAsIDMpOwogICAgICAgIGlmICh1dGMpIHsKICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhkWzFdLCBtMiwgZFszXSB8fCAxLCBkWzRdIHx8IDAsIGRbNV0gfHwgMCwgZFs2XSB8fCAwLCBtcykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IERhdGUoZFsxXSwgbTIsIGRbM10gfHwgMSwgZFs0XSB8fCAwLCBkWzVdIHx8IDAsIGRbNl0gfHwgMCwgbXMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZSk7CiAgfTsKICB2YXIgRGF5anMgPSAvKiBAX19QVVJFX18gKi8gZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiBEYXlqczIoY2ZnKSB7CiAgICAgIHRoaXMuJEwgPSBwYXJzZUxvY2FsZShjZmcubG9jYWxlLCBudWxsLCB0cnVlKTsKICAgICAgdGhpcy5wYXJzZShjZmcpOwogICAgICB0aGlzLiR4ID0gdGhpcy4keCB8fCBjZmcueCB8fCB7fTsKICAgICAgdGhpc1tJU19EQVlKU10gPSB0cnVlOwogICAgfQogICAgdmFyIF9wcm90byA9IERheWpzMi5wcm90b3R5cGU7CiAgICBfcHJvdG8ucGFyc2UgPSBmdW5jdGlvbiBwYXJzZShjZmcpIHsKICAgICAgdGhpcy4kZCA9IHBhcnNlRGF0ZShjZmcpOwogICAgICB0aGlzLmluaXQoKTsKICAgIH07CiAgICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgIHZhciAkZCA9IHRoaXMuJGQ7CiAgICAgIHRoaXMuJHkgPSAkZC5nZXRGdWxsWWVhcigpOwogICAgICB0aGlzLiRNID0gJGQuZ2V0TW9udGgoKTsKICAgICAgdGhpcy4kRCA9ICRkLmdldERhdGUoKTsKICAgICAgdGhpcy4kVyA9ICRkLmdldERheSgpOwogICAgICB0aGlzLiRIID0gJGQuZ2V0SG91cnMoKTsKICAgICAgdGhpcy4kbSA9ICRkLmdldE1pbnV0ZXMoKTsKICAgICAgdGhpcy4kcyA9ICRkLmdldFNlY29uZHMoKTsKICAgICAgdGhpcy4kbXMgPSAkZC5nZXRNaWxsaXNlY29uZHMoKTsKICAgIH07CiAgICBfcHJvdG8uJHV0aWxzID0gZnVuY3Rpb24gJHV0aWxzKCkgewogICAgICByZXR1cm4gVXRpbHM7CiAgICB9OwogICAgX3Byb3RvLmlzVmFsaWQgPSBmdW5jdGlvbiBpc1ZhbGlkMigpIHsKICAgICAgcmV0dXJuICEodGhpcy4kZC50b1N0cmluZygpID09PSBJTlZBTElEX0RBVEVfU1RSSU5HKTsKICAgIH07CiAgICBfcHJvdG8uaXNTYW1lID0gZnVuY3Rpb24gaXNTYW1lKHRoYXQsIHVuaXRzKSB7CiAgICAgIHZhciBvdGhlciA9IGRheWpzKHRoYXQpOwogICAgICByZXR1cm4gdGhpcy5zdGFydE9mKHVuaXRzKSA8PSBvdGhlciAmJiBvdGhlciA8PSB0aGlzLmVuZE9mKHVuaXRzKTsKICAgIH07CiAgICBfcHJvdG8uaXNBZnRlciA9IGZ1bmN0aW9uIGlzQWZ0ZXIodGhhdCwgdW5pdHMpIHsKICAgICAgcmV0dXJuIGRheWpzKHRoYXQpIDwgdGhpcy5zdGFydE9mKHVuaXRzKTsKICAgIH07CiAgICBfcHJvdG8uaXNCZWZvcmUgPSBmdW5jdGlvbiBpc0JlZm9yZSh0aGF0LCB1bml0cykgewogICAgICByZXR1cm4gdGhpcy5lbmRPZih1bml0cykgPCBkYXlqcyh0aGF0KTsKICAgIH07CiAgICBfcHJvdG8uJGcgPSBmdW5jdGlvbiAkZyhpbnB1dCwgZ2V0LCBzZXQpIHsKICAgICAgaWYgKFV0aWxzLnUoaW5wdXQpKSByZXR1cm4gdGhpc1tnZXRdOwogICAgICByZXR1cm4gdGhpcy5zZXQoc2V0LCBpbnB1dCk7CiAgICB9OwogICAgX3Byb3RvLnVuaXggPSBmdW5jdGlvbiB1bml4KCkgewogICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDFlMyk7CiAgICB9OwogICAgX3Byb3RvLnZhbHVlT2YgPSBmdW5jdGlvbiB2YWx1ZU9mKCkgewogICAgICByZXR1cm4gdGhpcy4kZC5nZXRUaW1lKCk7CiAgICB9OwogICAgX3Byb3RvLnN0YXJ0T2YgPSBmdW5jdGlvbiBzdGFydE9mKHVuaXRzLCBfc3RhcnRPZikgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgaXNTdGFydE9mID0gIVV0aWxzLnUoX3N0YXJ0T2YpID8gX3N0YXJ0T2YgOiB0cnVlOwogICAgICB2YXIgdW5pdCA9IFV0aWxzLnAodW5pdHMpOwogICAgICB2YXIgaW5zdGFuY2VGYWN0b3J5ID0gZnVuY3Rpb24gaW5zdGFuY2VGYWN0b3J5MihkLCBtMikgewogICAgICAgIHZhciBpbnMgPSBVdGlscy53KF90aGlzLiR1ID8gRGF0ZS5VVEMoX3RoaXMuJHksIG0yLCBkKSA6IG5ldyBEYXRlKF90aGlzLiR5LCBtMiwgZCksIF90aGlzKTsKICAgICAgICByZXR1cm4gaXNTdGFydE9mID8gaW5zIDogaW5zLmVuZE9mKEQpOwogICAgICB9OwogICAgICB2YXIgaW5zdGFuY2VGYWN0b3J5U2V0ID0gZnVuY3Rpb24gaW5zdGFuY2VGYWN0b3J5U2V0MihtZXRob2QsIHNsaWNlKSB7CiAgICAgICAgdmFyIGFyZ3VtZW50U3RhcnQgPSBbMCwgMCwgMCwgMF07CiAgICAgICAgdmFyIGFyZ3VtZW50RW5kID0gWzIzLCA1OSwgNTksIDk5OV07CiAgICAgICAgcmV0dXJuIFV0aWxzLncoX3RoaXMudG9EYXRlKClbbWV0aG9kXS5hcHBseSgKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXNwcmVhZAogICAgICAgICAgX3RoaXMudG9EYXRlKCJzIiksCiAgICAgICAgICAoaXNTdGFydE9mID8gYXJndW1lbnRTdGFydCA6IGFyZ3VtZW50RW5kKS5zbGljZShzbGljZSkKICAgICAgICApLCBfdGhpcyk7CiAgICAgIH07CiAgICAgIHZhciAkVyA9IHRoaXMuJFcsICRNID0gdGhpcy4kTSwgJEQgPSB0aGlzLiREOwogICAgICB2YXIgdXRjUGFkID0gInNldCIgKyAodGhpcy4kdSA/ICJVVEMiIDogIiIpOwogICAgICBzd2l0Y2ggKHVuaXQpIHsKICAgICAgICBjYXNlIFk6CiAgICAgICAgICByZXR1cm4gaXNTdGFydE9mID8gaW5zdGFuY2VGYWN0b3J5KDEsIDApIDogaW5zdGFuY2VGYWN0b3J5KDMxLCAxMSk7CiAgICAgICAgY2FzZSBNOgogICAgICAgICAgcmV0dXJuIGlzU3RhcnRPZiA/IGluc3RhbmNlRmFjdG9yeSgxLCAkTSkgOiBpbnN0YW5jZUZhY3RvcnkoMCwgJE0gKyAxKTsKICAgICAgICBjYXNlIFc6IHsKICAgICAgICAgIHZhciB3ZWVrU3RhcnQgPSB0aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnQgfHwgMDsKICAgICAgICAgIHZhciBnYXAgPSAoJFcgPCB3ZWVrU3RhcnQgPyAkVyArIDcgOiAkVykgLSB3ZWVrU3RhcnQ7CiAgICAgICAgICByZXR1cm4gaW5zdGFuY2VGYWN0b3J5KGlzU3RhcnRPZiA/ICREIC0gZ2FwIDogJEQgKyAoNiAtIGdhcCksICRNKTsKICAgICAgICB9CiAgICAgICAgY2FzZSBEOgogICAgICAgIGNhc2UgREFURToKICAgICAgICAgIHJldHVybiBpbnN0YW5jZUZhY3RvcnlTZXQodXRjUGFkICsgIkhvdXJzIiwgMCk7CiAgICAgICAgY2FzZSBIOgogICAgICAgICAgcmV0dXJuIGluc3RhbmNlRmFjdG9yeVNldCh1dGNQYWQgKyAiTWludXRlcyIsIDEpOwogICAgICAgIGNhc2UgTUlOOgogICAgICAgICAgcmV0dXJuIGluc3RhbmNlRmFjdG9yeVNldCh1dGNQYWQgKyAiU2Vjb25kcyIsIDIpOwogICAgICAgIGNhc2UgUzoKICAgICAgICAgIHJldHVybiBpbnN0YW5jZUZhY3RvcnlTZXQodXRjUGFkICsgIk1pbGxpc2Vjb25kcyIsIDMpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpOwogICAgICB9CiAgICB9OwogICAgX3Byb3RvLmVuZE9mID0gZnVuY3Rpb24gZW5kT2YoYXJnKSB7CiAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2YoYXJnLCBmYWxzZSk7CiAgICB9OwogICAgX3Byb3RvLiRzZXQgPSBmdW5jdGlvbiAkc2V0KHVuaXRzLCBfaW50KSB7CiAgICAgIHZhciBfQyREJEMkREFURSRDJE0kQyRZJEM7CiAgICAgIHZhciB1bml0ID0gVXRpbHMucCh1bml0cyk7CiAgICAgIHZhciB1dGNQYWQgPSAic2V0IiArICh0aGlzLiR1ID8gIlVUQyIgOiAiIik7CiAgICAgIHZhciBuYW1lID0gKF9DJEQkQyREQVRFJEMkTSRDJFkkQyA9IHt9LCBfQyREJEMkREFURSRDJE0kQyRZJENbRF0gPSB1dGNQYWQgKyAiRGF0ZSIsIF9DJEQkQyREQVRFJEMkTSRDJFkkQ1tEQVRFXSA9IHV0Y1BhZCArICJEYXRlIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW01dID0gdXRjUGFkICsgIk1vbnRoIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW1ldID0gdXRjUGFkICsgIkZ1bGxZZWFyIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW0hdID0gdXRjUGFkICsgIkhvdXJzIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW01JTl0gPSB1dGNQYWQgKyAiTWludXRlcyIsIF9DJEQkQyREQVRFJEMkTSRDJFkkQ1tTXSA9IHV0Y1BhZCArICJTZWNvbmRzIiwgX0MkRCRDJERBVEUkQyRNJEMkWSRDW01TXSA9IHV0Y1BhZCArICJNaWxsaXNlY29uZHMiLCBfQyREJEMkREFURSRDJE0kQyRZJEMpW3VuaXRdOwogICAgICB2YXIgYXJnID0gdW5pdCA9PT0gRCA/IHRoaXMuJEQgKyAoX2ludCAtIHRoaXMuJFcpIDogX2ludDsKICAgICAgaWYgKHVuaXQgPT09IE0gfHwgdW5pdCA9PT0gWSkgewogICAgICAgIHZhciBkYXRlID0gdGhpcy5jbG9uZSgpLnNldChEQVRFLCAxKTsKICAgICAgICBkYXRlLiRkW25hbWVdKGFyZyk7CiAgICAgICAgZGF0ZS5pbml0KCk7CiAgICAgICAgdGhpcy4kZCA9IGRhdGUuc2V0KERBVEUsIE1hdGgubWluKHRoaXMuJEQsIGRhdGUuZGF5c0luTW9udGgoKSkpLiRkOwogICAgICB9IGVsc2UgaWYgKG5hbWUpIHRoaXMuJGRbbmFtZV0oYXJnKTsKICAgICAgdGhpcy5pbml0KCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIF9wcm90by5zZXQgPSBmdW5jdGlvbiBzZXQoc3RyaW5nLCBfaW50MikgewogICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLiRzZXQoc3RyaW5nLCBfaW50Mik7CiAgICB9OwogICAgX3Byb3RvLmdldCA9IGZ1bmN0aW9uIGdldCh1bml0KSB7CiAgICAgIHJldHVybiB0aGlzW1V0aWxzLnAodW5pdCldKCk7CiAgICB9OwogICAgX3Byb3RvLmFkZCA9IGZ1bmN0aW9uIGFkZChudW1iZXIsIHVuaXRzKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzLCBfQyRNSU4kQyRIJEMkUyR1bml0OwogICAgICBudW1iZXIgPSBOdW1iZXIobnVtYmVyKTsKICAgICAgdmFyIHVuaXQgPSBVdGlscy5wKHVuaXRzKTsKICAgICAgdmFyIGluc3RhbmNlRmFjdG9yeVNldCA9IGZ1bmN0aW9uIGluc3RhbmNlRmFjdG9yeVNldDIobikgewogICAgICAgIHZhciBkID0gZGF5anMoX3RoaXMyKTsKICAgICAgICByZXR1cm4gVXRpbHMudyhkLmRhdGUoZC5kYXRlKCkgKyBNYXRoLnJvdW5kKG4gKiBudW1iZXIpKSwgX3RoaXMyKTsKICAgICAgfTsKICAgICAgaWYgKHVuaXQgPT09IE0pIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXQoTSwgdGhpcy4kTSArIG51bWJlcik7CiAgICAgIH0KICAgICAgaWYgKHVuaXQgPT09IFkpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZXQoWSwgdGhpcy4keSArIG51bWJlcik7CiAgICAgIH0KICAgICAgaWYgKHVuaXQgPT09IEQpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2VGYWN0b3J5U2V0KDEpOwogICAgICB9CiAgICAgIGlmICh1bml0ID09PSBXKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlRmFjdG9yeVNldCg3KTsKICAgICAgfQogICAgICB2YXIgc3RlcCA9IChfQyRNSU4kQyRIJEMkUyR1bml0ID0ge30sIF9DJE1JTiRDJEgkQyRTJHVuaXRbTUlOXSA9IE1JTExJU0VDT05EU19BX01JTlVURSwgX0MkTUlOJEMkSCRDJFMkdW5pdFtIXSA9IE1JTExJU0VDT05EU19BX0hPVVIsIF9DJE1JTiRDJEgkQyRTJHVuaXRbU10gPSBNSUxMSVNFQ09ORFNfQV9TRUNPTkQsIF9DJE1JTiRDJEgkQyRTJHVuaXQpW3VuaXRdIHx8IDE7CiAgICAgIHZhciBuZXh0VGltZVN0YW1wID0gdGhpcy4kZC5nZXRUaW1lKCkgKyBudW1iZXIgKiBzdGVwOwogICAgICByZXR1cm4gVXRpbHMudyhuZXh0VGltZVN0YW1wLCB0aGlzKTsKICAgIH07CiAgICBfcHJvdG8uc3VidHJhY3QgPSBmdW5jdGlvbiBzdWJ0cmFjdChudW1iZXIsIHN0cmluZykgewogICAgICByZXR1cm4gdGhpcy5hZGQobnVtYmVyICogLTEsIHN0cmluZyk7CiAgICB9OwogICAgX3Byb3RvLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChmb3JtYXRTdHIpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgIHZhciBsb2NhbGUgPSB0aGlzLiRsb2NhbGUoKTsKICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkgcmV0dXJuIGxvY2FsZS5pbnZhbGlkRGF0ZSB8fCBJTlZBTElEX0RBVEVfU1RSSU5HOwogICAgICB2YXIgc3RyID0gZm9ybWF0U3RyIHx8IEZPUk1BVF9ERUZBVUxUOwogICAgICB2YXIgem9uZVN0ciA9IFV0aWxzLnoodGhpcyk7CiAgICAgIHZhciAkSCA9IHRoaXMuJEgsICRtID0gdGhpcy4kbSwgJE0gPSB0aGlzLiRNOwogICAgICB2YXIgd2Vla2RheXMgPSBsb2NhbGUud2Vla2RheXMsIG1vbnRocyA9IGxvY2FsZS5tb250aHMsIG1lcmlkaWVtID0gbG9jYWxlLm1lcmlkaWVtOwogICAgICB2YXIgZ2V0U2hvcnQgPSBmdW5jdGlvbiBnZXRTaG9ydDIoYXJyLCBpbmRleCwgZnVsbCwgbGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGFyciAmJiAoYXJyW2luZGV4XSB8fCBhcnIoX3RoaXMzLCBzdHIpKSB8fCBmdWxsW2luZGV4XS5zbGljZSgwLCBsZW5ndGgpOwogICAgICB9OwogICAgICB2YXIgZ2V0JEggPSBmdW5jdGlvbiBnZXQkSDIobnVtKSB7CiAgICAgICAgcmV0dXJuIFV0aWxzLnMoJEggJSAxMiB8fCAxMiwgbnVtLCAiMCIpOwogICAgICB9OwogICAgICB2YXIgbWVyaWRpZW1GdW5jID0gbWVyaWRpZW0gfHwgZnVuY3Rpb24oaG91ciwgbWludXRlLCBpc0xvd2VyY2FzZSkgewogICAgICAgIHZhciBtMiA9IGhvdXIgPCAxMiA/ICJBTSIgOiAiUE0iOwogICAgICAgIHJldHVybiBpc0xvd2VyY2FzZSA/IG0yLnRvTG93ZXJDYXNlKCkgOiBtMjsKICAgICAgfTsKICAgICAgdmFyIG1hdGNoZXMgPSBmdW5jdGlvbiBtYXRjaGVzMihtYXRjaCkgewogICAgICAgIHN3aXRjaCAobWF0Y2gpIHsKICAgICAgICAgIGNhc2UgIllZIjoKICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhfdGhpczMuJHkpLnNsaWNlKC0yKTsKICAgICAgICAgIGNhc2UgIllZWVkiOgogICAgICAgICAgICByZXR1cm4gVXRpbHMucyhfdGhpczMuJHksIDQsICIwIik7CiAgICAgICAgICBjYXNlICJNIjoKICAgICAgICAgICAgcmV0dXJuICRNICsgMTsKICAgICAgICAgIGNhc2UgIk1NIjoKICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnMoJE0gKyAxLCAyLCAiMCIpOwogICAgICAgICAgY2FzZSAiTU1NIjoKICAgICAgICAgICAgcmV0dXJuIGdldFNob3J0KGxvY2FsZS5tb250aHNTaG9ydCwgJE0sIG1vbnRocywgMyk7CiAgICAgICAgICBjYXNlICJNTU1NIjoKICAgICAgICAgICAgcmV0dXJuIGdldFNob3J0KG1vbnRocywgJE0pOwogICAgICAgICAgY2FzZSAiRCI6CiAgICAgICAgICAgIHJldHVybiBfdGhpczMuJEQ7CiAgICAgICAgICBjYXNlICJERCI6CiAgICAgICAgICAgIHJldHVybiBVdGlscy5zKF90aGlzMy4kRCwgMiwgIjAiKTsKICAgICAgICAgIGNhc2UgImQiOgogICAgICAgICAgICByZXR1cm4gU3RyaW5nKF90aGlzMy4kVyk7CiAgICAgICAgICBjYXNlICJkZCI6CiAgICAgICAgICAgIHJldHVybiBnZXRTaG9ydChsb2NhbGUud2Vla2RheXNNaW4sIF90aGlzMy4kVywgd2Vla2RheXMsIDIpOwogICAgICAgICAgY2FzZSAiZGRkIjoKICAgICAgICAgICAgcmV0dXJuIGdldFNob3J0KGxvY2FsZS53ZWVrZGF5c1Nob3J0LCBfdGhpczMuJFcsIHdlZWtkYXlzLCAzKTsKICAgICAgICAgIGNhc2UgImRkZGQiOgogICAgICAgICAgICByZXR1cm4gd2Vla2RheXNbX3RoaXMzLiRXXTsKICAgICAgICAgIGNhc2UgIkgiOgogICAgICAgICAgICByZXR1cm4gU3RyaW5nKCRIKTsKICAgICAgICAgIGNhc2UgIkhIIjoKICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnMoJEgsIDIsICIwIik7CiAgICAgICAgICBjYXNlICJoIjoKICAgICAgICAgICAgcmV0dXJuIGdldCRIKDEpOwogICAgICAgICAgY2FzZSAiaGgiOgogICAgICAgICAgICByZXR1cm4gZ2V0JEgoMik7CiAgICAgICAgICBjYXNlICJhIjoKICAgICAgICAgICAgcmV0dXJuIG1lcmlkaWVtRnVuYygkSCwgJG0sIHRydWUpOwogICAgICAgICAgY2FzZSAiQSI6CiAgICAgICAgICAgIHJldHVybiBtZXJpZGllbUZ1bmMoJEgsICRtLCBmYWxzZSk7CiAgICAgICAgICBjYXNlICJtIjoKICAgICAgICAgICAgcmV0dXJuIFN0cmluZygkbSk7CiAgICAgICAgICBjYXNlICJtbSI6CiAgICAgICAgICAgIHJldHVybiBVdGlscy5zKCRtLCAyLCAiMCIpOwogICAgICAgICAgY2FzZSAicyI6CiAgICAgICAgICAgIHJldHVybiBTdHJpbmcoX3RoaXMzLiRzKTsKICAgICAgICAgIGNhc2UgInNzIjoKICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnMoX3RoaXMzLiRzLCAyLCAiMCIpOwogICAgICAgICAgY2FzZSAiU1NTIjoKICAgICAgICAgICAgcmV0dXJuIFV0aWxzLnMoX3RoaXMzLiRtcywgMywgIjAiKTsKICAgICAgICAgIGNhc2UgIloiOgogICAgICAgICAgICByZXR1cm4gem9uZVN0cjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH07CiAgICAgIHJldHVybiBzdHIucmVwbGFjZShSRUdFWF9GT1JNQVQsIGZ1bmN0aW9uKG1hdGNoLCAkMSkgewogICAgICAgIHJldHVybiAkMSB8fCBtYXRjaGVzKG1hdGNoKSB8fCB6b25lU3RyLnJlcGxhY2UoIjoiLCAiIik7CiAgICAgIH0pOwogICAgfTsKICAgIF9wcm90by51dGNPZmZzZXQgPSBmdW5jdGlvbiB1dGNPZmZzZXQoKSB7CiAgICAgIHJldHVybiAtTWF0aC5yb3VuZCh0aGlzLiRkLmdldFRpbWV6b25lT2Zmc2V0KCkgLyAxNSkgKiAxNTsKICAgIH07CiAgICBfcHJvdG8uZGlmZiA9IGZ1bmN0aW9uIGRpZmYoaW5wdXQsIHVuaXRzLCBfZmxvYXQpIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CiAgICAgIHZhciB1bml0ID0gVXRpbHMucCh1bml0cyk7CiAgICAgIHZhciB0aGF0ID0gZGF5anMoaW5wdXQpOwogICAgICB2YXIgem9uZURlbHRhID0gKHRoYXQudXRjT2Zmc2V0KCkgLSB0aGlzLnV0Y09mZnNldCgpKSAqIE1JTExJU0VDT05EU19BX01JTlVURTsKICAgICAgdmFyIGRpZmYyID0gdGhpcyAtIHRoYXQ7CiAgICAgIHZhciBnZXRNb250aCA9IGZ1bmN0aW9uIGdldE1vbnRoMigpIHsKICAgICAgICByZXR1cm4gVXRpbHMubShfdGhpczQsIHRoYXQpOwogICAgICB9OwogICAgICB2YXIgcmVzdWx0OwogICAgICBzd2l0Y2ggKHVuaXQpIHsKICAgICAgICBjYXNlIFk6CiAgICAgICAgICByZXN1bHQgPSBnZXRNb250aCgpIC8gMTI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE06CiAgICAgICAgICByZXN1bHQgPSBnZXRNb250aCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBROgogICAgICAgICAgcmVzdWx0ID0gZ2V0TW9udGgoKSAvIDM7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFc6CiAgICAgICAgICByZXN1bHQgPSAoZGlmZjIgLSB6b25lRGVsdGEpIC8gTUlMTElTRUNPTkRTX0FfV0VFSzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRDoKICAgICAgICAgIHJlc3VsdCA9IChkaWZmMiAtIHpvbmVEZWx0YSkgLyBNSUxMSVNFQ09ORFNfQV9EQVk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEg6CiAgICAgICAgICByZXN1bHQgPSBkaWZmMiAvIE1JTExJU0VDT05EU19BX0hPVVI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JTjoKICAgICAgICAgIHJlc3VsdCA9IGRpZmYyIC8gTUlMTElTRUNPTkRTX0FfTUlOVVRFOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTOgogICAgICAgICAgcmVzdWx0ID0gZGlmZjIgLyBNSUxMSVNFQ09ORFNfQV9TRUNPTkQ7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmVzdWx0ID0gZGlmZjI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICByZXR1cm4gX2Zsb2F0ID8gcmVzdWx0IDogVXRpbHMuYShyZXN1bHQpOwogICAgfTsKICAgIF9wcm90by5kYXlzSW5Nb250aCA9IGZ1bmN0aW9uIGRheXNJbk1vbnRoKCkgewogICAgICByZXR1cm4gdGhpcy5lbmRPZihNKS4kRDsKICAgIH07CiAgICBfcHJvdG8uJGxvY2FsZSA9IGZ1bmN0aW9uICRsb2NhbGUoKSB7CiAgICAgIHJldHVybiBMc1t0aGlzLiRMXTsKICAgIH07CiAgICBfcHJvdG8ubG9jYWxlID0gZnVuY3Rpb24gbG9jYWxlKHByZXNldCwgb2JqZWN0KSB7CiAgICAgIGlmICghcHJlc2V0KSByZXR1cm4gdGhpcy4kTDsKICAgICAgdmFyIHRoYXQgPSB0aGlzLmNsb25lKCk7CiAgICAgIHZhciBuZXh0TG9jYWxlTmFtZSA9IHBhcnNlTG9jYWxlKHByZXNldCwgb2JqZWN0LCB0cnVlKTsKICAgICAgaWYgKG5leHRMb2NhbGVOYW1lKSB0aGF0LiRMID0gbmV4dExvY2FsZU5hbWU7CiAgICAgIHJldHVybiB0aGF0OwogICAgfTsKICAgIF9wcm90by5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lKCkgewogICAgICByZXR1cm4gVXRpbHMudyh0aGlzLiRkLCB0aGlzKTsKICAgIH07CiAgICBfcHJvdG8udG9EYXRlID0gZnVuY3Rpb24gdG9EYXRlKCkgewogICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpOwogICAgfTsKICAgIF9wcm90by50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7CiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMudG9JU09TdHJpbmcoKSA6IG51bGw7CiAgICB9OwogICAgX3Byb3RvLnRvSVNPU3RyaW5nID0gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiRkLnRvSVNPU3RyaW5nKCk7CiAgICB9OwogICAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLiRkLnRvVVRDU3RyaW5nKCk7CiAgICB9OwogICAgcmV0dXJuIERheWpzMjsKICB9KCk7CiAgdmFyIHByb3RvID0gRGF5anMucHJvdG90eXBlOwogIGRheWpzLnByb3RvdHlwZSA9IHByb3RvOwogIFtbIiRtcyIsIE1TXSwgWyIkcyIsIFNdLCBbIiRtIiwgTUlOXSwgWyIkSCIsIEhdLCBbIiRXIiwgRF0sIFsiJE0iLCBNXSwgWyIkeSIsIFldLCBbIiREIiwgREFURV1dLmZvckVhY2goZnVuY3Rpb24oZykgewogICAgcHJvdG9bZ1sxXV0gPSBmdW5jdGlvbihpbnB1dCkgewogICAgICByZXR1cm4gdGhpcy4kZyhpbnB1dCwgZ1swXSwgZ1sxXSk7CiAgICB9OwogIH0pOwogIGRheWpzLmV4dGVuZCA9IGZ1bmN0aW9uKHBsdWdpbiwgb3B0aW9uKSB7CiAgICBpZiAoIXBsdWdpbi4kaSkgewogICAgICBwbHVnaW4ob3B0aW9uLCBEYXlqcywgZGF5anMpOwogICAgICBwbHVnaW4uJGkgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGRheWpzOwogIH07CiAgZGF5anMubG9jYWxlID0gcGFyc2VMb2NhbGU7CiAgZGF5anMuaXNEYXlqcyA9IGlzRGF5anM7CiAgZGF5anMudW5peCA9IGZ1bmN0aW9uKHRpbWVzdGFtcCkgewogICAgcmV0dXJuIGRheWpzKHRpbWVzdGFtcCAqIDFlMyk7CiAgfTsKICBkYXlqcy5lbiA9IExzW0xdOwogIGRheWpzLkxzID0gTHM7CiAgZGF5anMucCA9IHt9OwogIHZhciBhZHZhbmNlZEZvcm1hdCA9IGZ1bmN0aW9uKG8sIGMyKSB7CiAgICB2YXIgcHJvdG8yID0gYzIucHJvdG90eXBlOwogICAgdmFyIG9sZEZvcm1hdCA9IHByb3RvMi5mb3JtYXQ7CiAgICBwcm90bzIuZm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0U3RyKSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHZhciBsb2NhbGUgPSB0aGlzLiRsb2NhbGUoKTsKICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkgewogICAgICAgIHJldHVybiBvbGRGb3JtYXQuYmluZCh0aGlzKShmb3JtYXRTdHIpOwogICAgICB9CiAgICAgIHZhciB1dGlscyA9IHRoaXMuJHV0aWxzKCk7CiAgICAgIHZhciBzdHIgPSBmb3JtYXRTdHIgfHwgRk9STUFUX0RFRkFVTFQ7CiAgICAgIHZhciByZXN1bHQgPSBzdHIucmVwbGFjZSgvXFsoW15cXV0rKV18UXx3b3x3d3x3fFdXfFd8enp6fHp8Z2dnZ3xHR0dHfERvfFh8eHxrezEsMn18Uy9nLCBmdW5jdGlvbihtYXRjaCkgewogICAgICAgIHN3aXRjaCAobWF0Y2gpIHsKICAgICAgICAgIGNhc2UgIlEiOgogICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKChfdGhpcy4kTSArIDEpIC8gMyk7CiAgICAgICAgICBjYXNlICJEbyI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGUub3JkaW5hbChfdGhpcy4kRCk7CiAgICAgICAgICBjYXNlICJnZ2dnIjoKICAgICAgICAgICAgcmV0dXJuIF90aGlzLndlZWtZZWFyKCk7CiAgICAgICAgICBjYXNlICJHR0dHIjoKICAgICAgICAgICAgcmV0dXJuIF90aGlzLmlzb1dlZWtZZWFyKCk7CiAgICAgICAgICBjYXNlICJ3byI6CiAgICAgICAgICAgIHJldHVybiBsb2NhbGUub3JkaW5hbChfdGhpcy53ZWVrKCksICJXIik7CiAgICAgICAgICBjYXNlICJ3IjoKICAgICAgICAgIGNhc2UgInd3IjoKICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnMoX3RoaXMud2VlaygpLCBtYXRjaCA9PT0gInciID8gMSA6IDIsICIwIik7CiAgICAgICAgICBjYXNlICJXIjoKICAgICAgICAgIGNhc2UgIldXIjoKICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnMoX3RoaXMuaXNvV2VlaygpLCBtYXRjaCA9PT0gIlciID8gMSA6IDIsICIwIik7CiAgICAgICAgICBjYXNlICJrIjoKICAgICAgICAgIGNhc2UgImtrIjoKICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnMoU3RyaW5nKF90aGlzLiRIID09PSAwID8gMjQgOiBfdGhpcy4kSCksIG1hdGNoID09PSAiayIgPyAxIDogMiwgIjAiKTsKICAgICAgICAgIGNhc2UgIlgiOgogICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihfdGhpcy4kZC5nZXRUaW1lKCkgLyAxZTMpOwogICAgICAgICAgY2FzZSAieCI6CiAgICAgICAgICAgIHJldHVybiBfdGhpcy4kZC5nZXRUaW1lKCk7CiAgICAgICAgICBjYXNlICJ6IjoKICAgICAgICAgICAgcmV0dXJuICJbIiArIF90aGlzLm9mZnNldE5hbWUoKSArICJdIjsKICAgICAgICAgIGNhc2UgInp6eiI6CiAgICAgICAgICAgIHJldHVybiAiWyIgKyBfdGhpcy5vZmZzZXROYW1lKCJsb25nIikgKyAiXSI7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIG9sZEZvcm1hdC5iaW5kKHRoaXMpKHJlc3VsdCk7CiAgICB9OwogIH07CiAgdmFyIGlzb1dlZWtQcmV0dHlVbml0ID0gImlzb3dlZWsiOwogIHZhciBpc29XZWVrID0gZnVuY3Rpb24obywgYzIsIGQpIHsKICAgIHZhciBnZXRZZWFyRmlyc3RUaHVyc2RheSA9IGZ1bmN0aW9uIGdldFllYXJGaXJzdFRodXJzZGF5Mih5ZWFyLCBpc1V0YykgewogICAgICB2YXIgeWVhckZpcnN0RGF5ID0gKGlzVXRjID8gZC51dGMgOiBkKSgpLnllYXIoeWVhcikuc3RhcnRPZihZKTsKICAgICAgdmFyIGFkZERpZmZEYXlzID0gNCAtIHllYXJGaXJzdERheS5pc29XZWVrZGF5KCk7CiAgICAgIGlmICh5ZWFyRmlyc3REYXkuaXNvV2Vla2RheSgpID4gNCkgewogICAgICAgIGFkZERpZmZEYXlzICs9IDc7CiAgICAgIH0KICAgICAgcmV0dXJuIHllYXJGaXJzdERheS5hZGQoYWRkRGlmZkRheXMsIEQpOwogICAgfTsKICAgIHZhciBnZXRDdXJyZW50V2Vla1RodXJzZGF5ID0gZnVuY3Rpb24gZ2V0Q3VycmVudFdlZWtUaHVyc2RheTIoaW5zKSB7CiAgICAgIHJldHVybiBpbnMuYWRkKDQgLSBpbnMuaXNvV2Vla2RheSgpLCBEKTsKICAgIH07CiAgICB2YXIgcHJvdG8yID0gYzIucHJvdG90eXBlOwogICAgcHJvdG8yLmlzb1dlZWtZZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBub3dXZWVrVGh1cnNkYXkgPSBnZXRDdXJyZW50V2Vla1RodXJzZGF5KHRoaXMpOwogICAgICByZXR1cm4gbm93V2Vla1RodXJzZGF5LnllYXIoKTsKICAgIH07CiAgICBwcm90bzIuaXNvV2VlayA9IGZ1bmN0aW9uKHdlZWspIHsKICAgICAgaWYgKCF0aGlzLiR1dGlscygpLnUod2VlaykpIHsKICAgICAgICByZXR1cm4gdGhpcy5hZGQoKHdlZWsgLSB0aGlzLmlzb1dlZWsoKSkgKiA3LCBEKTsKICAgICAgfQogICAgICB2YXIgbm93V2Vla1RodXJzZGF5ID0gZ2V0Q3VycmVudFdlZWtUaHVyc2RheSh0aGlzKTsKICAgICAgdmFyIGRpZmZXZWVrVGh1cnNkYXkgPSBnZXRZZWFyRmlyc3RUaHVyc2RheSh0aGlzLmlzb1dlZWtZZWFyKCksIHRoaXMuJHUpOwogICAgICByZXR1cm4gbm93V2Vla1RodXJzZGF5LmRpZmYoZGlmZldlZWtUaHVyc2RheSwgVykgKyAxOwogICAgfTsKICAgIHByb3RvMi5pc29XZWVrZGF5ID0gZnVuY3Rpb24od2VlaykgewogICAgICBpZiAoIXRoaXMuJHV0aWxzKCkudSh3ZWVrKSkgewogICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWsgOiB3ZWVrIC0gNyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuZGF5KCkgfHwgNzsKICAgIH07CiAgICB2YXIgb2xkU3RhcnRPZiA9IHByb3RvMi5zdGFydE9mOwogICAgcHJvdG8yLnN0YXJ0T2YgPSBmdW5jdGlvbih1bml0cywgc3RhcnRPZikgewogICAgICB2YXIgdXRpbHMgPSB0aGlzLiR1dGlscygpOwogICAgICB2YXIgaXNTdGFydE9mID0gIXV0aWxzLnUoc3RhcnRPZikgPyBzdGFydE9mIDogdHJ1ZTsKICAgICAgdmFyIHVuaXQgPSB1dGlscy5wKHVuaXRzKTsKICAgICAgaWYgKHVuaXQgPT09IGlzb1dlZWtQcmV0dHlVbml0KSB7CiAgICAgICAgcmV0dXJuIGlzU3RhcnRPZiA/IHRoaXMuZGF0ZSh0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpKS5zdGFydE9mKCJkYXkiKSA6IHRoaXMuZGF0ZSh0aGlzLmRhdGUoKSAtIDEgLSAodGhpcy5pc29XZWVrZGF5KCkgLSAxKSArIDcpLmVuZE9mKCJkYXkiKTsKICAgICAgfQogICAgICByZXR1cm4gb2xkU3RhcnRPZi5iaW5kKHRoaXMpKHVuaXRzLCBzdGFydE9mKTsKICAgIH07CiAgfTsKICBkYXlqcy5leHRlbmQoaXNvV2Vlayk7CiAgZGF5anMuZXh0ZW5kKGFkdmFuY2VkRm9ybWF0KTsKICBjb25zdCBGT1JNQVRfSVNPX1dFRUtfWUVBUl9XRUVLID0gIkdHR0ctW1ddV1ciOwogIGNvbnN0IF9UZW1wb3JhbENhY2hlID0gY2xhc3MgX1RlbXBvcmFsQ2FjaGUgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHRoaXMueWVhck1vbnRoRGF5Q2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICB0aGlzLnllYXJXZWVrQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICB0aGlzLnllYXJNb250aENhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgICAgdGhpcy55ZWFyQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgfQogICAgZ2V0WWVhck1vbnRoRGF5KHMyKSB7CiAgICAgIGlmICghdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5oYXMoczIpKSB7CiAgICAgICAgdGhpcy55ZWFyTW9udGhEYXlDYWNoZS5zZXQoczIsIFllYXJNb250aERheUNsYXNzLnBhcnNlKHMyLCB0aGlzKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMueWVhck1vbnRoRGF5Q2FjaGUuZ2V0KHMyKTsKICAgIH0KICAgIGdldFllYXJNb250aChzMikgewogICAgICBpZiAoIXRoaXMueWVhck1vbnRoQ2FjaGUuaGFzKHMyKSkgewogICAgICAgIHRoaXMueWVhck1vbnRoQ2FjaGUuc2V0KHMyLCBZZWFyTW9udGhDbGFzcy5wYXJzZShzMiwgdGhpcykpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnllYXJNb250aENhY2hlLmdldChzMik7CiAgICB9CiAgICBnZXRZZWFyV2VlayhzMikgewogICAgICBpZiAoIXRoaXMueWVhcldlZWtDYWNoZS5oYXMoczIpKSB7CiAgICAgICAgdGhpcy55ZWFyV2Vla0NhY2hlLnNldChzMiwgWWVhcldlZWtDbGFzcy5wYXJzZShzMiwgdGhpcykpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnllYXJXZWVrQ2FjaGUuZ2V0KHMyKTsKICAgIH0KICAgIGdldFllYXIoczIpIHsKICAgICAgaWYgKCF0aGlzLnllYXJDYWNoZS5oYXMoczIpKSB7CiAgICAgICAgdGhpcy55ZWFyQ2FjaGUuc2V0KHMyLCBZZWFyQ2xhc3MucGFyc2UoczIsIHRoaXMpKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy55ZWFyQ2FjaGUuZ2V0KHMyKTsKICAgIH0KICAgIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7CiAgICB9CiAgfTsKICBfVGVtcG9yYWxDYWNoZS5pbnN0YW5jZSA9IG5ldyBfVGVtcG9yYWxDYWNoZSgpOwogIGxldCBUZW1wb3JhbENhY2hlID0gX1RlbXBvcmFsQ2FjaGU7CiAgY2xhc3MgWWVhck1vbnRoRGF5Q2xhc3MgewogICAgY29uc3RydWN0b3IoeWVhck51bWJlciwgbW9udGhOdW1iZXIsIGRheU51bWJlciwgY2FjaGUpIHsKICAgICAgdGhpcy55ZWFyTnVtYmVyID0geWVhck51bWJlcjsKICAgICAgdGhpcy5tb250aE51bWJlciA9IG1vbnRoTnVtYmVyOwogICAgICB0aGlzLmRheU51bWJlciA9IGRheU51bWJlcjsKICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlOwogICAgICB0aGlzLnR5cGUgPSAiWWVhck1vbnRoRGF5IjsKICAgICAgdGhpcy5kYXRlID0gbmV3IERhdGUodGhpcy55ZWFyTnVtYmVyLCB0aGlzLm1vbnRoTnVtYmVyIC0gMSwgdGhpcy5kYXlOdW1iZXIpOwogICAgICB0aGlzLmRheWpzID0gZGF5anModGhpcy5kYXRlKTsKICAgICAgdGhpcy5kYXRlU3RyaW5nID0gdGhpcy50b1N0cmluZygpOwogICAgfQogICAgZ2V0IHRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLmRheWpzLmZvcm1hdCgiWVlZWS1NTS1ERCIpOwogICAgfQogICAgdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICB9CiAgICBlbmdsaXNoTmFtZSgpIHsKICAgICAgcmV0dXJuIHRoaXMuZGF5anMuZm9ybWF0KCJkZGRkLCBNTU1NIEQsIFlZWVkiKTsKICAgIH0KICAgIGdldCBmaXJzdERheSgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXQgbGFzdERheSgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBnZXQgeWVhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLnllYXJOdW1iZXJ9YCk7CiAgICB9CiAgICBnZXQgbW9udGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aCh0aGlzLmRheWpzLmZvcm1hdCgiWVlZWS1NTSIpKTsKICAgIH0KICAgIGdldCB3ZWVrKCkgewogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyV2Vlayh0aGlzLmRheWpzLmZvcm1hdChGT1JNQVRfSVNPX1dFRUtfWUVBUl9XRUVLKSk7CiAgICB9CiAgICBhZGREYXlzKGRheXMpIHsKICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF5anMuYWRkKGRheXMsICJkYXkiKTsKICAgICAgY29uc3QgczIgPSBkYXRlLmZvcm1hdCgiWVlZWS1NTS1ERCIpOwogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkoczIpOwogICAgfQogICAgbWludXMob3RoZXIpIHsKICAgICAgcmV0dXJuIHRoaXMuZGF5anMuZGlmZihvdGhlci5kYXlqcywgImRheSIpOwogICAgfQogICAgc3RhdGljIHBhcnNlKHMyLCBjYWNoZSkgewogICAgICBjb25zdCBbeWVhciwgbW9udGgsIGRheV0gPSBzMi5zcGxpdCgiLSIpLm1hcCgoczIyKSA9PiBwYXJzZUludChzMjIsIDEwKSk7CiAgICAgIHJldHVybiBuZXcgWWVhck1vbnRoRGF5Q2xhc3MoeWVhciwgbW9udGgsIGRheSwgY2FjaGUpOwogICAgfQogIH0KICBjbGFzcyBZZWFyV2Vla0NsYXNzIHsKICAgIGNvbnN0cnVjdG9yKGlzb1llYXJOdW1iZXIsIGlzb1dlZWtOdW1iZXIsIGNhY2hlKSB7CiAgICAgIHRoaXMuaXNvWWVhck51bWJlciA9IGlzb1llYXJOdW1iZXI7CiAgICAgIHRoaXMuaXNvV2Vla051bWJlciA9IGlzb1dlZWtOdW1iZXI7CiAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKICAgICAgdGhpcy50eXBlID0gIlllYXJXZWVrIjsKICAgICAgdGhpcy5kYXRlU3RyaW5nID0gdGhpcy50b1N0cmluZygpOwogICAgfQogICAgZ2V0IHRleHQoKSB7CiAgICAgIHJldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmZvcm1hdChGT1JNQVRfSVNPX1dFRUtfWUVBUl9XRUVLKTsKICAgIH0KICAgIHRvU3RyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy50ZXh0OwogICAgfQogICAgZW5nbGlzaE5hbWUoKSB7CiAgICAgIHJldHVybiBgV2VlayAke3RoaXMuaXNvV2Vla051bWJlcn0sICR7dGhpcy5pc29ZZWFyTnVtYmVyfWA7CiAgICB9CiAgICBnZXQgZmlyc3REYXkoKSB7CiAgICAgIGNvbnN0IGZpcnN0RGF5ID0gZGF5anMoKS55ZWFyKHRoaXMuaXNvWWVhck51bWJlcikubW9udGgoMSkuZGF0ZSg0KS5pc29XZWVrKHRoaXMuaXNvV2Vla051bWJlcikuc3RhcnRPZigiaXNvV2VlayIpOwogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkoZmlyc3REYXkuZm9ybWF0KCJZWVlZLU1NLUREIikpOwogICAgfQogICAgZ2V0IGxhc3REYXkoKSB7CiAgICAgIGNvbnN0IGZpcnN0RGF5ID0gZGF5anMoKS55ZWFyKHRoaXMuaXNvWWVhck51bWJlcikuc3RhcnRPZigieWVhciIpLmFkZCgodGhpcy5pc29XZWVrTnVtYmVyIC0gMSkgKiA3LCAiZGF5Iikuc3RhcnRPZigid2VlayIpLmFkZCgxLCAiZGF5Iik7CiAgICAgIGNvbnN0IGxhc3REYXkgPSBmaXJzdERheS5hZGQoNiwgImRheSIpOwogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGhEYXkobGFzdERheS5mb3JtYXQoIllZWVktTU0tREQiKSk7CiAgICB9CiAgICBnZXQgeWVhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLmlzb1llYXJOdW1iZXJ9YCk7CiAgICB9CiAgICBhZGRXZWVrcyh3ZWVrcykgewogICAgICBjb25zdCBkYXRlID0gdGhpcy5maXJzdERheS5kYXlqcy5hZGQod2Vla3MsICJ3ZWVrIik7CiAgICAgIGNvbnN0IHMyID0gZGF0ZS5mb3JtYXQoRk9STUFUX0lTT19XRUVLX1lFQVJfV0VFSyk7CiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldFllYXJXZWVrKHMyKTsKICAgIH0KICAgIG1pbnVzKG90aGVyKSB7CiAgICAgIHJldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmRpZmYob3RoZXIuZmlyc3REYXkuZGF5anMsICJ3ZWVrIik7CiAgICB9CiAgICBzdGF0aWMgcGFyc2UoczIsIGNhY2hlKSB7CiAgICAgIGNvbnN0IFt5ZWFyLCB3ZWVrXSA9IHMyLnNwbGl0KCItVyIpLm1hcCgoczIyKSA9PiBwYXJzZUludChzMjIsIDEwKSk7CiAgICAgIHJldHVybiBuZXcgWWVhcldlZWtDbGFzcyh5ZWFyLCB3ZWVrLCBjYWNoZSk7CiAgICB9CiAgfQogIGNsYXNzIFllYXJNb250aENsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHllYXJOdW1iZXIsIG1vbnRoTnVtYmVyLCBjYWNoZSkgewogICAgICB0aGlzLnllYXJOdW1iZXIgPSB5ZWFyTnVtYmVyOwogICAgICB0aGlzLm1vbnRoTnVtYmVyID0gbW9udGhOdW1iZXI7CiAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKICAgICAgdGhpcy50eXBlID0gIlllYXJNb250aCI7CiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9IHRoaXMudG9TdHJpbmcoKTsKICAgIH0KICAgIGdldCB0ZXh0KCkgewogICAgICByZXR1cm4gdGhpcy5maXJzdERheS5kYXlqcy5mb3JtYXQoIllZWVktTU0iKTsKICAgIH0KICAgIHRvU3RyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy50ZXh0OwogICAgfQogICAgZW5nbGlzaE5hbWUoKSB7CiAgICAgIHJldHVybiBgJHttb250aE5hbWUodGhpcy5tb250aE51bWJlcil9ICR7dGhpcy55ZWFyTnVtYmVyfWA7CiAgICB9CiAgICBnZXQgZmlyc3REYXkoKSB7CiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aERheShkYXlqcyhgJHt0aGlzLnllYXJOdW1iZXJ9LSR7dGhpcy5tb250aE51bWJlcn0tMDFgKS5mb3JtYXQoIllZWVktTU0tREQiKSk7CiAgICB9CiAgICBnZXQgbGFzdERheSgpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoRGF5KAogICAgICAgIGRheWpzKGAke3RoaXMueWVhck51bWJlcn0tJHt0aGlzLm1vbnRoTnVtYmVyfS0wMWApLmVuZE9mKCJtb250aCIpLmZvcm1hdCgiWVlZWS1NTS1ERCIpCiAgICAgICk7CiAgICB9CiAgICBnZXQgeWVhcigpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhcihgJHt0aGlzLnllYXJOdW1iZXJ9YCk7CiAgICB9CiAgICBhZGRNb250aHMobW9udGhzKSB7CiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmZpcnN0RGF5LmRheWpzLmFkZChtb250aHMsICJtb250aCIpOwogICAgICBjb25zdCBzMiA9IGRhdGUuZm9ybWF0KCJZWVlZLU1NIik7CiAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldFllYXJNb250aChzMik7CiAgICB9CiAgICBtaW51cyhvdGhlcikgewogICAgICByZXR1cm4gdGhpcy5maXJzdERheS5kYXlqcy5kaWZmKG90aGVyLmZpcnN0RGF5LmRheWpzLCAibW9udGgiKTsKICAgIH0KICAgIHN0YXRpYyBwYXJzZShzMiwgY2FjaGUpIHsKICAgICAgY29uc3QgW3llYXIsIG1vbnRoXSA9IHMyLnNwbGl0KCItIikubWFwKChzMjIpID0+IHBhcnNlSW50KHMyMiwgMTApKTsKICAgICAgcmV0dXJuIG5ldyBZZWFyTW9udGhDbGFzcyh5ZWFyLCBtb250aCwgY2FjaGUpOwogICAgfQogIH0KICBjbGFzcyBZZWFyQ2xhc3MgewogICAgY29uc3RydWN0b3IoeWVhciwgY2FjaGUpIHsKICAgICAgdGhpcy55ZWFyID0geWVhcjsKICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlOwogICAgICB0aGlzLnR5cGUgPSAiWWVhciI7CiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9IHRoaXMudG9TdHJpbmcoKTsKICAgIH0KICAgIGdldCB0ZXh0KCkgewogICAgICByZXR1cm4gdGhpcy5maXJzdERheS5kYXlqcy5mb3JtYXQoIllZWVkiKTsKICAgIH0KICAgIHRvU3RyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy50ZXh0OwogICAgfQogICAgZW5nbGlzaE5hbWUoKSB7CiAgICAgIHJldHVybiB0aGlzLnllYXIudG9TdHJpbmcoKTsKICAgIH0KICAgIGdldCBmaXJzdE1vbnRoKCkgewogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyTW9udGgoYCR7dGhpcy55ZWFyfS0wMWApOwogICAgfQogICAgZ2V0IGxhc3RNb250aCgpIHsKICAgICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0WWVhck1vbnRoKGAke3RoaXMueWVhcn0tMTJgKTsKICAgIH0KICAgIGdldCBmaXJzdERheSgpIHsKICAgICAgcmV0dXJuIHRoaXMuZmlyc3RNb250aC5maXJzdERheTsKICAgIH0KICAgIGdldCBsYXN0RGF5KCkgewogICAgICByZXR1cm4gdGhpcy5sYXN0TW9udGgubGFzdERheTsKICAgIH0KICAgIGFkZFllYXJzKHllYXJzKSB7CiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmZpcnN0RGF5LmRheWpzLmFkZCh5ZWFycywgInllYXIiKTsKICAgICAgY29uc3QgczIgPSBkYXRlLmZvcm1hdCgiWVlZWSIpOwogICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRZZWFyKHMyKTsKICAgIH0KICAgIG1pbnVzKG90aGVyKSB7CiAgICAgIHJldHVybiB0aGlzLmZpcnN0RGF5LmRheWpzLmRpZmYob3RoZXIuZmlyc3REYXkuZGF5anMsICJ5ZWFyIik7CiAgICB9CiAgICBzdGF0aWMgcGFyc2UoczIsIGNhY2hlKSB7CiAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChzMiwgMTApOwogICAgICByZXR1cm4gbmV3IFllYXJDbGFzcyh5ZWFyLCBjYWNoZSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG1vbnRoTmFtZShtb250aCkgewogICAgcmV0dXJuIGRheWpzKCkubW9udGgobW9udGggLSAxKS5mb3JtYXQoIk1NTU0iKTsKICB9CiAgZnVuY3Rpb24gdG9UZW1wb3JhbCh0ZW1wb3JhbENsYXNzKSB7CiAgICBzd2l0Y2ggKHRlbXBvcmFsQ2xhc3MudHlwZSkgewogICAgICBjYXNlICJZZWFyTW9udGhEYXkiOgogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiWWVhck1vbnRoRGF5IiwKICAgICAgICAgIHllYXJOdW1iZXI6IHRlbXBvcmFsQ2xhc3MueWVhck51bWJlciwKICAgICAgICAgIG1vbnRoTnVtYmVyOiB0ZW1wb3JhbENsYXNzLm1vbnRoTnVtYmVyLAogICAgICAgICAgZGF5TnVtYmVyOiB0ZW1wb3JhbENsYXNzLmRheU51bWJlciwKICAgICAgICAgIGRhdGVTdHJpbmc6IHRlbXBvcmFsQ2xhc3MuZGF0ZVN0cmluZwogICAgICAgIH07CiAgICAgIGNhc2UgIlllYXJXZWVrIjoKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIlllYXJXZWVrIiwKICAgICAgICAgIGlzb1llYXJOdW1iZXI6IHRlbXBvcmFsQ2xhc3MuaXNvWWVhck51bWJlciwKICAgICAgICAgIGlzb1dlZWtOdW1iZXI6IHRlbXBvcmFsQ2xhc3MuaXNvV2Vla051bWJlciwKICAgICAgICAgIGRhdGVTdHJpbmc6IHRlbXBvcmFsQ2xhc3MuZGF0ZVN0cmluZwogICAgICAgIH07CiAgICAgIGNhc2UgIlllYXJNb250aCI6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJZZWFyTW9udGgiLAogICAgICAgICAgeWVhck51bWJlcjogdGVtcG9yYWxDbGFzcy55ZWFyTnVtYmVyLAogICAgICAgICAgbW9udGhOdW1iZXI6IHRlbXBvcmFsQ2xhc3MubW9udGhOdW1iZXIsCiAgICAgICAgICBkYXRlU3RyaW5nOiB0ZW1wb3JhbENsYXNzLmRhdGVTdHJpbmcKICAgICAgICB9OwogICAgICBjYXNlICJZZWFyIjoKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIlllYXIiLAogICAgICAgICAgeWVhcjogdGVtcG9yYWxDbGFzcy55ZWFyLAogICAgICAgICAgZGF0ZVN0cmluZzogdGVtcG9yYWxDbGFzcy5kYXRlU3RyaW5nCiAgICAgICAgfTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVBbGxEYXlzSW5SYW5nZShzdGFydCwgZW5kKSB7CiAgICBjb25zdCBkYXlzID0gW107CiAgICBjb25zdCBkYXlzSW5CZXR3ZWVuID0gZW5kLm1pbnVzKHN0YXJ0KTsKICAgIGZvciAobGV0IGkyID0gMDsgaTIgPD0gZGF5c0luQmV0d2VlbjsgaTIrKykgewogICAgICBkYXlzLnB1c2goc3RhcnQuYWRkRGF5cyhpMikpOwogICAgfQogICAgcmV0dXJuIGRheXM7CiAgfQogIGZ1bmN0aW9uIGdlbmVyYXRlQWxsV2Vla3NJblJhbmdlKHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IHdlZWtzID0gW107CiAgICBjb25zdCB3ZWVrc0luQmV0d2VlbiA9IGVuZC5taW51cyhzdGFydCk7CiAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDw9IHdlZWtzSW5CZXR3ZWVuOyBpMisrKSB7CiAgICAgIHdlZWtzLnB1c2goc3RhcnQuYWRkV2Vla3MoaTIpKTsKICAgIH0KICAgIHJldHVybiB3ZWVrczsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVBbGxNb250aHNJblJhbmdlKHN0YXJ0LCBlbmQpIHsKICAgIGNvbnN0IG1vbnRocyA9IFtdOwogICAgY29uc3QgbW9udGhzSW5CZXR3ZWVuID0gZW5kLm1pbnVzKHN0YXJ0KTsKICAgIGZvciAobGV0IGkyID0gMDsgaTIgPD0gbW9udGhzSW5CZXR3ZWVuOyBpMisrKSB7CiAgICAgIG1vbnRocy5wdXNoKHN0YXJ0LmFkZE1vbnRocyhpMikpOwogICAgfQogICAgcmV0dXJuIG1vbnRoczsKICB9CiAgZnVuY3Rpb24gZ2VuZXJhdGVBbGxZZWFyc0luUmFuZ2Uoc3RhcnQsIGVuZCkgewogICAgY29uc3QgeWVhcnMgPSBbXTsKICAgIGNvbnN0IHllYXJzSW5CZXR3ZWVuID0gZW5kLm1pbnVzKHN0YXJ0KTsKICAgIGZvciAobGV0IGkyID0gMDsgaTIgPD0geWVhcnNJbkJldHdlZW47IGkyKyspIHsKICAgICAgeWVhcnMucHVzaChzdGFydC5hZGRZZWFycyhpMikpOwogICAgfQogICAgcmV0dXJuIHllYXJzOwogIH0KICBmdW5jdGlvbiBnZW5lcmF0ZUFsbEluUmFuZ2Uoc3RhcnQsIGVuZCkgewogICAgaWYgKHN0YXJ0ID09PSBudWxsIHx8IGVuZCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gW107CiAgICB9CiAgICBpZiAoc3RhcnQgaW5zdGFuY2VvZiBZZWFyTW9udGhEYXlDbGFzcyAmJiBlbmQgaW5zdGFuY2VvZiBZZWFyTW9udGhEYXlDbGFzcykgewogICAgICByZXR1cm4gZ2VuZXJhdGVBbGxEYXlzSW5SYW5nZShzdGFydCwgZW5kKTsKICAgIH0KICAgIGlmIChzdGFydCBpbnN0YW5jZW9mIFllYXJXZWVrQ2xhc3MgJiYgZW5kIGluc3RhbmNlb2YgWWVhcldlZWtDbGFzcykgewogICAgICByZXR1cm4gZ2VuZXJhdGVBbGxXZWVrc0luUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgICB9CiAgICBpZiAoc3RhcnQgaW5zdGFuY2VvZiBZZWFyTW9udGhDbGFzcyAmJiBlbmQgaW5zdGFuY2VvZiBZZWFyTW9udGhDbGFzcykgewogICAgICByZXR1cm4gZ2VuZXJhdGVBbGxNb250aHNJblJhbmdlKHN0YXJ0LCBlbmQpOwogICAgfQogICAgaWYgKHN0YXJ0IGluc3RhbmNlb2YgWWVhckNsYXNzICYmIGVuZCBpbnN0YW5jZW9mIFllYXJDbGFzcykgewogICAgICByZXR1cm4gZ2VuZXJhdGVBbGxZZWFyc0luUmFuZ2Uoc3RhcnQsIGVuZCk7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnRzOiBzdGFydCBhbmQgZW5kIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZTogJHtzdGFydH0sICR7ZW5kfWApOwogIH0KICBmdW5jdGlvbiBtaW51c1RlbXBvcmFsKGEyLCBiKSB7CiAgICBpZiAoYTIgaW5zdGFuY2VvZiBZZWFyTW9udGhEYXlDbGFzcyAmJiBiIGluc3RhbmNlb2YgWWVhck1vbnRoRGF5Q2xhc3MpIHsKICAgICAgcmV0dXJuIGEyLm1pbnVzKGIpOwogICAgfQogICAgaWYgKGEyIGluc3RhbmNlb2YgWWVhcldlZWtDbGFzcyAmJiBiIGluc3RhbmNlb2YgWWVhcldlZWtDbGFzcykgewogICAgICByZXR1cm4gYTIubWludXMoYik7CiAgICB9CiAgICBpZiAoYTIgaW5zdGFuY2VvZiBZZWFyTW9udGhDbGFzcyAmJiBiIGluc3RhbmNlb2YgWWVhck1vbnRoQ2xhc3MpIHsKICAgICAgcmV0dXJuIGEyLm1pbnVzKGIpOwogICAgfQogICAgaWYgKGEyIGluc3RhbmNlb2YgWWVhckNsYXNzICYmIGIgaW5zdGFuY2VvZiBZZWFyQ2xhc3MpIHsKICAgICAgcmV0dXJuIGEyLm1pbnVzKGIpOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcGFyZSAke2EyfSBhbmQgJHtifWApOwogIH0KICBmdW5jdGlvbiBjb21wYXJlVGVtcG9yYWwoYTIsIGIpIHsKICAgIGlmIChhMiA9PT0gbnVsbCkgewogICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmIChiID09PSBudWxsKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGNvbnN0IGRpZmYgPSBtaW51c1RlbXBvcmFsKGEyLCBiKTsKICAgIGlmIChkaWZmIDwgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoZGlmZiA+IDApIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKICB9CiAgZnVuY3Rpb24gZ2V0TWluTWF4VGVtcG9yYWwodmFsdWVzKSB7CiAgICBsZXQgbWluID0gbnVsbDsKICAgIGxldCBtYXggPSBudWxsOwogICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjb21wYXJlVGVtcG9yYWwodmFsdWUsIG1pbikgPCAwKSB7CiAgICAgICAgbWluID0gdmFsdWU7CiAgICAgIH0KICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjb21wYXJlVGVtcG9yYWwodmFsdWUsIG1heCkgPiAwKSB7CiAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChtaW4gPT09IG51bGwgfHwgbWF4ID09PSBudWxsKSB7CiAgICAgIHJldHVybiB7IG1pbjogbnVsbCwgbWF4OiBudWxsIH07CiAgICB9CiAgICByZXR1cm4geyBtaW4sIG1heCB9OwogIH0KICBmdW5jdGlvbiBwYXJzZURhdGVTdHJpbmdUb1RlbXBvcmFsKGRhdGUsIGdyYW51bGFyaXR5KSB7CiAgICBjb25zdCBjYWNoZSA9IFRlbXBvcmFsQ2FjaGUuZ2V0SW5zdGFuY2UoKTsKICAgIGNvbnN0IGRheSA9IGNhY2hlLmdldFllYXJNb250aERheShkYXRlKTsKICAgIHN3aXRjaCAoZ3JhbnVsYXJpdHkpIHsKICAgICAgY2FzZSAiZGF5IjoKICAgICAgICByZXR1cm4gZGF5OwogICAgICBjYXNlICJ3ZWVrIjoKICAgICAgICByZXR1cm4gZGF5LndlZWs7CiAgICAgIGNhc2UgIm1vbnRoIjoKICAgICAgICByZXR1cm4gZGF5Lm1vbnRoOwogICAgICBjYXNlICJ5ZWFyIjoKICAgICAgICByZXR1cm4gZGF5LnllYXI7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRhdGVSYW5nZUNvbXBhcmUoYTIsIGIpIHsKICAgIGlmIChhMi5kYXRlUmFuZ2UgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoYi5kYXRlUmFuZ2UgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIGNvbXBhcmVUZW1wb3JhbChhMi5kYXRlUmFuZ2UsIGIuZGF0ZVJhbmdlKTsKICB9CiAgZnVuY3Rpb24gbWFwRGF0ZVRvR3JhbnVsYXJpdHlSYW5nZShkYXRhLCBncmFudWxhcml0eSkgewogICAgcmV0dXJuIHsKICAgICAgZGF0ZVJhbmdlOiBkYXRhLmRhdGUgPT09IG51bGwgPyBudWxsIDogcGFyc2VEYXRlU3RyaW5nVG9UZW1wb3JhbChkYXRhLmRhdGUsIGdyYW51bGFyaXR5KSwKICAgICAgY291bnQ6IGRhdGEuY291bnQKICAgIH07CiAgfQogIGNvbnN0IHN1YnN0aXR1dGlvblJlZ2V4ID0gL14oKD88c2VnbWVudD5bQS1aYS16MC05Xy1dKykoPz06KTopPyg/PHZhbHVlQXRSZWZlcmVuY2U+W0EtWmEtel0pPyg/PHBvc2l0aW9uPlxkKykoPzxzdWJzdGl0dXRpb25WYWx1ZT5bQS1aYS16Ll0pPyQvOwogIGNsYXNzIFN1YnN0aXR1dGlvbkNsYXNzIHsKICAgIGNvbnN0cnVjdG9yKHNlZ21lbnQsIHZhbHVlQXRSZWZlcmVuY2UsIHN1YnN0aXR1dGlvblZhbHVlLCBwb3NpdGlvbikgewogICAgICB0aGlzLnNlZ21lbnQgPSBzZWdtZW50OwogICAgICB0aGlzLnZhbHVlQXRSZWZlcmVuY2UgPSB2YWx1ZUF0UmVmZXJlbmNlOwogICAgICB0aGlzLnN1YnN0aXR1dGlvblZhbHVlID0gc3Vic3RpdHV0aW9uVmFsdWU7CiAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgdGhpcy50eXBlID0gInN1YnN0aXR1dGlvbiI7CiAgICAgIGNvbnN0IHNlZ21lbnRTdHJpbmcgPSB0aGlzLnNlZ21lbnQgPyBgJHt0aGlzLnNlZ21lbnR9OmAgOiAiIjsKICAgICAgY29uc3QgdmFsdWVBdFJlZmVyZW5jZVN0cmluZyA9IHRoaXMudmFsdWVBdFJlZmVyZW5jZSA/IGAke3RoaXMudmFsdWVBdFJlZmVyZW5jZX1gIDogIiI7CiAgICAgIGNvbnN0IHN1YnN0aXR1dGlvblZhbHVlU3RyaW5nID0gdGhpcy5zdWJzdGl0dXRpb25WYWx1ZSA/IGAke3RoaXMuc3Vic3RpdHV0aW9uVmFsdWV9YCA6ICIiOwogICAgICB0aGlzLmNvZGUgPSBgJHtzZWdtZW50U3RyaW5nfSR7dmFsdWVBdFJlZmVyZW5jZVN0cmluZ30ke3RoaXMucG9zaXRpb259JHtzdWJzdGl0dXRpb25WYWx1ZVN0cmluZ31gOwogICAgfQogICAgZXF1YWxzKG90aGVyKSB7CiAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU3Vic3RpdHV0aW9uQ2xhc3MpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnNlZ21lbnQgPT09IG90aGVyLnNlZ21lbnQgJiYgdGhpcy52YWx1ZUF0UmVmZXJlbmNlID09PSBvdGhlci52YWx1ZUF0UmVmZXJlbmNlICYmIHRoaXMuc3Vic3RpdHV0aW9uVmFsdWUgPT09IG90aGVyLnN1YnN0aXR1dGlvblZhbHVlICYmIHRoaXMucG9zaXRpb24gPT09IG90aGVyLnBvc2l0aW9uOwogICAgfQogICAgdG9TdHJpbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLmNvZGU7CiAgICB9CiAgICBzdGF0aWMgcGFyc2UobXV0YXRpb25TdHIpIHsKICAgICAgY29uc3QgbWF0Y2ggPSBtdXRhdGlvblN0ci5tYXRjaChzdWJzdGl0dXRpb25SZWdleCk7CiAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCB8fCBtYXRjaC5ncm91cHMgPT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgU3Vic3RpdHV0aW9uQ2xhc3MoCiAgICAgICAgbWF0Y2guZ3JvdXBzLnNlZ21lbnQsCiAgICAgICAgbWF0Y2guZ3JvdXBzLnZhbHVlQXRSZWZlcmVuY2UsCiAgICAgICAgbWF0Y2guZ3JvdXBzLnN1YnN0aXR1dGlvblZhbHVlLAogICAgICAgIHBhcnNlSW50KG1hdGNoLmdyb3Vwcy5wb3NpdGlvbiwgMTApCiAgICAgICk7CiAgICB9CiAgfQogIGNvbnN0IGRlbGV0aW9uUmVnZXggPSAvXigoPzxzZWdtZW50PltBLVphLXowLTlfLV0rKSg/PTopOik/KD88dmFsdWVBdFJlZmVyZW5jZT5bQS1aYS16XSk/KD88cG9zaXRpb24+XGQrKSgtKSQvOwogIGNsYXNzIERlbGV0aW9uQ2xhc3MgewogICAgY29uc3RydWN0b3Ioc2VnbWVudCwgdmFsdWVBdFJlZmVyZW5jZSwgcG9zaXRpb24pIHsKICAgICAgdGhpcy5zZWdtZW50ID0gc2VnbWVudDsKICAgICAgdGhpcy52YWx1ZUF0UmVmZXJlbmNlID0gdmFsdWVBdFJlZmVyZW5jZTsKICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgICB0aGlzLnR5cGUgPSAiZGVsZXRpb24iOwogICAgICBjb25zdCBzZWdtZW50U3RyaW5nID0gdGhpcy5zZWdtZW50ID8gYCR7dGhpcy5zZWdtZW50fTpgIDogIiI7CiAgICAgIGNvbnN0IHZhbHVlQXRSZWZlcmVuY2VTdHJpbmcgPSB0aGlzLnZhbHVlQXRSZWZlcmVuY2UgPyBgJHt0aGlzLnZhbHVlQXRSZWZlcmVuY2V9YCA6ICIiOwogICAgICB0aGlzLmNvZGUgPSBgJHtzZWdtZW50U3RyaW5nfSR7dmFsdWVBdFJlZmVyZW5jZVN0cmluZ30ke3RoaXMucG9zaXRpb259LWA7CiAgICB9CiAgICBlcXVhbHMob3RoZXIpIHsKICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBEZWxldGlvbkNsYXNzKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5zZWdtZW50ID09PSBvdGhlci5zZWdtZW50ICYmIHRoaXMudmFsdWVBdFJlZmVyZW5jZSA9PT0gb3RoZXIudmFsdWVBdFJlZmVyZW5jZSAmJiB0aGlzLnBvc2l0aW9uID09PSBvdGhlci5wb3NpdGlvbjsKICAgIH0KICAgIHRvU3RyaW5nKCkgewogICAgICByZXR1cm4gdGhpcy5jb2RlOwogICAgfQogICAgc3RhdGljIHBhcnNlKG11dGF0aW9uU3RyKSB7CiAgICAgIGNvbnN0IG1hdGNoID0gbXV0YXRpb25TdHIubWF0Y2goZGVsZXRpb25SZWdleCk7CiAgICAgIGlmIChtYXRjaCA9PT0gbnVsbCB8fCBtYXRjaC5ncm91cHMgPT09IHZvaWQgMCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGVsZXRpb25DbGFzcygKICAgICAgICBtYXRjaC5ncm91cHMuc2VnbWVudCwKICAgICAgICBtYXRjaC5ncm91cHMudmFsdWVBdFJlZmVyZW5jZSwKICAgICAgICBwYXJzZUludChtYXRjaC5ncm91cHMucG9zaXRpb24sIDEwKQogICAgICApOwogICAgfQogIH0KICBmdW5jdGlvbiB0b1N1YnN0aXR1dGlvbk9yRGVsZXRpb24obXV0YXRpb24pIHsKICAgIHN3aXRjaCAobXV0YXRpb24udHlwZSkgewogICAgICBjYXNlICJzdWJzdGl0dXRpb24iOgogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAic3Vic3RpdHV0aW9uIiwKICAgICAgICAgIGNvZGU6IG11dGF0aW9uLmNvZGUsCiAgICAgICAgICBzZWdtZW50OiBtdXRhdGlvbi5zZWdtZW50LAogICAgICAgICAgcG9zaXRpb246IG11dGF0aW9uLnBvc2l0aW9uLAogICAgICAgICAgdmFsdWVBdFJlZmVyZW5jZTogbXV0YXRpb24udmFsdWVBdFJlZmVyZW5jZSwKICAgICAgICAgIHN1YnN0aXR1dGlvblZhbHVlOiBtdXRhdGlvbi5zdWJzdGl0dXRpb25WYWx1ZQogICAgICAgIH07CiAgICAgIGNhc2UgImRlbGV0aW9uIjoKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogImRlbGV0aW9uIiwKICAgICAgICAgIGNvZGU6IG11dGF0aW9uLmNvZGUsCiAgICAgICAgICBzZWdtZW50OiBtdXRhdGlvbi5zZWdtZW50LAogICAgICAgICAgcG9zaXRpb246IG11dGF0aW9uLnBvc2l0aW9uLAogICAgICAgICAgdmFsdWVBdFJlZmVyZW5jZTogbXV0YXRpb24udmFsdWVBdFJlZmVyZW5jZQogICAgICAgIH07CiAgICB9CiAgfQogIGNsYXNzIEZldGNoU3Vic3RpdHV0aW9uc09yRGVsZXRpb25zT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoZmlsdGVyLCBzZXF1ZW5jZVR5cGUsIG1pblByb3BvcnRpb24pIHsKICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7CiAgICAgIHRoaXMuc2VxdWVuY2VUeXBlID0gc2VxdWVuY2VUeXBlOwogICAgICB0aGlzLm1pblByb3BvcnRpb24gPSBtaW5Qcm9wb3J0aW9uOwogICAgfQogICAgYXN5bmMgZXZhbHVhdGUobGFwaXMsIHNpZ25hbCkgewogICAgICBjb25zdCBtdXRhdGlvbnMgPSBhd2FpdCB0aGlzLmZldGNoTXV0YXRpb25zKGxhcGlzLCBzaWduYWwpOwogICAgICBjb25zdCBjb250ZW50ID0gbXV0YXRpb25zLm1hcCgKICAgICAgICAoeyBjb3VudCwgcHJvcG9ydGlvbiwgbXV0YXRpb25Gcm9tLCBtdXRhdGlvblRvLCBwb3NpdGlvbiwgc2VxdWVuY2VOYW1lIH0pID0+IHsKICAgICAgICAgIGlmIChtdXRhdGlvblRvID09PSAiLSIpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0eXBlOiAiZGVsZXRpb24iLAogICAgICAgICAgICAgIG11dGF0aW9uOiBuZXcgRGVsZXRpb25DbGFzcyhzZXF1ZW5jZU5hbWUgPz8gdm9pZCAwLCBtdXRhdGlvbkZyb20sIHBvc2l0aW9uKSwKICAgICAgICAgICAgICBjb3VudCwKICAgICAgICAgICAgICBwcm9wb3J0aW9uCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAic3Vic3RpdHV0aW9uIiwKICAgICAgICAgICAgbXV0YXRpb246IG5ldyBTdWJzdGl0dXRpb25DbGFzcyhzZXF1ZW5jZU5hbWUgPz8gdm9pZCAwLCBtdXRhdGlvbkZyb20sIG11dGF0aW9uVG8sIHBvc2l0aW9uKSwKICAgICAgICAgICAgY291bnQsCiAgICAgICAgICAgIHByb3BvcnRpb24KICAgICAgICAgIH07CiAgICAgICAgfQogICAgICApOwogICAgICByZXR1cm4geyBjb250ZW50IH07CiAgICB9CiAgICBhc3luYyBmZXRjaE11dGF0aW9ucyhsYXBpcywgc2lnbmFsKSB7CiAgICAgIGNvbnN0IGZpbHRlciA9IHsKICAgICAgICAuLi50aGlzLmZpbHRlciwKICAgICAgICBtaW5Qcm9wb3J0aW9uOiB0aGlzLm1pblByb3BvcnRpb24KICAgICAgfTsKICAgICAgcmV0dXJuIGZldGNoU3Vic3RpdHV0aW9uc09yRGVsZXRpb25zKGxhcGlzLCBmaWx0ZXIsIHRoaXMuc2VxdWVuY2VUeXBlLCBzaWduYWwpLnRoZW4oCiAgICAgICAgKHJlc3BvbnNlKSA9PiByZXNwb25zZS5kYXRhCiAgICAgICk7CiAgICB9CiAgfQogIHZhciBsJDE7CiAgbCQxID0geyBfX2U6IGZ1bmN0aW9uKG4sIGwyLCB1MiwgdCkgewogICAgZm9yICh2YXIgaTIsIG8sIHIyOyBsMiA9IGwyLl9fOyApIGlmICgoaTIgPSBsMi5fX2MpICYmICFpMi5fXykgdHJ5IHsKICAgICAgaWYgKChvID0gaTIuY29uc3RydWN0b3IpICYmIG51bGwgIT0gby5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgJiYgKGkyLnNldFN0YXRlKG8uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKG4pKSwgcjIgPSBpMi5fX2QpLCBudWxsICE9IGkyLmNvbXBvbmVudERpZENhdGNoICYmIChpMi5jb21wb25lbnREaWRDYXRjaChuLCB0IHx8IHt9KSwgcjIgPSBpMi5fX2QpLCByMikgcmV0dXJuIGkyLl9fRSA9IGkyOwogICAgfSBjYXRjaCAobDMpIHsKICAgICAgbiA9IGwzOwogICAgfQogICAgdGhyb3cgbjsKICB9IH0sICJmdW5jdGlvbiIgPT0gdHlwZW9mIFByb21pc2UgPyBQcm9taXNlLnByb3RvdHlwZS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpIDogc2V0VGltZW91dDsKICB2YXIgciwgdSwgaSwgZiA9IFtdLCBjID0gbCQxLCBlID0gYy5fX2IsIGEgPSBjLl9fciwgdiA9IGMuZGlmZmVkLCBsID0gYy5fX2MsIG0gPSBjLnVubW91bnQsIHMgPSBjLl9fOwogIGZ1bmN0aW9uIGooKSB7CiAgICBmb3IgKHZhciBuOyBuID0gZi5zaGlmdCgpOyApIGlmIChuLl9fUCAmJiBuLl9fSCkgdHJ5IHsKICAgICAgbi5fX0guX19oLmZvckVhY2goeiksIG4uX19ILl9faC5mb3JFYWNoKEIpLCBuLl9fSC5fX2ggPSBbXTsKICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgbi5fX0guX19oID0gW10sIGMuX19lKHQsIG4uX192KTsKICAgIH0KICB9CiAgYy5fX2IgPSBmdW5jdGlvbihuKSB7CiAgICByID0gbnVsbCwgZSAmJiBlKG4pOwogIH0sIGMuX18gPSBmdW5jdGlvbihuLCB0KSB7CiAgICBuICYmIHQuX19rICYmIHQuX19rLl9fbSAmJiAobi5fX20gPSB0Ll9fay5fX20pLCBzICYmIHMobiwgdCk7CiAgfSwgYy5fX3IgPSBmdW5jdGlvbihuKSB7CiAgICBhICYmIGEobik7CiAgICB2YXIgaTIgPSAociA9IG4uX19jKS5fX0g7CiAgICBpMiAmJiAodSA9PT0gciA/IChpMi5fX2ggPSBbXSwgci5fX2ggPSBbXSwgaTIuX18uZm9yRWFjaChmdW5jdGlvbihuMikgewogICAgICBuMi5fX04gJiYgKG4yLl9fID0gbjIuX19OKSwgbjIuaSA9IG4yLl9fTiA9IHZvaWQgMDsKICAgIH0pKSA6IChpMi5fX2guZm9yRWFjaCh6KSwgaTIuX19oLmZvckVhY2goQiksIGkyLl9faCA9IFtdLCAwKSksIHUgPSByOwogIH0sIGMuZGlmZmVkID0gZnVuY3Rpb24obikgewogICAgdiAmJiB2KG4pOwogICAgdmFyIHQgPSBuLl9fYzsKICAgIHQgJiYgdC5fX0ggJiYgKHQuX19ILl9faC5sZW5ndGggJiYgKDEgIT09IGYucHVzaCh0KSAmJiBpID09PSBjLnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAoKGkgPSBjLnJlcXVlc3RBbmltYXRpb25GcmFtZSkgfHwgdykoaikpLCB0Ll9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKG4yKSB7CiAgICAgIG4yLmkgJiYgKG4yLl9fSCA9IG4yLmkpLCBuMi5pID0gdm9pZCAwOwogICAgfSkpLCB1ID0gciA9IG51bGw7CiAgfSwgYy5fX2MgPSBmdW5jdGlvbihuLCB0KSB7CiAgICB0LnNvbWUoZnVuY3Rpb24objIpIHsKICAgICAgdHJ5IHsKICAgICAgICBuMi5fX2guZm9yRWFjaCh6KSwgbjIuX19oID0gbjIuX19oLmZpbHRlcihmdW5jdGlvbihuMykgewogICAgICAgICAgcmV0dXJuICFuMy5fXyB8fCBCKG4zKTsKICAgICAgICB9KTsKICAgICAgfSBjYXRjaCAocjIpIHsKICAgICAgICB0LnNvbWUoZnVuY3Rpb24objMpIHsKICAgICAgICAgIG4zLl9faCAmJiAobjMuX19oID0gW10pOwogICAgICAgIH0pLCB0ID0gW10sIGMuX19lKHIyLCBuMi5fX3YpOwogICAgICB9CiAgICB9KSwgbCAmJiBsKG4sIHQpOwogIH0sIGMudW5tb3VudCA9IGZ1bmN0aW9uKG4pIHsKICAgIG0gJiYgbShuKTsKICAgIHZhciB0LCByMiA9IG4uX19jOwogICAgcjIgJiYgcjIuX19IICYmIChyMi5fX0guX18uZm9yRWFjaChmdW5jdGlvbihuMikgewogICAgICB0cnkgewogICAgICAgIHoobjIpOwogICAgICB9IGNhdGNoIChuMykgewogICAgICAgIHQgPSBuMzsKICAgICAgfQogICAgfSksIHIyLl9fSCA9IHZvaWQgMCwgdCAmJiBjLl9fZSh0LCByMi5fX3YpKTsKICB9OwogIHZhciBrID0gImZ1bmN0aW9uIiA9PSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lOwogIGZ1bmN0aW9uIHcobikgewogICAgdmFyIHQsIHIyID0gZnVuY3Rpb24oKSB7CiAgICAgIGNsZWFyVGltZW91dCh1MiksIGsgJiYgY2FuY2VsQW5pbWF0aW9uRnJhbWUodCksIHNldFRpbWVvdXQobik7CiAgICB9LCB1MiA9IHNldFRpbWVvdXQocjIsIDEwMCk7CiAgICBrICYmICh0ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIyKSk7CiAgfQogIGZ1bmN0aW9uIHoobikgewogICAgdmFyIHQgPSByLCB1MiA9IG4uX19jOwogICAgImZ1bmN0aW9uIiA9PSB0eXBlb2YgdTIgJiYgKG4uX19jID0gdm9pZCAwLCB1MigpKSwgciA9IHQ7CiAgfQogIGZ1bmN0aW9uIEIobikgewogICAgdmFyIHQgPSByOwogICAgbi5fX2MgPSBuLl9fKCksIHIgPSB0OwogIH0KICBjbGFzcyBVc2VyRmFjaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgICBjb25zdHJ1Y3RvcihoZWFkbGluZSwgbWVzc2FnZSkgewogICAgICBzdXBlcihtZXNzYWdlKTsKICAgICAgdGhpcy5oZWFkbGluZSA9IGhlYWRsaW5lOwogICAgICB0aGlzLm5hbWUgPSAiVXNlckZhY2luZ0Vycm9yIjsKICAgIH0KICB9CiAgY2xhc3MgTWFwMmRCYXNlIHsKICAgIGNvbnN0cnVjdG9yKHNlcmlhbGl6ZUZpcnN0QXhpcywgc2VyaWFsaXplU2Vjb25kQXhpcywgaW5pdGlhbENvbnRlbnQpIHsKICAgICAgdGhpcy5zZXJpYWxpemVGaXJzdEF4aXMgPSBzZXJpYWxpemVGaXJzdEF4aXM7CiAgICAgIHRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcyA9IHNlcmlhbGl6ZVNlY29uZEF4aXM7CiAgICAgIHRoaXMuZGF0YSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIHRoaXMua2V5c0ZpcnN0QXhpcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICAgIHRoaXMua2V5c1NlY29uZEF4aXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgICBpZiAoaW5pdGlhbENvbnRlbnQpIHsKICAgICAgICB0aGlzLmtleXNGaXJzdEF4aXMgPSBuZXcgTWFwKGluaXRpYWxDb250ZW50LmtleXNGaXJzdEF4aXMpOwogICAgICAgIHRoaXMua2V5c1NlY29uZEF4aXMgPSBuZXcgTWFwKGluaXRpYWxDb250ZW50LmtleXNTZWNvbmRBeGlzKTsKICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWFwKGluaXRpYWxDb250ZW50LmRhdGEpOwogICAgICB9CiAgICB9CiAgICBnZXQoa2V5Rmlyc3RBeGlzLCBrZXlTZWNvbmRBeGlzKSB7CiAgICAgIHZhciBfYTsKICAgICAgY29uc3Qgc2VyaWFsaXplZEtleUZpcnN0QXhpcyA9IHRoaXMuc2VyaWFsaXplRmlyc3RBeGlzKGtleUZpcnN0QXhpcyk7CiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRLZXlTZWNvbmRBeGlzID0gdGhpcy5zZXJpYWxpemVTZWNvbmRBeGlzKGtleVNlY29uZEF4aXMpOwogICAgICByZXR1cm4gKF9hID0gdGhpcy5kYXRhLmdldChzZXJpYWxpemVkS2V5Rmlyc3RBeGlzKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmdldChzZXJpYWxpemVkS2V5U2Vjb25kQXhpcyk7CiAgICB9CiAgICBnZXRSb3coa2V5LCBmaWxsRW1wdHlXaXRoKSB7CiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMgPSB0aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhrZXkpOwogICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGEuZ2V0KHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMpOwogICAgICBpZiAocm93ID09PSB2b2lkIDApIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5rZXlzU2Vjb25kQXhpcy5rZXlzKCkpLm1hcCgoa2V5MikgPT4gcm93LmdldChrZXkyKSA/PyBmaWxsRW1wdHlXaXRoKTsKICAgIH0KICAgIHNldChrZXlGaXJzdEF4aXMsIGtleVNlY29uZEF4aXMsIHZhbHVlKSB7CiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMgPSB0aGlzLnNlcmlhbGl6ZUZpcnN0QXhpcyhrZXlGaXJzdEF4aXMpOwogICAgICBjb25zdCBzZXJpYWxpemVkS2V5U2Vjb25kQXhpcyA9IHRoaXMuc2VyaWFsaXplU2Vjb25kQXhpcyhrZXlTZWNvbmRBeGlzKTsKICAgICAgaWYgKCF0aGlzLmRhdGEuaGFzKHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMpKSB7CiAgICAgICAgdGhpcy5kYXRhLnNldChzZXJpYWxpemVkS2V5Rmlyc3RBeGlzLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTsKICAgICAgfQogICAgICB0aGlzLmRhdGEuZ2V0KHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMpLnNldChzZXJpYWxpemVkS2V5U2Vjb25kQXhpcywgdmFsdWUpOwogICAgICB0aGlzLmtleXNGaXJzdEF4aXMuc2V0KHNlcmlhbGl6ZWRLZXlGaXJzdEF4aXMsIGtleUZpcnN0QXhpcyk7CiAgICAgIHRoaXMua2V5c1NlY29uZEF4aXMuc2V0KHNlcmlhbGl6ZWRLZXlTZWNvbmRBeGlzLCBrZXlTZWNvbmRBeGlzKTsKICAgIH0KICAgIGRlbGV0ZVJvdyhrZXkpIHsKICAgICAgY29uc3Qgc2VyaWFsaXplZEtleUZpcnN0QXhpcyA9IHRoaXMuc2VyaWFsaXplRmlyc3RBeGlzKGtleSk7CiAgICAgIHRoaXMuZGF0YS5kZWxldGUoc2VyaWFsaXplZEtleUZpcnN0QXhpcyk7CiAgICAgIHRoaXMua2V5c0ZpcnN0QXhpcy5kZWxldGUoc2VyaWFsaXplZEtleUZpcnN0QXhpcyk7CiAgICB9CiAgICBnZXRGaXJzdEF4aXNLZXlzKCkgewogICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmtleXNGaXJzdEF4aXMudmFsdWVzKCkpOwogICAgfQogICAgZ2V0U2Vjb25kQXhpc0tleXMoKSB7CiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMua2V5c1NlY29uZEF4aXMudmFsdWVzKCkpOwogICAgfQogICAgZ2V0QXNBcnJheShmaWxsRW1wdHlXaXRoKSB7CiAgICAgIHJldHVybiB0aGlzLmdldEZpcnN0QXhpc0tleXMoKS5tYXAoKGZpcnN0QXhpc0tleSkgPT4gewogICAgICAgIHJldHVybiB0aGlzLmdldFNlY29uZEF4aXNLZXlzKCkubWFwKChzZWNvbmRBeGlzS2V5KSA9PiB7CiAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoZmlyc3RBeGlzS2V5LCBzZWNvbmRBeGlzS2V5KSA/PyBmaWxsRW1wdHlXaXRoOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KICAgIGdldENvbnRlbnRzKCkgewogICAgICByZXR1cm4gewogICAgICAgIGtleXNGaXJzdEF4aXM6IHRoaXMua2V5c0ZpcnN0QXhpcywKICAgICAgICBrZXlzU2Vjb25kQXhpczogdGhpcy5rZXlzU2Vjb25kQXhpcywKICAgICAgICBkYXRhOiB0aGlzLmRhdGEKICAgICAgfTsKICAgIH0KICB9CiAgY2xhc3MgQmFzZU11dGF0aW9uT3ZlclRpbWVEYXRhTWFwIGV4dGVuZHMgTWFwMmRCYXNlIHsKICAgIGNvbnN0cnVjdG9yKGluaXRpYWxDb250ZW50KSB7CiAgICAgIHN1cGVyKHNlcmlhbGl6ZVN1YnN0aXR1dGlvbk9yRGVsZXRpb24sIHNlcmlhbGl6ZVRlbXBvcmFsLCBpbml0aWFsQ29udGVudCk7CiAgICB9CiAgfQogIGNvbnN0IHNvcnRTdWJzdGl0dXRpb25zQW5kRGVsZXRpb25zID0gKGEyLCBiKSA9PiB7CiAgICBpZiAoYTIuc2VnbWVudCAhPT0gYi5zZWdtZW50KSB7CiAgICAgIHJldHVybiBjb21wYXJlU2VnbWVudHMoYTIuc2VnbWVudCwgYi5zZWdtZW50KTsKICAgIH0KICAgIGlmIChhMi5wb3NpdGlvbiAhPT0gYi5wb3NpdGlvbikgewogICAgICByZXR1cm4gY29tcGFyZVBvc2l0aW9ucyhhMi5wb3NpdGlvbiwgYi5wb3NpdGlvbik7CiAgICB9CiAgICBjb25zdCBhSXNEZWxldGlvbiA9IGEyIGluc3RhbmNlb2YgRGVsZXRpb25DbGFzczsKICAgIGNvbnN0IGJJc0RlbGV0aW9uID0gYiBpbnN0YW5jZW9mIERlbGV0aW9uQ2xhc3M7CiAgICBpZiAoYUlzRGVsZXRpb24gIT09IGJJc0RlbGV0aW9uKSB7CiAgICAgIHJldHVybiBhSXNEZWxldGlvbiA/IDEgOiAtMTsKICAgIH0KICAgIGlmICghYUlzRGVsZXRpb24gJiYgIWJJc0RlbGV0aW9uKSB7CiAgICAgIGlmIChhMi5zdWJzdGl0dXRpb25WYWx1ZSAhPT0gYi5zdWJzdGl0dXRpb25WYWx1ZSkgewogICAgICAgIHJldHVybiBjb21wYXJlU3Vic3RpdHV0aW9uVmFsdWVzKGEyLnN1YnN0aXR1dGlvblZhbHVlLCBiLnN1YnN0aXR1dGlvblZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7CiAgfTsKICBjb25zdCBjb21wYXJlU2VnbWVudHMgPSAoYTIsIGIpID0+IHsKICAgIGlmIChhMiA9PT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGlmIChiID09PSB2b2lkIDApIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gYTIubG9jYWxlQ29tcGFyZShiKTsKICB9OwogIGNvbnN0IGNvbXBhcmVQb3NpdGlvbnMgPSAoYTIsIGIpID0+IHsKICAgIHJldHVybiBhMiAtIGI7CiAgfTsKICBjb25zdCBjb21wYXJlU3Vic3RpdHV0aW9uVmFsdWVzID0gKGEyLCBiKSA9PiB7CiAgICBpZiAoYTIgPT09IHZvaWQgMCkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoYiA9PT0gdm9pZCAwKSB7CiAgICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIGEyLmxvY2FsZUNvbXBhcmUoYik7CiAgfTsKICBjb25zdCBNQVhfTlVNQkVSX09GX0dSSURfQ09MVU1OUyA9IDIwMDsKICBhc3luYyBmdW5jdGlvbiBxdWVyeU92ZXJhbGxNdXRhdGlvbkRhdGEoewogICAgbGFwaXNGaWx0ZXIsCiAgICBzZXF1ZW5jZVR5cGUsCiAgICBsYXBpcywKICAgIGdyYW51bGFyaXR5LAogICAgbGFwaXNEYXRlRmllbGQsCiAgICBzaWduYWwKICB9KSB7CiAgICBjb25zdCBhbGxEYXRlcyA9IGF3YWl0IGdldERhdGVzSW5EYXRhc2V0KGxhcGlzRmlsdGVyLCBsYXBpcywgZ3JhbnVsYXJpdHksIGxhcGlzRGF0ZUZpZWxkLCBzaWduYWwpOwogICAgY29uc3QgZmlsdGVyID0gewogICAgICAuLi5sYXBpc0ZpbHRlciwKICAgICAgW2Ake2xhcGlzRGF0ZUZpZWxkfUZyb21gXTogYWxsRGF0ZXNbMF0uZmlyc3REYXkudG9TdHJpbmcoKSwKICAgICAgW2Ake2xhcGlzRGF0ZUZpZWxkfVRvYF06IGFsbERhdGVzW2FsbERhdGVzLmxlbmd0aCAtIDFdLmxhc3REYXkudG9TdHJpbmcoKQogICAgfTsKICAgIHJldHVybiBmZXRjaEFuZFByZXBhcmVTdWJzdGl0dXRpb25zT3JEZWxldGlvbnMoZmlsdGVyLCBzZXF1ZW5jZVR5cGUpLmV2YWx1YXRlKGxhcGlzLCBzaWduYWwpOwogIH0KICBhc3luYyBmdW5jdGlvbiBxdWVyeU11dGF0aW9uc092ZXJUaW1lRGF0YSh7CiAgICBsYXBpc0ZpbHRlciwKICAgIHNlcXVlbmNlVHlwZSwKICAgIGxhcGlzLAogICAgbGFwaXNEYXRlRmllbGQsCiAgICBncmFudWxhcml0eSwKICAgIHNpZ25hbAogIH0pIHsKICAgIGNvbnN0IGFsbERhdGVzID0gYXdhaXQgZ2V0RGF0ZXNJbkRhdGFzZXQobGFwaXNGaWx0ZXIsIGxhcGlzLCBncmFudWxhcml0eSwgbGFwaXNEYXRlRmllbGQsIHNpZ25hbCk7CiAgICBpZiAoYWxsRGF0ZXMubGVuZ3RoID4gTUFYX05VTUJFUl9PRl9HUklEX0NPTFVNTlMpIHsKICAgICAgdGhyb3cgbmV3IFVzZXJGYWNpbmdFcnJvcigKICAgICAgICAiVG9vIG1hbnkgZGF0ZXMiLAogICAgICAgIGBUaGUgZGF0YXNldCB3b3VsZCBjb250YWluICR7YWxsRGF0ZXMubGVuZ3RofSBkYXRlIGludGVydmFscy4gUGxlYXNlIHJlZHVjZSB0aGUgbnVtYmVyIHRvIGJlbG93ICR7TUFYX05VTUJFUl9PRl9HUklEX0NPTFVNTlN9IHRvIGRpc3BsYXkgdGhlIGRhdGEuIFlvdSBjYW4gYWNoaWV2ZSB0aGlzIGJ5IGVpdGhlciBuYXJyb3dpbmcgdGhlIGRhdGUgcmFuZ2UgaW4gdGhlIHByb3ZpZGVkIExBUElTIGZpbHRlciBvciBieSBzZWxlY3RpbmcgYSBsYXJnZXIgZ3JhbnVsYXJpdHkuYAogICAgICApOwogICAgfQogICAgY29uc3Qgc3ViUXVlcmllcyA9IGFsbERhdGVzLm1hcChhc3luYyAoZGF0ZSkgPT4gewogICAgICBjb25zdCBkYXRlRnJvbSA9IGRhdGUuZmlyc3REYXkudG9TdHJpbmcoKTsKICAgICAgY29uc3QgZGF0ZVRvID0gZGF0ZS5sYXN0RGF5LnRvU3RyaW5nKCk7CiAgICAgIGNvbnN0IGZpbHRlciA9IHsKICAgICAgICAuLi5sYXBpc0ZpbHRlciwKICAgICAgICBbYCR7bGFwaXNEYXRlRmllbGR9RnJvbWBdOiBkYXRlRnJvbSwKICAgICAgICBbYCR7bGFwaXNEYXRlRmllbGR9VG9gXTogZGF0ZVRvCiAgICAgIH07CiAgICAgIGNvbnN0IGRhdGEyID0gYXdhaXQgZmV0Y2hBbmRQcmVwYXJlU3Vic3RpdHV0aW9uc09yRGVsZXRpb25zKGZpbHRlciwgc2VxdWVuY2VUeXBlKS5ldmFsdWF0ZShsYXBpcywgc2lnbmFsKTsKICAgICAgY29uc3QgdG90YWxDb3VudFF1ZXJ5ID0gYXdhaXQgZ2V0VG90YWxOdW1iZXJPZlNlcXVlbmNlc0luRGF0ZVJhbmdlKGZpbHRlcikuZXZhbHVhdGUobGFwaXMsIHNpZ25hbCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0ZSwKICAgICAgICBtdXRhdGlvbnM6IGRhdGEyLmNvbnRlbnQsCiAgICAgICAgdG90YWxDb3VudDogdG90YWxDb3VudFF1ZXJ5LmNvbnRlbnRbMF0uY291bnQKICAgICAgfTsKICAgIH0pOwogICAgY29uc3QgZGF0YSA9IGF3YWl0IFByb21pc2UuYWxsKHN1YlF1ZXJpZXMpOwogICAgY29uc3Qgb3ZlcmFsbE11dGF0aW9uc0RhdGEgPSAoYXdhaXQgcXVlcnlPdmVyYWxsTXV0YXRpb25EYXRhKHsKICAgICAgbGFwaXNGaWx0ZXIsCiAgICAgIHNlcXVlbmNlVHlwZSwKICAgICAgbGFwaXMsCiAgICAgIGxhcGlzRGF0ZUZpZWxkLAogICAgICBncmFudWxhcml0eQogICAgfSkpLmNvbnRlbnQ7CiAgICByZXR1cm4gewogICAgICBtdXRhdGlvbk92ZXJUaW1lRGF0YTogZ3JvdXBCeU11dGF0aW9uKGRhdGEsIG92ZXJhbGxNdXRhdGlvbnNEYXRhKSwKICAgICAgb3ZlcmFsbE11dGF0aW9uRGF0YTogb3ZlcmFsbE11dGF0aW9uc0RhdGEKICAgIH07CiAgfQogIGFzeW5jIGZ1bmN0aW9uIGdldERhdGVzSW5EYXRhc2V0KGxhcGlzRmlsdGVyLCBsYXBpcywgZ3JhbnVsYXJpdHksIGxhcGlzRGF0ZUZpZWxkLCBzaWduYWwpIHsKICAgIGNvbnN0IHsgY29udGVudDogYXZhaWxhYmxlRGF0ZXMgfSA9IGF3YWl0IHF1ZXJ5QXZhaWxhYmxlRGF0ZXMoCiAgICAgIGxhcGlzRmlsdGVyLAogICAgICBsYXBpcywKICAgICAgZ3JhbnVsYXJpdHksCiAgICAgIGxhcGlzRGF0ZUZpZWxkLAogICAgICBzaWduYWwKICAgICk7CiAgICBjb25zdCB7IGRhdGVGcm9tLCBkYXRlVG8gfSA9IGdldERhdGVSYW5nZUZyb21GaWx0ZXIobGFwaXNGaWx0ZXIsIGxhcGlzRGF0ZUZpZWxkLCBncmFudWxhcml0eSk7CiAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSBnZXRNaW5NYXhUZW1wb3JhbChhdmFpbGFibGVEYXRlcyk7CiAgICByZXR1cm4gZ2VuZXJhdGVBbGxJblJhbmdlKGRhdGVGcm9tID8/IG1pbiwgZGF0ZVRvID8/IG1heCk7CiAgfQogIGZ1bmN0aW9uIGdldERhdGVSYW5nZUZyb21GaWx0ZXIobGFwaXNGaWx0ZXIsIGxhcGlzRGF0ZUZpZWxkLCBncmFudWxhcml0eSkgewogICAgY29uc3QgdmFsdWVGcm9tRmlsdGVyID0gbGFwaXNGaWx0ZXJbbGFwaXNEYXRlRmllbGRdOwogICAgaWYgKHZhbHVlRnJvbUZpbHRlcikgewogICAgICByZXR1cm4gewogICAgICAgIGRhdGVGcm9tOiBwYXJzZURhdGVTdHJpbmdUb1RlbXBvcmFsKHZhbHVlRnJvbUZpbHRlciwgZ3JhbnVsYXJpdHkpLAogICAgICAgIGRhdGVUbzogcGFyc2VEYXRlU3RyaW5nVG9UZW1wb3JhbCh2YWx1ZUZyb21GaWx0ZXIsIGdyYW51bGFyaXR5KQogICAgICB9OwogICAgfQogICAgY29uc3QgbWluRnJvbUZpbHRlciA9IGxhcGlzRmlsdGVyW2Ake2xhcGlzRGF0ZUZpZWxkfUZyb21gXTsKICAgIGNvbnN0IG1heEZyb21GaWx0ZXIgPSBsYXBpc0ZpbHRlcltgJHtsYXBpc0RhdGVGaWVsZH1Ub2BdOwogICAgcmV0dXJuIHsKICAgICAgZGF0ZUZyb206IG1pbkZyb21GaWx0ZXIgPyBwYXJzZURhdGVTdHJpbmdUb1RlbXBvcmFsKG1pbkZyb21GaWx0ZXIsIGdyYW51bGFyaXR5KSA6IG51bGwsCiAgICAgIGRhdGVUbzogbWF4RnJvbUZpbHRlciA/IHBhcnNlRGF0ZVN0cmluZ1RvVGVtcG9yYWwobWF4RnJvbUZpbHRlciwgZ3JhbnVsYXJpdHkpIDogbnVsbAogICAgfTsKICB9CiAgZnVuY3Rpb24gcXVlcnlBdmFpbGFibGVEYXRlcyhsYXBpc0ZpbHRlciwgbGFwaXMsIGdyYW51bGFyaXR5LCBsYXBpc0RhdGVGaWVsZCwgc2lnbmFsKSB7CiAgICByZXR1cm4gZmV0Y2hBbmRQcmVwYXJlRGF0ZXMobGFwaXNGaWx0ZXIsIGdyYW51bGFyaXR5LCBsYXBpc0RhdGVGaWVsZCkuZXZhbHVhdGUobGFwaXMsIHNpZ25hbCk7CiAgfQogIGZ1bmN0aW9uIGZldGNoQW5kUHJlcGFyZURhdGVzKGZpbHRlciwgZ3JhbnVsYXJpdHksIGxhcGlzRGF0ZUZpZWxkKSB7CiAgICBjb25zdCBmZXRjaERhdGEgPSBuZXcgRmV0Y2hBZ2dyZWdhdGVkT3BlcmF0b3IoZmlsdGVyLCBbbGFwaXNEYXRlRmllbGRdKTsKICAgIGNvbnN0IGRhdGFXaXRoRml4ZWREYXRlS2V5ID0gbmV3IFJlbmFtZUZpZWxkT3BlcmF0b3IoZmV0Y2hEYXRhLCBsYXBpc0RhdGVGaWVsZCwgImRhdGUiKTsKICAgIGNvbnN0IG1hcERhdGEgPSBuZXcgTWFwT3BlcmF0b3IoZGF0YVdpdGhGaXhlZERhdGVLZXksIChkYXRhKSA9PiBtYXBEYXRlVG9HcmFudWxhcml0eVJhbmdlKGRhdGEsIGdyYW51bGFyaXR5KSk7CiAgICBjb25zdCBncm91cEJ5RGF0YSA9IG5ldyBHcm91cEJ5QW5kU3VtT3BlcmF0b3IobWFwRGF0YSwgImRhdGVSYW5nZSIsICJjb3VudCIpOwogICAgY29uc3Qgc29ydERhdGEgPSBuZXcgU29ydE9wZXJhdG9yKGdyb3VwQnlEYXRhLCBkYXRlUmFuZ2VDb21wYXJlKTsKICAgIHJldHVybiBuZXcgTWFwT3BlcmF0b3Ioc29ydERhdGEsIChkYXRhKSA9PiBkYXRhLmRhdGVSYW5nZSk7CiAgfQogIGZ1bmN0aW9uIGZldGNoQW5kUHJlcGFyZVN1YnN0aXR1dGlvbnNPckRlbGV0aW9ucyhmaWx0ZXIsIHNlcXVlbmNlVHlwZSkgewogICAgcmV0dXJuIG5ldyBGZXRjaFN1YnN0aXR1dGlvbnNPckRlbGV0aW9uc09wZXJhdG9yKGZpbHRlciwgc2VxdWVuY2VUeXBlLCAxZS0zKTsKICB9CiAgZnVuY3Rpb24gc2VyaWFsaXplU3Vic3RpdHV0aW9uT3JEZWxldGlvbihtdXRhdGlvbikgewogICAgcmV0dXJuIG11dGF0aW9uLmNvZGU7CiAgfQogIGZ1bmN0aW9uIHNlcmlhbGl6ZVRlbXBvcmFsKGRhdGUpIHsKICAgIHJldHVybiBkYXRlLmRhdGVTdHJpbmc7CiAgfQogIGZ1bmN0aW9uIGdyb3VwQnlNdXRhdGlvbihkYXRhLCBvdmVyYWxsTXV0YXRpb25EYXRhKSB7CiAgICBjb25zdCBkYXRhQXJyYXkgPSBuZXcgQmFzZU11dGF0aW9uT3ZlclRpbWVEYXRhTWFwKCk7CiAgICBjb25zdCBhbGxEYXRlcyA9IGRhdGEubWFwKChtdXRhdGlvbkRhdGEpID0+IG11dGF0aW9uRGF0YS5kYXRlKTsKICAgIGNvbnN0IHNvcnRlZE92ZXJhbGxNdXRhdGlvbkRhdGEgPSBvdmVyYWxsTXV0YXRpb25EYXRhLnNvcnQoKGEyLCBiKSA9PiBzb3J0U3Vic3RpdHV0aW9uc0FuZERlbGV0aW9ucyhhMi5tdXRhdGlvbiwgYi5tdXRhdGlvbikpLm1hcCgoZW50cnkpID0+IHsKICAgICAgcmV0dXJuIHRvU3Vic3RpdHV0aW9uT3JEZWxldGlvbihlbnRyeS5tdXRhdGlvbik7CiAgICB9KTsKICAgIGNvbnN0IHNvcnRlZERhdGVzID0gYWxsRGF0ZXMuc29ydCgoYTIsIGIpID0+IGNvbXBhcmVUZW1wb3JhbChhMiwgYikpLm1hcCgoZGF0ZSkgPT4gdG9UZW1wb3JhbChkYXRlKSk7CiAgICBzb3J0ZWRPdmVyYWxsTXV0YXRpb25EYXRhLmZvckVhY2goKG11dGF0aW9uRGF0YSkgPT4gewogICAgICBzb3J0ZWREYXRlcy5mb3JFYWNoKChkYXRlKSA9PiB7CiAgICAgICAgZGF0YUFycmF5LnNldChtdXRhdGlvbkRhdGEsIGRhdGUsIHsKICAgICAgICAgIGNvdW50OiAwLAogICAgICAgICAgcHJvcG9ydGlvbjogMCwKICAgICAgICAgIHRvdGFsQ291bnQ6IDAKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICAgIGRhdGEuZm9yRWFjaCgobXV0YXRpb25EYXRhKSA9PiB7CiAgICAgIG11dGF0aW9uRGF0YS5tdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb25FbnRyeSkgPT4gewogICAgICAgIGNvbnN0IG11dGF0aW9uID0gdG9TdWJzdGl0dXRpb25PckRlbGV0aW9uKG11dGF0aW9uRW50cnkubXV0YXRpb24pOwogICAgICAgIGNvbnN0IGRhdGUgPSB0b1RlbXBvcmFsKG11dGF0aW9uRGF0YS5kYXRlKTsKICAgICAgICBpZiAoZGF0YUFycmF5LmdldChtdXRhdGlvbiwgZGF0ZSkgIT09IHZvaWQgMCkgewogICAgICAgICAgZGF0YUFycmF5LnNldChtdXRhdGlvbiwgZGF0ZSwgewogICAgICAgICAgICBjb3VudDogbXV0YXRpb25FbnRyeS5jb3VudCwKICAgICAgICAgICAgcHJvcG9ydGlvbjogbXV0YXRpb25FbnRyeS5wcm9wb3J0aW9uLAogICAgICAgICAgICB0b3RhbENvdW50OiBtdXRhdGlvbkRhdGEudG90YWxDb3VudAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIGRhdGFBcnJheTsKICB9CiAgZnVuY3Rpb24gZ2V0VG90YWxOdW1iZXJPZlNlcXVlbmNlc0luRGF0ZVJhbmdlKGZpbHRlcikgewogICAgcmV0dXJuIG5ldyBGZXRjaEFnZ3JlZ2F0ZWRPcGVyYXRvcihmaWx0ZXIpOwogIH0KICBhc3luYyBmdW5jdGlvbiB3b3JrZXJGdW5jdGlvbihxdWVyeUZ1bmN0aW9uKSB7CiAgICB0cnkgewogICAgICBwb3N0TWVzc2FnZSh7IHN0YXR1czogImxvYWRpbmciIH0pOwogICAgICBjb25zdCB3b3JrZXJSZXNwb25zZSA9IGF3YWl0IHF1ZXJ5RnVuY3Rpb24oKTsKICAgICAgcG9zdE1lc3NhZ2UoewogICAgICAgIHN0YXR1czogInN1Y2Nlc3MiLAogICAgICAgIGRhdGE6IHdvcmtlclJlc3BvbnNlCiAgICAgIH0pOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgcG9zdE1lc3NhZ2UoeyBzdGF0dXM6ICJlcnJvciIsIGVycm9yIH0pOwogICAgfQogIH0KICBhc3luYyBmdW5jdGlvbiBnZXRNdXRhdGlvbk92ZXJUaW1lV29ya2VyRnVuY3Rpb24oZXZlbnQpIHsKICAgIGNvbnN0IG11dGF0aW9uT3ZlclRpbWVEYXRhID0gYXdhaXQgcXVlcnlNdXRhdGlvbnNPdmVyVGltZURhdGEoZXZlbnQuZGF0YSk7CiAgICBjb25zdCB3b3JrZXJSZXNwb25zZSA9IHsKICAgICAgb3ZlcmFsbE11dGF0aW9uRGF0YTogbXV0YXRpb25PdmVyVGltZURhdGEub3ZlcmFsbE11dGF0aW9uRGF0YSwKICAgICAgbXV0YXRpb25PdmVyVGltZVNlcmlhbGl6ZWQ6IG11dGF0aW9uT3ZlclRpbWVEYXRhLm11dGF0aW9uT3ZlclRpbWVEYXRhLmdldENvbnRlbnRzKCkKICAgIH07CiAgICByZXR1cm4gd29ya2VyUmVzcG9uc2U7CiAgfQogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgZnVuY3Rpb24oZXZlbnQpIHsKICAgIGF3YWl0IHdvcmtlckZ1bmN0aW9uKCgpID0+IGdldE11dGF0aW9uT3ZlclRpbWVXb3JrZXJGdW5jdGlvbihldmVudCkpOwogIH07Cn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPW11dGF0aW9uT3ZlclRpbWVXb3JrZXItQk9DWHRLemQuanMubWFwCg==", jV = (n) => Uint8Array.from(atob(n), (e) => e.charCodeAt(0)), eC = typeof self < "u" && self.Blob && new Blob([jV(Ip)], { type: "text/javascript;charset=utf-8" });
28636
28648
  function EV(n) {
28637
28649
  let e;
@@ -28936,7 +28948,7 @@ const g1 = ({ value: n, mutation: e, date: t, tooltipPosition: i, showProportion
28936
28948
  children: o ? Vt(n.proportion, 0) : void 0
28937
28949
  }
28938
28950
  ) }) });
28939
- }, c1 = (n) => n instanceof rn ? n.toString() : `${n.firstDay.toString()} - ${n.lastDay.toString()}`, d1 = ({ mutation: n }) => /* @__PURE__ */ h("div", { className: "text-center", children: n.code }), I1 = ({
28951
+ }, c1 = (n) => n instanceof ln ? n.toString() : `${n.firstDay.toString()} - ${n.lastDay.toString()}`, d1 = ({ mutation: n }) => /* @__PURE__ */ h("div", { className: "text-center", children: n.code }), I1 = ({
28940
28952
  colorScale: n,
28941
28953
  setColorScale: e
28942
28954
  }) => /* @__PURE__ */ h("div", { className: "w-20", children: /* @__PURE__ */ h(Jc, { buttonTitle: "Color scale", placement: "bottom-start", children: /* @__PURE__ */ h(e1, { colorScale: n, setColorScale: e }) }) });
@@ -28961,13 +28973,13 @@ function u1(n, e) {
28961
28973
  s(new Error(`Worker received a message that it cannot deserialize: ${l.data}`)), r(!1);
28962
28974
  }, () => {
28963
28975
  e.terminate();
28964
- }), []), an(() => {
28976
+ }), []), rn(() => {
28965
28977
  e.postMessage(n);
28966
28978
  }, [n]), { data: t, error: o, isLoading: a };
28967
28979
  }
28968
28980
  const C1 = (n) => {
28969
28981
  const { width: e, height: t } = n, i = { height: t, width: e };
28970
- return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Jt, { size: i, children: /* @__PURE__ */ h(h1, { ...n }) }) });
28982
+ return /* @__PURE__ */ h(xt, { size: i, children: /* @__PURE__ */ h(Dt, { size: i, children: /* @__PURE__ */ h(h1, { ...n }) }) });
28971
28983
  }, h1 = (n) => {
28972
28984
  const e = Se(De), { lapisFilter: t, sequenceType: i, granularity: o, lapisDateField: s } = n, { data: a, error: r, isLoading: l } = u1(
28973
28985
  {
@@ -28980,11 +28992,11 @@ const C1 = (n) => {
28980
28992
  new EV()
28981
28993
  );
28982
28994
  if (l)
28983
- return /* @__PURE__ */ h(Dt, {});
28995
+ return /* @__PURE__ */ h(Ot, {});
28984
28996
  if (r !== void 0)
28985
- return /* @__PURE__ */ h(Tt, { error: r });
28997
+ return /* @__PURE__ */ h(Jt, { error: r });
28986
28998
  if (a == null)
28987
- return /* @__PURE__ */ h(Sn, {});
28999
+ return /* @__PURE__ */ h(kt, {});
28988
29000
  const { overallMutationData: g, mutationOverTimeSerialized: c } = a, d = new $V(c);
28989
29001
  return /* @__PURE__ */ h(
28990
29002
  A1,
@@ -29002,7 +29014,7 @@ const C1 = (n) => {
29002
29014
  const [i, o] = oe({ min: 0.05, max: 0.9 }), [s, a] = oe({ min: 0, max: 1, color: "indigo" }), [r, l] = Ec(e.sequenceType), [g, c] = oe([
29003
29015
  { label: "Substitutions", checked: !0, type: "substitution" },
29004
29016
  { label: "Deletions", checked: !0, type: "deletion" }
29005
- ]), d = an(() => qV(
29017
+ ]), d = rn(() => qV(
29006
29018
  n,
29007
29019
  t,
29008
29020
  r,
@@ -29012,7 +29024,7 @@ const C1 = (n) => {
29012
29024
  if (d === void 0)
29013
29025
  return {
29014
29026
  title: "Calculating",
29015
- content: /* @__PURE__ */ h(Dt, {})
29027
+ content: /* @__PURE__ */ h(Ot, {})
29016
29028
  };
29017
29029
  switch (A) {
29018
29030
  case "grid":
@@ -29106,7 +29118,7 @@ var b1 = Object.defineProperty, y1 = Object.getOwnPropertyDescriptor, pi = (n, e
29106
29118
  (a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
29107
29119
  return i && o && b1(e, t, o), o;
29108
29120
  };
29109
- let kn = class extends es {
29121
+ let Hn = class extends es {
29110
29122
  constructor() {
29111
29123
  super(...arguments), this.lapisFilter = {}, this.sequenceType = "nucleotide", this.views = ["grid"], this.width = "100%", this.height = "700px", this.granularity = "week", this.lapisDateField = "date";
29112
29124
  }
@@ -29127,28 +29139,28 @@ let kn = class extends es {
29127
29139
  };
29128
29140
  pi([
29129
29141
  Y({ type: Object })
29130
- ], kn.prototype, "lapisFilter", 2);
29142
+ ], Hn.prototype, "lapisFilter", 2);
29131
29143
  pi([
29132
29144
  Y({ type: String })
29133
- ], kn.prototype, "sequenceType", 2);
29145
+ ], Hn.prototype, "sequenceType", 2);
29134
29146
  pi([
29135
29147
  Y({ type: Array })
29136
- ], kn.prototype, "views", 2);
29148
+ ], Hn.prototype, "views", 2);
29137
29149
  pi([
29138
29150
  Y({ type: String })
29139
- ], kn.prototype, "width", 2);
29151
+ ], Hn.prototype, "width", 2);
29140
29152
  pi([
29141
29153
  Y({ type: String })
29142
- ], kn.prototype, "height", 2);
29154
+ ], Hn.prototype, "height", 2);
29143
29155
  pi([
29144
29156
  Y({ type: String })
29145
- ], kn.prototype, "granularity", 2);
29157
+ ], Hn.prototype, "granularity", 2);
29146
29158
  pi([
29147
29159
  Y({ type: String })
29148
- ], kn.prototype, "lapisDateField", 2);
29149
- kn = pi([
29160
+ ], Hn.prototype, "lapisDateField", 2);
29161
+ Hn = pi([
29150
29162
  Zt("gs-mutations-over-time")
29151
- ], kn);
29163
+ ], Hn);
29152
29164
  const Cp = (n) => n.map((e) => ({ label: e.label, value: e.label })), hp = (n, e, t) => {
29153
29165
  const i = /* @__PURE__ */ new Date(), o = { dateFrom: new Date(t), dateTo: i };
29154
29166
  if (n === void 0)
@@ -29313,7 +29325,7 @@ var G1 = Object.defineProperty, B1 = Object.getOwnPropertyDescriptor, fi = (n, e
29313
29325
  (a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
29314
29326
  return i && o && G1(e, t, o), o;
29315
29327
  };
29316
- let Hn = class extends un {
29328
+ let Sn = class extends Cn {
29317
29329
  constructor() {
29318
29330
  super(...arguments), this.dateRangeOptions = [], this.earliestDate = "1900-01-01", this.initialValue = void 0, this.initialDateFrom = "", this.initialDateTo = "", this.width = "100%", this.dateColumn = "date";
29319
29331
  }
@@ -29334,28 +29346,28 @@ let Hn = class extends un {
29334
29346
  };
29335
29347
  fi([
29336
29348
  Y({ type: Array })
29337
- ], Hn.prototype, "dateRangeOptions", 2);
29349
+ ], Sn.prototype, "dateRangeOptions", 2);
29338
29350
  fi([
29339
29351
  Y({ type: String })
29340
- ], Hn.prototype, "earliestDate", 2);
29352
+ ], Sn.prototype, "earliestDate", 2);
29341
29353
  fi([
29342
29354
  Y()
29343
- ], Hn.prototype, "initialValue", 2);
29355
+ ], Sn.prototype, "initialValue", 2);
29344
29356
  fi([
29345
29357
  Y()
29346
- ], Hn.prototype, "initialDateFrom", 2);
29358
+ ], Sn.prototype, "initialDateFrom", 2);
29347
29359
  fi([
29348
29360
  Y()
29349
- ], Hn.prototype, "initialDateTo", 2);
29361
+ ], Sn.prototype, "initialDateTo", 2);
29350
29362
  fi([
29351
29363
  Y({ type: String })
29352
- ], Hn.prototype, "width", 2);
29364
+ ], Sn.prototype, "width", 2);
29353
29365
  fi([
29354
29366
  Y({ type: String })
29355
- ], Hn.prototype, "dateColumn", 2);
29356
- Hn = fi([
29367
+ ], Sn.prototype, "dateColumn", 2);
29368
+ Sn = fi([
29357
29369
  Zt("gs-date-range-selector")
29358
- ], Hn);
29370
+ ], Sn);
29359
29371
  async function W1(n, e, t) {
29360
29372
  const i = Array(n.length - 1).fill(0).map((r, l) => l + 1).map((r) => n.slice(r).reduce((l, g) => ({ ...l, [g]: null }), {}));
29361
29373
  return [...(await new eo({}, n).evaluate(e, t)).content.map((r) => n.reduce((l, g) => ({ ...l, [g]: r[g] }), {})).reduce((r, l) => (r.add(JSON.stringify(l)), i.forEach((g) => {
@@ -29374,10 +29386,10 @@ function V1(n) {
29374
29386
  }
29375
29387
  const X1 = ({ width: n, ...e }) => {
29376
29388
  const t = { width: n, height: "3rem" };
29377
- return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(Jt, { size: t, children: /* @__PURE__ */ h(R1, { ...e }) }) });
29389
+ return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(Dt, { size: t, children: /* @__PURE__ */ h(R1, { ...e }) }) });
29378
29390
  }, R1 = ({ initialValue: n, fields: e, placeholderText: t }) => {
29379
29391
  const i = Se(De), [o, s] = oe(n ?? ""), [a, r] = oe(!1), l = Ke(null), { data: g, error: c, isLoading: d } = Yn(() => W1(e, i), [e, i]);
29380
- return d ? /* @__PURE__ */ h(Dt, {}) : c ? /* @__PURE__ */ h(Tt, { error: c }) : /* @__PURE__ */ h("div", { class: "flex w-full", ref: l, children: [
29392
+ return d ? /* @__PURE__ */ h(Ot, {}) : c ? /* @__PURE__ */ h(Jt, { error: c }) : /* @__PURE__ */ h("div", { class: "flex w-full", ref: l, children: [
29381
29393
  /* @__PURE__ */ h(
29382
29394
  "input",
29383
29395
  {
@@ -29418,7 +29430,7 @@ var S1 = Object.defineProperty, Y1 = Object.getOwnPropertyDescriptor, pa = (n, e
29418
29430
  (a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
29419
29431
  return i && o && S1(e, t, o), o;
29420
29432
  };
29421
- let Jo = class extends un {
29433
+ let Jo = class extends Cn {
29422
29434
  constructor() {
29423
29435
  super(...arguments), this.initialValue = "", this.fields = [], this.width = "100%", this.placeholderText = "";
29424
29436
  }
@@ -29454,15 +29466,15 @@ async function N1(n, e, t) {
29454
29466
  }
29455
29467
  const F1 = ({ width: n, ...e }) => {
29456
29468
  const t = { width: n, height: "3rem" };
29457
- return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(Jt, { size: t, children: /* @__PURE__ */ h(K1, { ...e }) }) });
29469
+ return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(Dt, { size: t, children: /* @__PURE__ */ h(K1, { ...e }) }) });
29458
29470
  }, K1 = ({ lapisField: n, placeholderText: e, initialValue: t }) => {
29459
29471
  const i = Se(De), o = Ke(null), { data: s, error: a, isLoading: r } = Yn(() => N1(i, n), [n, i]);
29460
29472
  if (r)
29461
- return /* @__PURE__ */ h(Dt, {});
29473
+ return /* @__PURE__ */ h(Ot, {});
29462
29474
  if (a !== null)
29463
- return /* @__PURE__ */ h(Tt, { error: a });
29475
+ return /* @__PURE__ */ h(Jt, { error: a });
29464
29476
  if (s === null)
29465
- return /* @__PURE__ */ h(Sn, {});
29477
+ return /* @__PURE__ */ h(kt, {});
29466
29478
  const l = () => {
29467
29479
  var c, d, I;
29468
29480
  const u = ((c = o.current) == null ? void 0 : c.value) === "" || (d = o.current) == null ? void 0 : d.value;
@@ -29495,7 +29507,7 @@ var _1 = Object.defineProperty, z1 = Object.getOwnPropertyDescriptor, fa = (n, e
29495
29507
  (a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
29496
29508
  return i && o && _1(e, t, o), o;
29497
29509
  };
29498
- let Do = class extends un {
29510
+ let Do = class extends Cn {
29499
29511
  constructor() {
29500
29512
  super(...arguments), this.initialValue = "", this.lapisField = "", this.placeholderText = "", this.width = "100%";
29501
29513
  }
@@ -29538,9 +29550,9 @@ const T1 = () => {
29538
29550
  return /* @__PURE__ */ h(hi, { children: [
29539
29551
  /* @__PURE__ */ h(Ai, { children: " Mutation Filter" }),
29540
29552
  /* @__PURE__ */ h(Ce, { children: "This component allows you to filter for mutations at specific positions." }),
29541
- /* @__PURE__ */ h(Pt, { children: " Nucleotide Mutations and Insertions" }),
29553
+ /* @__PURE__ */ h(Ut, { children: " Nucleotide Mutations and Insertions" }),
29542
29554
  xA(n) ? /* @__PURE__ */ h(J1, {}) : /* @__PURE__ */ h(D1, {}),
29543
- /* @__PURE__ */ h(Pt, { children: "Amino Acid Mutations and Insertions" }),
29555
+ /* @__PURE__ */ h(Ut, { children: "Amino Acid Mutations and Insertions" }),
29544
29556
  /* @__PURE__ */ h(Ce, { children: [
29545
29557
  "An amino acid mutation has the format ",
29546
29558
  /* @__PURE__ */ h("b", { children: "<gene>:<position><base>" }),
@@ -29575,7 +29587,7 @@ const T1 = () => {
29575
29587
  n.genes.map((t) => t.name).join(", "),
29576
29588
  "."
29577
29589
  ] }),
29578
- /* @__PURE__ */ h(Pt, { children: "Insertion Wildcards" }),
29590
+ /* @__PURE__ */ h(Ut, { children: "Insertion Wildcards" }),
29579
29591
  /* @__PURE__ */ h(Ce, { children: [
29580
29592
  "This component supports insertion queries that contain wildcards ",
29581
29593
  /* @__PURE__ */ h("b", { children: "?" }),
@@ -29610,9 +29622,9 @@ const T1 = () => {
29610
29622
  ] }),
29611
29623
  " match any (but at least one) insertion between the positions 214 and 215."
29612
29624
  ] }),
29613
- /* @__PURE__ */ h(Pt, { children: "Multiple Mutations" }),
29625
+ /* @__PURE__ */ h(Ut, { children: "Multiple Mutations" }),
29614
29626
  /* @__PURE__ */ h(Ce, { children: "Multiple mutation filters can be provided by adding one mutation after the other." }),
29615
- /* @__PURE__ */ h(Pt, { children: "Any Mutation" }),
29627
+ /* @__PURE__ */ h(Ut, { children: "Any Mutation" }),
29616
29628
  /* @__PURE__ */ h(Ce, { children: [
29617
29629
  "To filter for any mutation at a given position you can omit the ",
29618
29630
  /* @__PURE__ */ h("b", { children: "<base>" }),
@@ -29624,7 +29636,7 @@ const T1 = () => {
29624
29636
  ] }),
29625
29637
  "."
29626
29638
  ] }),
29627
- /* @__PURE__ */ h(Pt, { children: "No Mutation" }),
29639
+ /* @__PURE__ */ h(Ut, { children: "No Mutation" }),
29628
29640
  /* @__PURE__ */ h(Ce, { children: [
29629
29641
  "You can write a ",
29630
29642
  /* @__PURE__ */ h("b", { children: "." }),
@@ -29991,7 +30003,7 @@ var tX = Object.defineProperty, nX = Object.getOwnPropertyDescriptor, nd = (n, e
29991
30003
  (a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
29992
30004
  return i && o && tX(e, t, o), o;
29993
30005
  };
29994
- let Kr = class extends un {
30006
+ let Kr = class extends Cn {
29995
30007
  constructor() {
29996
30008
  super(...arguments), this.initialValue = void 0, this.width = "100%";
29997
30009
  }
@@ -30013,7 +30025,7 @@ async function iX(n, e, t) {
30013
30025
  }
30014
30026
  const oX = ({ width: n, ...e }) => {
30015
30027
  const t = { width: n, height: "3rem" };
30016
- return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(Jt, { size: t, children: /* @__PURE__ */ h(sX, { ...e }) }) });
30028
+ return /* @__PURE__ */ h(xt, { size: t, children: /* @__PURE__ */ h(Dt, { size: t, children: /* @__PURE__ */ h(sX, { ...e }) }) });
30017
30029
  }, sX = ({
30018
30030
  lapisField: n,
30019
30031
  placeholderText: e,
@@ -30024,11 +30036,11 @@ const oX = ({ width: n, ...e }) => {
30024
30036
  [n, i]
30025
30037
  );
30026
30038
  if (r)
30027
- return /* @__PURE__ */ h(Dt, {});
30039
+ return /* @__PURE__ */ h(Ot, {});
30028
30040
  if (a !== null)
30029
- return /* @__PURE__ */ h(Tt, { error: a });
30041
+ return /* @__PURE__ */ h(Jt, { error: a });
30030
30042
  if (s === null)
30031
- return /* @__PURE__ */ h(Sn, {});
30043
+ return /* @__PURE__ */ h(kt, {});
30032
30044
  const l = () => {
30033
30045
  var c, d, I;
30034
30046
  const u = ((c = o.current) == null ? void 0 : c.value) === "" || (d = o.current) == null ? void 0 : d.value;
@@ -30061,7 +30073,7 @@ var aX = Object.defineProperty, rX = Object.getOwnPropertyDescriptor, ma = (n, e
30061
30073
  (a = n[s]) && (o = (i ? a(e, t, o) : a(o)) || o);
30062
30074
  return i && o && aX(e, t, o), o;
30063
30075
  };
30064
- let Oo = class extends un {
30076
+ let Oo = class extends Cn {
30065
30077
  constructor() {
30066
30078
  super(...arguments), this.initialValue = "", this.lapisField = "", this.placeholderText = "", this.width = "100%";
30067
30079
  }
@@ -30128,18 +30140,18 @@ const kX = {
30128
30140
  }
30129
30141
  };
30130
30142
  export {
30131
- ln as AggregateComponent,
30143
+ gn as AggregateComponent,
30132
30144
  Sr as App,
30133
- Hn as DateRangeSelectorComponent,
30145
+ Sn as DateRangeSelectorComponent,
30134
30146
  Oo as LineageFilterComponent,
30135
30147
  Jo as LocationFilterComponent,
30136
30148
  gi as MutationComparisonComponent,
30137
30149
  Kr as MutationFilterComponent,
30138
30150
  ci as MutationsComponent,
30139
- kn as MutationsOverTimeComponent,
30140
- gn as NumberSequencesOverTimeComponent,
30151
+ Hn as MutationsOverTimeComponent,
30152
+ cn as NumberSequencesOverTimeComponent,
30141
30153
  ut as PrevalenceOverTimeComponent,
30142
- Lt as RelativeGrowthAdvantageComponent,
30154
+ Tt as RelativeGrowthAdvantageComponent,
30143
30155
  Do as TextInputComponent,
30144
30156
  rr as UserFacingError,
30145
30157
  kX as dateRangeOptionPresets