@launchdarkly/o11y 1.4.0 → 1.5.0

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.
@@ -1,18 +1,18 @@
1
- var _l = Object.defineProperty, $l = Object.defineProperties;
2
- var ql = Object.getOwnPropertyDescriptors;
1
+ var $l = Object.defineProperty, ql = Object.defineProperties;
2
+ var eo = Object.getOwnPropertyDescriptors;
3
3
  var St = Object.getOwnPropertySymbols;
4
4
  var Ps = Object.prototype.hasOwnProperty, Es = Object.prototype.propertyIsEnumerable;
5
5
  var Bs = (e) => {
6
6
  throw TypeError(e);
7
7
  };
8
- var si = (e, t, s) => t in e ? _l(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s, K = (e, t) => {
8
+ var si = (e, t, s) => t in e ? $l(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s, K = (e, t) => {
9
9
  for (var s in t || (t = {}))
10
10
  Ps.call(t, s) && si(e, s, t[s]);
11
11
  if (St)
12
12
  for (var s of St(t))
13
13
  Es.call(t, s) && si(e, s, t[s]);
14
14
  return e;
15
- }, me = (e, t) => $l(e, ql(t));
15
+ }, me = (e, t) => ql(e, eo(t));
16
16
  var st = (e, t) => {
17
17
  var s = {};
18
18
  for (var l in e)
@@ -40,16 +40,16 @@ var fe = (e, t, s) => new Promise((l, c) => {
40
40
  }, b = (m) => m.done ? l(m.value) : Promise.resolve(m.value).then(u, f);
41
41
  b((s = s.apply(e, t)).next());
42
42
  });
43
- import { z as Bn, A as eo, a as Le, S as Ye, d as Be, g as ri, r as _s, G as ni, b as to, c as io, o as so, q as ro, m as $s, e as li, f as rt, F as qs, V as no, P as lo, h as oo, t as ao, H as er, M as co, i as uo, s as ho, L as po, B as mo, C as tr, D as fo, E as bo, p as yo, l as ir, v as Zo, I as go, y as So, J as sr, K as Xo, N as Ro, O as Go, Q as Vo, R as Wo, T as Io, U as wo } from "./common-7gIdCuSo.js";
44
- import { L as Co, s as xo, i as Me, a as Jt } from "./buffer-CwCRPuMA.js";
45
- import { LDRecord as vo } from "./LDRecord.js";
46
- const Lo = {
43
+ import { z as Bn, A as to, a as Le, S as Ye, d as Be, g as ri, r as _s, G as ni, b as io, c as so, o as ro, q as no, m as $s, e as li, f as rt, F as qs, V as lo, P as oo, h as ao, t as co, H as er, M as uo, i as ho, s as po, L as mo, B as fo, C as tr, D as bo, E as yo, p as Zo, l as ir, v as go, I as So, y as Xo, J as sr, K as Ro, N as Go, O as Vo, Q as Wo, R as Io, T as wo, U as Co } from "./common-1QcQF8EE.js";
44
+ import { L as xo, s as vo, i as Me, a as Jt } from "./buffer-CwCRPuMA.js";
45
+ import { LDRecord as Lo } from "./LDRecord.js";
46
+ const ko = {
47
47
  key: "_sid"
48
- }, ko = "rrweb/sequential-id@1", Jo = (e) => {
49
- const t = Lo;
48
+ }, Jo = "rrweb/sequential-id@1", Yo = (e) => {
49
+ const t = ko;
50
50
  let s = 0;
51
51
  return {
52
- name: ko,
52
+ name: Jo,
53
53
  eventProcessor(l) {
54
54
  return Object.assign(l, {
55
55
  [t.key]: ++s
@@ -58,12 +58,12 @@ const Lo = {
58
58
  options: t
59
59
  };
60
60
  };
61
- var Yo = Object.defineProperty, No = (e, t, s) => t in e ? Yo(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s, L = (e, t, s) => No(e, typeof t != "symbol" ? t + "" : t, s), rr, To = Object.defineProperty, Uo = (e, t, s) => t in e ? To(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s, nr = (e, t, s) => Uo(e, typeof t != "symbol" ? t + "" : t, s), pe = /* @__PURE__ */ ((e) => (e[e.Document = 0] = "Document", e[e.DocumentType = 1] = "DocumentType", e[e.Element = 2] = "Element", e[e.Text = 3] = "Text", e[e.CDATA = 4] = "CDATA", e[e.Comment = 5] = "Comment", e))(pe || {});
61
+ var Qn = /* @__PURE__ */ ((e) => (e[e.DomContentLoaded = 0] = "DomContentLoaded", e[e.Load = 1] = "Load", e[e.FullSnapshot = 2] = "FullSnapshot", e[e.IncrementalSnapshot = 3] = "IncrementalSnapshot", e[e.Meta = 4] = "Meta", e[e.Custom = 5] = "Custom", e[e.Plugin = 6] = "Plugin", e[e.Asset = 7] = "Asset", e))(Qn || {}), No = Object.defineProperty, To = (e, t, s) => t in e ? No(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s, L = (e, t, s) => To(e, typeof t != "symbol" ? t + "" : t, s), rr, Uo = Object.defineProperty, Ko = (e, t, s) => t in e ? Uo(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s, nr = (e, t, s) => Ko(e, typeof t != "symbol" ? t + "" : t, s), pe = /* @__PURE__ */ ((e) => (e[e.Document = 0] = "Document", e[e.DocumentType = 1] = "DocumentType", e[e.Element = 2] = "Element", e[e.Text = 3] = "Text", e[e.CDATA = 4] = "CDATA", e[e.Comment = 5] = "Comment", e))(pe || {});
62
62
  const Xt = /* @__PURE__ */ new Map(), lr = /* @__PURE__ */ new WeakSet();
63
63
  function or(e) {
64
64
  return e !== null && typeof e == "object" && "complete" in e && "naturalWidth" in e && "naturalHeight" in e && "src" in e && "onload" in e;
65
65
  }
66
- function Ko(e) {
66
+ function Fo(e) {
67
67
  if (lr.has(e))
68
68
  return;
69
69
  lr.add(e);
@@ -112,7 +112,7 @@ const ar = {
112
112
  ShadowRoot: ["getSelection"],
113
113
  Element: [],
114
114
  MutationObserver: ["constructor"]
115
- }, Rt = {}, Qn = {}, Fo = () => !!globalThis.Zone;
115
+ }, Rt = {}, Dn = {}, Mo = () => !!globalThis.Zone;
116
116
  function Vs(e) {
117
117
  if (Rt[e])
118
118
  return Rt[e];
@@ -129,7 +129,7 @@ function Vs(e) {
129
129
  return typeof s[b] == "function" && ((m = s[b]) == null ? void 0 : m.toString().includes("[native code]"));
130
130
  }
131
131
  ));
132
- if (c && f && !Fo())
132
+ if (c && f && !Mo())
133
133
  return Rt[e] = t.prototype, t.prototype;
134
134
  try {
135
135
  const b = document.createElement("iframe");
@@ -140,7 +140,7 @@ function Vs(e) {
140
140
  if (!h)
141
141
  return b.remove(), s;
142
142
  const d = navigator.userAgent;
143
- return d.includes("Safari") && !d.includes("Chrome") ? (b.classList.add("rr-block"), b.setAttribute("__rrwebUntaintedMutationObserver", ""), Qn[e] = () => b.remove()) : b.remove(), Rt[e] = h;
143
+ return d.includes("Safari") && !d.includes("Chrome") ? (b.classList.add("rr-block"), b.setAttribute("__rrwebUntaintedMutationObserver", ""), Dn[e] = () => b.remove()) : b.remove(), Rt[e] = h;
144
144
  } catch (b) {
145
145
  return s;
146
146
  }
@@ -160,7 +160,7 @@ function Te(e, t, s) {
160
160
  return f ? (oi[c] = f, f.call(t)) : t[s];
161
161
  }
162
162
  const ai = {};
163
- function Dn(e, t, s) {
163
+ function jn(e, t, s) {
164
164
  const l = `${e}.${String(s)}`;
165
165
  if (ai[l])
166
166
  return ai[l].bind(
@@ -169,53 +169,53 @@ function Dn(e, t, s) {
169
169
  const u = Vs(e)[s];
170
170
  return typeof u != "function" ? t[s] : (ai[l] = u, u.bind(t));
171
171
  }
172
- function Mo(e) {
172
+ function zo(e) {
173
173
  return Te("Node", e, "ownerDocument");
174
174
  }
175
- function zo(e) {
175
+ function Ho(e) {
176
176
  return Te("Node", e, "childNodes");
177
177
  }
178
- function Ho(e) {
178
+ function Oo(e) {
179
179
  return Te("Node", e, "parentNode");
180
180
  }
181
- function Oo(e) {
181
+ function Po(e) {
182
182
  return Te("Node", e, "parentElement");
183
183
  }
184
- function Po(e) {
184
+ function Eo(e) {
185
185
  return Te("Node", e, "textContent");
186
186
  }
187
- function Eo(e, t) {
188
- return Dn("Node", e, "contains")(t);
189
- }
190
- function Bo(e) {
191
- return Dn("Node", e, "getRootNode")();
187
+ function Bo(e, t) {
188
+ return jn("Node", e, "contains")(t);
192
189
  }
193
190
  function Qo(e) {
194
- return !e || !("host" in e) ? null : Te("ShadowRoot", e, "host");
191
+ return jn("Node", e, "getRootNode")();
195
192
  }
196
193
  function Do(e) {
197
- return e.styleSheets;
194
+ return !e || !("host" in e) ? null : Te("ShadowRoot", e, "host");
198
195
  }
199
196
  function jo(e) {
197
+ return e.styleSheets;
198
+ }
199
+ function Ao(e) {
200
200
  return !e || !("shadowRoot" in e) ? null : Te("Element", e, "shadowRoot");
201
201
  }
202
- function Ao(e, t) {
202
+ function _o(e, t) {
203
203
  return Te("Element", e, "querySelector")(t);
204
204
  }
205
- function _o(e, t) {
205
+ function $o(e, t) {
206
206
  return Te("Element", e, "querySelectorAll")(t);
207
207
  }
208
- function $o() {
208
+ function qo() {
209
209
  var e;
210
210
  return [
211
211
  Vs("MutationObserver").constructor,
212
- (e = Qn.MutationObserver) != null ? e : () => {
212
+ (e = Dn.MutationObserver) != null ? e : () => {
213
213
  }
214
214
  ];
215
215
  }
216
- let jn = Date.now;
217
- /* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString()) || (jn = () => (/* @__PURE__ */ new Date()).getTime());
218
- function qo(e, t, s) {
216
+ let An = Date.now;
217
+ /* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString()) || (An = () => (/* @__PURE__ */ new Date()).getTime());
218
+ function ea(e, t, s) {
219
219
  try {
220
220
  if (!(t in e))
221
221
  return () => {
@@ -235,24 +235,24 @@ function qo(e, t, s) {
235
235
  }
236
236
  }
237
237
  const be = {
238
- ownerDocument: Mo,
239
- childNodes: zo,
240
- parentNode: Ho,
241
- parentElement: Oo,
242
- textContent: Po,
243
- contains: Eo,
244
- getRootNode: Bo,
245
- host: Qo,
246
- styleSheets: Do,
247
- shadowRoot: jo,
248
- querySelector: Ao,
249
- querySelectorAll: _o,
250
- nowTimestamp: jn,
251
- mutationObserverCtor: $o,
252
- patch: qo,
253
- wrapCanvasContextDrawImage: Ko
238
+ ownerDocument: zo,
239
+ childNodes: Ho,
240
+ parentNode: Oo,
241
+ parentElement: Po,
242
+ textContent: Eo,
243
+ contains: Bo,
244
+ getRootNode: Qo,
245
+ host: Do,
246
+ styleSheets: jo,
247
+ shadowRoot: Ao,
248
+ querySelector: _o,
249
+ querySelectorAll: $o,
250
+ nowTimestamp: An,
251
+ mutationObserverCtor: qo,
252
+ patch: ea,
253
+ wrapCanvasContextDrawImage: Fo
254
254
  };
255
- function An(e) {
255
+ function _n(e) {
256
256
  return e.nodeType === e.ELEMENT_NODE;
257
257
  }
258
258
  function ot(e) {
@@ -266,13 +266,13 @@ function ot(e) {
266
266
  function at(e) {
267
267
  return Object.prototype.toString.call(e) === "[object ShadowRoot]";
268
268
  }
269
- function ea(e) {
269
+ function ta(e) {
270
270
  return e.includes(" background-clip: text;") && !e.includes(" -webkit-background-clip: text;") && (e = e.replace(
271
271
  /\sbackground-clip:\s*text;/g,
272
272
  " -webkit-background-clip: text; background-clip: text;"
273
273
  )), e;
274
274
  }
275
- function ta(e) {
275
+ function ia(e) {
276
276
  const { cssText: t } = e;
277
277
  if (t.split('"').length < 3) return t;
278
278
  const s = ["@import", `url(${JSON.stringify(e.href)})`];
@@ -287,41 +287,41 @@ function fs(e) {
287
287
  !s && e.ownerNode && (s = e.ownerNode.baseURI);
288
288
  const l = Array.from(
289
289
  t,
290
- (c) => _n(c, s)
290
+ (c) => $n(c, s)
291
291
  ).join("");
292
- return ea(l);
292
+ return ta(l);
293
293
  } catch (t) {
294
294
  return null;
295
295
  }
296
296
  }
297
- function _n(e, t) {
298
- if ($n(e)) {
297
+ function $n(e, t) {
298
+ if (qn(e)) {
299
299
  let s;
300
300
  try {
301
301
  s = // for same-origin stylesheets,
302
302
  // we can access the imported stylesheet rules directly
303
303
  fs(e.styleSheet) || // work around browser issues with the raw string `@import url(...)` statement
304
- ta(e);
304
+ ia(e);
305
305
  } catch (l) {
306
306
  s = e.cssText;
307
307
  }
308
308
  return e.styleSheet.href ? Kt(s, e.styleSheet.href) : s;
309
309
  } else {
310
310
  let s = e.cssText;
311
- return sa(e) && e.selectorText.includes(":") && (s = ia(s)), t ? Kt(s, t) : s;
311
+ return ra(e) && e.selectorText.includes(":") && (s = sa(s)), t ? Kt(s, t) : s;
312
312
  }
313
313
  }
314
- function ia(e) {
314
+ function sa(e) {
315
315
  const t = /(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm;
316
316
  return e.replace(t, "$1\\$2");
317
317
  }
318
- function $n(e) {
318
+ function qn(e) {
319
319
  return "styleSheet" in e;
320
320
  }
321
- function sa(e) {
321
+ function ra(e) {
322
322
  return "selectorText" in e;
323
323
  }
324
- class qn {
324
+ class el {
325
325
  constructor() {
326
326
  nr(this, "idNodeMap", /* @__PURE__ */ new Map()), nr(this, "nodeMetaMap", /* @__PURE__ */ new WeakMap());
327
327
  }
@@ -370,8 +370,8 @@ class qn {
370
370
  this.idNodeMap = /* @__PURE__ */ new Map(), this.nodeMetaMap = /* @__PURE__ */ new WeakMap();
371
371
  }
372
372
  }
373
- function ra() {
374
- return new qn();
373
+ function na() {
374
+ return new el();
375
375
  }
376
376
  function Tt({
377
377
  element: e,
@@ -383,7 +383,7 @@ function Tt({
383
383
  maskInputFn: f
384
384
  }) {
385
385
  let b = c || "";
386
- return il({
386
+ return sl({
387
387
  maskInputOptions: t,
388
388
  tagName: s,
389
389
  type: l,
@@ -394,7 +394,7 @@ function Qe(e) {
394
394
  return e.toLowerCase();
395
395
  }
396
396
  const ur = "__rrweb_original__";
397
- function na(e) {
397
+ function la(e) {
398
398
  const t = e.getContext("2d");
399
399
  if (!t) return !0;
400
400
  const s = 50;
@@ -421,7 +421,7 @@ function Ut(e) {
421
421
  Qe(t)
422
422
  ) : null;
423
423
  }
424
- function el(e, t) {
424
+ function tl(e, t) {
425
425
  var u;
426
426
  let s;
427
427
  try {
@@ -432,24 +432,24 @@ function el(e, t) {
432
432
  const l = /\.([0-9a-z]+)(?:$)/i, c = s.pathname.match(l);
433
433
  return (u = c == null ? void 0 : c[1]) != null ? u : null;
434
434
  }
435
- function la(e) {
435
+ function oa(e) {
436
436
  let t = "";
437
437
  return e.indexOf("//") > -1 ? t = e.split("/").slice(0, 3).join("/") : t = e.split("/")[0], t = t.split("?")[0], t;
438
438
  }
439
- const oa = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm, aa = /^(?:[a-z+]+:)?\/\//i, ca = /^www\..*/i, ua = /^(data:)([^,]*),(.*)/i;
439
+ const aa = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm, ca = /^(?:[a-z+]+:)?\/\//i, ua = /^www\..*/i, da = /^(data:)([^,]*),(.*)/i;
440
440
  function Kt(e, t) {
441
441
  return (e || "").replace(
442
- oa,
442
+ aa,
443
443
  (s, l, c, u, f, b) => {
444
444
  const m = c || f || b, h = l || u || "";
445
445
  if (!m)
446
446
  return s;
447
- if (aa.test(m) || ca.test(m))
447
+ if (ca.test(m) || ua.test(m))
448
448
  return `url(${h}${m}${h})`;
449
- if (ua.test(m))
449
+ if (da.test(m))
450
450
  return `url(${h}${m}${h})`;
451
451
  if (m[0] === "/")
452
- return `url(${h}${la(t) + m}${h})`;
452
+ return `url(${h}${oa(t) + m}${h})`;
453
453
  const d = m.split("#")[0], r = m.substring(d.length), n = t.split("#")[0].split("/"), i = d.split("/");
454
454
  n.pop();
455
455
  for (const o of i)
@@ -461,7 +461,7 @@ function Kt(e, t) {
461
461
  function Gt(e, t = !1) {
462
462
  return t ? e.replace(/(\/\*[^*]*\*\/)|[\s;]/g, "") : e.replace(/(\/\*[^*]*\*\/)|[\s;]/g, "").replace(/0px/g, "0");
463
463
  }
464
- function da(e, t, s = !1) {
464
+ function ha(e, t, s = !1) {
465
465
  const l = Array.from(t.childNodes), c = [];
466
466
  let u = 0;
467
467
  if (l.length > 1 && e && typeof e == "string") {
@@ -527,8 +527,8 @@ function da(e, t, s = !1) {
527
527
  }
528
528
  return c.push(e), c;
529
529
  }
530
- function ha(e, t) {
531
- return da(e, t).join("/* rr_split */");
530
+ function pa(e, t) {
531
+ return ha(e, t).join("/* rr_split */");
532
532
  }
533
533
  function Ws(e) {
534
534
  return e = e.replace(/[^ -~]+/g, ""), e = (e == null ? void 0 : e.split(" ").map((t) => t ? Math.random().toString(20).substring(2, t.length + 2) : "").join(" ")) || "", e;
@@ -536,25 +536,25 @@ function Ws(e) {
536
536
  function bs(e) {
537
537
  return e === "img" || e === "video" || e === "audio" || e === "source";
538
538
  }
539
- const pa = new RegExp(
539
+ const ma = new RegExp(
540
540
  /[a-zA-Z0-9.!#$%&'*+=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*/
541
- ), ma = new RegExp(/[0-9]{9,16}/), fa = new RegExp(/[0-9]{3}-?[0-9]{2}-?[0-9]{4}/), ba = new RegExp(
541
+ ), fa = new RegExp(/[0-9]{9,16}/), ba = new RegExp(/[0-9]{3}-?[0-9]{2}-?[0-9]{4}/), ya = new RegExp(
542
542
  /[+]?[(]?[0-9]{3}[)]?[-\s.]?[0-9]{3}[-\s.]?[0-9]{4,6}/
543
- ), ya = new RegExp(/[0-9]{4}-?[0-9]{4}-?[0-9]{4}-?[0-9]{4}/), Za = new RegExp(
543
+ ), Za = new RegExp(/[0-9]{4}-?[0-9]{4}-?[0-9]{4}-?[0-9]{4}/), ga = new RegExp(
544
544
  /[0-9]{1,5}.?[0-9]{0,3}\s[a-zA-Z]{2,30}\s[a-zA-Z]{2,15}/
545
- ), ga = new RegExp(/(?:[0-9]{1,3}.){3}[0-9]{1,3}/), Sa = [
546
- pa,
545
+ ), Sa = new RegExp(/(?:[0-9]{1,3}.){3}[0-9]{1,3}/), Xa = [
547
546
  ma,
548
547
  fa,
549
548
  ba,
550
549
  ya,
551
550
  Za,
552
- ga
551
+ ga,
552
+ Sa
553
553
  ];
554
- function tl(e) {
555
- return e ? Sa.some((t) => t.test(e)) : !1;
554
+ function il(e) {
555
+ return e ? Xa.some((t) => t.test(e)) : !1;
556
556
  }
557
- const il = ({
557
+ const sl = ({
558
558
  maskInputOptions: e,
559
559
  tagName: t,
560
560
  type: s,
@@ -563,20 +563,20 @@ const il = ({
563
563
  const c = s && s.toLowerCase();
564
564
  return l !== "true" && (!!e[t.toLowerCase()] || !!(c && e[c]));
565
565
  };
566
- let Xa = 1;
567
- const Ra = new RegExp("[^a-z0-9-_:]"), ht = -2;
568
- function sl() {
569
- return Xa++;
566
+ let Ra = 1;
567
+ const Ga = new RegExp("[^a-z0-9-_:]"), ht = -2;
568
+ function rl() {
569
+ return Ra++;
570
570
  }
571
- function Ga(e) {
571
+ function Va(e) {
572
572
  if (e instanceof HTMLFormElement)
573
573
  return "form";
574
574
  const t = Qe(e.tagName);
575
- return Ra.test(t) ? "div" : t;
575
+ return Ga.test(t) ? "div" : t;
576
576
  }
577
577
  let Ae, dr;
578
- const Va = /^[^ \t\n\r\u000c]+/, Wa = /^[, \t\n\r\u000c]+/;
579
- function Ia(e, t) {
578
+ const Wa = /^[^ \t\n\r\u000c]+/, Ia = /^[, \t\n\r\u000c]+/;
579
+ function wa(e, t) {
580
580
  if (t.trim() === "")
581
581
  return t;
582
582
  let s = 0;
@@ -586,8 +586,8 @@ function Ia(e, t) {
586
586
  return b ? (f = b[0], s += f.length, f) : "";
587
587
  }
588
588
  const c = [];
589
- for (; l(Wa), !(s >= t.length); ) {
590
- let u = l(Va);
589
+ for (; l(Ia), !(s >= t.length); ) {
590
+ let u = l(Wa);
591
591
  if (u.slice(-1) === ",")
592
592
  u = qe(e, u.substring(0, u.length - 1)), c.push(u);
593
593
  else {
@@ -615,7 +615,7 @@ const hr = /* @__PURE__ */ new WeakMap();
615
615
  function qe(e, t) {
616
616
  return !t || t.trim() === "" ? t : Is(e, t);
617
617
  }
618
- function wa(e) {
618
+ function Ca(e) {
619
619
  return !!(e.tagName === "svg" || e.ownerSVGElement);
620
620
  }
621
621
  function Is(e, t) {
@@ -626,10 +626,10 @@ function Is(e, t) {
626
626
  return t;
627
627
  return s.setAttribute("href", t), s.href;
628
628
  }
629
- function rl(e, t, s, l) {
630
- return l && (s === "src" || s === "href" && !(t === "use" && l[0] === "#") || s === "xlink:href" && l[0] !== "#" || s === "background" && ["table", "td", "th"].includes(t) ? qe(e, l) : s === "srcset" ? Ia(e, l) : s === "style" ? Kt(l, Is(e)) : t === "object" && s === "data" ? qe(e, l) : l);
629
+ function nl(e, t, s, l) {
630
+ return l && (s === "src" || s === "href" && !(t === "use" && l[0] === "#") || s === "xlink:href" && l[0] !== "#" || s === "background" && ["table", "td", "th"].includes(t) ? qe(e, l) : s === "srcset" ? wa(e, l) : s === "style" ? Kt(l, Is(e)) : t === "object" && s === "data" ? qe(e, l) : l);
631
631
  }
632
- function nl(e, t, s) {
632
+ function ll(e, t, s) {
633
633
  return ["video", "audio"].includes(e) && t === "autoplay";
634
634
  }
635
635
  function pr(e, t, s) {
@@ -660,9 +660,9 @@ function Ft(e, t, s) {
660
660
  }
661
661
  return s ? Ft(be.parentNode(e), t, s) : !1;
662
662
  }
663
- function ll(e, t, s, l) {
663
+ function ol(e, t, s, l) {
664
664
  let c;
665
- if (An(e)) {
665
+ if (_n(e)) {
666
666
  if (c = e, !be.childNodes(c).length)
667
667
  return !1;
668
668
  } else {
@@ -685,7 +685,7 @@ function ll(e, t, s, l) {
685
685
  }
686
686
  return !1;
687
687
  }
688
- function Ca(e, t, s) {
688
+ function xa(e, t, s) {
689
689
  const l = e.contentWindow;
690
690
  if (!l)
691
691
  return;
@@ -709,7 +709,7 @@ function Ca(e, t, s) {
709
709
  return setTimeout(t, 0), e.addEventListener("load", t);
710
710
  e.addEventListener("load", t);
711
711
  }
712
- function xa(e, t, s) {
712
+ function va(e, t, s) {
713
713
  let l = !1, c;
714
714
  try {
715
715
  c = e.sheet;
@@ -724,7 +724,7 @@ function xa(e, t, s) {
724
724
  clearTimeout(u), l = !0, t();
725
725
  });
726
726
  }
727
- function va(e, t) {
727
+ function La(e, t) {
728
728
  const {
729
729
  doc: s,
730
730
  mirror: l,
@@ -744,7 +744,7 @@ function va(e, t) {
744
744
  newlyAddedElement: X = !1,
745
745
  cssCaptured: Z = !1,
746
746
  privacySetting: S
747
- } = t, G = La(s, l);
747
+ } = t, G = ka(s, l);
748
748
  switch (e.nodeType) {
749
749
  case e.DOCUMENT_NODE:
750
750
  return e.compatMode !== "CSS1Compat" ? {
@@ -765,7 +765,7 @@ function va(e, t) {
765
765
  rootId: G
766
766
  };
767
767
  case e.ELEMENT_NODE:
768
- return Ja(e, {
768
+ return Ya(e, {
769
769
  doc: s,
770
770
  blockClass: c,
771
771
  blockSelector: u,
@@ -783,7 +783,7 @@ function va(e, t) {
783
783
  rootId: G
784
784
  });
785
785
  case e.TEXT_NODE:
786
- return ka(e, {
786
+ return Ja(e, {
787
787
  doc: s,
788
788
  needsMask: f,
789
789
  maskTextFn: d,
@@ -807,18 +807,18 @@ function va(e, t) {
807
807
  return !1;
808
808
  }
809
809
  }
810
- function La(e, t) {
810
+ function ka(e, t) {
811
811
  if (!t.hasNode(e)) return;
812
812
  const s = t.getId(e);
813
813
  return s === 1 ? void 0 : s;
814
814
  }
815
- function ka(e, t) {
815
+ function Ja(e, t) {
816
816
  var s;
817
817
  const { needsMask: l, maskTextFn: c, privacySetting: u, rootId: f, cssCaptured: b } = t, m = be.parentNode(e), h = m && m.tagName;
818
818
  let d = "";
819
819
  const r = h === "STYLE" ? !0 : void 0, n = h === "SCRIPT" ? !0 : void 0;
820
820
  n ? d = "SCRIPT_PLACEHOLDER" : b || (d = be.textContent(e), r && d && (d = Kt(d, Is(t.doc)))), !r && !n && d && l && (d = c ? c(d, be.parentElement(e)) : d.replace(/[\S]/g, "*"));
821
- const i = u === "strict", o = (s = e.parentElement) == null ? void 0 : s.getAttribute("data-hl-record"), a = u === "default" && tl(d);
821
+ const i = u === "strict", o = (s = e.parentElement) == null ? void 0 : s.getAttribute("data-hl-record"), a = u === "default" && il(d);
822
822
  return (i || a) && !o && h && !(/* @__PURE__ */ new Set([
823
823
  "HEAD",
824
824
  "TITLE",
@@ -833,7 +833,7 @@ function ka(e, t) {
833
833
  rootId: f
834
834
  };
835
835
  }
836
- function Ja(e, t) {
836
+ function Ya(e, t) {
837
837
  const {
838
838
  doc: s,
839
839
  blockClass: l,
@@ -853,11 +853,11 @@ function Ja(e, t) {
853
853
  } = t;
854
854
  let X = pr(e, l, c);
855
855
  const Z = pr(e, m, null), S = a === "strict";
856
- let G = Ga(e), g = {};
856
+ let G = Va(e), g = {};
857
857
  const y = e.attributes.length;
858
858
  for (let V = 0; V < y; V++) {
859
859
  const W = e.attributes[V];
860
- nl(G, W.name) || (g[W.name] = rl(
860
+ ll(G, W.name) || (g[W.name] = nl(
861
861
  s,
862
862
  G,
863
863
  Qe(W.name),
@@ -873,7 +873,7 @@ function Ja(e, t) {
873
873
  let V = fs(
874
874
  e.sheet
875
875
  );
876
- V && (e.childNodes.length > 1 && (V = ha(V, e)), g._cssText = V);
876
+ V && (e.childNodes.length > 1 && (V = pa(V, e)), g._cssText = V);
877
877
  }
878
878
  if (["input", "textarea", "select"].includes(G)) {
879
879
  const V = e.value, W = e.checked;
@@ -889,7 +889,7 @@ function Ja(e, t) {
889
889
  }
890
890
  if (G === "option" && (e.selected && !f.select ? g.selected = !0 : delete g.selected), G === "dialog" && e.open && (g.rr_open_mode = e.matches("dialog:modal") ? "modal" : "non-modal"), G === "canvas" && n) {
891
891
  if (e.__context === "2d")
892
- na(e);
892
+ la(e);
893
893
  else if (!("__context" in e)) {
894
894
  const V = e.toDataURL(
895
895
  h.type,
@@ -969,7 +969,7 @@ function Ja(e, t) {
969
969
  tagName: G,
970
970
  attributes: g,
971
971
  childNodes: [],
972
- isSVG: wa(e) || void 0,
972
+ isSVG: Ca(e) || void 0,
973
973
  needBlock: X,
974
974
  needMask: Z,
975
975
  rootId: p,
@@ -979,7 +979,7 @@ function Ja(e, t) {
979
979
  function re(e) {
980
980
  return e == null ? "" : e.toLowerCase();
981
981
  }
982
- function ol(e) {
982
+ function al(e) {
983
983
  return e === !0 || e === "all" ? {
984
984
  script: !0,
985
985
  comment: !0,
@@ -996,14 +996,14 @@ function ol(e) {
996
996
  headTitleMutations: e === "all"
997
997
  } : e || {};
998
998
  }
999
- function Ya(e, t) {
999
+ function Na(e, t) {
1000
1000
  if (t.comment && e.type === pe.Comment)
1001
1001
  return !0;
1002
1002
  if (e.type === pe.Element) {
1003
1003
  if (t.script && // script tag
1004
1004
  (e.tagName === "script" || // (module)preload link
1005
1005
  e.tagName === "link" && (e.attributes.rel === "preload" && e.attributes.as === "script" || e.attributes.rel === "modulepreload") || // prefetch link
1006
- e.tagName === "link" && e.attributes.rel === "prefetch" && typeof e.attributes.href == "string" && el(e.attributes.href) === "js"))
1006
+ e.tagName === "link" && e.attributes.rel === "prefetch" && typeof e.attributes.href == "string" && tl(e.attributes.href) === "js"))
1007
1007
  return !0;
1008
1008
  if (t.headFavicon && (e.tagName === "link" && e.attributes.rel === "shortcut icon" || e.tagName === "meta" && (re(e.attributes.name).match(
1009
1009
  /^msapplication-tile(image|color)$/
@@ -1056,13 +1056,13 @@ function et(e, t) {
1056
1056
  privacySetting: W
1057
1057
  } = t;
1058
1058
  let { needsMask: v } = t, { preserveWhiteSpace: x = !0 } = t;
1059
- v || (v = ll(
1059
+ v || (v = ol(
1060
1060
  e,
1061
1061
  f,
1062
1062
  b,
1063
1063
  v === void 0
1064
1064
  ));
1065
- const D = va(e, {
1065
+ const D = La(e, {
1066
1066
  doc: s,
1067
1067
  mirror: l,
1068
1068
  blockClass: c,
@@ -1085,7 +1085,7 @@ function et(e, t) {
1085
1085
  if (!D)
1086
1086
  return console.warn(e, "not serialized"), null;
1087
1087
  let E;
1088
- l.hasNode(e) ? E = l.getId(e) : Ya(D, i) || !x && D.type === pe.Text && !D.textContent.replace(/^\s+|\s+$/gm, "").length ? E = ht : E = sl();
1088
+ l.hasNode(e) ? E = l.getId(e) : Na(D, i) || !x && D.type === pe.Text && !D.textContent.replace(/^\s+|\s+$/gm, "").length ? E = ht : E = rl();
1089
1089
  const w = Object.assign(D, { id: E });
1090
1090
  if (l.add(e, w), E === ht)
1091
1091
  return null;
@@ -1138,14 +1138,14 @@ function et(e, t) {
1138
1138
  }
1139
1139
  }
1140
1140
  let j = null;
1141
- if (An(e) && (j = be.shadowRoot(e)))
1141
+ if (_n(e) && (j = be.shadowRoot(e)))
1142
1142
  for (const ne of Array.from(be.childNodes(j))) {
1143
1143
  const C = et(ne, M);
1144
1144
  C && (at(j) && (C.isShadow = !0), w.childNodes.push(C));
1145
1145
  }
1146
1146
  }
1147
1147
  const B = be.parentNode(e);
1148
- return B && ot(B) && at(B) && (w.isShadow = !0), w.type === pe.Element && w.tagName === "iframe" && Ca(
1148
+ return B && ot(B) && at(B) && (w.isShadow = !0), w.type === pe.Element && w.tagName === "iframe" && xa(
1149
1149
  e,
1150
1150
  () => {
1151
1151
  const M = e.contentDocument;
@@ -1184,7 +1184,7 @@ function et(e, t) {
1184
1184
  }
1185
1185
  },
1186
1186
  G
1187
- ), w.type === pe.Element && w.tagName === "link" && typeof w.attributes.rel == "string" && (w.attributes.rel === "stylesheet" || w.attributes.rel === "preload" && typeof w.attributes.href == "string" && el(w.attributes.href) === "css") && xa(
1187
+ ), w.type === pe.Element && w.tagName === "link" && typeof w.attributes.rel == "string" && (w.attributes.rel === "stylesheet" || w.attributes.rel === "preload" && typeof w.attributes.href == "string" && tl(w.attributes.href) === "css") && va(
1188
1188
  e,
1189
1189
  () => {
1190
1190
  if (g) {
@@ -1224,9 +1224,9 @@ function et(e, t) {
1224
1224
  y
1225
1225
  ), w;
1226
1226
  }
1227
- function Na(e, t) {
1227
+ function Ta(e, t) {
1228
1228
  const {
1229
- mirror: s = new qn(),
1229
+ mirror: s = new el(),
1230
1230
  blockClass: l = "highlight-block",
1231
1231
  blockSelector: c = null,
1232
1232
  maskTextClass: u = "highlight-mask",
@@ -1267,7 +1267,7 @@ function Na(e, t) {
1267
1267
  password: !0
1268
1268
  } : r === !1 ? {
1269
1269
  password: !0
1270
- } : r, V = ol(o);
1270
+ } : r, V = al(o);
1271
1271
  return et(e, {
1272
1272
  doc: e,
1273
1273
  mirror: s,
@@ -1296,7 +1296,7 @@ function Na(e, t) {
1296
1296
  privacySetting: R
1297
1297
  });
1298
1298
  }
1299
- function Ta(e) {
1299
+ function Ua(e) {
1300
1300
  if (Object.prototype.hasOwnProperty.call(e, "__esModule")) return e;
1301
1301
  var t = e.default;
1302
1302
  if (typeof t == "function") {
@@ -1316,7 +1316,7 @@ function Ta(e) {
1316
1316
  }), s;
1317
1317
  }
1318
1318
  var Vt = { exports: {} }, mr;
1319
- function Ua() {
1319
+ function Ka() {
1320
1320
  if (mr) return Vt.exports;
1321
1321
  mr = 1;
1322
1322
  var e = String, t = function() {
@@ -1324,15 +1324,15 @@ function Ua() {
1324
1324
  };
1325
1325
  return Vt.exports = t(), Vt.exports.createColors = t, Vt.exports;
1326
1326
  }
1327
- const Ka = {}, Fa = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1327
+ const Fa = {}, Ma = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1328
1328
  __proto__: null,
1329
- default: Ka
1330
- }, Symbol.toStringTag, { value: "Module" })), xe = /* @__PURE__ */ Ta(Fa);
1329
+ default: Fa
1330
+ }, Symbol.toStringTag, { value: "Module" })), xe = /* @__PURE__ */ Ua(Ma);
1331
1331
  var ci, fr;
1332
1332
  function ws() {
1333
1333
  if (fr) return ci;
1334
1334
  fr = 1;
1335
- let e = /* @__PURE__ */ Ua(), t = xe;
1335
+ let e = /* @__PURE__ */ Ka(), t = xe;
1336
1336
  class s extends Error {
1337
1337
  constructor(c, u, f, b, m, h) {
1338
1338
  super(c), this.name = "CssSyntaxError", this.reason = c, m && (this.file = m), b && (this.source = b), h && (this.plugin = h), typeof u != "undefined" && typeof f != "undefined" && (typeof u == "number" ? (this.line = u, this.column = f) : (this.line = u.line, this.column = u.column, this.endLine = f.line, this.endColumn = f.column)), this.setMessage(), Error.captureStackTrace && Error.captureStackTrace(this, s);
@@ -1380,7 +1380,7 @@ function ws() {
1380
1380
  return ci = s, s.default = s, ci;
1381
1381
  }
1382
1382
  var ui, br;
1383
- function al() {
1383
+ function cl() {
1384
1384
  if (br) return ui;
1385
1385
  br = 1;
1386
1386
  const e = /(<)(\/?style\b)/gi, t = /(<)(!--)/g, s = /[\t\n\f\r "#'()/;[\\\]{}]/;
@@ -1614,7 +1614,7 @@ var di, yr;
1614
1614
  function Ot() {
1615
1615
  if (yr) return di;
1616
1616
  yr = 1;
1617
- let e = al();
1617
+ let e = cl();
1618
1618
  function t(s, l) {
1619
1619
  new e(l).stringify(s);
1620
1620
  }
@@ -1628,7 +1628,7 @@ var hi, gr;
1628
1628
  function Et() {
1629
1629
  if (gr) return hi;
1630
1630
  gr = 1;
1631
- let e = ws(), t = al(), s = Ot(), { isClean: l, my: c } = Pt();
1631
+ let e = ws(), t = cl(), s = Ot(), { isClean: l, my: c } = Pt();
1632
1632
  function u(m, h) {
1633
1633
  let d = new m.constructor(), r = [[m, d, h]];
1634
1634
  for (; r.length > 0; ) {
@@ -2228,7 +2228,7 @@ function xs() {
2228
2228
  }, yi = l, l.default = l, yi;
2229
2229
  }
2230
2230
  var Zi, Wr;
2231
- function Ma() {
2231
+ function za() {
2232
2232
  if (Wr) return Zi;
2233
2233
  Wr = 1;
2234
2234
  let e = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
@@ -2245,7 +2245,7 @@ function Ma() {
2245
2245
  } }, Zi;
2246
2246
  }
2247
2247
  var gi, Ir;
2248
- function cl() {
2248
+ function ul() {
2249
2249
  if (Ir) return gi;
2250
2250
  Ir = 1;
2251
2251
  let { existsSync: e, readFileSync: t, realpathSync: s } = xe, { dirname: l, isAbsolute: c, join: u, relative: f, sep: b } = xe, { SourceMapConsumer: m, SourceMapGenerator: h } = xe;
@@ -2357,7 +2357,7 @@ var Si, wr;
2357
2357
  function Dt() {
2358
2358
  if (wr) return Si;
2359
2359
  wr = 1;
2360
- let { nanoid: e } = /* @__PURE__ */ Ma(), { isAbsolute: t, resolve: s } = xe, { SourceMapConsumer: l, SourceMapGenerator: c } = xe, { fileURLToPath: u, pathToFileURL: f } = xe, b = ws(), m = cl(), h = xe, d = Symbol("lineToIndexCache"), r = !!(l && c), n = !!(s && t);
2360
+ let { nanoid: e } = /* @__PURE__ */ za(), { isAbsolute: t, resolve: s } = xe, { SourceMapConsumer: l, SourceMapGenerator: c } = xe, { fileURLToPath: u, pathToFileURL: f } = xe, b = ws(), m = ul(), h = xe, d = Symbol("lineToIndexCache"), r = !!(l && c), n = !!(s && t);
2361
2361
  function i(a) {
2362
2362
  if (a[d]) return a[d];
2363
2363
  let p = a.css.split(`
@@ -2537,7 +2537,7 @@ function yt() {
2537
2537
  }, Xi = l, l.default = l, e.registerRoot(l), Xi;
2538
2538
  }
2539
2539
  var Ri, xr;
2540
- function ul() {
2540
+ function dl() {
2541
2541
  if (xr) return Ri;
2542
2542
  xr = 1;
2543
2543
  let e = {
@@ -2563,7 +2563,7 @@ var Gi, vr;
2563
2563
  function vs() {
2564
2564
  if (vr) return Gi;
2565
2565
  vr = 1;
2566
- let e = Oe(), t = ul();
2566
+ let e = Oe(), t = dl();
2567
2567
  class s extends e {
2568
2568
  get selectors() {
2569
2569
  return t.comma(this.selector);
@@ -2579,10 +2579,10 @@ function vs() {
2579
2579
  return Gi = s, s.default = s, e.registerRule(s), Gi;
2580
2580
  }
2581
2581
  var Vi, Lr;
2582
- function za() {
2582
+ function Ha() {
2583
2583
  if (Lr) return Vi;
2584
2584
  Lr = 1;
2585
- let e = Cs(), t = Bt(), s = Qt(), l = Dt(), c = cl(), u = yt(), f = vs();
2585
+ let e = Cs(), t = Bt(), s = Qt(), l = Dt(), c = ul(), u = yt(), f = vs();
2586
2586
  function b(d, r) {
2587
2587
  return d.inputs ? d.inputs.map((n) => {
2588
2588
  let i = me(K({}, n), { __proto__: l.prototype });
@@ -2646,7 +2646,7 @@ function za() {
2646
2646
  return Vi = h, h.default = h, Vi;
2647
2647
  }
2648
2648
  var Wi, kr;
2649
- function dl() {
2649
+ function hl() {
2650
2650
  if (kr) return Wi;
2651
2651
  kr = 1;
2652
2652
  let { dirname: e, relative: t, resolve: s, sep: l } = xe, { SourceMapConsumer: c, SourceMapGenerator: u } = xe, { pathToFileURL: f } = xe, b = Dt(), m = !!(c && u), h = !!(e && s && t && l);
@@ -2823,7 +2823,7 @@ function dl() {
2823
2823
  return Wi = d, Wi;
2824
2824
  }
2825
2825
  var Ii, Jr;
2826
- function Ha() {
2826
+ function Oa() {
2827
2827
  if (Jr) return Ii;
2828
2828
  Jr = 1;
2829
2829
  const e = 39, t = 34, s = 92, l = 47, c = 10, u = 32, f = 12, b = 9, m = 13, h = 91, d = 93, r = 40, n = 41, i = 123, o = 125, a = 59, p = 42, X = 58, Z = 64, S = /[\t\n\f\r "#'()/;[\\\]{}]/g, G = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g, g = /.[\r\n"'(/\\]/, y = /[\da-f]/i;
@@ -2933,10 +2933,10 @@ function Ha() {
2933
2933
  }, Ii;
2934
2934
  }
2935
2935
  var wi, Yr;
2936
- function Oa() {
2936
+ function Pa() {
2937
2937
  if (Yr) return wi;
2938
2938
  Yr = 1;
2939
- let e = Cs(), t = Bt(), s = Qt(), l = yt(), c = vs(), u = Ha();
2939
+ let e = Cs(), t = Bt(), s = Qt(), l = yt(), c = vs(), u = Oa();
2940
2940
  const f = {
2941
2941
  empty: !0,
2942
2942
  space: !0
@@ -3258,7 +3258,7 @@ var Ci, Nr;
3258
3258
  function Ls() {
3259
3259
  if (Nr) return Ci;
3260
3260
  Nr = 1;
3261
- let e = Oe(), t = Dt(), s = Oa();
3261
+ let e = Oe(), t = Dt(), s = Pa();
3262
3262
  function l(c, u) {
3263
3263
  let f = new t(c, u), b = new s(f);
3264
3264
  try {
@@ -3274,7 +3274,7 @@ You tried to parse Less with the standard CSS parser; try again with the postcss
3274
3274
  return Ci = l, l.default = l, e.registerParse(l), Ci;
3275
3275
  }
3276
3276
  var xi, Tr;
3277
- function hl() {
3277
+ function pl() {
3278
3278
  if (Tr) return xi;
3279
3279
  Tr = 1;
3280
3280
  let e = Oe(), { my: t } = Pt();
@@ -3301,7 +3301,7 @@ var vi, Ur;
3301
3301
  function ks() {
3302
3302
  if (Ur) return vi;
3303
3303
  Ur = 1;
3304
- let e = hl();
3304
+ let e = pl();
3305
3305
  class t {
3306
3306
  get content() {
3307
3307
  return this.css;
@@ -3324,7 +3324,7 @@ function ks() {
3324
3324
  return vi = t, t.default = t, vi;
3325
3325
  }
3326
3326
  var Li, Kr;
3327
- function pl() {
3327
+ function ml() {
3328
3328
  if (Kr) return Li;
3329
3329
  Kr = 1;
3330
3330
  let e = {};
@@ -3333,10 +3333,10 @@ function pl() {
3333
3333
  }, Li;
3334
3334
  }
3335
3335
  var ki, Fr;
3336
- function ml() {
3336
+ function fl() {
3337
3337
  if (Fr) return ki;
3338
3338
  Fr = 1;
3339
- let e = Oe(), t = xs(), s = dl(), l = Ls(), c = ks(), u = yt(), f = Ot(), { isClean: b, my: m } = Pt(), h = pl();
3339
+ let e = Oe(), t = xs(), s = hl(), l = Ls(), c = ks(), u = yt(), f = Ot(), { isClean: b, my: m } = Pt(), h = ml();
3340
3340
  const d = {
3341
3341
  atrule: "AtRule",
3342
3342
  comment: "Comment",
@@ -3709,10 +3709,10 @@ function ml() {
3709
3709
  }, ki = S, S.default = S, u.registerLazyResult(S), t.registerLazyResult(S), ki;
3710
3710
  }
3711
3711
  var Ji, Mr;
3712
- function Pa() {
3712
+ function Ea() {
3713
3713
  if (Mr) return Ji;
3714
3714
  Mr = 1;
3715
- let e = dl(), t = Ls(), s = ks(), l = Ot(), c = pl();
3715
+ let e = hl(), t = Ls(), s = ks(), l = Ot(), c = ml();
3716
3716
  class u {
3717
3717
  get content() {
3718
3718
  return this.result.css;
@@ -3793,10 +3793,10 @@ function Pa() {
3793
3793
  return Ji = u, u.default = u, Ji;
3794
3794
  }
3795
3795
  var Yi, zr;
3796
- function Ea() {
3796
+ function Ba() {
3797
3797
  if (zr) return Yi;
3798
3798
  zr = 1;
3799
- let e = xs(), t = ml(), s = Pa(), l = yt();
3799
+ let e = xs(), t = fl(), s = Ea(), l = yt();
3800
3800
  class c {
3801
3801
  constructor(f = []) {
3802
3802
  this.version = "8.5.26", this.plugins = this.normalize(f);
@@ -3829,10 +3829,10 @@ function Ea() {
3829
3829
  return Yi = c, c.default = c, l.registerProcessor(c), e.registerProcessor(c), Yi;
3830
3830
  }
3831
3831
  var Ni, Hr;
3832
- function Ba() {
3832
+ function Qa() {
3833
3833
  if (Hr) return Ni;
3834
3834
  Hr = 1;
3835
- let e = Cs(), t = Bt(), s = Oe(), l = ws(), c = Qt(), u = xs(), f = za(), b = Dt(), m = ml(), h = ul(), d = Et(), r = Ls(), n = Ea(), i = ks(), o = yt(), a = vs(), p = Ot(), X = hl();
3835
+ let e = Cs(), t = Bt(), s = Oe(), l = ws(), c = Qt(), u = xs(), f = Ha(), b = Dt(), m = fl(), h = dl(), d = Et(), r = Ls(), n = Ba(), i = ks(), o = yt(), a = vs(), p = Ot(), X = pl();
3836
3836
  function Z(...S) {
3837
3837
  return S.length === 1 && Array.isArray(S[0]) && (S = S[0]), new n(S);
3838
3838
  }
@@ -3859,10 +3859,10 @@ https://www.w3ctech.com/topic/2226`
3859
3859
  }, R;
3860
3860
  }, Z.stringify = p, Z.parse = r, Z.fromJSON = f, Z.list = h, Z.comment = (S) => new t(S), Z.atRule = (S) => new e(S), Z.decl = (S) => new c(S), Z.rule = (S) => new a(S), Z.root = (S) => new o(S), Z.document = (S) => new u(S), Z.CssSyntaxError = l, Z.Declaration = c, Z.Container = s, Z.Processor = n, Z.Document = u, Z.Comment = t, Z.Warning = X, Z.AtRule = e, Z.Result = i, Z.Input = b, Z.Rule = a, Z.Root = o, Z.Node = d, m.registerPostcss(Z), Ni = Z, Z.default = Z, Ni;
3861
3861
  }
3862
- Ba();
3863
- var Qa = Object.defineProperty, Da = (e, t, s) => t in e ? Qa(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s, Ie = (e, t, s) => Da(e, typeof t != "symbol" ? t + "" : t, s);
3862
+ Qa();
3863
+ var Da = Object.defineProperty, ja = (e, t, s) => t in e ? Da(e, t, { enumerable: !0, configurable: !0, writable: !0, value: s }) : e[t] = s, Ie = (e, t, s) => ja(e, typeof t != "symbol" ? t + "" : t, s);
3864
3864
  Date.now().toString();
3865
- function ja(e) {
3865
+ function Aa(e) {
3866
3866
  if (Object.prototype.hasOwnProperty.call(e, "__esModule")) return e;
3867
3867
  var t = e.default;
3868
3868
  if (typeof t == "function") {
@@ -3882,7 +3882,7 @@ function ja(e) {
3882
3882
  }), s;
3883
3883
  }
3884
3884
  var It = { exports: {} }, Or;
3885
- function Aa() {
3885
+ function _a() {
3886
3886
  if (Or) return It.exports;
3887
3887
  Or = 1;
3888
3888
  var e = String, t = function() {
@@ -3890,15 +3890,15 @@ function Aa() {
3890
3890
  };
3891
3891
  return It.exports = t(), It.exports.createColors = t, It.exports;
3892
3892
  }
3893
- const _a = {}, $a = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3893
+ const $a = {}, qa = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3894
3894
  __proto__: null,
3895
- default: _a
3896
- }, Symbol.toStringTag, { value: "Module" })), ve = /* @__PURE__ */ ja($a);
3895
+ default: $a
3896
+ }, Symbol.toStringTag, { value: "Module" })), ve = /* @__PURE__ */ Aa(qa);
3897
3897
  var Ti, Pr;
3898
3898
  function Js() {
3899
3899
  if (Pr) return Ti;
3900
3900
  Pr = 1;
3901
- let e = /* @__PURE__ */ Aa(), t = ve;
3901
+ let e = /* @__PURE__ */ _a(), t = ve;
3902
3902
  class s extends Error {
3903
3903
  constructor(c, u, f, b, m, h) {
3904
3904
  super(c), this.name = "CssSyntaxError", this.reason = c, m && (this.file = m), b && (this.source = b), h && (this.plugin = h), typeof u != "undefined" && typeof f != "undefined" && (typeof u == "number" ? (this.line = u, this.column = f) : (this.line = u.line, this.column = u.column, this.endLine = f.line, this.endColumn = f.column)), this.setMessage(), Error.captureStackTrace && Error.captureStackTrace(this, s);
@@ -3946,7 +3946,7 @@ function Js() {
3946
3946
  return Ti = s, s.default = s, Ti;
3947
3947
  }
3948
3948
  var Ui, Er;
3949
- function fl() {
3949
+ function bl() {
3950
3950
  if (Er) return Ui;
3951
3951
  Er = 1;
3952
3952
  const e = /(<)(\/?style\b)/gi, t = /(<)(!--)/g, s = /[\t\n\f\r "#'()/;[\\\]{}]/;
@@ -4180,7 +4180,7 @@ var Ki, Br;
4180
4180
  function jt() {
4181
4181
  if (Br) return Ki;
4182
4182
  Br = 1;
4183
- let e = fl();
4183
+ let e = bl();
4184
4184
  function t(s, l) {
4185
4185
  new e(l).stringify(s);
4186
4186
  }
@@ -4194,7 +4194,7 @@ var Fi, Dr;
4194
4194
  function _t() {
4195
4195
  if (Dr) return Fi;
4196
4196
  Dr = 1;
4197
- let e = Js(), t = fl(), s = jt(), { isClean: l, my: c } = At();
4197
+ let e = Js(), t = bl(), s = jt(), { isClean: l, my: c } = At();
4198
4198
  function u(m, h) {
4199
4199
  let d = new m.constructor(), r = [[m, d, h]];
4200
4200
  for (; r.length > 0; ) {
@@ -4794,7 +4794,7 @@ function Ns() {
4794
4794
  }, Pi = l, l.default = l, Pi;
4795
4795
  }
4796
4796
  var Ei, en;
4797
- function qa() {
4797
+ function ec() {
4798
4798
  if (en) return Ei;
4799
4799
  en = 1;
4800
4800
  let e = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
@@ -4811,7 +4811,7 @@ function qa() {
4811
4811
  } }, Ei;
4812
4812
  }
4813
4813
  var Bi, tn;
4814
- function bl() {
4814
+ function yl() {
4815
4815
  if (tn) return Bi;
4816
4816
  tn = 1;
4817
4817
  let { existsSync: e, readFileSync: t, realpathSync: s } = ve, { dirname: l, isAbsolute: c, join: u, relative: f, sep: b } = ve, { SourceMapConsumer: m, SourceMapGenerator: h } = ve;
@@ -4923,7 +4923,7 @@ var Qi, sn;
4923
4923
  function ei() {
4924
4924
  if (sn) return Qi;
4925
4925
  sn = 1;
4926
- let { nanoid: e } = /* @__PURE__ */ qa(), { isAbsolute: t, resolve: s } = ve, { SourceMapConsumer: l, SourceMapGenerator: c } = ve, { fileURLToPath: u, pathToFileURL: f } = ve, b = Js(), m = bl(), h = ve, d = Symbol("lineToIndexCache"), r = !!(l && c), n = !!(s && t);
4926
+ let { nanoid: e } = /* @__PURE__ */ ec(), { isAbsolute: t, resolve: s } = ve, { SourceMapConsumer: l, SourceMapGenerator: c } = ve, { fileURLToPath: u, pathToFileURL: f } = ve, b = Js(), m = yl(), h = ve, d = Symbol("lineToIndexCache"), r = !!(l && c), n = !!(s && t);
4927
4927
  function i(a) {
4928
4928
  if (a[d]) return a[d];
4929
4929
  let p = a.css.split(`
@@ -5103,7 +5103,7 @@ function Zt() {
5103
5103
  }, Di = l, l.default = l, e.registerRoot(l), Di;
5104
5104
  }
5105
5105
  var ji, nn;
5106
- function yl() {
5106
+ function Zl() {
5107
5107
  if (nn) return ji;
5108
5108
  nn = 1;
5109
5109
  let e = {
@@ -5129,7 +5129,7 @@ var Ai, ln;
5129
5129
  function Ts() {
5130
5130
  if (ln) return Ai;
5131
5131
  ln = 1;
5132
- let e = Pe(), t = yl();
5132
+ let e = Pe(), t = Zl();
5133
5133
  class s extends e {
5134
5134
  get selectors() {
5135
5135
  return t.comma(this.selector);
@@ -5145,10 +5145,10 @@ function Ts() {
5145
5145
  return Ai = s, s.default = s, e.registerRule(s), Ai;
5146
5146
  }
5147
5147
  var _i, on;
5148
- function ec() {
5148
+ function tc() {
5149
5149
  if (on) return _i;
5150
5150
  on = 1;
5151
- let e = Ys(), t = $t(), s = qt(), l = ei(), c = bl(), u = Zt(), f = Ts();
5151
+ let e = Ys(), t = $t(), s = qt(), l = ei(), c = yl(), u = Zt(), f = Ts();
5152
5152
  function b(d, r) {
5153
5153
  return d.inputs ? d.inputs.map((n) => {
5154
5154
  let i = me(K({}, n), { __proto__: l.prototype });
@@ -5212,7 +5212,7 @@ function ec() {
5212
5212
  return _i = h, h.default = h, _i;
5213
5213
  }
5214
5214
  var $i, an;
5215
- function Zl() {
5215
+ function gl() {
5216
5216
  if (an) return $i;
5217
5217
  an = 1;
5218
5218
  let { dirname: e, relative: t, resolve: s, sep: l } = ve, { SourceMapConsumer: c, SourceMapGenerator: u } = ve, { pathToFileURL: f } = ve, b = ei(), m = !!(c && u), h = !!(e && s && t && l);
@@ -5389,7 +5389,7 @@ function Zl() {
5389
5389
  return $i = d, $i;
5390
5390
  }
5391
5391
  var qi, cn;
5392
- function tc() {
5392
+ function ic() {
5393
5393
  if (cn) return qi;
5394
5394
  cn = 1;
5395
5395
  const e = 39, t = 34, s = 92, l = 47, c = 10, u = 32, f = 12, b = 9, m = 13, h = 91, d = 93, r = 40, n = 41, i = 123, o = 125, a = 59, p = 42, X = 58, Z = 64, S = /[\t\n\f\r "#'()/;[\\\]{}]/g, G = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g, g = /.[\r\n"'(/\\]/, y = /[\da-f]/i;
@@ -5499,10 +5499,10 @@ function tc() {
5499
5499
  }, qi;
5500
5500
  }
5501
5501
  var es, un;
5502
- function ic() {
5502
+ function sc() {
5503
5503
  if (un) return es;
5504
5504
  un = 1;
5505
- let e = Ys(), t = $t(), s = qt(), l = Zt(), c = Ts(), u = tc();
5505
+ let e = Ys(), t = $t(), s = qt(), l = Zt(), c = Ts(), u = ic();
5506
5506
  const f = {
5507
5507
  empty: !0,
5508
5508
  space: !0
@@ -5824,7 +5824,7 @@ var ts, dn;
5824
5824
  function Us() {
5825
5825
  if (dn) return ts;
5826
5826
  dn = 1;
5827
- let e = Pe(), t = ei(), s = ic();
5827
+ let e = Pe(), t = ei(), s = sc();
5828
5828
  function l(c, u) {
5829
5829
  let f = new t(c, u), b = new s(f);
5830
5830
  try {
@@ -5840,7 +5840,7 @@ You tried to parse Less with the standard CSS parser; try again with the postcss
5840
5840
  return ts = l, l.default = l, e.registerParse(l), ts;
5841
5841
  }
5842
5842
  var is, hn;
5843
- function gl() {
5843
+ function Sl() {
5844
5844
  if (hn) return is;
5845
5845
  hn = 1;
5846
5846
  let e = Pe(), { my: t } = At();
@@ -5867,7 +5867,7 @@ var ss, pn;
5867
5867
  function Ks() {
5868
5868
  if (pn) return ss;
5869
5869
  pn = 1;
5870
- let e = gl();
5870
+ let e = Sl();
5871
5871
  class t {
5872
5872
  get content() {
5873
5873
  return this.css;
@@ -5890,7 +5890,7 @@ function Ks() {
5890
5890
  return ss = t, t.default = t, ss;
5891
5891
  }
5892
5892
  var rs, mn;
5893
- function Sl() {
5893
+ function Xl() {
5894
5894
  if (mn) return rs;
5895
5895
  mn = 1;
5896
5896
  let e = {};
@@ -5899,10 +5899,10 @@ function Sl() {
5899
5899
  }, rs;
5900
5900
  }
5901
5901
  var ns, fn;
5902
- function Xl() {
5902
+ function Rl() {
5903
5903
  if (fn) return ns;
5904
5904
  fn = 1;
5905
- let e = Pe(), t = Ns(), s = Zl(), l = Us(), c = Ks(), u = Zt(), f = jt(), { isClean: b, my: m } = At(), h = Sl();
5905
+ let e = Pe(), t = Ns(), s = gl(), l = Us(), c = Ks(), u = Zt(), f = jt(), { isClean: b, my: m } = At(), h = Xl();
5906
5906
  const d = {
5907
5907
  atrule: "AtRule",
5908
5908
  comment: "Comment",
@@ -6275,10 +6275,10 @@ function Xl() {
6275
6275
  }, ns = S, S.default = S, u.registerLazyResult(S), t.registerLazyResult(S), ns;
6276
6276
  }
6277
6277
  var ls, bn;
6278
- function sc() {
6278
+ function rc() {
6279
6279
  if (bn) return ls;
6280
6280
  bn = 1;
6281
- let e = Zl(), t = Us(), s = Ks(), l = jt(), c = Sl();
6281
+ let e = gl(), t = Us(), s = Ks(), l = jt(), c = Xl();
6282
6282
  class u {
6283
6283
  get content() {
6284
6284
  return this.result.css;
@@ -6359,10 +6359,10 @@ function sc() {
6359
6359
  return ls = u, u.default = u, ls;
6360
6360
  }
6361
6361
  var os, yn;
6362
- function rc() {
6362
+ function nc() {
6363
6363
  if (yn) return os;
6364
6364
  yn = 1;
6365
- let e = Ns(), t = Xl(), s = sc(), l = Zt();
6365
+ let e = Ns(), t = Rl(), s = rc(), l = Zt();
6366
6366
  class c {
6367
6367
  constructor(f = []) {
6368
6368
  this.version = "8.5.26", this.plugins = this.normalize(f);
@@ -6395,10 +6395,10 @@ function rc() {
6395
6395
  return os = c, c.default = c, l.registerProcessor(c), e.registerProcessor(c), os;
6396
6396
  }
6397
6397
  var as, Zn;
6398
- function nc() {
6398
+ function lc() {
6399
6399
  if (Zn) return as;
6400
6400
  Zn = 1;
6401
- let e = Ys(), t = $t(), s = Pe(), l = Js(), c = qt(), u = Ns(), f = ec(), b = ei(), m = Xl(), h = yl(), d = _t(), r = Us(), n = rc(), i = Ks(), o = Zt(), a = Ts(), p = jt(), X = gl();
6401
+ let e = Ys(), t = $t(), s = Pe(), l = Js(), c = qt(), u = Ns(), f = tc(), b = ei(), m = Rl(), h = Zl(), d = _t(), r = Us(), n = nc(), i = Ks(), o = Zt(), a = Ts(), p = jt(), X = Sl();
6402
6402
  function Z(...S) {
6403
6403
  return S.length === 1 && Array.isArray(S[0]) && (S = S[0]), new n(S);
6404
6404
  }
@@ -6425,7 +6425,7 @@ https://www.w3ctech.com/topic/2226`
6425
6425
  }, R;
6426
6426
  }, Z.stringify = p, Z.parse = r, Z.fromJSON = f, Z.list = h, Z.comment = (S) => new t(S), Z.atRule = (S) => new e(S), Z.decl = (S) => new c(S), Z.rule = (S) => new a(S), Z.root = (S) => new o(S), Z.document = (S) => new u(S), Z.CssSyntaxError = l, Z.Declaration = c, Z.Container = s, Z.Processor = n, Z.Document = u, Z.Comment = t, Z.Warning = X, Z.AtRule = e, Z.Result = i, Z.Input = b, Z.Rule = a, Z.Root = o, Z.Node = d, m.registerPostcss(Z), as = Z, Z.default = Z, as;
6427
6427
  }
6428
- nc();
6428
+ lc();
6429
6429
  class Fs {
6430
6430
  // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
6431
6431
  constructor(...t) {
@@ -6476,7 +6476,7 @@ const Ct = /* @__PURE__ */ new Map(), gn = /* @__PURE__ */ new WeakSet();
6476
6476
  function Sn(e) {
6477
6477
  return e !== null && typeof e == "object" && "complete" in e && "naturalWidth" in e && "naturalHeight" in e && "src" in e && "onload" in e;
6478
6478
  }
6479
- function lc(e) {
6479
+ function oc(e) {
6480
6480
  if (gn.has(e))
6481
6481
  return;
6482
6482
  gn.add(e);
@@ -6525,7 +6525,7 @@ const Xn = {
6525
6525
  ShadowRoot: ["getSelection"],
6526
6526
  Element: [],
6527
6527
  MutationObserver: ["constructor"]
6528
- }, xt = {}, Rl = {}, oc = () => !!globalThis.Zone;
6528
+ }, xt = {}, Gl = {}, ac = () => !!globalThis.Zone;
6529
6529
  function Ms(e) {
6530
6530
  if (xt[e])
6531
6531
  return xt[e];
@@ -6542,7 +6542,7 @@ function Ms(e) {
6542
6542
  return typeof s[b] == "function" && ((m = s[b]) == null ? void 0 : m.toString().includes("[native code]"));
6543
6543
  }
6544
6544
  ));
6545
- if (c && f && !oc())
6545
+ if (c && f && !ac())
6546
6546
  return xt[e] = t.prototype, t.prototype;
6547
6547
  try {
6548
6548
  const b = document.createElement("iframe");
@@ -6553,7 +6553,7 @@ function Ms(e) {
6553
6553
  if (!h)
6554
6554
  return b.remove(), s;
6555
6555
  const d = navigator.userAgent;
6556
- return d.includes("Safari") && !d.includes("Chrome") ? (b.classList.add("rr-block"), b.setAttribute("__rrwebUntaintedMutationObserver", ""), Rl[e] = () => b.remove()) : b.remove(), xt[e] = h;
6556
+ return d.includes("Safari") && !d.includes("Chrome") ? (b.classList.add("rr-block"), b.setAttribute("__rrwebUntaintedMutationObserver", ""), Gl[e] = () => b.remove()) : b.remove(), xt[e] = h;
6557
6557
  } catch (b) {
6558
6558
  return s;
6559
6559
  }
@@ -6573,7 +6573,7 @@ function Ue(e, t, s) {
6573
6573
  return f ? (cs[c] = f, f.call(t)) : t[s];
6574
6574
  }
6575
6575
  const us = {};
6576
- function Gl(e, t, s) {
6576
+ function Vl(e, t, s) {
6577
6577
  const l = `${e}.${String(s)}`;
6578
6578
  if (us[l])
6579
6579
  return us[l].bind(
@@ -6582,47 +6582,47 @@ function Gl(e, t, s) {
6582
6582
  const u = Ms(e)[s];
6583
6583
  return typeof u != "function" ? t[s] : (us[l] = u, u.bind(t));
6584
6584
  }
6585
- function ac(e) {
6585
+ function cc(e) {
6586
6586
  return Ue("Node", e, "ownerDocument");
6587
6587
  }
6588
- function cc(e) {
6588
+ function uc(e) {
6589
6589
  return Ue("Node", e, "childNodes");
6590
6590
  }
6591
- function uc(e) {
6591
+ function dc(e) {
6592
6592
  return Ue("Node", e, "parentNode");
6593
6593
  }
6594
- function dc(e) {
6594
+ function hc(e) {
6595
6595
  return Ue("Node", e, "parentElement");
6596
6596
  }
6597
- function hc(e) {
6597
+ function pc(e) {
6598
6598
  return Ue("Node", e, "textContent");
6599
6599
  }
6600
- function pc(e, t) {
6601
- return Gl("Node", e, "contains")(t);
6602
- }
6603
- function mc(e) {
6604
- return Gl("Node", e, "getRootNode")();
6600
+ function mc(e, t) {
6601
+ return Vl("Node", e, "contains")(t);
6605
6602
  }
6606
6603
  function fc(e) {
6607
- return !e || !("host" in e) ? null : Ue("ShadowRoot", e, "host");
6604
+ return Vl("Node", e, "getRootNode")();
6608
6605
  }
6609
6606
  function bc(e) {
6610
- return e.styleSheets;
6607
+ return !e || !("host" in e) ? null : Ue("ShadowRoot", e, "host");
6611
6608
  }
6612
6609
  function yc(e) {
6610
+ return e.styleSheets;
6611
+ }
6612
+ function Zc(e) {
6613
6613
  return !e || !("shadowRoot" in e) ? null : Ue("Element", e, "shadowRoot");
6614
6614
  }
6615
- function Zc(e, t) {
6615
+ function gc(e, t) {
6616
6616
  return Ue("Element", e, "querySelector")(t);
6617
6617
  }
6618
- function gc(e, t) {
6618
+ function Sc(e, t) {
6619
6619
  return Ue("Element", e, "querySelectorAll")(t);
6620
6620
  }
6621
- function Vl() {
6621
+ function Wl() {
6622
6622
  var e;
6623
6623
  return [
6624
6624
  Ms("MutationObserver").constructor,
6625
- (e = Rl.MutationObserver) != null ? e : () => {
6625
+ (e = Gl.MutationObserver) != null ? e : () => {
6626
6626
  }
6627
6627
  ];
6628
6628
  }
@@ -6648,22 +6648,22 @@ function je(e, t, s) {
6648
6648
  }
6649
6649
  }
6650
6650
  const Q = {
6651
- ownerDocument: ac,
6652
- childNodes: cc,
6653
- parentNode: uc,
6654
- parentElement: dc,
6655
- textContent: hc,
6656
- contains: pc,
6657
- getRootNode: mc,
6658
- host: fc,
6659
- styleSheets: bc,
6660
- shadowRoot: yc,
6661
- querySelector: Zc,
6662
- querySelectorAll: gc,
6651
+ ownerDocument: cc,
6652
+ childNodes: uc,
6653
+ parentNode: dc,
6654
+ parentElement: hc,
6655
+ textContent: pc,
6656
+ contains: mc,
6657
+ getRootNode: fc,
6658
+ host: bc,
6659
+ styleSheets: yc,
6660
+ shadowRoot: Zc,
6661
+ querySelector: gc,
6662
+ querySelectorAll: Sc,
6663
6663
  nowTimestamp: pt,
6664
- mutationObserverCtor: Vl,
6664
+ mutationObserverCtor: Wl,
6665
6665
  patch: je,
6666
- wrapCanvasContextDrawImage: lc
6666
+ wrapCanvasContextDrawImage: oc
6667
6667
  };
6668
6668
  function Se(e, t, s = document) {
6669
6669
  const l = { capture: !0 };
@@ -6720,7 +6720,7 @@ function ti(e, t, s, l, c = window) {
6720
6720
  }
6721
6721
  ), () => ti(e, t, u || {}, !0);
6722
6722
  }
6723
- function Wl(e) {
6723
+ function Il(e) {
6724
6724
  var t, s, l, c;
6725
6725
  const u = e.document;
6726
6726
  return {
@@ -6728,16 +6728,16 @@ function Wl(e) {
6728
6728
  top: u.scrollingElement ? u.scrollingElement.scrollTop : e.pageYOffset !== void 0 ? e.pageYOffset : (u == null ? void 0 : u.documentElement.scrollTop) || (u == null ? void 0 : u.body) && ((l = Q.parentElement(u.body)) == null ? void 0 : l.scrollTop) || ((c = u == null ? void 0 : u.body) == null ? void 0 : c.scrollTop) || 0
6729
6729
  };
6730
6730
  }
6731
- function Il() {
6731
+ function wl() {
6732
6732
  return window.innerHeight || document.documentElement && document.documentElement.clientHeight || document.body && document.body.clientHeight;
6733
6733
  }
6734
- function wl() {
6734
+ function Cl() {
6735
6735
  return window.innerWidth || document.documentElement && document.documentElement.clientWidth || document.body && document.body.clientWidth;
6736
6736
  }
6737
- function Cl(e) {
6737
+ function xl(e) {
6738
6738
  return e ? e.nodeType === e.ELEMENT_NODE ? e : Q.parentElement(e) : null;
6739
6739
  }
6740
- const Sc = (e) => {
6740
+ const Xc = (e) => {
6741
6741
  try {
6742
6742
  if (e instanceof HTMLElement)
6743
6743
  return e.tagName === "CANVAS";
@@ -6749,7 +6749,7 @@ const Sc = (e) => {
6749
6749
  function ye(e, t, s, l) {
6750
6750
  if (!e)
6751
6751
  return !1;
6752
- const c = Cl(e);
6752
+ const c = xl(e);
6753
6753
  if (!c)
6754
6754
  return !1;
6755
6755
  try {
@@ -6760,37 +6760,37 @@ function ye(e, t, s, l) {
6760
6760
  }
6761
6761
  return !!(s && (c.matches(s) || l && c.closest(s) !== null));
6762
6762
  }
6763
- function Xc(e, t) {
6763
+ function Rc(e, t) {
6764
6764
  return t.getId(e) !== -1;
6765
6765
  }
6766
6766
  function ds(e, t, s) {
6767
6767
  return e.tagName === "TITLE" && s.headTitleMutations ? !0 : t.getId(e) === ht;
6768
6768
  }
6769
- function xl(e, t) {
6769
+ function vl(e, t) {
6770
6770
  if (ot(e))
6771
6771
  return !1;
6772
6772
  const s = t.getId(e);
6773
6773
  if (!t.has(s))
6774
6774
  return !0;
6775
6775
  const l = Q.parentNode(e);
6776
- return l && l.nodeType === e.DOCUMENT_NODE ? !1 : l ? xl(l, t) : !0;
6776
+ return l && l.nodeType === e.DOCUMENT_NODE ? !1 : l ? vl(l, t) : !0;
6777
6777
  }
6778
6778
  function ys(e) {
6779
6779
  return !!e.changedTouches;
6780
6780
  }
6781
- function Rc(e = window) {
6781
+ function Gc(e = window) {
6782
6782
  "NodeList" in e && !e.NodeList.prototype.forEach && (e.NodeList.prototype.forEach = Array.prototype.forEach), "DOMTokenList" in e && !e.DOMTokenList.prototype.forEach && (e.DOMTokenList.prototype.forEach = Array.prototype.forEach);
6783
6783
  }
6784
- function vl(e, t) {
6784
+ function Ll(e, t) {
6785
6785
  return !!(e.nodeName === "IFRAME" && t.getMeta(e));
6786
6786
  }
6787
- function Ll(e, t) {
6787
+ function kl(e, t) {
6788
6788
  return !!(e.nodeName === "LINK" && e.nodeType === e.ELEMENT_NODE && e.getAttribute && e.getAttribute("rel") === "stylesheet" && t.getMeta(e));
6789
6789
  }
6790
6790
  function Zs(e) {
6791
6791
  return e ? e instanceof Fs && "shadowRoot" in e ? !!e.shadowRoot : !!Q.shadowRoot(e) : !1;
6792
6792
  }
6793
- class Gc {
6793
+ class Vc {
6794
6794
  constructor() {
6795
6795
  L(this, "id", 1), L(this, "styleIDMap", /* @__PURE__ */ new WeakMap()), L(this, "idStyleMap", /* @__PURE__ */ new Map());
6796
6796
  }
@@ -6819,32 +6819,32 @@ class Gc {
6819
6819
  return this.id++;
6820
6820
  }
6821
6821
  }
6822
- function kl(e) {
6822
+ function Jl(e) {
6823
6823
  var t;
6824
6824
  let s = null;
6825
6825
  return "getRootNode" in e && ((t = Q.getRootNode(e)) == null ? void 0 : t.nodeType) === Node.DOCUMENT_FRAGMENT_NODE && Q.host(Q.getRootNode(e)) && (s = Q.host(Q.getRootNode(e))), s;
6826
6826
  }
6827
- function Vc(e) {
6827
+ function Wc(e) {
6828
6828
  let t = e, s;
6829
- for (; s = kl(t); )
6829
+ for (; s = Jl(t); )
6830
6830
  t = s;
6831
6831
  return t;
6832
6832
  }
6833
- function Wc(e) {
6833
+ function Ic(e) {
6834
6834
  const t = Q.ownerDocument(e);
6835
6835
  if (!t) return !1;
6836
- const s = Vc(e);
6836
+ const s = Wc(e);
6837
6837
  return Q.contains(t, s);
6838
6838
  }
6839
- function Jl(e) {
6839
+ function Yl(e) {
6840
6840
  const t = Q.ownerDocument(e);
6841
- return t ? Q.contains(t, e) || Wc(e) : !1;
6841
+ return t ? Q.contains(t, e) || Ic(e) : !1;
6842
6842
  }
6843
- var q = /* @__PURE__ */ ((e) => (e[e.DomContentLoaded = 0] = "DomContentLoaded", e[e.Load = 1] = "Load", e[e.FullSnapshot = 2] = "FullSnapshot", e[e.IncrementalSnapshot = 3] = "IncrementalSnapshot", e[e.Meta = 4] = "Meta", e[e.Custom = 5] = "Custom", e[e.Plugin = 6] = "Plugin", e[e.Asset = 7] = "Asset", e))(q || {}), A = /* @__PURE__ */ ((e) => (e[e.Mutation = 0] = "Mutation", e[e.MouseMove = 1] = "MouseMove", e[e.MouseInteraction = 2] = "MouseInteraction", e[e.Scroll = 3] = "Scroll", e[e.ViewportResize = 4] = "ViewportResize", e[e.Input = 5] = "Input", e[e.TouchMove = 6] = "TouchMove", e[e.MediaInteraction = 7] = "MediaInteraction", e[e.StyleSheetRule = 8] = "StyleSheetRule", e[e.CanvasMutation = 9] = "CanvasMutation", e[e.Font = 10] = "Font", e[e.Log = 11] = "Log", e[e.Drag = 12] = "Drag", e[e.StyleDeclaration = 13] = "StyleDeclaration", e[e.Selection = 14] = "Selection", e[e.AdoptedStyleSheet = 15] = "AdoptedStyleSheet", e[e.CustomElement = 16] = "CustomElement", e))(A || {}), Xe = /* @__PURE__ */ ((e) => (e[e.MouseUp = 0] = "MouseUp", e[e.MouseDown = 1] = "MouseDown", e[e.Click = 2] = "Click", e[e.ContextMenu = 3] = "ContextMenu", e[e.DblClick = 4] = "DblClick", e[e.Focus = 5] = "Focus", e[e.Blur = 6] = "Blur", e[e.TouchStart = 7] = "TouchStart", e[e.TouchMove_Departed = 8] = "TouchMove_Departed", e[e.TouchEnd = 9] = "TouchEnd", e[e.TouchCancel = 10] = "TouchCancel", e))(Xe || {}), ze = /* @__PURE__ */ ((e) => (e[e.Mouse = 0] = "Mouse", e[e.Pen = 1] = "Pen", e[e.Touch = 2] = "Touch", e))(ze || {}), it = /* @__PURE__ */ ((e) => (e[e["2D"] = 0] = "2D", e[e.WebGL = 1] = "WebGL", e[e.WebGL2 = 2] = "WebGL2", e))(it || {}), $e = /* @__PURE__ */ ((e) => (e[e.Play = 0] = "Play", e[e.Pause = 1] = "Pause", e[e.Seeked = 2] = "Seeked", e[e.VolumeChange = 3] = "VolumeChange", e[e.RateChange = 4] = "RateChange", e))($e || {}), Yl = /* @__PURE__ */ ((e) => (e[e.Document = 0] = "Document", e[e.DocumentType = 1] = "DocumentType", e[e.Element = 2] = "Element", e[e.Text = 3] = "Text", e[e.CDATA = 4] = "CDATA", e[e.Comment = 5] = "Comment", e))(Yl || {});
6843
+ var q = /* @__PURE__ */ ((e) => (e[e.DomContentLoaded = 0] = "DomContentLoaded", e[e.Load = 1] = "Load", e[e.FullSnapshot = 2] = "FullSnapshot", e[e.IncrementalSnapshot = 3] = "IncrementalSnapshot", e[e.Meta = 4] = "Meta", e[e.Custom = 5] = "Custom", e[e.Plugin = 6] = "Plugin", e[e.Asset = 7] = "Asset", e))(q || {}), A = /* @__PURE__ */ ((e) => (e[e.Mutation = 0] = "Mutation", e[e.MouseMove = 1] = "MouseMove", e[e.MouseInteraction = 2] = "MouseInteraction", e[e.Scroll = 3] = "Scroll", e[e.ViewportResize = 4] = "ViewportResize", e[e.Input = 5] = "Input", e[e.TouchMove = 6] = "TouchMove", e[e.MediaInteraction = 7] = "MediaInteraction", e[e.StyleSheetRule = 8] = "StyleSheetRule", e[e.CanvasMutation = 9] = "CanvasMutation", e[e.Font = 10] = "Font", e[e.Log = 11] = "Log", e[e.Drag = 12] = "Drag", e[e.StyleDeclaration = 13] = "StyleDeclaration", e[e.Selection = 14] = "Selection", e[e.AdoptedStyleSheet = 15] = "AdoptedStyleSheet", e[e.CustomElement = 16] = "CustomElement", e))(A || {}), Xe = /* @__PURE__ */ ((e) => (e[e.MouseUp = 0] = "MouseUp", e[e.MouseDown = 1] = "MouseDown", e[e.Click = 2] = "Click", e[e.ContextMenu = 3] = "ContextMenu", e[e.DblClick = 4] = "DblClick", e[e.Focus = 5] = "Focus", e[e.Blur = 6] = "Blur", e[e.TouchStart = 7] = "TouchStart", e[e.TouchMove_Departed = 8] = "TouchMove_Departed", e[e.TouchEnd = 9] = "TouchEnd", e[e.TouchCancel = 10] = "TouchCancel", e))(Xe || {}), ze = /* @__PURE__ */ ((e) => (e[e.Mouse = 0] = "Mouse", e[e.Pen = 1] = "Pen", e[e.Touch = 2] = "Touch", e))(ze || {}), it = /* @__PURE__ */ ((e) => (e[e["2D"] = 0] = "2D", e[e.WebGL = 1] = "WebGL", e[e.WebGL2 = 2] = "WebGL2", e))(it || {}), $e = /* @__PURE__ */ ((e) => (e[e.Play = 0] = "Play", e[e.Pause = 1] = "Pause", e[e.Seeked = 2] = "Seeked", e[e.VolumeChange = 3] = "VolumeChange", e[e.RateChange = 4] = "RateChange", e))($e || {}), Nl = /* @__PURE__ */ ((e) => (e[e.Document = 0] = "Document", e[e.DocumentType = 1] = "DocumentType", e[e.Element = 2] = "Element", e[e.Text = 3] = "Text", e[e.CDATA = 4] = "CDATA", e[e.Comment = 5] = "Comment", e))(Nl || {});
6844
6844
  function Vn(e) {
6845
6845
  return "__ln" in e;
6846
6846
  }
6847
- class Ic {
6847
+ class wc {
6848
6848
  constructor() {
6849
6849
  L(this, "length", 0), L(this, "head", null), L(this, "tail", null);
6850
6850
  }
@@ -6878,21 +6878,21 @@ class Ic {
6878
6878
  }
6879
6879
  }
6880
6880
  const Wn = (e, t) => `${e}@${t}`;
6881
- class wc {
6881
+ class Cc {
6882
6882
  constructor() {
6883
6883
  L(this, "frozen", !1), L(this, "locked", !1), L(this, "texts", []), L(this, "attributes", []), L(this, "attributeMap", /* @__PURE__ */ new WeakMap()), L(this, "removes", []), L(this, "mapRemoves", []), L(this, "movedMap", {}), L(this, "addedSet", /* @__PURE__ */ new Set()), L(this, "movedSet", /* @__PURE__ */ new Set()), L(this, "droppedSet", /* @__PURE__ */ new Set()), L(this, "removesSubTreeCache", /* @__PURE__ */ new Set()), L(this, "mutationCb"), L(this, "blockClass"), L(this, "blockSelector"), L(this, "maskTextClass"), L(this, "maskTextSelector"), L(this, "inlineStylesheet"), L(this, "maskInputOptions"), L(this, "maskTextFn"), L(this, "maskInputFn"), L(this, "keepIframeSrcFn"), L(this, "recordCanvas"), L(this, "inlineImages"), L(this, "inlineVideos"), L(this, "privacySetting"), L(this, "slimDOMOptions"), L(this, "dataURLOptions"), L(this, "doc"), L(this, "mirror"), L(this, "iframeManager"), L(this, "stylesheetManager"), L(this, "shadowDomManager"), L(this, "canvasManager"), L(this, "processedNodeManager"), L(this, "unattachedDoc"), L(this, "processMutations", (t) => {
6884
6884
  t.forEach(this.processMutation), this.emit();
6885
6885
  }), L(this, "emit", () => {
6886
6886
  if (this.frozen || this.locked)
6887
6887
  return;
6888
- const t = [], s = /* @__PURE__ */ new Set(), l = new Ic(), c = (m) => {
6888
+ const t = [], s = /* @__PURE__ */ new Set(), l = new wc(), c = (m) => {
6889
6889
  let h = m, d = ht;
6890
6890
  for (; d === ht; )
6891
6891
  h = h && h.nextSibling, d = h && this.mirror.getId(h);
6892
6892
  return d;
6893
6893
  }, u = (m) => {
6894
6894
  const h = Q.parentNode(m);
6895
- if (!h || !Jl(m))
6895
+ if (!h || !Yl(m))
6896
6896
  return;
6897
6897
  let d = !1;
6898
6898
  if (m.nodeType === Node.TEXT_NODE) {
@@ -6901,7 +6901,7 @@ class wc {
6901
6901
  return;
6902
6902
  o === "STYLE" && this.addedSet.has(h) && (d = !0);
6903
6903
  }
6904
- const r = ot(h) ? this.mirror.getId(kl(m)) : this.mirror.getId(h), n = c(m);
6904
+ const r = ot(h) ? this.mirror.getId(Jl(m)) : this.mirror.getId(h), n = c(m);
6905
6905
  if (r === -1 || n === -1)
6906
6906
  return l.addNode(m);
6907
6907
  const i = et(m, {
@@ -6924,7 +6924,7 @@ class wc {
6924
6924
  inlineVideos: this.inlineVideos,
6925
6925
  privacySetting: this.privacySetting,
6926
6926
  onSerialize: (o) => {
6927
- vl(o, this.mirror) && this.iframeManager.addIframe(o), Ll(o, this.mirror) && this.stylesheetManager.trackLinkElement(
6927
+ Ll(o, this.mirror) && this.iframeManager.addIframe(o), kl(o, this.mirror) && this.stylesheetManager.trackLinkElement(
6928
6928
  o
6929
6929
  ), Zs(m) && this.shadowDomManager.addShadowRoot(Q.shadowRoot(m), this.doc);
6930
6930
  },
@@ -6991,7 +6991,7 @@ class wc {
6991
6991
  const r = m.node, n = Q.parentNode(r);
6992
6992
  n && n.tagName === "TEXTAREA" && this.genTextAreaValueMutation(n);
6993
6993
  let i = m.value;
6994
- const o = this.privacySetting === "strict", a = this.privacySetting === "default" && tl(i), p = (d = (h = m.node) == null ? void 0 : h.parentElement) == null ? void 0 : d.getAttribute("data-hl-record");
6994
+ const o = this.privacySetting === "strict", a = this.privacySetting === "default" && il(i), p = (d = (h = m.node) == null ? void 0 : h.parentElement) == null ? void 0 : d.getAttribute("data-hl-record");
6995
6995
  return (o || a) && !p && i && (i = Ws(i)), {
6996
6996
  id: this.mirror.getId(r),
6997
6997
  value: i
@@ -7039,13 +7039,13 @@ class wc {
7039
7039
  case "characterData": {
7040
7040
  const s = Q.textContent(t.target);
7041
7041
  !ye(t.target, this.blockClass, this.blockSelector, !1) && s !== t.oldValue && this.texts.push({
7042
- value: ll(
7042
+ value: ol(
7043
7043
  t.target,
7044
7044
  this.maskTextClass,
7045
7045
  this.maskTextSelector,
7046
7046
  !0
7047
7047
  // checkAncestors
7048
- ) && s ? this.maskTextFn ? this.maskTextFn(s, Cl(t.target)) : s.replace(/[\S]/g, "*") : s,
7048
+ ) && s ? this.maskTextFn ? this.maskTextFn(s, xl(t.target)) : s.replace(/[\S]/g, "*") : s,
7049
7049
  node: t.target
7050
7050
  });
7051
7051
  break;
@@ -7078,7 +7078,7 @@ class wc {
7078
7078
  attributes: {},
7079
7079
  styleDiff: {},
7080
7080
  _unchangedStyles: {}
7081
- }, this.attributes.push(u), this.attributeMap.set(t.target, u)), l === "type" && s.tagName === "INPUT" && (t.oldValue || "").toLowerCase() === "password" && s.setAttribute("data-rr-is-password", "true"), !nl(s.tagName, l)) {
7081
+ }, this.attributes.push(u), this.attributeMap.set(t.target, u)), l === "type" && s.tagName === "INPUT" && (t.oldValue || "").toLowerCase() === "password" && s.setAttribute("data-rr-is-password", "true"), !ll(s.tagName, l)) {
7082
7082
  if (t.target.tagName === "INPUT") {
7083
7083
  const b = t.target;
7084
7084
  if (b.type === "password") {
@@ -7086,7 +7086,7 @@ class wc {
7086
7086
  break;
7087
7087
  }
7088
7088
  }
7089
- if (u.attributes[l] = rl(
7089
+ if (u.attributes[l] = nl(
7090
7090
  this.doc,
7091
7091
  Qe(s.tagName),
7092
7092
  Qe(l),
@@ -7119,11 +7119,11 @@ class wc {
7119
7119
  }
7120
7120
  t.addedNodes.forEach((s) => this.genAdds(s, t.target)), t.removedNodes.forEach((s) => {
7121
7121
  const l = this.mirror.getId(s), c = ot(t.target) ? this.mirror.getId(Q.host(t.target)) : this.mirror.getId(t.target);
7122
- ye(t.target, this.blockClass, this.blockSelector, !1) || ds(s, this.mirror, this.slimDOMOptions) || !Xc(s, this.mirror) || (this.addedSet.has(s) ? (gs(this.addedSet, s), this.droppedSet.add(s)) : this.addedSet.has(t.target) && l === -1 || xl(t.target, this.mirror) || (this.movedSet.has(s) && this.movedMap[Wn(l, c)] ? gs(this.movedSet, s) : (this.removes.push({
7122
+ ye(t.target, this.blockClass, this.blockSelector, !1) || ds(s, this.mirror, this.slimDOMOptions) || !Rc(s, this.mirror) || (this.addedSet.has(s) ? (gs(this.addedSet, s), this.droppedSet.add(s)) : this.addedSet.has(t.target) && l === -1 || vl(t.target, this.mirror) || (this.movedSet.has(s) && this.movedMap[Wn(l, c)] ? gs(this.movedSet, s) : (this.removes.push({
7123
7123
  parentId: c,
7124
7124
  id: l,
7125
7125
  isShadow: ot(t.target) && at(t.target) ? !0 : void 0
7126
- }), Cc(s, this.removesSubTreeCache))), this.mapRemoves.push(s));
7126
+ }), xc(s, this.removesSubTreeCache))), this.mapRemoves.push(s));
7127
7127
  });
7128
7128
  break;
7129
7129
  }
@@ -7195,7 +7195,7 @@ class wc {
7195
7195
  function gs(e, t) {
7196
7196
  e.delete(t), Q.childNodes(t).forEach((s) => gs(e, s));
7197
7197
  }
7198
- function Cc(e, t) {
7198
+ function xc(e, t) {
7199
7199
  const s = [e];
7200
7200
  for (; s.length; ) {
7201
7201
  const l = s.pop();
@@ -7203,24 +7203,24 @@ function Cc(e, t) {
7203
7203
  }
7204
7204
  }
7205
7205
  function In(e, t, s) {
7206
- return e.size === 0 ? !1 : xc(e, t);
7206
+ return e.size === 0 ? !1 : vc(e, t);
7207
7207
  }
7208
- function xc(e, t, s) {
7208
+ function vc(e, t, s) {
7209
7209
  const l = Q.parentNode(t);
7210
7210
  return l ? e.has(l) : !1;
7211
7211
  }
7212
7212
  function wn(e, t) {
7213
- return e.size === 0 ? !1 : Nl(e, t);
7213
+ return e.size === 0 ? !1 : Tl(e, t);
7214
7214
  }
7215
- function Nl(e, t) {
7215
+ function Tl(e, t) {
7216
7216
  const s = Q.parentNode(t);
7217
- return s ? e.has(s) ? !0 : Nl(e, s) : !1;
7217
+ return s ? e.has(s) ? !0 : Tl(e, s) : !1;
7218
7218
  }
7219
7219
  let ct;
7220
- function vc(e) {
7220
+ function Lc(e) {
7221
7221
  ct = e;
7222
7222
  }
7223
- function Lc() {
7223
+ function kc() {
7224
7224
  ct = void 0;
7225
7225
  }
7226
7226
  const _ = (e) => ct ? (...s) => {
@@ -7244,10 +7244,10 @@ function gt(e) {
7244
7244
  }
7245
7245
  return e && e.target;
7246
7246
  }
7247
- function Tl(e, t) {
7248
- const s = new wc();
7247
+ function Ul(e, t) {
7248
+ const s = new Cc();
7249
7249
  Ee.push(s), s.init(e);
7250
- const [l, c] = Vl(), u = new l(
7250
+ const [l, c] = Wl(), u = new l(
7251
7251
  _(s.processMutations.bind(s))
7252
7252
  );
7253
7253
  return u.observe(t, {
@@ -7259,7 +7259,7 @@ function Tl(e, t) {
7259
7259
  subtree: !0
7260
7260
  }), [u, c];
7261
7261
  }
7262
- function kc({
7262
+ function Jc({
7263
7263
  mousemoveCb: e,
7264
7264
  sampling: t,
7265
7265
  doc: s,
@@ -7308,7 +7308,7 @@ function kc({
7308
7308
  d.forEach((r) => r());
7309
7309
  });
7310
7310
  }
7311
- function Jc({
7311
+ function Yc({
7312
7312
  mouseInteractionCb: e,
7313
7313
  doc: t,
7314
7314
  mirror: s,
@@ -7324,7 +7324,7 @@ function Jc({
7324
7324
  const h = (d) => (r) => {
7325
7325
  const n = gt(r);
7326
7326
  if (ye(n, l, c, !0) || // We ignore canvas elements for rage click detection because we cannot infer what inside the canvas is getting interacted with.
7327
- Sc(n))
7327
+ Xc(n))
7328
7328
  return;
7329
7329
  let i = null, o = d;
7330
7330
  if ("pointerType" in r) {
@@ -7376,7 +7376,7 @@ function Jc({
7376
7376
  b.forEach((d) => d());
7377
7377
  });
7378
7378
  }
7379
- function Ul({
7379
+ function Kl({
7380
7380
  scrollCb: e,
7381
7381
  doc: t,
7382
7382
  mirror: s,
@@ -7392,7 +7392,7 @@ function Ul({
7392
7392
  return;
7393
7393
  const h = s.getId(m);
7394
7394
  if (m === t && t.defaultView) {
7395
- const d = Wl(t.defaultView);
7395
+ const d = Il(t.defaultView);
7396
7396
  e({
7397
7397
  id: h,
7398
7398
  x: d.left,
@@ -7410,12 +7410,12 @@ function Ul({
7410
7410
  );
7411
7411
  return Se("scroll", f, t);
7412
7412
  }
7413
- function Yc({ viewportResizeCb: e }, { win: t }) {
7413
+ function Nc({ viewportResizeCb: e }, { win: t }) {
7414
7414
  let s = -1, l = -1;
7415
7415
  const c = _(
7416
7416
  mt(
7417
7417
  _(() => {
7418
- const u = Il(), f = wl();
7418
+ const u = wl(), f = Cl();
7419
7419
  (s !== u || l !== f) && (e({
7420
7420
  width: Number(f),
7421
7421
  height: Number(u)
@@ -7426,8 +7426,8 @@ function Yc({ viewportResizeCb: e }, { win: t }) {
7426
7426
  );
7427
7427
  return Se("resize", c, t);
7428
7428
  }
7429
- const Nc = ["INPUT", "TEXTAREA", "SELECT"], Cn = /* @__PURE__ */ new WeakMap();
7430
- function Tc({
7429
+ const Tc = ["INPUT", "TEXTAREA", "SELECT"], Cn = /* @__PURE__ */ new WeakMap();
7430
+ function Uc({
7431
7431
  inputCb: e,
7432
7432
  doc: t,
7433
7433
  mirror: s,
@@ -7443,11 +7443,11 @@ function Tc({
7443
7443
  function r(Z) {
7444
7444
  let S = gt(Z);
7445
7445
  const G = Z.isTrusted, g = S && S.tagName;
7446
- if (S && g === "OPTION" && (S = Q.parentElement(S)), !S || !g || Nc.indexOf(g) < 0 || ye(S, l, c, !0) || S.classList.contains(u) || f && S.matches(f))
7446
+ if (S && g === "OPTION" && (S = Q.parentElement(S)), !S || !g || Tc.indexOf(g) < 0 || ye(S, l, c, !0) || S.classList.contains(u) || f && S.matches(f))
7447
7447
  return;
7448
7448
  let y = S.value, R = !1;
7449
7449
  const I = Ut(S) || "", V = S.getAttribute("data-hl-record");
7450
- I === "radio" || I === "checkbox" ? R = S.checked : il({
7450
+ I === "radio" || I === "checkbox" ? R = S.checked : sl({
7451
7451
  maskInputOptions: b,
7452
7452
  type: I,
7453
7453
  tagName: g,
@@ -7552,8 +7552,8 @@ function He(e, t, s) {
7552
7552
  function Ke(e, t, s, l) {
7553
7553
  e[t] === s && (e[t] = l);
7554
7554
  }
7555
- const Uc = 5;
7556
- function Kc({
7555
+ const Kc = 5;
7556
+ function Fc({
7557
7557
  styleSheetRuleCb: e,
7558
7558
  mirror: t,
7559
7559
  stylesheetManager: s,
@@ -7758,7 +7758,7 @@ function Kc({
7758
7758
  };
7759
7759
  let j = 0;
7760
7760
  const ne = (k) => {
7761
- j >= Uc || (j += 1, k.insertRule || (g = u.CSSStyleSheet.prototype.insertRule, G = X(g), u.CSSStyleSheet.prototype.insertRule = G), k.deleteRule || (W = u.CSSStyleSheet.prototype.deleteRule, V = Z(W), u.CSSStyleSheet.prototype.deleteRule = V));
7761
+ j >= Kc || (j += 1, k.insertRule || (g = u.CSSStyleSheet.prototype.insertRule, G = X(g), u.CSSStyleSheet.prototype.insertRule = G), k.deleteRule || (W = u.CSSStyleSheet.prototype.deleteRule, V = Z(W), u.CSSStyleSheet.prototype.deleteRule = V));
7762
7762
  }, C = (k) => {
7763
7763
  for (let J = 0; J < l.styleSheets.length; J++) {
7764
7764
  const N = l.styleSheets[J];
@@ -7775,7 +7775,7 @@ function Kc({
7775
7775
  }
7776
7776
  const O = f.get(N);
7777
7777
  if (!O) {
7778
- if (Array.from(T).some(($) => $n($))) {
7778
+ if (Array.from(T).some(($) => qn($))) {
7779
7779
  b.add(N);
7780
7780
  continue;
7781
7781
  }
@@ -7849,7 +7849,7 @@ function Kc({
7849
7849
  });
7850
7850
  });
7851
7851
  }
7852
- function Kl({
7852
+ function Fl({
7853
7853
  mirror: e,
7854
7854
  stylesheetManager: t
7855
7855
  }, s) {
@@ -7889,7 +7889,7 @@ function Kl({
7889
7889
  });
7890
7890
  }));
7891
7891
  }
7892
- function Fc({
7892
+ function Mc({
7893
7893
  styleDeclarationCb: e,
7894
7894
  mirror: t,
7895
7895
  ignoreCSSAttributes: s,
@@ -7950,7 +7950,7 @@ function Fc({
7950
7950
  c.CSSStyleDeclaration.prototype.setProperty = u, c.CSSStyleDeclaration.prototype.removeProperty = f;
7951
7951
  });
7952
7952
  }
7953
- function Mc({
7953
+ function zc({
7954
7954
  mediaInteractionCb: e,
7955
7955
  blockClass: t,
7956
7956
  blockSelector: s,
@@ -7988,7 +7988,7 @@ function Mc({
7988
7988
  b.forEach((m) => m());
7989
7989
  });
7990
7990
  }
7991
- function zc({ fontCb: e, doc: t }) {
7991
+ function Hc({ fontCb: e, doc: t }) {
7992
7992
  const s = t.defaultView;
7993
7993
  if (!s)
7994
7994
  return () => {
@@ -8028,7 +8028,7 @@ function zc({ fontCb: e, doc: t }) {
8028
8028
  l.forEach((b) => b());
8029
8029
  });
8030
8030
  }
8031
- function Hc(e) {
8031
+ function Oc(e) {
8032
8032
  const { doc: t, mirror: s, blockClass: l, blockSelector: c, selectionCb: u } = e;
8033
8033
  let f = !0;
8034
8034
  const b = _(() => {
@@ -8049,7 +8049,7 @@ function Hc(e) {
8049
8049
  });
8050
8050
  return b(), Se("selectionchange", b);
8051
8051
  }
8052
- function Oc({
8052
+ function Pc({
8053
8053
  doc: e,
8054
8054
  customElementCb: t
8055
8055
  }) {
@@ -8074,7 +8074,7 @@ function Oc({
8074
8074
  }
8075
8075
  );
8076
8076
  }
8077
- function Pc(e, t) {
8077
+ function Ec(e, t) {
8078
8078
  const {
8079
8079
  mutationCb: s,
8080
8080
  mousemoveCb: l,
@@ -8118,27 +8118,27 @@ function Pc(e, t) {
8118
8118
  t.customElement && t.customElement(...a), o(...a);
8119
8119
  };
8120
8120
  }
8121
- function Ec(e, t = {}) {
8121
+ function Bc(e, t = {}) {
8122
8122
  const s = e.doc.defaultView;
8123
8123
  if (!s)
8124
8124
  return () => {
8125
8125
  };
8126
- Pc(e, t);
8126
+ Ec(e, t);
8127
8127
  let l, c = () => {
8128
8128
  };
8129
- e.recordDOM && ([l, c] = Tl(e, e.doc));
8130
- const u = kc(e), f = Jc(e), b = Ul(e), m = Yc(e, {
8129
+ e.recordDOM && ([l, c] = Ul(e, e.doc));
8130
+ const u = Jc(e), f = Yc(e), b = Kl(e), m = Nc(e, {
8131
8131
  win: s
8132
- }), h = Tc(e), d = Mc(e);
8132
+ }), h = Uc(e), d = zc(e);
8133
8133
  let r = () => {
8134
8134
  }, n = () => {
8135
8135
  }, i = () => {
8136
8136
  }, o = () => {
8137
8137
  };
8138
- e.recordDOM && (r = Kc(e, { win: s }), n = Kl(e, e.doc), i = Fc(e, {
8138
+ e.recordDOM && (r = Fc(e, { win: s }), n = Fl(e, e.doc), i = Mc(e, {
8139
8139
  win: s
8140
- }), e.collectFonts && (o = zc(e)));
8141
- const a = Hc(e), p = Oc(e), X = [];
8140
+ }), e.collectFonts && (o = Hc(e)));
8141
+ const a = Oc(e), p = Pc(e), X = [];
8142
8142
  for (const Z of e.plugins)
8143
8143
  X.push(
8144
8144
  Z.observer(Z.callback, s, Z.options)
@@ -8196,9 +8196,9 @@ class xn {
8196
8196
  return s || (s = /* @__PURE__ */ new Map(), this.iframeRemoteIdToIdMap.set(t, s)), s;
8197
8197
  }
8198
8198
  }
8199
- class Bc {
8199
+ class Qc {
8200
8200
  constructor(t) {
8201
- L(this, "iframes", /* @__PURE__ */ new WeakMap()), L(this, "crossOriginIframeMap", /* @__PURE__ */ new WeakMap()), L(this, "crossOriginIframeMirror", new xn(sl)), L(this, "crossOriginIframeStyleMirror"), L(this, "crossOriginIframeRootIdMap", /* @__PURE__ */ new WeakMap()), L(this, "mirror"), L(this, "mutationCb"), L(this, "wrappedEmit"), L(this, "loadListener"), L(this, "stylesheetManager"), L(this, "recordCrossOriginIframes"), this.mutationCb = t.mutationCb, this.wrappedEmit = t.wrappedEmit, this.stylesheetManager = t.stylesheetManager, this.recordCrossOriginIframes = t.recordCrossOriginIframes, this.crossOriginIframeStyleMirror = new xn(
8201
+ L(this, "iframes", /* @__PURE__ */ new WeakMap()), L(this, "crossOriginIframeMap", /* @__PURE__ */ new WeakMap()), L(this, "crossOriginIframeMirror", new xn(rl)), L(this, "crossOriginIframeStyleMirror"), L(this, "crossOriginIframeRootIdMap", /* @__PURE__ */ new WeakMap()), L(this, "mirror"), L(this, "mutationCb"), L(this, "wrappedEmit"), L(this, "loadListener"), L(this, "stylesheetManager"), L(this, "recordCrossOriginIframes"), this.mutationCb = t.mutationCb, this.wrappedEmit = t.wrappedEmit, this.stylesheetManager = t.stylesheetManager, this.recordCrossOriginIframes = t.recordCrossOriginIframes, this.crossOriginIframeStyleMirror = new xn(
8202
8202
  this.stylesheetManager.styleMirror.generateId.bind(
8203
8203
  this.stylesheetManager.styleMirror
8204
8204
  )
@@ -8356,12 +8356,12 @@ class Bc {
8356
8356
  });
8357
8357
  }
8358
8358
  patchRootIdOnNode(t, s) {
8359
- t.type !== Yl.Document && !t.rootId && (t.rootId = s), "childNodes" in t && t.childNodes.forEach((l) => {
8359
+ t.type !== Nl.Document && !t.rootId && (t.rootId = s), "childNodes" in t && t.childNodes.forEach((l) => {
8360
8360
  this.patchRootIdOnNode(l, s);
8361
8361
  });
8362
8362
  }
8363
8363
  }
8364
- class Qc {
8364
+ class Dc {
8365
8365
  constructor(t) {
8366
8366
  L(this, "shadowDoms", /* @__PURE__ */ new WeakSet()), L(this, "mutationCb"), L(this, "scrollCb"), L(this, "bypassOptions"), L(this, "mirror"), L(this, "restoreHandlers", []), this.mutationCb = t.mutationCb, this.scrollCb = t.scrollCb, this.bypassOptions = t.bypassOptions, this.mirror = t.mirror, this.init();
8367
8367
  }
@@ -8371,7 +8371,7 @@ class Qc {
8371
8371
  addShadowRoot(t, s) {
8372
8372
  if (!at(t) || this.shadowDoms.has(t)) return;
8373
8373
  this.shadowDoms.add(t);
8374
- const [l] = Tl(
8374
+ const [l] = Ul(
8375
8375
  me(K({}, this.bypassOptions), {
8376
8376
  doc: s,
8377
8377
  mutationCb: this.mutationCb,
@@ -8381,7 +8381,7 @@ class Qc {
8381
8381
  t
8382
8382
  );
8383
8383
  this.restoreHandlers.push(() => l.disconnect()), this.restoreHandlers.push(
8384
- Ul(me(K({}, this.bypassOptions), {
8384
+ Kl(me(K({}, this.bypassOptions), {
8385
8385
  scrollCb: this.scrollCb,
8386
8386
  // https://gist.github.com/praveenpuglia/0832da687ed5a5d7a0907046c9ef1813
8387
8387
  // scroll is not allowed to pass the boundary, so we need to listen the shadow document
@@ -8393,7 +8393,7 @@ class Qc {
8393
8393
  t.adoptedStyleSheets,
8394
8394
  this.mirror.getId(Q.host(t))
8395
8395
  ), this.restoreHandlers.push(
8396
- Kl(
8396
+ Fl(
8397
8397
  {
8398
8398
  mirror: this.mirror,
8399
8399
  stylesheetManager: this.bypassOptions.stylesheetManager
@@ -8424,7 +8424,7 @@ class Qc {
8424
8424
  function(c) {
8425
8425
  return function(u) {
8426
8426
  const f = c.call(this, u), b = Q.shadowRoot(this);
8427
- return b && Jl(this) && l.addShadowRoot(b, s), f;
8427
+ return b && Yl(this) && l.addShadowRoot(b, s), f;
8428
8428
  };
8429
8429
  }
8430
8430
  )
@@ -8439,24 +8439,24 @@ class Qc {
8439
8439
  }), this.restoreHandlers = [], this.shadowDoms = /* @__PURE__ */ new WeakSet();
8440
8440
  }
8441
8441
  }
8442
- var tt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", Dc = typeof Uint8Array == "undefined" ? [] : new Uint8Array(256);
8442
+ var tt = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", jc = typeof Uint8Array == "undefined" ? [] : new Uint8Array(256);
8443
8443
  for (var kt = 0; kt < tt.length; kt++)
8444
- Dc[tt.charCodeAt(kt)] = kt;
8445
- var jc = function(e) {
8444
+ jc[tt.charCodeAt(kt)] = kt;
8445
+ var Ac = function(e) {
8446
8446
  var t = new Uint8Array(e), s, l = t.length, c = "";
8447
8447
  for (s = 0; s < l; s += 3)
8448
8448
  c += tt[t[s] >> 2], c += tt[(t[s] & 3) << 4 | t[s + 1] >> 4], c += tt[(t[s + 1] & 15) << 2 | t[s + 2] >> 6], c += tt[t[s + 2] & 63];
8449
8449
  return l % 3 === 2 ? c = c.substring(0, c.length - 1) + "=" : l % 3 === 1 && (c = c.substring(0, c.length - 2) + "=="), c;
8450
8450
  };
8451
8451
  const vn = /* @__PURE__ */ new Map();
8452
- function Ac(e, t) {
8452
+ function _c(e, t) {
8453
8453
  let s = vn.get(e);
8454
8454
  return s || (s = /* @__PURE__ */ new Map(), vn.set(e, s)), s.has(t) || s.set(t, []), s.get(t);
8455
8455
  }
8456
- const Fl = (e, t, s) => {
8457
- if (!e || !(zl(e, t) || typeof e == "object"))
8456
+ const Ml = (e, t, s) => {
8457
+ if (!e || !(Hl(e, t) || typeof e == "object"))
8458
8458
  return;
8459
- const l = e.constructor.name, c = Ac(s, l);
8459
+ const l = e.constructor.name, c = _c(s, l);
8460
8460
  let u = c.indexOf(e);
8461
8461
  return u === -1 && (u = c.length, c.push(e)), u;
8462
8462
  };
@@ -8476,7 +8476,7 @@ function Yt(e, t, s) {
8476
8476
  // value instanceof SharedArrayBuffer ||
8477
8477
  e instanceof ArrayBuffer
8478
8478
  ) {
8479
- const l = e.constructor.name, c = jc(e);
8479
+ const l = e.constructor.name, c = Ac(e);
8480
8480
  return {
8481
8481
  rr_type: l,
8482
8482
  base64: c
@@ -8509,8 +8509,8 @@ function Yt(e, t, s) {
8509
8509
  rr_type: e.constructor.name,
8510
8510
  args: [Yt(e.data, t, s), e.width, e.height]
8511
8511
  };
8512
- if (zl(e, t) || typeof e == "object") {
8513
- const l = e.constructor.name, c = Fl(e, t, s);
8512
+ if (Hl(e, t) || typeof e == "object") {
8513
+ const l = e.constructor.name, c = Ml(e, t, s);
8514
8514
  return {
8515
8515
  rr_type: l,
8516
8516
  index: c
@@ -8520,7 +8520,7 @@ function Yt(e, t, s) {
8520
8520
  }
8521
8521
  return e;
8522
8522
  }
8523
- const Ml = (e, t, s) => e.map((l) => Yt(l, t, s)), zl = (e, t) => !![
8523
+ const zl = (e, t, s) => e.map((l) => Yt(l, t, s)), Hl = (e, t) => !![
8524
8524
  "WebGLActiveInfo",
8525
8525
  "WebGLBuffer",
8526
8526
  "WebGLFramebuffer",
@@ -8538,7 +8538,7 @@ const Ml = (e, t, s) => e.map((l) => Yt(l, t, s)), zl = (e, t) => !![
8538
8538
  ).find(
8539
8539
  (c) => e instanceof t[c]
8540
8540
  );
8541
- function _c(e, t, s, l) {
8541
+ function $c(e, t, s, l) {
8542
8542
  const c = [], u = Object.getOwnPropertyNames(
8543
8543
  t.CanvasRenderingContext2D.prototype
8544
8544
  );
@@ -8552,7 +8552,7 @@ function _c(e, t, s, l) {
8552
8552
  function(m) {
8553
8553
  return function(...h) {
8554
8554
  return ye(this.canvas, s, l, !0) || setTimeout(() => {
8555
- const d = Ml(h, t, this);
8555
+ const d = zl(h, t, this);
8556
8556
  e(this.canvas, {
8557
8557
  type: it["2D"],
8558
8558
  property: f,
@@ -8584,7 +8584,7 @@ function _c(e, t, s, l) {
8584
8584
  c.forEach((f) => f());
8585
8585
  };
8586
8586
  }
8587
- function $c(e) {
8587
+ function qc(e) {
8588
8588
  return e === "experimental-webgl" ? "webgl" : e;
8589
8589
  }
8590
8590
  function Ln(e, t, s, l) {
@@ -8596,7 +8596,7 @@ function Ln(e, t, s, l) {
8596
8596
  function(f) {
8597
8597
  return function(b, ...m) {
8598
8598
  if (!ye(this, t, s, !0)) {
8599
- const h = $c(b);
8599
+ const h = qc(b);
8600
8600
  if ("__context" in this || (this.__context = h), l && ["webgl", "webgl2"].includes(h))
8601
8601
  if (m[0] && typeof m[0] == "object") {
8602
8602
  const d = m[0];
@@ -8639,8 +8639,8 @@ function kn(e, t, s, l, c, u) {
8639
8639
  function(d) {
8640
8640
  return function(...r) {
8641
8641
  const n = d.apply(this, r);
8642
- if (Fl(n, u, this), "tagName" in this.canvas && !ye(this.canvas, l, c, !0)) {
8643
- const i = Ml(r, u, this), o = {
8642
+ if (Ml(n, u, this), "tagName" in this.canvas && !ye(this.canvas, l, c, !0)) {
8643
+ const i = zl(r, u, this), o = {
8644
8644
  type: t,
8645
8645
  property: m,
8646
8646
  args: i
@@ -8667,7 +8667,7 @@ function kn(e, t, s, l, c, u) {
8667
8667
  }
8668
8668
  return f;
8669
8669
  }
8670
- function qc(e, t, s, l) {
8670
+ function eu(e, t, s, l) {
8671
8671
  const c = [];
8672
8672
  return typeof t.WebGLRenderingContext != "undefined" && c.push(
8673
8673
  ...kn(
@@ -8691,7 +8691,7 @@ function qc(e, t, s, l) {
8691
8691
  c.forEach((u) => u());
8692
8692
  };
8693
8693
  }
8694
- const Hl = `(function() {
8694
+ const Ol = `(function() {
8695
8695
  "use strict";
8696
8696
  var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
8697
8697
  var lookup = typeof Uint8Array === "undefined" ? [] : new Uint8Array(256);
@@ -8791,8 +8791,8 @@ const Hl = `(function() {
8791
8791
  };
8792
8792
  })();
8793
8793
  //# sourceMappingURL=image-bitmap-data-url-worker-DwtK8A0z.js.map
8794
- `, Jn = typeof self != "undefined" && self.Blob && new Blob([Hl], { type: "text/javascript;charset=utf-8" });
8795
- function eu(e) {
8794
+ `, Jn = typeof self != "undefined" && self.Blob && new Blob([Ol], { type: "text/javascript;charset=utf-8" });
8795
+ function tu(e) {
8796
8796
  let t;
8797
8797
  try {
8798
8798
  if (t = Jn && (self.URL || self.webkitURL).createObjectURL(Jn), !t) throw "";
@@ -8804,7 +8804,7 @@ function eu(e) {
8804
8804
  }), s;
8805
8805
  } catch (s) {
8806
8806
  return new Worker(
8807
- "data:text/javascript;charset=utf-8," + encodeURIComponent(Hl),
8807
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(Ol),
8808
8808
  {
8809
8809
  name: e == null ? void 0 : e.name
8810
8810
  }
@@ -8813,7 +8813,7 @@ function eu(e) {
8813
8813
  t && (self.URL || self.webkitURL).revokeObjectURL(t);
8814
8814
  }
8815
8815
  }
8816
- class tu {
8816
+ class iu {
8817
8817
  constructor(t) {
8818
8818
  L(this, "pendingCanvasMutations", /* @__PURE__ */ new Map()), L(this, "rafStamps", { latestId: 0, invokeId: null }), L(this, "mirror"), L(this, "logger"), L(this, "worker"), L(this, "snapshotInProgressMap", /* @__PURE__ */ new Map()), L(this, "lastSnapshotTime", /* @__PURE__ */ new Map()), L(this, "options"), L(this, "mutationCb"), L(this, "resetObservers"), L(this, "frozen", !1), L(this, "locked", !1), L(this, "processMutation", (r, n) => {
8819
8819
  (this.rafStamps.invokeId && this.rafStamps.latestId !== this.rafStamps.invokeId || !this.rafStamps.invokeId) && (this.rafStamps.invokeId = this.rafStamps.latestId), this.pendingCanvasMutations.has(r) || this.pendingCanvasMutations.set(r, []), this.pendingCanvasMutations.get(r).push(n);
@@ -8829,7 +8829,7 @@ class tu {
8829
8829
  initialSnapshotDelay: h,
8830
8830
  dataURLOptions: d
8831
8831
  } = t;
8832
- this.mutationCb = t.mutationCb, this.mirror = t.mirror, this.logger = t.logger, this.worker = new eu(), this.worker.onmessage = (r) => {
8832
+ this.mutationCb = t.mutationCb, this.mirror = t.mirror, this.logger = t.logger, this.worker = new tu(), this.worker.onmessage = (r) => {
8833
8833
  const { id: n } = r.data;
8834
8834
  if (this.snapshotInProgressMap.set(n, !1), !("base64" in r.data)) {
8835
8835
  this.debug(null, "canvas worker received empty message", {
@@ -9106,12 +9106,12 @@ class tu {
9106
9106
  s,
9107
9107
  l,
9108
9108
  !1
9109
- ), u = _c(
9109
+ ), u = $c(
9110
9110
  this.processMutation.bind(this),
9111
9111
  t,
9112
9112
  s,
9113
9113
  l
9114
- ), f = qc(
9114
+ ), f = eu(
9115
9115
  this.processMutation.bind(this),
9116
9116
  t,
9117
9117
  s,
@@ -9150,9 +9150,9 @@ class tu {
9150
9150
  this.mutationCb({ id: s, type: u, commands: c }), this.pendingCanvasMutations.delete(t);
9151
9151
  }
9152
9152
  }
9153
- class iu {
9153
+ class su {
9154
9154
  constructor(t) {
9155
- L(this, "trackedLinkElements", /* @__PURE__ */ new WeakSet()), L(this, "mutationCb"), L(this, "adoptedStyleSheetCb"), L(this, "styleMirror", new Gc()), this.mutationCb = t.mutationCb, this.adoptedStyleSheetCb = t.adoptedStyleSheetCb;
9155
+ L(this, "trackedLinkElements", /* @__PURE__ */ new WeakSet()), L(this, "mutationCb"), L(this, "adoptedStyleSheetCb"), L(this, "styleMirror", new Vc()), this.mutationCb = t.mutationCb, this.adoptedStyleSheetCb = t.adoptedStyleSheetCb;
9156
9156
  }
9157
9157
  attachLinkElement(t, s) {
9158
9158
  "_cssText" in s.attributes && this.mutationCb({
@@ -9181,7 +9181,7 @@ class iu {
9181
9181
  this.styleMirror.has(u) ? f = this.styleMirror.getId(u) : (f = this.styleMirror.add(u), c.push({
9182
9182
  styleId: f,
9183
9183
  rules: Array.from(u.rules || CSSRule, (b, m) => ({
9184
- rule: _n(b, u.href),
9184
+ rule: $n(b, u.href),
9185
9185
  index: m
9186
9186
  }))
9187
9187
  })), l.styleIds.push(f);
@@ -9195,7 +9195,7 @@ class iu {
9195
9195
  trackStylesheetInLinkElement(t) {
9196
9196
  }
9197
9197
  }
9198
- class su {
9198
+ class ru {
9199
9199
  constructor() {
9200
9200
  L(this, "nodeMap", /* @__PURE__ */ new WeakMap()), L(this, "active", !1);
9201
9201
  }
@@ -9220,7 +9220,7 @@ try {
9220
9220
  } catch (e) {
9221
9221
  console.debug("Unable to override Array.from", e);
9222
9222
  }
9223
- const we = ra();
9223
+ const we = na();
9224
9224
  function Ne(e = {}) {
9225
9225
  var t;
9226
9226
  const {
@@ -9259,7 +9259,7 @@ function Ne(e = {}) {
9259
9259
  errorHandler: F,
9260
9260
  logger: B
9261
9261
  } = e, M = K(K({}, e.dataURLOptions), typeof ((t = e.sampling) == null ? void 0 : t.canvas) == "object" ? e.sampling.canvas.dataURLOptions : void 0);
9262
- vc(F);
9262
+ Lc(F);
9263
9263
  const j = R ? window.parent === window : !0;
9264
9264
  let ne = !1;
9265
9265
  if (!j)
@@ -9291,8 +9291,8 @@ function Ne(e = {}) {
9291
9291
  textarea: !0,
9292
9292
  select: !0,
9293
9293
  password: !0
9294
- } : i !== void 0 ? i : { password: !0 }, oe = ol(o);
9295
- Rc();
9294
+ } : i !== void 0 ? i : { password: !0 }, oe = al(o);
9295
+ Gc();
9296
9296
  let ee, de = 0;
9297
9297
  const k = (P) => {
9298
9298
  for (const he of D || [])
@@ -9346,10 +9346,10 @@ function Ne(e = {}) {
9346
9346
  data: K({
9347
9347
  source: A.AdoptedStyleSheet
9348
9348
  }, P)
9349
- }), T = new iu({
9349
+ }), T = new su({
9350
9350
  mutationCb: J,
9351
9351
  adoptedStyleSheetCb: z
9352
- }), O = new Bc({
9352
+ }), O = new Qc({
9353
9353
  mirror: we,
9354
9354
  mutationCb: J,
9355
9355
  stylesheetManager: T,
@@ -9362,8 +9362,8 @@ function Ne(e = {}) {
9362
9362
  crossOriginIframeMirror: O.crossOriginIframeMirror,
9363
9363
  crossOriginIframeStyleMirror: O.crossOriginIframeStyleMirror
9364
9364
  });
9365
- const $ = new su(), ue = typeof (S == null ? void 0 : S.canvas) == "object" ? S.canvas : { fps: S == null ? void 0 : S.canvas };
9366
- ut = new tu({
9365
+ const $ = new ru(), ue = typeof (S == null ? void 0 : S.canvas) == "object" ? S.canvas : { fps: S == null ? void 0 : S.canvas };
9366
+ ut = new iu({
9367
9367
  recordCanvas: y,
9368
9368
  recordLocalVideos: v,
9369
9369
  recordRemoteVideos: x,
@@ -9381,7 +9381,7 @@ function Ne(e = {}) {
9381
9381
  maxSnapshotDimension: ue.maxSnapshotDimension,
9382
9382
  logger: B
9383
9383
  });
9384
- const Re = new Qc({
9384
+ const Re = new Dc({
9385
9385
  mutationCb: J,
9386
9386
  scrollCb: N,
9387
9387
  bypassOptions: {
@@ -9416,13 +9416,13 @@ function Ne(e = {}) {
9416
9416
  type: q.Meta,
9417
9417
  data: {
9418
9418
  href: window.location.href,
9419
- width: wl(),
9420
- height: Il()
9419
+ width: Cl(),
9420
+ height: wl()
9421
9421
  }
9422
9422
  },
9423
9423
  P
9424
9424
  ), T.reset(), Re.init(), Ee.forEach((se) => se.lock());
9425
- const he = Na(document, {
9425
+ const he = Ta(document, {
9426
9426
  mirror: we,
9427
9427
  blockClass: u,
9428
9428
  blockSelector: f,
@@ -9439,7 +9439,7 @@ function Ne(e = {}) {
9439
9439
  inlineVideos: x,
9440
9440
  privacySetting: w,
9441
9441
  onSerialize: (se) => {
9442
- vl(se, we) && O.addIframe(se), Ll(se, we) && T.trackLinkElement(se), Zs(se) && Re.addShadowRoot(Q.shadowRoot(se), document);
9442
+ Ll(se, we) && O.addIframe(se), kl(se, we) && T.trackLinkElement(se), Zs(se) && Re.addShadowRoot(Q.shadowRoot(se), document);
9443
9443
  },
9444
9444
  onIframeLoad: (se, ae) => {
9445
9445
  O.attachIframe(se, ae), Re.observeAttachShadow(se);
@@ -9456,7 +9456,7 @@ function Ne(e = {}) {
9456
9456
  type: q.FullSnapshot,
9457
9457
  data: {
9458
9458
  node: he,
9459
- initialOffset: Wl(window)
9459
+ initialOffset: Il(window)
9460
9460
  }
9461
9461
  },
9462
9462
  P
@@ -9468,7 +9468,7 @@ function Ne(e = {}) {
9468
9468
  try {
9469
9469
  const P = [], he = (ae) => {
9470
9470
  var Ge;
9471
- return _(Ec)(
9471
+ return _(Bc)(
9472
9472
  {
9473
9473
  mutationCb: J,
9474
9474
  mousemoveCb: (ie, ii) => ce({
@@ -9618,7 +9618,7 @@ function Ne(e = {}) {
9618
9618
  } catch (Ge) {
9619
9619
  String(Ge).toLowerCase().includes("cross-origin") || console.warn(Ge);
9620
9620
  }
9621
- }), $.destroy(), zt = !1, Lc();
9621
+ }), $.destroy(), zt = !1, kc();
9622
9622
  };
9623
9623
  } catch (P) {
9624
9624
  console.warn(P);
@@ -9651,7 +9651,7 @@ var Yn;
9651
9651
  (function(e) {
9652
9652
  e[e.NotStarted = 0] = "NotStarted", e[e.Running = 1] = "Running", e[e.Stopped = 2] = "Stopped";
9653
9653
  })(Yn || (Yn = {}));
9654
- const { addCustomEvent: Nn } = Ne, ru = (e, t, s) => {
9654
+ const { addCustomEvent: Nn } = Ne, nu = (e, t, s) => {
9655
9655
  switch (e) {
9656
9656
  case "strict":
9657
9657
  return [!0, void 0];
@@ -9660,7 +9660,7 @@ const { addCustomEvent: Nn } = Ne, ru = (e, t, s) => {
9660
9660
  case "none":
9661
9661
  return [!!t, me(K({}, s), { password: !0 })];
9662
9662
  }
9663
- }, nu = (e, t) => e === "strict" ? "strict" : (t != null ? t : e === "default") ? "default" : "none", lu = (e) => {
9663
+ }, lu = (e, t) => e === "strict" ? "strict" : (t != null ? t : e === "default") ? "default" : "none", ou = (e) => {
9664
9664
  const t = (l) => {
9665
9665
  if (l.target) {
9666
9666
  const c = l.target, u = Bn(c);
@@ -9668,7 +9668,7 @@ const { addCustomEvent: Nn } = Ne, ru = (e, t, s) => {
9668
9668
  }
9669
9669
  }, s = { capture: !0 };
9670
9670
  return window.addEventListener("click", t, s), () => window.removeEventListener("click", t, s);
9671
- }, ou = (e) => {
9671
+ }, au = (e) => {
9672
9672
  const t = (s) => {
9673
9673
  if (s.target) {
9674
9674
  const l = Bn(s.target);
@@ -9676,7 +9676,7 @@ const { addCustomEvent: Nn } = Ne, ru = (e, t, s) => {
9676
9676
  }
9677
9677
  };
9678
9678
  return window.addEventListener("focusin", t), () => window.removeEventListener("focusin", t);
9679
- }, au = (e) => {
9679
+ }, cu = (e) => {
9680
9680
  let t, s;
9681
9681
  if (typeof document.hidden != "undefined" ? (t = "hidden", s = "visibilitychange") : typeof document.msHidden != "undefined" ? (t = "msHidden", s = "msvisibilitychange") : typeof document.webkitHidden != "undefined" && (t = "webkitHidden", s = "webkitvisibilitychange"), s === void 0)
9682
9682
  return () => {
@@ -9691,7 +9691,7 @@ const { addCustomEvent: Nn } = Ne, ru = (e, t, s) => {
9691
9691
  document.addEventListener(s, c);
9692
9692
  const u = s;
9693
9693
  return () => document.removeEventListener(u, c);
9694
- }, cu = (e) => {
9694
+ }, uu = (e) => {
9695
9695
  e(window.location.href);
9696
9696
  var t = XMLHttpRequest.prototype.send;
9697
9697
  XMLHttpRequest.prototype.send = function(u) {
@@ -9731,7 +9731,7 @@ const { addCustomEvent: Nn } = Ne, ru = (e, t, s) => {
9731
9731
  };
9732
9732
  hs(f) && e(f);
9733
9733
  }
9734
- return window.addEventListener("storage", s), eo(({ keyName: u }) => {
9734
+ return window.addEventListener("storage", s), to(({ keyName: u }) => {
9735
9735
  s({
9736
9736
  key: u
9737
9737
  });
@@ -9763,21 +9763,21 @@ const { addCustomEvent: Nn } = Ne, ru = (e, t, s) => {
9763
9763
  } catch (c) {
9764
9764
  return !1;
9765
9765
  }
9766
- const s = uu(t), l = Le(
9766
+ const s = du(t), l = Le(
9767
9767
  Ye.SEGMENT_LAST_SENT_HASH_KEY
9768
9768
  );
9769
9769
  return l === void 0 ? (Be(Ye.SEGMENT_LAST_SENT_HASH_KEY, s), !0) : s !== l ? (Be(Ye.SEGMENT_LAST_SENT_HASH_KEY, s), !0) : !1;
9770
- }, uu = (e) => {
9770
+ }, du = (e) => {
9771
9771
  var t = 0, s = e.length, l = 0;
9772
9772
  if (s > 0) for (; l < s; ) t = (t << 5) - t + e.charCodeAt(l++) | 0;
9773
9773
  return t.toString();
9774
- }, du = (e, t) => {
9775
- const s = hu(e);
9774
+ }, hu = (e, t) => {
9775
+ const s = pu(e);
9776
9776
  let l = [];
9777
9777
  const c = !1, u = !0, f = [];
9778
9778
  for (let m = 0; m < s.length; m++) {
9779
9779
  let h = s[m].split("+");
9780
- l = [], h.length > 1 && (l = fu(Ol, h)), h = h[h.length - 1], h = h === "*" ? "*" : mu(h), h in Ce || (Ce[h] = []);
9780
+ l = [], h.length > 1 && (l = bu(Pl, h)), h = h[h.length - 1], h = h === "*" ? "*" : fu(h), h in Ce || (Ce[h] = []);
9781
9781
  const d = {
9782
9782
  mods: l,
9783
9783
  shortcut: s[m],
@@ -9790,8 +9790,8 @@ const { addCustomEvent: Nn } = Ne, ru = (e, t, s) => {
9790
9790
  };
9791
9791
  Ce[h].push(d), f.push({ key: h, handler: d });
9792
9792
  }
9793
- const b = (m) => Zu(m);
9794
- return bu(document, "keydown", b), () => {
9793
+ const b = (m) => gu(m);
9794
+ return yu(document, "keydown", b), () => {
9795
9795
  document.removeEventListener("keydown", b);
9796
9796
  for (const { key: m, handler: h } of f) {
9797
9797
  const d = Ce[m], r = d ? d.indexOf(h) : -1;
@@ -9800,7 +9800,7 @@ const { addCustomEvent: Nn } = Ne, ru = (e, t, s) => {
9800
9800
  };
9801
9801
  };
9802
9802
  let Ze = [];
9803
- function hu(e) {
9803
+ function pu(e) {
9804
9804
  typeof e != "string" && (e = ""), e = e.replace(/\s/g, "");
9805
9805
  const t = e.split(",");
9806
9806
  let s = t.lastIndexOf("");
@@ -9808,7 +9808,7 @@ function hu(e) {
9808
9808
  t[s - 1] += ",", t.splice(s, 1), s = t.lastIndexOf("");
9809
9809
  return t;
9810
9810
  }
9811
- const Ce = {}, ps = typeof navigator != "undefined" ? navigator.userAgent.toLowerCase().indexOf("firefox") > 0 : !1, pu = {
9811
+ const Ce = {}, ps = typeof navigator != "undefined" ? navigator.userAgent.toLowerCase().indexOf("firefox") > 0 : !1, mu = {
9812
9812
  backspace: 8,
9813
9813
  tab: 9,
9814
9814
  clear: 12,
@@ -9872,7 +9872,7 @@ const Ce = {}, ps = typeof navigator != "undefined" ? navigator.userAgent.toLowe
9872
9872
  18: !1,
9873
9873
  17: !1,
9874
9874
  91: !1
9875
- }, Ol = {
9875
+ }, Pl = {
9876
9876
  // shiftKey
9877
9877
  "⇧": 16,
9878
9878
  shift: 16,
@@ -9888,23 +9888,23 @@ const Ce = {}, ps = typeof navigator != "undefined" ? navigator.userAgent.toLowe
9888
9888
  "⌘": 91,
9889
9889
  cmd: 91,
9890
9890
  command: 91
9891
- }, mu = (e) => (
9891
+ }, fu = (e) => (
9892
9892
  // @ts-expect-error
9893
- pu[e.toLowerCase()] || // @ts-expect-error
9894
- Ol[e.toLowerCase()] || e.toUpperCase().charCodeAt(0)
9893
+ mu[e.toLowerCase()] || // @ts-expect-error
9894
+ Pl[e.toLowerCase()] || e.toUpperCase().charCodeAt(0)
9895
9895
  );
9896
- function fu(e, t) {
9896
+ function bu(e, t) {
9897
9897
  const s = t.slice(0, t.length - 1);
9898
9898
  for (let l = 0; l < s.length; l++)
9899
9899
  s[l] = e[s[l].toLowerCase()];
9900
9900
  return s;
9901
9901
  }
9902
- function bu(e, t, s) {
9902
+ function yu(e, t, s) {
9903
9903
  e.addEventListener ? e.addEventListener(t, s, !1) : e.attachEvent && e.attachEvent(`on${t}`, () => {
9904
9904
  s(window.event);
9905
9905
  });
9906
9906
  }
9907
- function yu(e, t, s) {
9907
+ function Zu(e, t, s) {
9908
9908
  let l;
9909
9909
  if (t.scope === s || t.scope === "all") {
9910
9910
  l = t.mods.length > 0;
@@ -9915,7 +9915,7 @@ function yu(e, t, s) {
9915
9915
  (t.mods.length === 0 && !ge[16] && !ge[18] && !ge[17] && !ge[91] || l || t.shortcut === "*") && t.method(e, t) === !1 && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, e.stopPropagation && e.stopPropagation(), e.cancelBubble && (e.cancelBubble = !0));
9916
9916
  }
9917
9917
  }
9918
- function Zu(e) {
9918
+ function gu(e) {
9919
9919
  const t = Ce["*"];
9920
9920
  let s = e.keyCode || e.which || e.charCode;
9921
9921
  if ((s === 93 || s === 224) && (s = 91), Ze.indexOf(s) === -1 && s !== 229 && Ze.push(s), ["ctrlKey", "altKey", "shiftKey", "metaKey"].forEach((l) => {
@@ -9932,20 +9932,20 @@ function Zu(e) {
9932
9932
  e.type === "keyup" && Ce[s][l].keyup) && Ce[s][l].key
9933
9933
  ) {
9934
9934
  const c = Ce[s][l];
9935
- yu(e, c, "all");
9935
+ Zu(e, c, "all");
9936
9936
  }
9937
9937
  }
9938
9938
  }
9939
9939
  }
9940
- const Kn = "iframe parent ready", Fn = "iframe ok", ft = "highlightLogs", gu = (e) => {
9940
+ const Kn = "iframe parent ready", Fn = "iframe ok", ft = "highlightLogs", Su = (e) => {
9941
9941
  let t = Le(ft) || "";
9942
9942
  t = t + "[" + (/* @__PURE__ */ new Date()).getTime() + "] " + e + `
9943
9943
  `, Be(ft, t);
9944
- }, Su = () => Le(ft) || "", Xu = (e) => {
9944
+ }, Xu = () => Le(ft) || "", Ru = (e) => {
9945
9945
  if (!e)
9946
9946
  return;
9947
9947
  let t = Le(ft) || "";
9948
- t && (t.startsWith(e) ? (t = t.slice(e.length), Be(ft, t)) : gu(
9948
+ t && (t.startsWith(e) ? (t = t.slice(e.length), Be(ft, t)) : Su(
9949
9949
  "Unable to clear logs " + e.replace(`
9950
9950
  `, " ") + " from " + t.replace(`
9951
9951
  `, " ")
@@ -10020,16 +10020,16 @@ var We = Uint8Array, Ve = Uint16Array, zs = Int32Array, Hs = new We([
10020
10020
  /* unused */
10021
10021
  0,
10022
10022
  0
10023
- ]), Mn = new We([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), Pl = function(e, t) {
10023
+ ]), Mn = new We([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), El = function(e, t) {
10024
10024
  for (var s = new Ve(31), l = 0; l < 31; ++l)
10025
10025
  s[l] = t += 1 << e[l - 1];
10026
10026
  for (var c = new zs(s[30]), l = 1; l < 30; ++l)
10027
10027
  for (var u = s[l]; u < s[l + 1]; ++u)
10028
10028
  c[u] = u - s[l] << 5 | l;
10029
10029
  return { b: s, r: c };
10030
- }, El = Pl(Hs, 2), Ru = El.b, Ss = El.r;
10031
- Ru[28] = 258, Ss[258] = 28;
10032
- var Gu = Pl(Os, 0), zn = Gu.r, Xs = new Ve(32768);
10030
+ }, Bl = El(Hs, 2), Gu = Bl.b, Ss = Bl.r;
10031
+ Gu[28] = 258, Ss[258] = 28;
10032
+ var Vu = El(Os, 0), zn = Vu.r, Xs = new Ve(32768);
10033
10033
  for (var le = 0; le < 32768; ++le) {
10034
10034
  var Fe = (le & 43690) >> 1 | (le & 21845) << 1;
10035
10035
  Fe = (Fe & 52428) >> 2 | (Fe & 13107) << 2, Fe = (Fe & 61680) >> 4 | (Fe & 3855) << 4, Xs[le] = ((Fe & 65280) >> 8 | (Fe & 255) << 8) >> 1;
@@ -10064,9 +10064,9 @@ for (var le = 280; le < 288; ++le)
10064
10064
  var Ht = new We(32);
10065
10065
  for (var le = 0; le < 32; ++le)
10066
10066
  Ht[le] = 5;
10067
- var Vu = /* @__PURE__ */ dt(De, 9, 0), Wu = /* @__PURE__ */ dt(Ht, 5, 0), Bl = function(e) {
10067
+ var Wu = /* @__PURE__ */ dt(De, 9, 0), Iu = /* @__PURE__ */ dt(Ht, 5, 0), Ql = function(e) {
10068
10068
  return (e + 7) / 8 | 0;
10069
- }, Ql = function(e, t, s) {
10069
+ }, Dl = function(e, t, s) {
10070
10070
  return (s == null || s > e.length) && (s = e.length), new We(e.subarray(t, s));
10071
10071
  }, ke = function(e, t, s) {
10072
10072
  s <<= t & 7;
@@ -10081,7 +10081,7 @@ var Vu = /* @__PURE__ */ dt(De, 9, 0), Wu = /* @__PURE__ */ dt(Ht, 5, 0), Bl = f
10081
10081
  e[l] && s.push({ s: l, f: e[l] });
10082
10082
  var c = s.length, u = s.slice();
10083
10083
  if (!c)
10084
- return { t: jl, l: 0 };
10084
+ return { t: Al, l: 0 };
10085
10085
  if (c == 1) {
10086
10086
  var f = new We(s[0].s + 1);
10087
10087
  return f[s[0].s] = 1, { t: f, l: 1 };
@@ -10146,8 +10146,8 @@ var Vu = /* @__PURE__ */ dt(De, 9, 0), Wu = /* @__PURE__ */ dt(Ht, 5, 0), Bl = f
10146
10146
  for (var s = 0, l = 0; l < t.length; ++l)
10147
10147
  s += e[l] * t[l];
10148
10148
  return s;
10149
- }, Dl = function(e, t, s) {
10150
- var l = s.length, c = Bl(t + 2);
10149
+ }, jl = function(e, t, s) {
10150
+ var l = s.length, c = Ql(t + 2);
10151
10151
  e[c] = l & 255, e[c + 1] = l >> 8, e[c + 2] = e[c] ^ 255, e[c + 3] = e[c + 1] ^ 255;
10152
10152
  for (var u = 0; u < l; ++u)
10153
10153
  e[c + u + 4] = s[u];
@@ -10162,7 +10162,7 @@ var Vu = /* @__PURE__ */ dt(De, 9, 0), Wu = /* @__PURE__ */ dt(Ht, 5, 0), Bl = f
10162
10162
  ;
10163
10163
  var D = h + 5 << 3, E = lt(c, De) + lt(u, Ht) + f, w = lt(c, n) + lt(u, a) + f + 14 + 3 * x + lt(R, W) + 2 * R[16] + 3 * R[17] + 7 * R[18];
10164
10164
  if (m >= 0 && D <= E && D <= w)
10165
- return Dl(t, d, e.subarray(m, m + h));
10165
+ return jl(t, d, e.subarray(m, m + h));
10166
10166
  var te, Y, F, B;
10167
10167
  if (ke(t, d, 1 + (w < E)), d += 2, w < E) {
10168
10168
  te = dt(n, i, 0), Y = n, F = dt(a, p, 0), B = a;
@@ -10177,7 +10177,7 @@ var Vu = /* @__PURE__ */ dt(De, 9, 0), Wu = /* @__PURE__ */ dt(Ht, 5, 0), Bl = f
10177
10177
  ke(t, d, M[oe]), d += W[oe], oe > 15 && (ke(t, d, C[I] >> 5 & 127), d += C[I] >> 12);
10178
10178
  }
10179
10179
  } else
10180
- te = Vu, Y = De, F = Wu, B = Ht;
10180
+ te = Wu, Y = De, F = Iu, B = Ht;
10181
10181
  for (var I = 0; I < b; ++I) {
10182
10182
  var ee = l[I];
10183
10183
  if (ee > 255) {
@@ -10189,11 +10189,11 @@ var Vu = /* @__PURE__ */ dt(De, 9, 0), Wu = /* @__PURE__ */ dt(Ht, 5, 0), Bl = f
10189
10189
  nt(t, d, te[ee]), d += Y[ee];
10190
10190
  }
10191
10191
  return nt(t, d, te[256]), d + Y[256];
10192
- }, Iu = /* @__PURE__ */ new zs([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]), jl = /* @__PURE__ */ new We(0), wu = function(e, t, s, l, c, u) {
10192
+ }, wu = /* @__PURE__ */ new zs([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]), Al = /* @__PURE__ */ new We(0), Cu = function(e, t, s, l, c, u) {
10193
10193
  var f = u.z || e.length, b = new We(l + f + 5 * (1 + Math.ceil(f / 7e3)) + c), m = b.subarray(l, b.length - c), h = u.l, d = (u.r || 0) & 7;
10194
10194
  if (t) {
10195
10195
  d && (m[0] = u.r >> 3);
10196
- for (var r = Iu[t - 1], n = r >> 13, i = r & 8191, o = (1 << s) - 1, a = u.p || new Ve(32768), p = u.h || new Ve(o + 1), X = Math.ceil(s / 3), Z = 2 * X, S = function($) {
10196
+ for (var r = wu[t - 1], n = r >> 13, i = r & 8191, o = (1 << s) - 1, a = u.p || new Ve(32768), p = u.h || new Ve(o + 1), X = Math.ceil(s / 3), Z = 2 * X, S = function($) {
10197
10197
  return (e[$] ^ e[$ + 1] << X ^ e[$ + 2] << Z) & o;
10198
10198
  }, G = new zs(25e3), g = new Ve(288), y = new Ve(32), R = 0, I = 0, V = u.i || 0, W = 0, v = u.w || 0, x = 0; V + 2 < f; ++V) {
10199
10199
  var D = S(V), E = V & 32767, w = p[D];
@@ -10237,62 +10237,62 @@ var Vu = /* @__PURE__ */ dt(De, 9, 0), Wu = /* @__PURE__ */ dt(Ht, 5, 0), Bl = f
10237
10237
  } else {
10238
10238
  for (var V = u.w || 0; V < f + h; V += 65535) {
10239
10239
  var O = V + 65535;
10240
- O >= f && (m[d / 8 | 0] = h, O = f), d = Dl(m, d + 1, e.subarray(V, O));
10240
+ O >= f && (m[d / 8 | 0] = h, O = f), d = jl(m, d + 1, e.subarray(V, O));
10241
10241
  }
10242
10242
  u.i = f;
10243
10243
  }
10244
- return Ql(b, 0, l + Bl(d) + c);
10245
- }, Cu = /* @__PURE__ */ function() {
10244
+ return Dl(b, 0, l + Ql(d) + c);
10245
+ }, xu = /* @__PURE__ */ function() {
10246
10246
  for (var e = new Int32Array(256), t = 0; t < 256; ++t) {
10247
10247
  for (var s = t, l = 9; --l; )
10248
10248
  s = (s & 1 && -306674912) ^ s >>> 1;
10249
10249
  e[t] = s;
10250
10250
  }
10251
10251
  return e;
10252
- }(), xu = function() {
10252
+ }(), vu = function() {
10253
10253
  var e = -1;
10254
10254
  return {
10255
10255
  p: function(t) {
10256
10256
  for (var s = e, l = 0; l < t.length; ++l)
10257
- s = Cu[s & 255 ^ t[l]] ^ s >>> 8;
10257
+ s = xu[s & 255 ^ t[l]] ^ s >>> 8;
10258
10258
  e = s;
10259
10259
  },
10260
10260
  d: function() {
10261
10261
  return ~e;
10262
10262
  }
10263
10263
  };
10264
- }, vu = function(e, t, s, l, c) {
10264
+ }, Lu = function(e, t, s, l, c) {
10265
10265
  if (!c && (c = { l: 1 }, t.dictionary)) {
10266
10266
  var u = t.dictionary.subarray(-32768), f = new We(u.length + e.length);
10267
10267
  f.set(u), f.set(e, u.length), e = f, c.w = u.length;
10268
10268
  }
10269
- return wu(e, t.level == null ? 6 : t.level, t.mem == null ? c.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(e.length))) * 1.5) : 20 : 12 + t.mem, s, l, c);
10269
+ return Cu(e, t.level == null ? 6 : t.level, t.mem == null ? c.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(e.length))) * 1.5) : 20 : 12 + t.mem, s, l, c);
10270
10270
  }, Gs = function(e, t, s) {
10271
10271
  for (; s; ++t)
10272
10272
  e[t] = s, s >>>= 8;
10273
- }, Lu = function(e, t) {
10273
+ }, ku = function(e, t) {
10274
10274
  var s = t.filename;
10275
10275
  if (e[0] = 31, e[1] = 139, e[2] = 8, e[8] = t.level < 2 ? 4 : t.level == 9 ? 2 : 0, e[9] = 3, t.mtime != 0 && Gs(e, 4, Math.floor(new Date(t.mtime || Date.now()) / 1e3)), s) {
10276
10276
  e[3] = 8;
10277
10277
  for (var l = 0; l <= s.length; ++l)
10278
10278
  e[l + 10] = s.charCodeAt(l);
10279
10279
  }
10280
- }, ku = function(e) {
10280
+ }, Ju = function(e) {
10281
10281
  return 10 + (e.filename ? e.filename.length + 1 : 0);
10282
10282
  };
10283
- function Ju(e, t) {
10283
+ function Yu(e, t) {
10284
10284
  t || (t = {});
10285
- var s = xu(), l = e.length;
10285
+ var s = vu(), l = e.length;
10286
10286
  s.p(e);
10287
- var c = vu(e, t, ku(t), 8), u = c.length;
10288
- return Lu(c, t), Gs(c, u - 8, s.d()), Gs(c, u - 4, l), c;
10287
+ var c = Lu(e, t, Ju(t), 8), u = c.length;
10288
+ return ku(c, t), Gs(c, u - 8, s.d()), Gs(c, u - 4, l), c;
10289
10289
  }
10290
- var Pn = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder(), Yu = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
10290
+ var Pn = typeof TextEncoder != "undefined" && /* @__PURE__ */ new TextEncoder(), Nu = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
10291
10291
  try {
10292
- Yu.decode(jl, { stream: !0 });
10292
+ Nu.decode(Al, { stream: !0 });
10293
10293
  } catch (e) {
10294
10294
  }
10295
- function Nu(e, t) {
10295
+ function Tu(e, t) {
10296
10296
  var s;
10297
10297
  if (Pn)
10298
10298
  return Pn.encode(e);
@@ -10306,11 +10306,11 @@ function Nu(e, t) {
10306
10306
  var m = e.charCodeAt(s);
10307
10307
  m < 128 || t ? f(m) : m < 2048 ? (f(192 | m >> 6), f(128 | m & 63)) : m > 55295 && m < 57344 ? (m = 65536 + (m & 1047552) | e.charCodeAt(++s) & 1023, f(240 | m >> 18), f(128 | m >> 12 & 63), f(128 | m >> 6 & 63), f(128 | m & 63)) : (f(224 | m >> 12), f(128 | m >> 6 & 63), f(128 | m & 63));
10308
10308
  }
10309
- return Ql(c, 0, u);
10309
+ return Dl(c, 0, u);
10310
10310
  }
10311
- function Tu(e) {
10311
+ function Uu(e) {
10312
10312
  return fe(this, null, function* () {
10313
- const t = Nu(JSON.stringify(e)), s = Ju(t), l = yield new Promise((c) => {
10313
+ const t = Tu(JSON.stringify(e)), s = Yu(t), l = yield new Promise((c) => {
10314
10314
  const u = new FileReader();
10315
10315
  u.onload = () => c(u.result), u.readAsDataURL(new Blob([new Uint8Array(s)]));
10316
10316
  });
@@ -10321,8 +10321,8 @@ function Tu(e) {
10321
10321
  };
10322
10322
  });
10323
10323
  }
10324
- const Al = "dmFyIFFyPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxYcj1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgV3I9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyICRlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIG9uPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYW49T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgbXQ9KEYsQiwkKT0+QiBpbiBGP1FyKEYsQix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6JH0pOkZbQl09JCxEPShGLEIpPT57Zm9yKHZhciAkIGluIEJ8fChCPXt9KSlvbi5jYWxsKEIsJCkmJm10KEYsJCxCWyRdKTtpZigkZSlmb3IodmFyICQgb2YgJGUoQikpYW4uY2FsbChCLCQpJiZtdChGLCQsQlskXSk7cmV0dXJuIEZ9LFVlPShGLEIpPT5YcihGLFdyKEIpKTt2YXIgdmU9KEYsQik9Pnt2YXIgJD17fTtmb3IodmFyIGVlIGluIEYpb24uY2FsbChGLGVlKSYmQi5pbmRleE9mKGVlKTwwJiYoJFtlZV09RltlZV0pO2lmKEYhPW51bGwmJiRlKWZvcih2YXIgZWUgb2YgJGUoRikpQi5pbmRleE9mKGVlKTwwJiZhbi5jYWxsKEYsZWUpJiYoJFtlZV09RltlZV0pO3JldHVybiAkfTt2YXIgeXQ9KEYsQiwkKT0+bXQoRix0eXBlb2YgQiE9InN5bWJvbCI/QisiIjpCLCQpO3ZhciBKPShGLEIsJCk9Pm5ldyBQcm9taXNlKChlZSxPZSk9Pnt2YXIgVmU9c2U9Pnt0cnl7RWUoJC5uZXh0KHNlKSl9Y2F0Y2goX2Upe09lKF9lKX19LGxlPXNlPT57dHJ5e0VlKCQudGhyb3coc2UpKX1jYXRjaChfZSl7T2UoX2UpfX0sRWU9c2U9PnNlLmRvbmU/ZWUoc2UudmFsdWUpOlByb21pc2UucmVzb2x2ZShzZS52YWx1ZSkudGhlbihWZSxsZSk7RWUoKCQ9JC5hcHBseShGLEIpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IEY9SlNPTixCPWU9PmUudG9VcHBlckNhc2UoKSwkPWU9Pntjb25zdCB0PXt9O3JldHVybiBlLmZvckVhY2goKG4saSk9Pnt0W2ldPW59KSx0fSxlZT0oZSx0LG4pPT5lLmRvY3VtZW50P2U6e2RvY3VtZW50OmUsdmFyaWFibGVzOnQscmVxdWVzdEhlYWRlcnM6bixzaWduYWw6dm9pZCAwfSxPZT0oZSx0LG4pPT5lLnF1ZXJ5P2U6e3F1ZXJ5OmUsdmFyaWFibGVzOnQscmVxdWVzdEhlYWRlcnM6bixzaWduYWw6dm9pZCAwfSxWZT0oZSx0KT0+ZS5kb2N1bWVudHM/ZTp7ZG9jdW1lbnRzOmUscmVxdWVzdEhlYWRlcnM6dCxzaWduYWw6dm9pZCAwfTtmdW5jdGlvbiBsZShlLHQpe2lmKCEhIWUpdGhyb3cgbmV3IEVycm9yKHQpfWZ1bmN0aW9uIEVlKGUpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsfWZ1bmN0aW9uIHNlKGUsdCl7aWYoISEhZSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgaW52YXJpYW50IHRyaWdnZXJlZC4iKX1jb25zdCBfZT0vXHJcbnxbXG5ccl0vZztmdW5jdGlvbiBxZShlLHQpe2xldCBuPTAsaT0xO2Zvcihjb25zdCByIG9mIGUuYm9keS5tYXRjaEFsbChfZSkpe2lmKHR5cGVvZiByLmluZGV4PT0ibnVtYmVyInx8c2UoITEpLHIuaW5kZXg+PXQpYnJlYWs7bj1yLmluZGV4K3JbMF0ubGVuZ3RoLGkrPTF9cmV0dXJue2xpbmU6aSxjb2x1bW46dCsxLW59fWZ1bmN0aW9uIGNuKGUpe3JldHVybiBndChlLnNvdXJjZSxxZShlLnNvdXJjZSxlLnN0YXJ0KSl9ZnVuY3Rpb24gZ3QoZSx0KXtjb25zdCBuPWUubG9jYXRpb25PZmZzZXQuY29sdW1uLTEsaT0iIi5wYWRTdGFydChuKStlLmJvZHkscj10LmxpbmUtMSxzPWUubG9jYXRpb25PZmZzZXQubGluZS0xLG89dC5saW5lK3MsYz10LmxpbmU9PT0xP246MCxoPXQuY29sdW1uK2MsZD1gJHtlLm5hbWV9OiR7b306JHtofQpgLHU9aS5zcGxpdCgvXHJcbnxbXG5ccl0vZykseT11W3JdO2lmKHkubGVuZ3RoPjEyMCl7Y29uc3Qgdj1NYXRoLmZsb29yKGgvODApLFQ9aCU4MCxtPVtdO2ZvcihsZXQgTj0wO048eS5sZW5ndGg7Tis9ODApbS5wdXNoKHkuc2xpY2UoTixOKzgwKSk7cmV0dXJuIGQrdnQoW1tgJHtvfSB8YCxtWzBdXSwuLi5tLnNsaWNlKDEsdisxKS5tYXAoTj0+WyJ8IixOXSksWyJ8IiwiXiIucGFkU3RhcnQoVCldLFsifCIsbVt2KzFdXV0pfXJldHVybiBkK3Z0KFtbYCR7by0xfSB8YCx1W3ItMV1dLFtgJHtvfSB8YCx5XSxbInwiLCJeIi5wYWRTdGFydChoKV0sW2Ake28rMX0gfGAsdVtyKzFdXV0pfWZ1bmN0aW9uIHZ0KGUpe2NvbnN0IHQ9ZS5maWx0ZXIoKFtpLHJdKT0+ciE9PXZvaWQgMCksbj1NYXRoLm1heCguLi50Lm1hcCgoW2ldKT0+aS5sZW5ndGgpKTtyZXR1cm4gdC5tYXAoKFtpLHJdKT0+aS5wYWRTdGFydChuKSsocj8iICIrcjoiIikpLmpvaW4oYApgKX1mdW5jdGlvbiB1bihlKXtjb25zdCB0PWVbMF07cmV0dXJuIHQ9PW51bGx8fCJraW5kImluIHR8fCJsZW5ndGgiaW4gdD97bm9kZXM6dCxzb3VyY2U6ZVsxXSxwb3NpdGlvbnM6ZVsyXSxwYXRoOmVbM10sb3JpZ2luYWxFcnJvcjplWzRdLGV4dGVuc2lvbnM6ZVs1XX06dH1jbGFzcyBqZSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsLi4ubil7dmFyIGkscixzO2NvbnN0e25vZGVzOm8sc291cmNlOmMscG9zaXRpb25zOmgscGF0aDpkLG9yaWdpbmFsRXJyb3I6dSxleHRlbnNpb25zOnl9PXVuKG4pO3N1cGVyKHQpLHRoaXMubmFtZT0iR3JhcGhRTEVycm9yIix0aGlzLnBhdGg9ZCE9bnVsbD9kOnZvaWQgMCx0aGlzLm9yaWdpbmFsRXJyb3I9dSE9bnVsbD91OnZvaWQgMCx0aGlzLm5vZGVzPUV0KEFycmF5LmlzQXJyYXkobyk/bzpvP1tvXTp2b2lkIDApO2NvbnN0IHY9RXQoKGk9dGhpcy5ub2Rlcyk9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLm1hcChtPT5tLmxvYykuZmlsdGVyKG09Pm0hPW51bGwpKTt0aGlzLnNvdXJjZT1jIT1udWxsP2M6dj09bnVsbHx8KHI9dlswXSk9PT1udWxsfHxyPT09dm9pZCAwP3ZvaWQgMDpyLnNvdXJjZSx0aGlzLnBvc2l0aW9ucz1oIT1udWxsP2g6dj09bnVsbD92b2lkIDA6di5tYXAobT0+bS5zdGFydCksdGhpcy5sb2NhdGlvbnM9aCYmYz9oLm1hcChtPT5xZShjLG0pKTp2PT1udWxsP3ZvaWQgMDp2Lm1hcChtPT5xZShtLnNvdXJjZSxtLnN0YXJ0KSk7Y29uc3QgVD1FZSh1PT1udWxsP3ZvaWQgMDp1LmV4dGVuc2lvbnMpP3U9PW51bGw/dm9pZCAwOnUuZXh0ZW5zaW9uczp2b2lkIDA7dGhpcy5leHRlbnNpb25zPShzPXkhPW51bGw/eTpUKSE9PW51bGwmJnMhPT12b2lkIDA/czpPYmplY3QuY3JlYXRlKG51bGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse21lc3NhZ2U6e3dyaXRhYmxlOiEwLGVudW1lcmFibGU6ITB9LG5hbWU6e2VudW1lcmFibGU6ITF9LG5vZGVzOntlbnVtZXJhYmxlOiExfSxzb3VyY2U6e2VudW1lcmFibGU6ITF9LHBvc2l0aW9uczp7ZW51bWVyYWJsZTohMX0sb3JpZ2luYWxFcnJvcjp7ZW51bWVyYWJsZTohMX19KSx1IT1udWxsJiZ1LnN0YWNrP09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOnUuc3RhY2ssd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxqZSk6T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YWNrIix7dmFsdWU6RXJyb3IoKS5zdGFjayx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJHcmFwaFFMRXJyb3IifXRvU3RyaW5nKCl7bGV0IHQ9dGhpcy5tZXNzYWdlO2lmKHRoaXMubm9kZXMpZm9yKGNvbnN0IG4gb2YgdGhpcy5ub2RlcyluLmxvYyYmKHQrPWAKCmArY24obi5sb2MpKTtlbHNlIGlmKHRoaXMuc291cmNlJiZ0aGlzLmxvY2F0aW9ucylmb3IoY29uc3QgbiBvZiB0aGlzLmxvY2F0aW9ucyl0Kz1gCgpgK2d0KHRoaXMuc291cmNlLG4pO3JldHVybiB0fXRvSlNPTigpe2NvbnN0IHQ9e21lc3NhZ2U6dGhpcy5tZXNzYWdlfTtyZXR1cm4gdGhpcy5sb2NhdGlvbnMhPW51bGwmJih0LmxvY2F0aW9ucz10aGlzLmxvY2F0aW9ucyksdGhpcy5wYXRoIT1udWxsJiYodC5wYXRoPXRoaXMucGF0aCksdGhpcy5leHRlbnNpb25zIT1udWxsJiZPYmplY3Qua2V5cyh0aGlzLmV4dGVuc2lvbnMpLmxlbmd0aD4wJiYodC5leHRlbnNpb25zPXRoaXMuZXh0ZW5zaW9ucyksdH19ZnVuY3Rpb24gRXQoZSl7cmV0dXJuIGU9PT12b2lkIDB8fGUubGVuZ3RoPT09MD92b2lkIDA6ZX1mdW5jdGlvbiBHKGUsdCxuKXtyZXR1cm4gbmV3IGplKGBTeW50YXggRXJyb3I6ICR7bn1gLHtzb3VyY2U6ZSxwb3NpdGlvbnM6W3RdfSl9Y2xhc3MgbG57Y29uc3RydWN0b3IodCxuLGkpe3RoaXMuc3RhcnQ9dC5zdGFydCx0aGlzLmVuZD1uLmVuZCx0aGlzLnN0YXJ0VG9rZW49dCx0aGlzLmVuZFRva2VuPW4sdGhpcy5zb3VyY2U9aX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJMb2NhdGlvbiJ9dG9KU09OKCl7cmV0dXJue3N0YXJ0OnRoaXMuc3RhcnQsZW5kOnRoaXMuZW5kfX19Y2xhc3MgX3R7Y29uc3RydWN0b3IodCxuLGkscixzLG8pe3RoaXMua2luZD10LHRoaXMuc3RhcnQ9bix0aGlzLmVuZD1pLHRoaXMubGluZT1yLHRoaXMuY29sdW1uPXMsdGhpcy52YWx1ZT1vLHRoaXMucHJldj1udWxsLHRoaXMubmV4dD1udWxsfWdldFtTeW1ib2wudG9TdHJpbmdUYWddKCl7cmV0dXJuIlRva2VuIn10b0pTT04oKXtyZXR1cm57a2luZDp0aGlzLmtpbmQsdmFsdWU6dGhpcy52YWx1ZSxsaW5lOnRoaXMubGluZSxjb2x1bW46dGhpcy5jb2x1bW59fX1jb25zdCBidD17TmFtZTpbXSxEb2N1bWVudDpbImRlZmluaXRpb25zIl0sT3BlcmF0aW9uRGVmaW5pdGlvbjpbIm5hbWUiLCJ2YXJpYWJsZURlZmluaXRpb25zIiwiZGlyZWN0aXZlcyIsInNlbGVjdGlvblNldCJdLFZhcmlhYmxlRGVmaW5pdGlvbjpbInZhcmlhYmxlIiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImRpcmVjdGl2ZXMiXSxWYXJpYWJsZTpbIm5hbWUiXSxTZWxlY3Rpb25TZXQ6WyJzZWxlY3Rpb25zIl0sRmllbGQ6WyJhbGlhcyIsIm5hbWUiLCJhcmd1bWVudHMiLCJkaXJlY3RpdmVzIiwic2VsZWN0aW9uU2V0Il0sQXJndW1lbnQ6WyJuYW1lIiwidmFsdWUiXSxGcmFnbWVudFNwcmVhZDpbIm5hbWUiLCJkaXJlY3RpdmVzIl0sSW5saW5lRnJhZ21lbnQ6WyJ0eXBlQ29uZGl0aW9uIiwiZGlyZWN0aXZlcyIsInNlbGVjdGlvblNldCJdLEZyYWdtZW50RGVmaW5pdGlvbjpbIm5hbWUiLCJ2YXJpYWJsZURlZmluaXRpb25zIiwidHlwZUNvbmRpdGlvbiIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxJbnRWYWx1ZTpbXSxGbG9hdFZhbHVlOltdLFN0cmluZ1ZhbHVlOltdLEJvb2xlYW5WYWx1ZTpbXSxOdWxsVmFsdWU6W10sRW51bVZhbHVlOltdLExpc3RWYWx1ZTpbInZhbHVlcyJdLE9iamVjdFZhbHVlOlsiZmllbGRzIl0sT2JqZWN0RmllbGQ6WyJuYW1lIiwidmFsdWUiXSxEaXJlY3RpdmU6WyJuYW1lIiwiYXJndW1lbnRzIl0sTmFtZWRUeXBlOlsibmFtZSJdLExpc3RUeXBlOlsidHlwZSJdLE5vbk51bGxUeXBlOlsidHlwZSJdLFNjaGVtYURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsImRpcmVjdGl2ZXMiLCJvcGVyYXRpb25UeXBlcyJdLE9wZXJhdGlvblR5cGVEZWZpbml0aW9uOlsidHlwZSJdLFNjYWxhclR5cGVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGlyZWN0aXZlcyJdLE9iamVjdFR5cGVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiaW50ZXJmYWNlcyIsImRpcmVjdGl2ZXMiLCJmaWVsZHMiXSxGaWVsZERlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJhcmd1bWVudHMiLCJ0eXBlIiwiZGlyZWN0aXZlcyJdLElucHV0VmFsdWVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImRpcmVjdGl2ZXMiXSxJbnRlcmZhY2VUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sVW5pb25UeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiLCJ0eXBlcyJdLEVudW1UeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiLCJ2YWx1ZXMiXSxFbnVtVmFsdWVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGlyZWN0aXZlcyJdLElucHV0T2JqZWN0VHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sRGlyZWN0aXZlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImFyZ3VtZW50cyIsImxvY2F0aW9ucyJdLFNjaGVtYUV4dGVuc2lvbjpbImRpcmVjdGl2ZXMiLCJvcGVyYXRpb25UeXBlcyJdLFNjYWxhclR5cGVFeHRlbnNpb246WyJuYW1lIiwiZGlyZWN0aXZlcyJdLE9iamVjdFR5cGVFeHRlbnNpb246WyJuYW1lIiwiaW50ZXJmYWNlcyIsImRpcmVjdGl2ZXMiLCJmaWVsZHMiXSxJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sVW5pb25UeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiLCJ0eXBlcyJdLEVudW1UeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiLCJ2YWx1ZXMiXSxJbnB1dE9iamVjdFR5cGVFeHRlbnNpb246WyJuYW1lIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdfSxobj1uZXcgU2V0KE9iamVjdC5rZXlzKGJ0KSk7ZnVuY3Rpb24gVHQoZSl7Y29uc3QgdD1lPT1udWxsP3ZvaWQgMDplLmtpbmQ7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIiYmaG4uaGFzKHQpfXZhciBoZTsoZnVuY3Rpb24oZSl7ZS5RVUVSWT0icXVlcnkiLGUuTVVUQVRJT049Im11dGF0aW9uIixlLlNVQlNDUklQVElPTj0ic3Vic2NyaXB0aW9uIn0pKGhlfHwoaGU9e30pKTt2YXIgR2U7KGZ1bmN0aW9uKGUpe2UuUVVFUlk9IlFVRVJZIixlLk1VVEFUSU9OPSJNVVRBVElPTiIsZS5TVUJTQ1JJUFRJT049IlNVQlNDUklQVElPTiIsZS5GSUVMRD0iRklFTEQiLGUuRlJBR01FTlRfREVGSU5JVElPTj0iRlJBR01FTlRfREVGSU5JVElPTiIsZS5GUkFHTUVOVF9TUFJFQUQ9IkZSQUdNRU5UX1NQUkVBRCIsZS5JTkxJTkVfRlJBR01FTlQ9IklOTElORV9GUkFHTUVOVCIsZS5WQVJJQUJMRV9ERUZJTklUSU9OPSJWQVJJQUJMRV9ERUZJTklUSU9OIixlLlNDSEVNQT0iU0NIRU1BIixlLlNDQUxBUj0iU0NBTEFSIixlLk9CSkVDVD0iT0JKRUNUIixlLkZJRUxEX0RFRklOSVRJT049IkZJRUxEX0RFRklOSVRJT04iLGUuQVJHVU1FTlRfREVGSU5JVElPTj0iQVJHVU1FTlRfREVGSU5JVElPTiIsZS5JTlRFUkZBQ0U9IklOVEVSRkFDRSIsZS5VTklPTj0iVU5JT04iLGUuRU5VTT0iRU5VTSIsZS5FTlVNX1ZBTFVFPSJFTlVNX1ZBTFVFIixlLklOUFVUX09CSkVDVD0iSU5QVVRfT0JKRUNUIixlLklOUFVUX0ZJRUxEX0RFRklOSVRJT049IklOUFVUX0ZJRUxEX0RFRklOSVRJT04ifSkoR2V8fChHZT17fSkpO3ZhciBiOyhmdW5jdGlvbihlKXtlLk5BTUU9Ik5hbWUiLGUuRE9DVU1FTlQ9IkRvY3VtZW50IixlLk9QRVJBVElPTl9ERUZJTklUSU9OPSJPcGVyYXRpb25EZWZpbml0aW9uIixlLlZBUklBQkxFX0RFRklOSVRJT049IlZhcmlhYmxlRGVmaW5pdGlvbiIsZS5TRUxFQ1RJT05fU0VUPSJTZWxlY3Rpb25TZXQiLGUuRklFTEQ9IkZpZWxkIixlLkFSR1VNRU5UPSJBcmd1bWVudCIsZS5GUkFHTUVOVF9TUFJFQUQ9IkZyYWdtZW50U3ByZWFkIixlLklOTElORV9GUkFHTUVOVD0iSW5saW5lRnJhZ21lbnQiLGUuRlJBR01FTlRfREVGSU5JVElPTj0iRnJhZ21lbnREZWZpbml0aW9uIixlLlZBUklBQkxFPSJWYXJpYWJsZSIsZS5JTlQ9IkludFZhbHVlIixlLkZMT0FUPSJGbG9hdFZhbHVlIixlLlNUUklORz0iU3RyaW5nVmFsdWUiLGUuQk9PTEVBTj0iQm9vbGVhblZhbHVlIixlLk5VTEw9Ik51bGxWYWx1ZSIsZS5FTlVNPSJFbnVtVmFsdWUiLGUuTElTVD0iTGlzdFZhbHVlIixlLk9CSkVDVD0iT2JqZWN0VmFsdWUiLGUuT0JKRUNUX0ZJRUxEPSJPYmplY3RGaWVsZCIsZS5ESVJFQ1RJVkU9IkRpcmVjdGl2ZSIsZS5OQU1FRF9UWVBFPSJOYW1lZFR5cGUiLGUuTElTVF9UWVBFPSJMaXN0VHlwZSIsZS5OT05fTlVMTF9UWVBFPSJOb25OdWxsVHlwZSIsZS5TQ0hFTUFfREVGSU5JVElPTj0iU2NoZW1hRGVmaW5pdGlvbiIsZS5PUEVSQVRJT05fVFlQRV9ERUZJTklUSU9OPSJPcGVyYXRpb25UeXBlRGVmaW5pdGlvbiIsZS5TQ0FMQVJfVFlQRV9ERUZJTklUSU9OPSJTY2FsYXJUeXBlRGVmaW5pdGlvbiIsZS5PQkpFQ1RfVFlQRV9ERUZJTklUSU9OPSJPYmplY3RUeXBlRGVmaW5pdGlvbiIsZS5GSUVMRF9ERUZJTklUSU9OPSJGaWVsZERlZmluaXRpb24iLGUuSU5QVVRfVkFMVUVfREVGSU5JVElPTj0iSW5wdXRWYWx1ZURlZmluaXRpb24iLGUuSU5URVJGQUNFX1RZUEVfREVGSU5JVElPTj0iSW50ZXJmYWNlVHlwZURlZmluaXRpb24iLGUuVU5JT05fVFlQRV9ERUZJTklUSU9OPSJVbmlvblR5cGVEZWZpbml0aW9uIixlLkVOVU1fVFlQRV9ERUZJTklUSU9OPSJFbnVtVHlwZURlZmluaXRpb24iLGUuRU5VTV9WQUxVRV9ERUZJTklUSU9OPSJFbnVtVmFsdWVEZWZpbml0aW9uIixlLklOUFVUX09CSkVDVF9UWVBFX0RFRklOSVRJT049IklucHV0T2JqZWN0VHlwZURlZmluaXRpb24iLGUuRElSRUNUSVZFX0RFRklOSVRJT049IkRpcmVjdGl2ZURlZmluaXRpb24iLGUuU0NIRU1BX0VYVEVOU0lPTj0iU2NoZW1hRXh0ZW5zaW9uIixlLlNDQUxBUl9UWVBFX0VYVEVOU0lPTj0iU2NhbGFyVHlwZUV4dGVuc2lvbiIsZS5PQkpFQ1RfVFlQRV9FWFRFTlNJT049Ik9iamVjdFR5cGVFeHRlbnNpb24iLGUuSU5URVJGQUNFX1RZUEVfRVhURU5TSU9OPSJJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uIixlLlVOSU9OX1RZUEVfRVhURU5TSU9OPSJVbmlvblR5cGVFeHRlbnNpb24iLGUuRU5VTV9UWVBFX0VYVEVOU0lPTj0iRW51bVR5cGVFeHRlbnNpb24iLGUuSU5QVVRfT0JKRUNUX1RZUEVfRVhURU5TSU9OPSJJbnB1dE9iamVjdFR5cGVFeHRlbnNpb24ifSkoYnx8KGI9e30pKTtmdW5jdGlvbiB6ZShlKXtyZXR1cm4gZT09PTl8fGU9PT0zMn1mdW5jdGlvbiBiZShlKXtyZXR1cm4gZT49NDgmJmU8PTU3fWZ1bmN0aW9uIE50KGUpe3JldHVybiBlPj05NyYmZTw9MTIyfHxlPj02NSYmZTw9OTB9ZnVuY3Rpb24geHQoZSl7cmV0dXJuIE50KGUpfHxlPT09OTV9ZnVuY3Rpb24gZm4oZSl7cmV0dXJuIE50KGUpfHxiZShlKXx8ZT09PTk1fWZ1bmN0aW9uIGRuKGUpe3ZhciB0O2xldCBuPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGk9bnVsbCxyPS0xO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7KytvKXt2YXIgcztjb25zdCBjPWVbb10saD1wbihjKTtoIT09Yy5sZW5ndGgmJihpPShzPWkpIT09bnVsbCYmcyE9PXZvaWQgMD9zOm8scj1vLG8hPT0wJiZoPG4mJihuPWgpKX1yZXR1cm4gZS5tYXAoKG8sYyk9PmM9PT0wP286by5zbGljZShuKSkuc2xpY2UoKHQ9aSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6MCxyKzEpfWZ1bmN0aW9uIHBuKGUpe2xldCB0PTA7Zm9yKDt0PGUubGVuZ3RoJiZ6ZShlLmNoYXJDb2RlQXQodCkpOykrK3Q7cmV0dXJuIHR9ZnVuY3Rpb24gbW4oZSx0KXtjb25zdCBuPWUucmVwbGFjZSgvIiIiL2csJ1xcIiIiJyksaT1uLnNwbGl0KC9cclxufFtcblxyXS9nKSxyPWkubGVuZ3RoPT09MSxzPWkubGVuZ3RoPjEmJmkuc2xpY2UoMSkuZXZlcnkoVD0+VC5sZW5ndGg9PT0wfHx6ZShULmNoYXJDb2RlQXQoMCkpKSxvPW4uZW5kc1dpdGgoJ1xcIiIiJyksYz1lLmVuZHNXaXRoKCciJykmJiFvLGg9ZS5lbmRzV2l0aCgiXFwiKSxkPWN8fGgsdT0hcnx8ZS5sZW5ndGg+NzB8fGR8fHN8fG87bGV0IHk9IiI7Y29uc3Qgdj1yJiZ6ZShlLmNoYXJDb2RlQXQoMCkpO3JldHVybih1JiYhdnx8cykmJih5Kz1gCmApLHkrPW4sKHV8fGQpJiYoeSs9YApgKSwnIiIiJyt5KyciIiInfXZhciBsOyhmdW5jdGlvbihlKXtlLlNPRj0iPFNPRj4iLGUuRU9GPSI8RU9GPiIsZS5CQU5HPSIhIixlLkRPTExBUj0iJCIsZS5BTVA9IiYiLGUuUEFSRU5fTD0iKCIsZS5QQVJFTl9SPSIpIixlLlNQUkVBRD0iLi4uIixlLkNPTE9OPSI6IixlLkVRVUFMUz0iPSIsZS5BVD0iQCIsZS5CUkFDS0VUX0w9IlsiLGUuQlJBQ0tFVF9SPSJdIixlLkJSQUNFX0w9InsiLGUuUElQRT0ifCIsZS5CUkFDRV9SPSJ9IixlLk5BTUU9Ik5hbWUiLGUuSU5UPSJJbnQiLGUuRkxPQVQ9IkZsb2F0IixlLlNUUklORz0iU3RyaW5nIixlLkJMT0NLX1NUUklORz0iQmxvY2tTdHJpbmciLGUuQ09NTUVOVD0iQ29tbWVudCJ9KShsfHwobD17fSkpO2NsYXNzIHlue2NvbnN0cnVjdG9yKHQpe2NvbnN0IG49bmV3IF90KGwuU09GLDAsMCwwLDApO3RoaXMuc291cmNlPXQsdGhpcy5sYXN0VG9rZW49bix0aGlzLnRva2VuPW4sdGhpcy5saW5lPTEsdGhpcy5saW5lU3RhcnQ9MH1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJMZXhlciJ9YWR2YW5jZSgpe3JldHVybiB0aGlzLmxhc3RUb2tlbj10aGlzLnRva2VuLHRoaXMudG9rZW49dGhpcy5sb29rYWhlYWQoKX1sb29rYWhlYWQoKXtsZXQgdD10aGlzLnRva2VuO2lmKHQua2luZCE9PWwuRU9GKWRvIGlmKHQubmV4dCl0PXQubmV4dDtlbHNle2NvbnN0IG49dm4odGhpcyx0LmVuZCk7dC5uZXh0PW4sbi5wcmV2PXQsdD1ufXdoaWxlKHQua2luZD09PWwuQ09NTUVOVCk7cmV0dXJuIHR9fWZ1bmN0aW9uIGduKGUpe3JldHVybiBlPT09bC5CQU5HfHxlPT09bC5ET0xMQVJ8fGU9PT1sLkFNUHx8ZT09PWwuUEFSRU5fTHx8ZT09PWwuUEFSRU5fUnx8ZT09PWwuU1BSRUFEfHxlPT09bC5DT0xPTnx8ZT09PWwuRVFVQUxTfHxlPT09bC5BVHx8ZT09PWwuQlJBQ0tFVF9MfHxlPT09bC5CUkFDS0VUX1J8fGU9PT1sLkJSQUNFX0x8fGU9PT1sLlBJUEV8fGU9PT1sLkJSQUNFX1J9ZnVuY3Rpb24gZmUoZSl7cmV0dXJuIGU+PTAmJmU8PTU1Mjk1fHxlPj01NzM0NCYmZTw9MTExNDExMX1mdW5jdGlvbiB3ZShlLHQpe3JldHVybiBBdChlLmNoYXJDb2RlQXQodCkpJiZJdChlLmNoYXJDb2RlQXQodCsxKSl9ZnVuY3Rpb24gQXQoZSl7cmV0dXJuIGU+PTU1Mjk2JiZlPD01NjMxOX1mdW5jdGlvbiBJdChlKXtyZXR1cm4gZT49NTYzMjAmJmU8PTU3MzQzfWZ1bmN0aW9uIGNlKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LmNvZGVQb2ludEF0KHQpO2lmKG49PT12b2lkIDApcmV0dXJuIGwuRU9GO2lmKG4+PTMyJiZuPD0xMjYpe2NvbnN0IGk9U3RyaW5nLmZyb21Db2RlUG9pbnQobik7cmV0dXJuIGk9PT0nIic/YCciJ2A6YCIke2l9ImB9cmV0dXJuIlUrIituLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnBhZFN0YXJ0KDQsIjAiKX1mdW5jdGlvbiBVKGUsdCxuLGkscil7Y29uc3Qgcz1lLmxpbmUsbz0xK24tZS5saW5lU3RhcnQ7cmV0dXJuIG5ldyBfdCh0LG4saSxzLG8scil9ZnVuY3Rpb24gdm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1uLmxlbmd0aDtsZXQgcj10O2Zvcig7cjxpOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQocik7c3dpdGNoKHMpe2Nhc2UgNjUyNzk6Y2FzZSA5OmNhc2UgMzI6Y2FzZSA0NDorK3I7Y29udGludWU7Y2FzZSAxMDorK3IsKytlLmxpbmUsZS5saW5lU3RhcnQ9cjtjb250aW51ZTtjYXNlIDEzOm4uY2hhckNvZGVBdChyKzEpPT09MTA/cis9MjorK3IsKytlLmxpbmUsZS5saW5lU3RhcnQ9cjtjb250aW51ZTtjYXNlIDM1OnJldHVybiBFbihlLHIpO2Nhc2UgMzM6cmV0dXJuIFUoZSxsLkJBTkcscixyKzEpO2Nhc2UgMzY6cmV0dXJuIFUoZSxsLkRPTExBUixyLHIrMSk7Y2FzZSAzODpyZXR1cm4gVShlLGwuQU1QLHIscisxKTtjYXNlIDQwOnJldHVybiBVKGUsbC5QQVJFTl9MLHIscisxKTtjYXNlIDQxOnJldHVybiBVKGUsbC5QQVJFTl9SLHIscisxKTtjYXNlIDQ2OmlmKG4uY2hhckNvZGVBdChyKzEpPT09NDYmJm4uY2hhckNvZGVBdChyKzIpPT09NDYpcmV0dXJuIFUoZSxsLlNQUkVBRCxyLHIrMyk7YnJlYWs7Y2FzZSA1ODpyZXR1cm4gVShlLGwuQ09MT04scixyKzEpO2Nhc2UgNjE6cmV0dXJuIFUoZSxsLkVRVUFMUyxyLHIrMSk7Y2FzZSA2NDpyZXR1cm4gVShlLGwuQVQscixyKzEpO2Nhc2UgOTE6cmV0dXJuIFUoZSxsLkJSQUNLRVRfTCxyLHIrMSk7Y2FzZSA5MzpyZXR1cm4gVShlLGwuQlJBQ0tFVF9SLHIscisxKTtjYXNlIDEyMzpyZXR1cm4gVShlLGwuQlJBQ0VfTCxyLHIrMSk7Y2FzZSAxMjQ6cmV0dXJuIFUoZSxsLlBJUEUscixyKzEpO2Nhc2UgMTI1OnJldHVybiBVKGUsbC5CUkFDRV9SLHIscisxKTtjYXNlIDM0OnJldHVybiBuLmNoYXJDb2RlQXQocisxKT09PTM0JiZuLmNoYXJDb2RlQXQocisyKT09PTM0P0FuKGUscik6Ym4oZSxyKX1pZihiZShzKXx8cz09PTQ1KXJldHVybiBfbihlLHIscyk7aWYoeHQocykpcmV0dXJuIEluKGUscik7dGhyb3cgRyhlLnNvdXJjZSxyLHM9PT0zOT9gVW5leHBlY3RlZCBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyICgnKSwgZGlkIHlvdSBtZWFuIHRvIHVzZSBhIGRvdWJsZSBxdW90ZSAoIik/YDpmZShzKXx8d2UobixyKT9gVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICR7Y2UoZSxyKX0uYDpgSW52YWxpZCBjaGFyYWN0ZXI6ICR7Y2UoZSxyKX0uYCl9cmV0dXJuIFUoZSxsLkVPRixpLGkpfWZ1bmN0aW9uIEVuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxO2Zvcig7cjxpOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQocik7aWYocz09PTEwfHxzPT09MTMpYnJlYWs7aWYoZmUocykpKytyO2Vsc2UgaWYod2UobixyKSlyKz0yO2Vsc2UgYnJlYWt9cmV0dXJuIFUoZSxsLkNPTU1FTlQsdCxyLG4uc2xpY2UodCsxLHIpKX1mdW5jdGlvbiBfbihlLHQsbil7Y29uc3QgaT1lLnNvdXJjZS5ib2R5O2xldCByPXQscz1uLG89ITE7aWYocz09PTQ1JiYocz1pLmNoYXJDb2RlQXQoKytyKSkscz09PTQ4KXtpZihzPWkuY2hhckNvZGVBdCgrK3IpLGJlKHMpKXRocm93IEcoZS5zb3VyY2UscixgSW52YWxpZCBudW1iZXIsIHVuZXhwZWN0ZWQgZGlnaXQgYWZ0ZXIgMDogJHtjZShlLHIpfS5gKX1lbHNlIHI9SGUoZSxyLHMpLHM9aS5jaGFyQ29kZUF0KHIpO2lmKHM9PT00NiYmKG89ITAscz1pLmNoYXJDb2RlQXQoKytyKSxyPUhlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKSksKHM9PT02OXx8cz09PTEwMSkmJihvPSEwLHM9aS5jaGFyQ29kZUF0KCsrciksKHM9PT00M3x8cz09PTQ1KSYmKHM9aS5jaGFyQ29kZUF0KCsrcikpLHI9SGUoZSxyLHMpLHM9aS5jaGFyQ29kZUF0KHIpKSxzPT09NDZ8fHh0KHMpKXRocm93IEcoZS5zb3VyY2UscixgSW52YWxpZCBudW1iZXIsIGV4cGVjdGVkIGRpZ2l0IGJ1dCBnb3Q6ICR7Y2UoZSxyKX0uYCk7cmV0dXJuIFUoZSxvP2wuRkxPQVQ6bC5JTlQsdCxyLGkuc2xpY2UodCxyKSl9ZnVuY3Rpb24gSGUoZSx0LG4pe2lmKCFiZShuKSl0aHJvdyBHKGUuc291cmNlLHQsYEludmFsaWQgbnVtYmVyLCBleHBlY3RlZCBkaWdpdCBidXQgZ290OiAke2NlKGUsdCl9LmApO2NvbnN0IGk9ZS5zb3VyY2UuYm9keTtsZXQgcj10KzE7Zm9yKDtiZShpLmNoYXJDb2RlQXQocikpOykrK3I7cmV0dXJuIHJ9ZnVuY3Rpb24gYm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1uLmxlbmd0aDtsZXQgcj10KzEscz1yLG89IiI7Zm9yKDtyPGk7KXtjb25zdCBjPW4uY2hhckNvZGVBdChyKTtpZihjPT09MzQpcmV0dXJuIG8rPW4uc2xpY2UocyxyKSxVKGUsbC5TVFJJTkcsdCxyKzEsbyk7aWYoYz09PTkyKXtvKz1uLnNsaWNlKHMscik7Y29uc3QgaD1uLmNoYXJDb2RlQXQocisxKT09PTExNz9uLmNoYXJDb2RlQXQocisyKT09PTEyMz9UbihlLHIpOk5uKGUscik6eG4oZSxyKTtvKz1oLnZhbHVlLHIrPWguc2l6ZSxzPXI7Y29udGludWV9aWYoYz09PTEwfHxjPT09MTMpYnJlYWs7aWYoZmUoYykpKytyO2Vsc2UgaWYod2UobixyKSlyKz0yO2Vsc2UgdGhyb3cgRyhlLnNvdXJjZSxyLGBJbnZhbGlkIGNoYXJhY3RlciB3aXRoaW4gU3RyaW5nOiAke2NlKGUscil9LmApfXRocm93IEcoZS5zb3VyY2UsciwiVW50ZXJtaW5hdGVkIHN0cmluZy4iKX1mdW5jdGlvbiBUbihlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keTtsZXQgaT0wLHI9Mztmb3IoO3I8MTI7KXtjb25zdCBzPW4uY2hhckNvZGVBdCh0K3IrKyk7aWYocz09PTEyNSl7aWYocjw1fHwhZmUoaSkpYnJlYWs7cmV0dXJue3ZhbHVlOlN0cmluZy5mcm9tQ29kZVBvaW50KGkpLHNpemU6cn19aWYoaT1pPDw0fFRlKHMpLGk8MClicmVha310aHJvdyBHKGUuc291cmNlLHQsYEludmFsaWQgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2U6ICIke24uc2xpY2UodCx0K3IpfSIuYCl9ZnVuY3Rpb24gTm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1TdChuLHQrMik7aWYoZmUoaSkpcmV0dXJue3ZhbHVlOlN0cmluZy5mcm9tQ29kZVBvaW50KGkpLHNpemU6Nn07aWYoQXQoaSkmJm4uY2hhckNvZGVBdCh0KzYpPT09OTImJm4uY2hhckNvZGVBdCh0KzcpPT09MTE3KXtjb25zdCByPVN0KG4sdCs4KTtpZihJdChyKSlyZXR1cm57dmFsdWU6U3RyaW5nLmZyb21Db2RlUG9pbnQoaSxyKSxzaXplOjEyfX10aHJvdyBHKGUuc291cmNlLHQsYEludmFsaWQgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2U6ICIke24uc2xpY2UodCx0KzYpfSIuYCl9ZnVuY3Rpb24gU3QoZSx0KXtyZXR1cm4gVGUoZS5jaGFyQ29kZUF0KHQpKTw8MTJ8VGUoZS5jaGFyQ29kZUF0KHQrMSkpPDw4fFRlKGUuY2hhckNvZGVBdCh0KzIpKTw8NHxUZShlLmNoYXJDb2RlQXQodCszKSl9ZnVuY3Rpb24gVGUoZSl7cmV0dXJuIGU+PTQ4JiZlPD01Nz9lLTQ4OmU+PTY1JiZlPD03MD9lLTU1OmU+PTk3JiZlPD0xMDI/ZS04NzotMX1mdW5jdGlvbiB4bihlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keTtzd2l0Y2gobi5jaGFyQ29kZUF0KHQrMSkpe2Nhc2UgMzQ6cmV0dXJue3ZhbHVlOiciJyxzaXplOjJ9O2Nhc2UgOTI6cmV0dXJue3ZhbHVlOiJcXCIsc2l6ZToyfTtjYXNlIDQ3OnJldHVybnt2YWx1ZToiLyIsc2l6ZToyfTtjYXNlIDk4OnJldHVybnt2YWx1ZToiXGIiLHNpemU6Mn07Y2FzZSAxMDI6cmV0dXJue3ZhbHVlOiJcZiIsc2l6ZToyfTtjYXNlIDExMDpyZXR1cm57dmFsdWU6YApgLHNpemU6Mn07Y2FzZSAxMTQ6cmV0dXJue3ZhbHVlOiJcciIsc2l6ZToyfTtjYXNlIDExNjpyZXR1cm57dmFsdWU6IgkiLHNpemU6Mn19dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U6ICIke24uc2xpY2UodCx0KzIpfSIuYCl9ZnVuY3Rpb24gQW4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1uLmxlbmd0aDtsZXQgcj1lLmxpbmVTdGFydCxzPXQrMyxvPXMsYz0iIjtjb25zdCBoPVtdO2Zvcig7czxpOyl7Y29uc3QgZD1uLmNoYXJDb2RlQXQocyk7aWYoZD09PTM0JiZuLmNoYXJDb2RlQXQocysxKT09PTM0JiZuLmNoYXJDb2RlQXQocysyKT09PTM0KXtjKz1uLnNsaWNlKG8scyksaC5wdXNoKGMpO2NvbnN0IHU9VShlLGwuQkxPQ0tfU1RSSU5HLHQscyszLGRuKGgpLmpvaW4oYApgKSk7cmV0dXJuIGUubGluZSs9aC5sZW5ndGgtMSxlLmxpbmVTdGFydD1yLHV9aWYoZD09PTkyJiZuLmNoYXJDb2RlQXQocysxKT09PTM0JiZuLmNoYXJDb2RlQXQocysyKT09PTM0JiZuLmNoYXJDb2RlQXQocyszKT09PTM0KXtjKz1uLnNsaWNlKG8scyksbz1zKzEscys9NDtjb250aW51ZX1pZihkPT09MTB8fGQ9PT0xMyl7Yys9bi5zbGljZShvLHMpLGgucHVzaChjKSxkPT09MTMmJm4uY2hhckNvZGVBdChzKzEpPT09MTA/cys9MjorK3MsYz0iIixvPXMscj1zO2NvbnRpbnVlfWlmKGZlKGQpKSsrcztlbHNlIGlmKHdlKG4scykpcys9MjtlbHNlIHRocm93IEcoZS5zb3VyY2UscyxgSW52YWxpZCBjaGFyYWN0ZXIgd2l0aGluIFN0cmluZzogJHtjZShlLHMpfS5gKX10aHJvdyBHKGUuc291cmNlLHMsIlVudGVybWluYXRlZCBzdHJpbmcuIil9ZnVuY3Rpb24gSW4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1uLmxlbmd0aDtsZXQgcj10KzE7Zm9yKDtyPGk7KXtjb25zdCBzPW4uY2hhckNvZGVBdChyKTtpZihmbihzKSkrK3I7ZWxzZSBicmVha31yZXR1cm4gVShlLGwuTkFNRSx0LHIsbi5zbGljZSh0LHIpKX1jb25zdCBTbj0xMCxPdD0yO2Z1bmN0aW9uIFllKGUpe3JldHVybiBEZShlLFtdKX1mdW5jdGlvbiBEZShlLHQpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJzdHJpbmciOnJldHVybiBKU09OLnN0cmluZ2lmeShlKTtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gZS5uYW1lP2BbZnVuY3Rpb24gJHtlLm5hbWV9XWA6IltmdW5jdGlvbl0iO2Nhc2Uib2JqZWN0IjpyZXR1cm4gT24oZSx0KTtkZWZhdWx0OnJldHVybiBTdHJpbmcoZSl9fWZ1bmN0aW9uIE9uKGUsdCl7aWYoZT09PW51bGwpcmV0dXJuIm51bGwiO2lmKHQuaW5jbHVkZXMoZSkpcmV0dXJuIltDaXJjdWxhcl0iO2NvbnN0IG49Wy4uLnQsZV07aWYod24oZSkpe2NvbnN0IGk9ZS50b0pTT04oKTtpZihpIT09ZSlyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2k6RGUoaSxuKX1lbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGtuKGUsbik7cmV0dXJuIERuKGUsbil9ZnVuY3Rpb24gd24oZSl7cmV0dXJuIHR5cGVvZiBlLnRvSlNPTj09ImZ1bmN0aW9uIn1mdW5jdGlvbiBEbihlLHQpe2NvbnN0IG49T2JqZWN0LmVudHJpZXMoZSk7cmV0dXJuIG4ubGVuZ3RoPT09MD8ie30iOnQubGVuZ3RoPk90PyJbIitDbihlKSsiXSI6InsgIituLm1hcCgoW3Isc10pPT5yKyI6ICIrRGUocyx0KSkuam9pbigiLCAiKSsiIH0ifWZ1bmN0aW9uIGtuKGUsdCl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiJbXSI7aWYodC5sZW5ndGg+T3QpcmV0dXJuIltBcnJheV0iO2NvbnN0IG49TWF0aC5taW4oU24sZS5sZW5ndGgpLGk9ZS5sZW5ndGgtbixyPVtdO2ZvcihsZXQgcz0wO3M8bjsrK3Mpci5wdXNoKERlKGVbc10sdCkpO3JldHVybiBpPT09MT9yLnB1c2goIi4uLiAxIG1vcmUgaXRlbSIpOmk+MSYmci5wdXNoKGAuLi4gJHtpfSBtb3JlIGl0ZW1zYCksIlsiK3Iuam9pbigiLCAiKSsiXSJ9ZnVuY3Rpb24gQ24oZSl7Y29uc3QgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkucmVwbGFjZSgvXlxbb2JqZWN0IC8sIiIpLnJlcGxhY2UoL10kLywiIik7aWYodD09PSJPYmplY3QiJiZ0eXBlb2YgZS5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIil7Y29uc3Qgbj1lLmNvbnN0cnVjdG9yLm5hbWU7aWYodHlwZW9mIG49PSJzdHJpbmciJiZuIT09IiIpcmV0dXJuIG59cmV0dXJuIHR9Y29uc3QgUm49Z2xvYmFsVGhpcy5wcm9jZXNzJiZwcm9jZXNzLmVudi5OT0RFX0VOVj09PSJwcm9kdWN0aW9uIj9mdW5jdGlvbih0LG4pe3JldHVybiB0IGluc3RhbmNlb2Ygbn06ZnVuY3Rpb24odCxuKXtpZih0IGluc3RhbmNlb2YgbilyZXR1cm4hMDtpZih0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsKXt2YXIgaTtjb25zdCByPW4ucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10scz1TeW1ib2wudG9TdHJpbmdUYWcgaW4gdD90W1N5bWJvbC50b1N0cmluZ1RhZ106KGk9dC5jb25zdHJ1Y3Rvcik9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLm5hbWU7aWYocj09PXMpe2NvbnN0IG89WWUodCk7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlICR7cn0gIiR7b30iIGZyb20gYW5vdGhlciBtb2R1bGUgb3IgcmVhbG0uCgpFbnN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiAiZ3JhcGhxbCIgaW4gdGhlIG5vZGVfbW9kdWxlcwpkaXJlY3RvcnkuIElmIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiAiZ3JhcGhxbCIgYXJlIHRoZSBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIKcmVsaWVkIG9uIG1vZHVsZXMsIHVzZSAicmVzb2x1dGlvbnMiIHRvIGVuc3VyZSBvbmx5IG9uZSB2ZXJzaW9uIGlzIGluc3RhbGxlZC4KCmh0dHBzOi8veWFybnBrZy5jb20vZW4vZG9jcy9zZWxlY3RpdmUtdmVyc2lvbi1yZXNvbHV0aW9ucwoKRHVwbGljYXRlICJncmFwaHFsIiBtb2R1bGVzIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZGlmZmVyZW50CnZlcnNpb25zIG1heSBoYXZlIGRpZmZlcmVudCBjYXBhYmlsaXRpZXMgYW5kIGJlaGF2aW9yLiBUaGUgZGF0YSBmcm9tIG9uZQp2ZXJzaW9uIHVzZWQgaW4gdGhlIGZ1bmN0aW9uIGZyb20gYW5vdGhlciBjb3VsZCBwcm9kdWNlIGNvbmZ1c2luZyBhbmQKc3B1cmlvdXMgcmVzdWx0cy5gKX19cmV0dXJuITF9O2NsYXNzIHd0e2NvbnN0cnVjdG9yKHQsbj0iR3JhcGhRTCByZXF1ZXN0IixpPXtsaW5lOjEsY29sdW1uOjF9KXt0eXBlb2YgdD09InN0cmluZyJ8fGxlKCExLGBCb2R5IG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkOiAke1llKHQpfS5gKSx0aGlzLmJvZHk9dCx0aGlzLm5hbWU9bix0aGlzLmxvY2F0aW9uT2Zmc2V0PWksdGhpcy5sb2NhdGlvbk9mZnNldC5saW5lPjB8fGxlKCExLCJsaW5lIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKSx0aGlzLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbj4wfHxsZSghMSwiY29sdW1uIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJTb3VyY2UifX1mdW5jdGlvbiBMbihlKXtyZXR1cm4gUm4oZSx3dCl9ZnVuY3Rpb24gRHQoZSx0KXtjb25zdCBuPW5ldyBQbihlLHQpLGk9bi5wYXJzZURvY3VtZW50KCk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJ0b2tlbkNvdW50Iix7ZW51bWVyYWJsZTohMSx2YWx1ZTpuLnRva2VuQ291bnR9KSxpfWNsYXNzIFBue2NvbnN0cnVjdG9yKHQsbj17fSl7Y29uc3QgaT1Mbih0KT90Om5ldyB3dCh0KTt0aGlzLl9sZXhlcj1uZXcgeW4oaSksdGhpcy5fb3B0aW9ucz1uLHRoaXMuX3Rva2VuQ291bnRlcj0wfWdldCB0b2tlbkNvdW50KCl7cmV0dXJuIHRoaXMuX3Rva2VuQ291bnRlcn1wYXJzZU5hbWUoKXtjb25zdCB0PXRoaXMuZXhwZWN0VG9rZW4obC5OQU1FKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5OQU1FLHZhbHVlOnQudmFsdWV9KX1wYXJzZURvY3VtZW50KCl7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpiLkRPQ1VNRU5ULGRlZmluaXRpb25zOnRoaXMubWFueShsLlNPRix0aGlzLnBhcnNlRGVmaW5pdGlvbixsLkVPRil9KX1wYXJzZURlZmluaXRpb24oKXtpZih0aGlzLnBlZWsobC5CUkFDRV9MKSlyZXR1cm4gdGhpcy5wYXJzZU9wZXJhdGlvbkRlZmluaXRpb24oKTtjb25zdCB0PXRoaXMucGVla0Rlc2NyaXB0aW9uKCksbj10P3RoaXMuX2xleGVyLmxvb2thaGVhZCgpOnRoaXMuX2xleGVyLnRva2VuO2lmKG4ua2luZD09PWwuTkFNRSl7c3dpdGNoKG4udmFsdWUpe2Nhc2Uic2NoZW1hIjpyZXR1cm4gdGhpcy5wYXJzZVNjaGVtYURlZmluaXRpb24oKTtjYXNlInNjYWxhciI6cmV0dXJuIHRoaXMucGFyc2VTY2FsYXJUeXBlRGVmaW5pdGlvbigpO2Nhc2UidHlwZSI6cmV0dXJuIHRoaXMucGFyc2VPYmplY3RUeXBlRGVmaW5pdGlvbigpO2Nhc2UiaW50ZXJmYWNlIjpyZXR1cm4gdGhpcy5wYXJzZUludGVyZmFjZVR5cGVEZWZpbml0aW9uKCk7Y2FzZSJ1bmlvbiI6cmV0dXJuIHRoaXMucGFyc2VVbmlvblR5cGVEZWZpbml0aW9uKCk7Y2FzZSJlbnVtIjpyZXR1cm4gdGhpcy5wYXJzZUVudW1UeXBlRGVmaW5pdGlvbigpO2Nhc2UiaW5wdXQiOnJldHVybiB0aGlzLnBhcnNlSW5wdXRPYmplY3RUeXBlRGVmaW5pdGlvbigpO2Nhc2UiZGlyZWN0aXZlIjpyZXR1cm4gdGhpcy5wYXJzZURpcmVjdGl2ZURlZmluaXRpb24oKX1pZih0KXRocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLHRoaXMuX2xleGVyLnRva2VuLnN0YXJ0LCJVbmV4cGVjdGVkIGRlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbnMgYXJlIHN1cHBvcnRlZCBvbmx5IG9uIHR5cGUgZGVmaW5pdGlvbnMuIik7c3dpdGNoKG4udmFsdWUpe2Nhc2UicXVlcnkiOmNhc2UibXV0YXRpb24iOmNhc2Uic3Vic2NyaXB0aW9uIjpyZXR1cm4gdGhpcy5wYXJzZU9wZXJhdGlvbkRlZmluaXRpb24oKTtjYXNlImZyYWdtZW50IjpyZXR1cm4gdGhpcy5wYXJzZUZyYWdtZW50RGVmaW5pdGlvbigpO2Nhc2UiZXh0ZW5kIjpyZXR1cm4gdGhpcy5wYXJzZVR5cGVTeXN0ZW1FeHRlbnNpb24oKX19dGhyb3cgdGhpcy51bmV4cGVjdGVkKG4pfXBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47aWYodGhpcy5wZWVrKGwuQlJBQ0VfTCkpcmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOmIuT1BFUkFUSU9OX0RFRklOSVRJT04sb3BlcmF0aW9uOmhlLlFVRVJZLG5hbWU6dm9pZCAwLHZhcmlhYmxlRGVmaW5pdGlvbnM6W10sZGlyZWN0aXZlczpbXSxzZWxlY3Rpb25TZXQ6dGhpcy5wYXJzZVNlbGVjdGlvblNldCgpfSk7Y29uc3Qgbj10aGlzLnBhcnNlT3BlcmF0aW9uVHlwZSgpO2xldCBpO3JldHVybiB0aGlzLnBlZWsobC5OQU1FKSYmKGk9dGhpcy5wYXJzZU5hbWUoKSksdGhpcy5ub2RlKHQse2tpbmQ6Yi5PUEVSQVRJT05fREVGSU5JVElPTixvcGVyYXRpb246bixuYW1lOmksdmFyaWFibGVEZWZpbml0aW9uczp0aGlzLnBhcnNlVmFyaWFibGVEZWZpbml0aW9ucygpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KX1wYXJzZU9wZXJhdGlvblR5cGUoKXtjb25zdCB0PXRoaXMuZXhwZWN0VG9rZW4obC5OQU1FKTtzd2l0Y2godC52YWx1ZSl7Y2FzZSJxdWVyeSI6cmV0dXJuIGhlLlFVRVJZO2Nhc2UibXV0YXRpb24iOnJldHVybiBoZS5NVVRBVElPTjtjYXNlInN1YnNjcmlwdGlvbiI6cmV0dXJuIGhlLlNVQlNDUklQVElPTn10aHJvdyB0aGlzLnVuZXhwZWN0ZWQodCl9cGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuUEFSRU5fTCx0aGlzLnBhcnNlVmFyaWFibGVEZWZpbml0aW9uLGwuUEFSRU5fUil9cGFyc2VWYXJpYWJsZURlZmluaXRpb24oKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOmIuVkFSSUFCTEVfREVGSU5JVElPTix2YXJpYWJsZTp0aGlzLnBhcnNlVmFyaWFibGUoKSx0eXBlOih0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pLHRoaXMucGFyc2VUeXBlUmVmZXJlbmNlKCkpLGRlZmF1bHRWYWx1ZTp0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4obC5FUVVBTFMpP3RoaXMucGFyc2VDb25zdFZhbHVlTGl0ZXJhbCgpOnZvaWQgMCxkaXJlY3RpdmVzOnRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKX0pfXBhcnNlVmFyaWFibGUoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuRE9MTEFSKSx0aGlzLm5vZGUodCx7a2luZDpiLlZBUklBQkxFLG5hbWU6dGhpcy5wYXJzZU5hbWUoKX0pfXBhcnNlU2VsZWN0aW9uU2V0KCl7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpiLlNFTEVDVElPTl9TRVQsc2VsZWN0aW9uczp0aGlzLm1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VTZWxlY3Rpb24sbC5CUkFDRV9SKX0pfXBhcnNlU2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMucGVlayhsLlNQUkVBRCk/dGhpcy5wYXJzZUZyYWdtZW50KCk6dGhpcy5wYXJzZUZpZWxkKCl9cGFyc2VGaWVsZCgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlTmFtZSgpO2xldCBpLHI7cmV0dXJuIHRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkNPTE9OKT8oaT1uLHI9dGhpcy5wYXJzZU5hbWUoKSk6cj1uLHRoaXMubm9kZSh0LHtraW5kOmIuRklFTEQsYWxpYXM6aSxuYW1lOnIsYXJndW1lbnRzOnRoaXMucGFyc2VBcmd1bWVudHMoITEpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpLHNlbGVjdGlvblNldDp0aGlzLnBlZWsobC5CUkFDRV9MKT90aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCk6dm9pZCAwfSl9cGFyc2VBcmd1bWVudHModCl7Y29uc3Qgbj10P3RoaXMucGFyc2VDb25zdEFyZ3VtZW50OnRoaXMucGFyc2VBcmd1bWVudDtyZXR1cm4gdGhpcy5vcHRpb25hbE1hbnkobC5QQVJFTl9MLG4sbC5QQVJFTl9SKX1wYXJzZUFyZ3VtZW50KHQ9ITEpe2NvbnN0IG49dGhpcy5fbGV4ZXIudG9rZW4saT10aGlzLnBhcnNlTmFtZSgpO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pLHRoaXMubm9kZShuLHtraW5kOmIuQVJHVU1FTlQsbmFtZTppLHZhbHVlOnRoaXMucGFyc2VWYWx1ZUxpdGVyYWwodCl9KX1wYXJzZUNvbnN0QXJndW1lbnQoKXtyZXR1cm4gdGhpcy5wYXJzZUFyZ3VtZW50KCEwKX1wYXJzZUZyYWdtZW50KCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdFRva2VuKGwuU1BSRUFEKTtjb25zdCBuPXRoaXMuZXhwZWN0T3B0aW9uYWxLZXl3b3JkKCJvbiIpO3JldHVybiFuJiZ0aGlzLnBlZWsobC5OQU1FKT90aGlzLm5vZGUodCx7a2luZDpiLkZSQUdNRU5UX1NQUkVBRCxuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSxkaXJlY3RpdmVzOnRoaXMucGFyc2VEaXJlY3RpdmVzKCExKX0pOnRoaXMubm9kZSh0LHtraW5kOmIuSU5MSU5FX0ZSQUdNRU5ULHR5cGVDb25kaXRpb246bj90aGlzLnBhcnNlTmFtZWRUeXBlKCk6dm9pZCAwLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KX1wYXJzZUZyYWdtZW50RGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47cmV0dXJuIHRoaXMuZXhwZWN0S2V5d29yZCgiZnJhZ21lbnQiKSx0aGlzLl9vcHRpb25zLmFsbG93TGVnYWN5RnJhZ21lbnRWYXJpYWJsZXM9PT0hMD90aGlzLm5vZGUodCx7a2luZDpiLkZSQUdNRU5UX0RFRklOSVRJT04sbmFtZTp0aGlzLnBhcnNlRnJhZ21lbnROYW1lKCksdmFyaWFibGVEZWZpbml0aW9uczp0aGlzLnBhcnNlVmFyaWFibGVEZWZpbml0aW9ucygpLHR5cGVDb25kaXRpb246KHRoaXMuZXhwZWN0S2V5d29yZCgib24iKSx0aGlzLnBhcnNlTmFtZWRUeXBlKCkpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KTp0aGlzLm5vZGUodCx7a2luZDpiLkZSQUdNRU5UX0RFRklOSVRJT04sbmFtZTp0aGlzLnBhcnNlRnJhZ21lbnROYW1lKCksdHlwZUNvbmRpdGlvbjoodGhpcy5leHBlY3RLZXl3b3JkKCJvbiIpLHRoaXMucGFyc2VOYW1lZFR5cGUoKSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlRnJhZ21lbnROYW1lKCl7aWYodGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0ib24iKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLnBhcnNlTmFtZSgpfXBhcnNlVmFsdWVMaXRlcmFsKHQpe2NvbnN0IG49dGhpcy5fbGV4ZXIudG9rZW47c3dpdGNoKG4ua2luZCl7Y2FzZSBsLkJSQUNLRVRfTDpyZXR1cm4gdGhpcy5wYXJzZUxpc3QodCk7Y2FzZSBsLkJSQUNFX0w6cmV0dXJuIHRoaXMucGFyc2VPYmplY3QodCk7Y2FzZSBsLklOVDpyZXR1cm4gdGhpcy5hZHZhbmNlTGV4ZXIoKSx0aGlzLm5vZGUobix7a2luZDpiLklOVCx2YWx1ZTpuLnZhbHVlfSk7Y2FzZSBsLkZMT0FUOnJldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZShuLHtraW5kOmIuRkxPQVQsdmFsdWU6bi52YWx1ZX0pO2Nhc2UgbC5TVFJJTkc6Y2FzZSBsLkJMT0NLX1NUUklORzpyZXR1cm4gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwoKTtjYXNlIGwuTkFNRTpzd2l0Y2godGhpcy5hZHZhbmNlTGV4ZXIoKSxuLnZhbHVlKXtjYXNlInRydWUiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpiLkJPT0xFQU4sdmFsdWU6ITB9KTtjYXNlImZhbHNlIjpyZXR1cm4gdGhpcy5ub2RlKG4se2tpbmQ6Yi5CT09MRUFOLHZhbHVlOiExfSk7Y2FzZSJudWxsIjpyZXR1cm4gdGhpcy5ub2RlKG4se2tpbmQ6Yi5OVUxMfSk7ZGVmYXVsdDpyZXR1cm4gdGhpcy5ub2RlKG4se2tpbmQ6Yi5FTlVNLHZhbHVlOm4udmFsdWV9KX1jYXNlIGwuRE9MTEFSOmlmKHQpaWYodGhpcy5leHBlY3RUb2tlbihsLkRPTExBUiksdGhpcy5fbGV4ZXIudG9rZW4ua2luZD09PWwuTkFNRSl7Y29uc3QgaT10aGlzLl9sZXhlci50b2tlbi52YWx1ZTt0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBVbmV4cGVjdGVkIHZhcmlhYmxlICIkJHtpfSIgaW4gY29uc3RhbnQgdmFsdWUuYCl9ZWxzZSB0aHJvdyB0aGlzLnVuZXhwZWN0ZWQobik7cmV0dXJuIHRoaXMucGFyc2VWYXJpYWJsZSgpO2RlZmF1bHQ6dGhyb3cgdGhpcy51bmV4cGVjdGVkKCl9fXBhcnNlQ29uc3RWYWx1ZUxpdGVyYWwoKXtyZXR1cm4gdGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCghMCl9cGFyc2VTdHJpbmdMaXRlcmFsKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gdGhpcy5hZHZhbmNlTGV4ZXIoKSx0aGlzLm5vZGUodCx7a2luZDpiLlNUUklORyx2YWx1ZTp0LnZhbHVlLGJsb2NrOnQua2luZD09PWwuQkxPQ0tfU1RSSU5HfSl9cGFyc2VMaXN0KHQpe2NvbnN0IG49KCk9PnRoaXMucGFyc2VWYWx1ZUxpdGVyYWwodCk7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpiLkxJU1QsdmFsdWVzOnRoaXMuYW55KGwuQlJBQ0tFVF9MLG4sbC5CUkFDS0VUX1IpfSl9cGFyc2VPYmplY3QodCl7Y29uc3Qgbj0oKT0+dGhpcy5wYXJzZU9iamVjdEZpZWxkKHQpO3JldHVybiB0aGlzLm5vZGUodGhpcy5fbGV4ZXIudG9rZW4se2tpbmQ6Yi5PQkpFQ1QsZmllbGRzOnRoaXMuYW55KGwuQlJBQ0VfTCxuLGwuQlJBQ0VfUil9KX1wYXJzZU9iamVjdEZpZWxkKHQpe2NvbnN0IG49dGhpcy5fbGV4ZXIudG9rZW4saT10aGlzLnBhcnNlTmFtZSgpO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pLHRoaXMubm9kZShuLHtraW5kOmIuT0JKRUNUX0ZJRUxELG5hbWU6aSx2YWx1ZTp0aGlzLnBhcnNlVmFsdWVMaXRlcmFsKHQpfSl9cGFyc2VEaXJlY3RpdmVzKHQpe2NvbnN0IG49W107Zm9yKDt0aGlzLnBlZWsobC5BVCk7KW4ucHVzaCh0aGlzLnBhcnNlRGlyZWN0aXZlKHQpKTtyZXR1cm4gbn1wYXJzZUNvbnN0RGlyZWN0aXZlcygpe3JldHVybiB0aGlzLnBhcnNlRGlyZWN0aXZlcyghMCl9cGFyc2VEaXJlY3RpdmUodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gdGhpcy5leHBlY3RUb2tlbihsLkFUKSx0aGlzLm5vZGUobix7a2luZDpiLkRJUkVDVElWRSxuYW1lOnRoaXMucGFyc2VOYW1lKCksYXJndW1lbnRzOnRoaXMucGFyc2VBcmd1bWVudHModCl9KX1wYXJzZVR5cGVSZWZlcmVuY2UoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO2xldCBuO2lmKHRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkJSQUNLRVRfTCkpe2NvbnN0IGk9dGhpcy5wYXJzZVR5cGVSZWZlcmVuY2UoKTt0aGlzLmV4cGVjdFRva2VuKGwuQlJBQ0tFVF9SKSxuPXRoaXMubm9kZSh0LHtraW5kOmIuTElTVF9UWVBFLHR5cGU6aX0pfWVsc2Ugbj10aGlzLnBhcnNlTmFtZWRUeXBlKCk7cmV0dXJuIHRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkJBTkcpP3RoaXMubm9kZSh0LHtraW5kOmIuTk9OX05VTExfVFlQRSx0eXBlOm59KTpufXBhcnNlTmFtZWRUeXBlKCl7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpiLk5BTUVEX1RZUEUsbmFtZTp0aGlzLnBhcnNlTmFtZSgpfSl9cGVla0Rlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMucGVlayhsLlNUUklORyl8fHRoaXMucGVlayhsLkJMT0NLX1NUUklORyl9cGFyc2VEZXNjcmlwdGlvbigpe2lmKHRoaXMucGVla0Rlc2NyaXB0aW9uKCkpcmV0dXJuIHRoaXMucGFyc2VTdHJpbmdMaXRlcmFsKCl9cGFyc2VTY2hlbWFEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgic2NoZW1hIik7Y29uc3QgaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscj10aGlzLm1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VPcGVyYXRpb25UeXBlRGVmaW5pdGlvbixsLkJSQUNFX1IpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLlNDSEVNQV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sZGlyZWN0aXZlczppLG9wZXJhdGlvblR5cGVzOnJ9KX1wYXJzZU9wZXJhdGlvblR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VPcGVyYXRpb25UeXBlKCk7dGhpcy5leHBlY3RUb2tlbihsLkNPTE9OKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lZFR5cGUoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5PUEVSQVRJT05fVFlQRV9ERUZJTklUSU9OLG9wZXJhdGlvbjpuLHR5cGU6aX0pfXBhcnNlU2NhbGFyVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJzY2FsYXIiKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOmIuU0NBTEFSX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnJ9KX1wYXJzZU9iamVjdFR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgidHlwZSIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHM9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLG89dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5PQkpFQ1RfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGludGVyZmFjZXM6cixkaXJlY3RpdmVzOnMsZmllbGRzOm99KX1wYXJzZUltcGxlbWVudHNJbnRlcmZhY2VzKCl7cmV0dXJuIHRoaXMuZXhwZWN0T3B0aW9uYWxLZXl3b3JkKCJpbXBsZW1lbnRzIik/dGhpcy5kZWxpbWl0ZWRNYW55KGwuQU1QLHRoaXMucGFyc2VOYW1lZFR5cGUpOltdfXBhcnNlRmllbGRzRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZUZpZWxkRGVmaW5pdGlvbixsLkJSQUNFX1IpfXBhcnNlRmllbGREZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpLGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VBcmd1bWVudERlZnMoKTt0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pO2NvbnN0IHM9dGhpcy5wYXJzZVR5cGVSZWZlcmVuY2UoKSxvPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5GSUVMRF9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGFyZ3VtZW50czpyLHR5cGU6cyxkaXJlY3RpdmVzOm99KX1wYXJzZUFyZ3VtZW50RGVmcygpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLlBBUkVOX0wsdGhpcy5wYXJzZUlucHV0VmFsdWVEZWYsbC5QQVJFTl9SKX1wYXJzZUlucHV0VmFsdWVEZWYoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlTmFtZSgpO3RoaXMuZXhwZWN0VG9rZW4obC5DT0xPTik7Y29uc3Qgcj10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpO2xldCBzO3RoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkVRVUFMUykmJihzPXRoaXMucGFyc2VDb25zdFZhbHVlTGl0ZXJhbCgpKTtjb25zdCBvPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5JTlBVVF9WQUxVRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLHR5cGU6cixkZWZhdWx0VmFsdWU6cyxkaXJlY3RpdmVzOm99KX1wYXJzZUludGVyZmFjZVR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgiaW50ZXJmYWNlIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUltcGxlbWVudHNJbnRlcmZhY2VzKCkscz10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCksbz10aGlzLnBhcnNlRmllbGRzRGVmaW5pdGlvbigpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLklOVEVSRkFDRV9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksaW50ZXJmYWNlczpyLGRpcmVjdGl2ZXM6cyxmaWVsZHM6b30pfXBhcnNlVW5pb25UeXBlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoInVuaW9uIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZVVuaW9uTWVtYmVyVHlwZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5VTklPTl9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksZGlyZWN0aXZlczpyLHR5cGVzOnN9KX1wYXJzZVVuaW9uTWVtYmVyVHlwZXMoKXtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuRVFVQUxTKT90aGlzLmRlbGltaXRlZE1hbnkobC5QSVBFLHRoaXMucGFyc2VOYW1lZFR5cGUpOltdfXBhcnNlRW51bVR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgiZW51bSIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VFbnVtVmFsdWVzRGVmaW5pdGlvbigpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLkVOVU1fVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cix2YWx1ZXM6c30pfXBhcnNlRW51bVZhbHVlc0RlZmluaXRpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25hbE1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VFbnVtVmFsdWVEZWZpbml0aW9uLGwuQlJBQ0VfUil9cGFyc2VFbnVtVmFsdWVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpLGk9dGhpcy5wYXJzZUVudW1WYWx1ZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5FTlVNX1ZBTFVFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksZGlyZWN0aXZlczpyfSl9cGFyc2VFbnVtVmFsdWVOYW1lKCl7aWYodGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0idHJ1ZSJ8fHRoaXMuX2xleGVyLnRva2VuLnZhbHVlPT09ImZhbHNlInx8dGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0ibnVsbCIpdGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2UsdGhpcy5fbGV4ZXIudG9rZW4uc3RhcnQsYCR7a2UodGhpcy5fbGV4ZXIudG9rZW4pfSBpcyByZXNlcnZlZCBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIGFuIGVudW0gdmFsdWUuYCk7cmV0dXJuIHRoaXMucGFyc2VOYW1lKCl9cGFyc2VJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgiaW5wdXQiKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscz10aGlzLnBhcnNlSW5wdXRGaWVsZHNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOmIuSU5QVVRfT0JKRUNUX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnIsZmllbGRzOnN9KX1wYXJzZUlucHV0RmllbGRzRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZUlucHV0VmFsdWVEZWYsbC5CUkFDRV9SKX1wYXJzZVR5cGVTeXN0ZW1FeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLmxvb2thaGVhZCgpO2lmKHQua2luZD09PWwuTkFNRSlzd2l0Y2godC52YWx1ZSl7Y2FzZSJzY2hlbWEiOnJldHVybiB0aGlzLnBhcnNlU2NoZW1hRXh0ZW5zaW9uKCk7Y2FzZSJzY2FsYXIiOnJldHVybiB0aGlzLnBhcnNlU2NhbGFyVHlwZUV4dGVuc2lvbigpO2Nhc2UidHlwZSI6cmV0dXJuIHRoaXMucGFyc2VPYmplY3RUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJpbnRlcmZhY2UiOnJldHVybiB0aGlzLnBhcnNlSW50ZXJmYWNlVHlwZUV4dGVuc2lvbigpO2Nhc2UidW5pb24iOnJldHVybiB0aGlzLnBhcnNlVW5pb25UeXBlRXh0ZW5zaW9uKCk7Y2FzZSJlbnVtIjpyZXR1cm4gdGhpcy5wYXJzZUVudW1UeXBlRXh0ZW5zaW9uKCk7Y2FzZSJpbnB1dCI6cmV0dXJuIHRoaXMucGFyc2VJbnB1dE9iamVjdFR5cGVFeHRlbnNpb24oKX10aHJvdyB0aGlzLnVuZXhwZWN0ZWQodCl9cGFyc2VTY2hlbWFFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJzY2hlbWEiKTtjb25zdCBuPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxpPXRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlT3BlcmF0aW9uVHlwZURlZmluaXRpb24sbC5CUkFDRV9SKTtpZihuLmxlbmd0aD09PTAmJmkubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5TQ0hFTUFfRVhURU5TSU9OLGRpcmVjdGl2ZXM6bixvcGVyYXRpb25UeXBlczppfSl9cGFyc2VTY2FsYXJUeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgic2NhbGFyIik7Y29uc3Qgbj10aGlzLnBhcnNlTmFtZSgpLGk9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO2lmKGkubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5TQ0FMQVJfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGRpcmVjdGl2ZXM6aX0pfXBhcnNlT2JqZWN0VHlwZUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoInR5cGUiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VGaWVsZHNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTAmJnMubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5PQkpFQ1RfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGludGVyZmFjZXM6aSxkaXJlY3RpdmVzOnIsZmllbGRzOnN9KX1wYXJzZUludGVyZmFjZVR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJpbnRlcmZhY2UiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VGaWVsZHNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTAmJnMubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5JTlRFUkZBQ0VfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGludGVyZmFjZXM6aSxkaXJlY3RpdmVzOnIsZmllbGRzOnN9KX1wYXJzZVVuaW9uVHlwZUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoInVuaW9uIik7Y29uc3Qgbj10aGlzLnBhcnNlTmFtZSgpLGk9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHI9dGhpcy5wYXJzZVVuaW9uTWVtYmVyVHlwZXMoKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5VTklPTl9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppLHR5cGVzOnJ9KX1wYXJzZUVudW1UeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgiZW51bSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMucGFyc2VFbnVtVmFsdWVzRGVmaW5pdGlvbigpO2lmKGkubGVuZ3RoPT09MCYmci5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLkVOVU1fVFlQRV9FWFRFTlNJT04sbmFtZTpuLGRpcmVjdGl2ZXM6aSx2YWx1ZXM6cn0pfXBhcnNlSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgiaW5wdXQiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscj10aGlzLnBhcnNlSW5wdXRGaWVsZHNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTApdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOmIuSU5QVVRfT0JKRUNUX1RZUEVfRVhURU5TSU9OLG5hbWU6bixkaXJlY3RpdmVzOmksZmllbGRzOnJ9KX1wYXJzZURpcmVjdGl2ZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJkaXJlY3RpdmUiKSx0aGlzLmV4cGVjdFRva2VuKGwuQVQpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VBcmd1bWVudERlZnMoKSxzPXRoaXMuZXhwZWN0T3B0aW9uYWxLZXl3b3JkKCJyZXBlYXRhYmxlIik7dGhpcy5leHBlY3RLZXl3b3JkKCJvbiIpO2NvbnN0IG89dGhpcy5wYXJzZURpcmVjdGl2ZUxvY2F0aW9ucygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLkRJUkVDVElWRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGFyZ3VtZW50czpyLHJlcGVhdGFibGU6cyxsb2NhdGlvbnM6b30pfXBhcnNlRGlyZWN0aXZlTG9jYXRpb25zKCl7cmV0dXJuIHRoaXMuZGVsaW1pdGVkTWFueShsLlBJUEUsdGhpcy5wYXJzZURpcmVjdGl2ZUxvY2F0aW9uKX1wYXJzZURpcmVjdGl2ZUxvY2F0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VOYW1lKCk7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdlLG4udmFsdWUpKXJldHVybiBuO3Rocm93IHRoaXMudW5leHBlY3RlZCh0KX1ub2RlKHQsbil7cmV0dXJuIHRoaXMuX29wdGlvbnMubm9Mb2NhdGlvbiE9PSEwJiYobi5sb2M9bmV3IGxuKHQsdGhpcy5fbGV4ZXIubGFzdFRva2VuLHRoaXMuX2xleGVyLnNvdXJjZSkpLG59cGVlayh0KXtyZXR1cm4gdGhpcy5fbGV4ZXIudG9rZW4ua2luZD09PXR9ZXhwZWN0VG9rZW4odCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtpZihuLmtpbmQ9PT10KXJldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLG47dGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2Usbi5zdGFydCxgRXhwZWN0ZWQgJHtrdCh0KX0sIGZvdW5kICR7a2Uobil9LmApfWV4cGVjdE9wdGlvbmFsVG9rZW4odCl7cmV0dXJuIHRoaXMuX2xleGVyLnRva2VuLmtpbmQ9PT10Pyh0aGlzLmFkdmFuY2VMZXhlcigpLCEwKTohMX1leHBlY3RLZXl3b3JkKHQpe2NvbnN0IG49dGhpcy5fbGV4ZXIudG9rZW47aWYobi5raW5kPT09bC5OQU1FJiZuLnZhbHVlPT09dCl0aGlzLmFkdmFuY2VMZXhlcigpO2Vsc2UgdGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2Usbi5zdGFydCxgRXhwZWN0ZWQgIiR7dH0iLCBmb3VuZCAke2tlKG4pfS5gKX1leHBlY3RPcHRpb25hbEtleXdvcmQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gbi5raW5kPT09bC5OQU1FJiZuLnZhbHVlPT09dD8odGhpcy5hZHZhbmNlTGV4ZXIoKSwhMCk6ITF9dW5leHBlY3RlZCh0KXtjb25zdCBuPXQhPW51bGw/dDp0aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gRyh0aGlzLl9sZXhlci5zb3VyY2Usbi5zdGFydCxgVW5leHBlY3RlZCAke2tlKG4pfS5gKX1hbnkodCxuLGkpe3RoaXMuZXhwZWN0VG9rZW4odCk7Y29uc3Qgcj1bXTtmb3IoOyF0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4oaSk7KXIucHVzaChuLmNhbGwodGhpcykpO3JldHVybiByfW9wdGlvbmFsTWFueSh0LG4saSl7aWYodGhpcy5leHBlY3RPcHRpb25hbFRva2VuKHQpKXtjb25zdCByPVtdO2RvIHIucHVzaChuLmNhbGwodGhpcykpO3doaWxlKCF0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4oaSkpO3JldHVybiByfXJldHVybltdfW1hbnkodCxuLGkpe3RoaXMuZXhwZWN0VG9rZW4odCk7Y29uc3Qgcj1bXTtkbyByLnB1c2gobi5jYWxsKHRoaXMpKTt3aGlsZSghdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGkpKTtyZXR1cm4gcn1kZWxpbWl0ZWRNYW55KHQsbil7dGhpcy5leHBlY3RPcHRpb25hbFRva2VuKHQpO2NvbnN0IGk9W107ZG8gaS5wdXNoKG4uY2FsbCh0aGlzKSk7d2hpbGUodGhpcy5leHBlY3RPcHRpb25hbFRva2VuKHQpKTtyZXR1cm4gaX1hZHZhbmNlTGV4ZXIoKXtjb25zdHttYXhUb2tlbnM6dH09dGhpcy5fb3B0aW9ucyxuPXRoaXMuX2xleGVyLmFkdmFuY2UoKTtpZihuLmtpbmQhPT1sLkVPRiYmKCsrdGhpcy5fdG9rZW5Db3VudGVyLHQhPT12b2lkIDAmJnRoaXMuX3Rva2VuQ291bnRlcj50KSl0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBEb2N1bWVudCBjb250YWlucyBtb3JlIHRoYXQgJHt0fSB0b2tlbnMuIFBhcnNpbmcgYWJvcnRlZC5gKX19ZnVuY3Rpb24ga2UoZSl7Y29uc3QgdD1lLnZhbHVlO3JldHVybiBrdChlLmtpbmQpKyh0IT1udWxsP2AgIiR7dH0iYDoiIil9ZnVuY3Rpb24ga3QoZSl7cmV0dXJuIGduKGUpP2AiJHtlfSJgOmV9ZnVuY3Rpb24gRm4oZSl7cmV0dXJuYCIke2UucmVwbGFjZShNbixCbil9ImB9Y29uc3QgTW49L1tceDAwLVx4MWZceDIyXHg1Y1x4N2YtXHg5Zl0vZztmdW5jdGlvbiBCbihlKXtyZXR1cm4gJG5bZS5jaGFyQ29kZUF0KDApXX1jb25zdCAkbj1bIlxcdTAwMDAiLCJcXHUwMDAxIiwiXFx1MDAwMiIsIlxcdTAwMDMiLCJcXHUwMDA0IiwiXFx1MDAwNSIsIlxcdTAwMDYiLCJcXHUwMDA3IiwiXFxiIiwiXFx0IiwiXFxuIiwiXFx1MDAwQiIsIlxcZiIsIlxcciIsIlxcdTAwMEUiLCJcXHUwMDBGIiwiXFx1MDAxMCIsIlxcdTAwMTEiLCJcXHUwMDEyIiwiXFx1MDAxMyIsIlxcdTAwMTQiLCJcXHUwMDE1IiwiXFx1MDAxNiIsIlxcdTAwMTciLCJcXHUwMDE4IiwiXFx1MDAxOSIsIlxcdTAwMUEiLCJcXHUwMDFCIiwiXFx1MDAxQyIsIlxcdTAwMUQiLCJcXHUwMDFFIiwiXFx1MDAxRiIsIiIsIiIsJ1xcIicsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIlxcXFwiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJcXHUwMDdGIiwiXFx1MDA4MCIsIlxcdTAwODEiLCJcXHUwMDgyIiwiXFx1MDA4MyIsIlxcdTAwODQiLCJcXHUwMDg1IiwiXFx1MDA4NiIsIlxcdTAwODciLCJcXHUwMDg4IiwiXFx1MDA4OSIsIlxcdTAwOEEiLCJcXHUwMDhCIiwiXFx1MDA4QyIsIlxcdTAwOEQiLCJcXHUwMDhFIiwiXFx1MDA4RiIsIlxcdTAwOTAiLCJcXHUwMDkxIiwiXFx1MDA5MiIsIlxcdTAwOTMiLCJcXHUwMDk0IiwiXFx1MDA5NSIsIlxcdTAwOTYiLCJcXHUwMDk3IiwiXFx1MDA5OCIsIlxcdTAwOTkiLCJcXHUwMDlBIiwiXFx1MDA5QiIsIlxcdTAwOUMiLCJcXHUwMDlEIiwiXFx1MDA5RSIsIlxcdTAwOUYiXSxVbj1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBWbihlLHQsbj1idCl7Y29uc3QgaT1uZXcgTWFwO2Zvcihjb25zdCBMIG9mIE9iamVjdC52YWx1ZXMoYikpaS5zZXQoTCxxbih0LEwpKTtsZXQgcixzPUFycmF5LmlzQXJyYXkoZSksbz1bZV0sYz0tMSxoPVtdLGQ9ZSx1LHk7Y29uc3Qgdj1bXSxUPVtdO2Rve2MrKztjb25zdCBMPWM9PT1vLmxlbmd0aCxxPUwmJmgubGVuZ3RoIT09MDtpZihMKXtpZih1PVQubGVuZ3RoPT09MD92b2lkIDA6dlt2Lmxlbmd0aC0xXSxkPXkseT1ULnBvcCgpLHEpaWYocyl7ZD1kLnNsaWNlKCk7bGV0IEU9MDtmb3IoY29uc3RbdyxrXW9mIGgpe2NvbnN0IFA9dy1FO2s9PT1udWxsPyhkLnNwbGljZShQLDEpLEUrKyk6ZFtQXT1rfX1lbHNle2Q9RCh7fSxkKTtmb3IoY29uc3RbRSx3XW9mIGgpZFtFXT13fWM9ci5pbmRleCxvPXIua2V5cyxoPXIuZWRpdHMscz1yLmluQXJyYXkscj1yLnByZXZ9ZWxzZSBpZih5KXtpZih1PXM/YzpvW2NdLGQ9eVt1XSxkPT1udWxsKWNvbnRpbnVlO3YucHVzaCh1KX1sZXQgZztpZighQXJyYXkuaXNBcnJheShkKSl7dmFyIG0sTjtUdChkKXx8bGUoITEsYEludmFsaWQgQVNUIE5vZGU6ICR7WWUoZCl9LmApO2NvbnN0IEU9TD8obT1pLmdldChkLmtpbmQpKT09PW51bGx8fG09PT12b2lkIDA/dm9pZCAwOm0ubGVhdmU6KE49aS5nZXQoZC5raW5kKSk9PT1udWxsfHxOPT09dm9pZCAwP3ZvaWQgMDpOLmVudGVyO2lmKGc9RT09bnVsbD92b2lkIDA6RS5jYWxsKHQsZCx1LHksdixUKSxnPT09VW4pYnJlYWs7aWYoZz09PSExKXtpZighTCl7di5wb3AoKTtjb250aW51ZX19ZWxzZSBpZihnIT09dm9pZCAwJiYoaC5wdXNoKFt1LGddKSwhTCkpaWYoVHQoZykpZD1nO2Vsc2V7di5wb3AoKTtjb250aW51ZX19aWYoZz09PXZvaWQgMCYmcSYmaC5wdXNoKFt1LGRdKSxMKXYucG9wKCk7ZWxzZXt2YXIgUjtyPXtpbkFycmF5OnMsaW5kZXg6YyxrZXlzOm8sZWRpdHM6aCxwcmV2OnJ9LHM9QXJyYXkuaXNBcnJheShkKSxvPXM/ZDooUj1uW2Qua2luZF0pIT09bnVsbCYmUiE9PXZvaWQgMD9SOltdLGM9LTEsaD1bXSx5JiZULnB1c2goeSkseT1kfX13aGlsZShyIT09dm9pZCAwKTtyZXR1cm4gaC5sZW5ndGghPT0wP2hbaC5sZW5ndGgtMV1bMV06ZX1mdW5jdGlvbiBxbihlLHQpe2NvbnN0IG49ZVt0XTtyZXR1cm4gdHlwZW9mIG49PSJvYmplY3QiP246dHlwZW9mIG49PSJmdW5jdGlvbiI/e2VudGVyOm4sbGVhdmU6dm9pZCAwfTp7ZW50ZXI6ZS5lbnRlcixsZWF2ZTplLmxlYXZlfX1mdW5jdGlvbiBqbihlKXtyZXR1cm4gVm4oZSx6bil9Y29uc3QgR249ODAsem49e05hbWU6e2xlYXZlOmU9PmUudmFsdWV9LFZhcmlhYmxlOntsZWF2ZTplPT4iJCIrZS5uYW1lfSxEb2N1bWVudDp7bGVhdmU6ZT0+cChlLmRlZmluaXRpb25zLGAKCmApfSxPcGVyYXRpb25EZWZpbml0aW9uOntsZWF2ZShlKXtjb25zdCB0PU8oIigiLHAoZS52YXJpYWJsZURlZmluaXRpb25zLCIsICIpLCIpIiksbj1wKFtlLm9wZXJhdGlvbixwKFtlLm5hbWUsdF0pLHAoZS5kaXJlY3RpdmVzLCIgIildLCIgIik7cmV0dXJuKG49PT0icXVlcnkiPyIiOm4rIiAiKStlLnNlbGVjdGlvblNldH19LFZhcmlhYmxlRGVmaW5pdGlvbjp7bGVhdmU6KHt2YXJpYWJsZTplLHR5cGU6dCxkZWZhdWx0VmFsdWU6bixkaXJlY3RpdmVzOml9KT0+ZSsiOiAiK3QrTygiID0gIixuKStPKCIgIixwKGksIiAiKSl9LFNlbGVjdGlvblNldDp7bGVhdmU6KHtzZWxlY3Rpb25zOmV9KT0+cmUoZSl9LEZpZWxkOntsZWF2ZSh7YWxpYXM6ZSxuYW1lOnQsYXJndW1lbnRzOm4sZGlyZWN0aXZlczppLHNlbGVjdGlvblNldDpyfSl7Y29uc3Qgcz1PKCIiLGUsIjogIikrdDtsZXQgbz1zK08oIigiLHAobiwiLCAiKSwiKSIpO3JldHVybiBvLmxlbmd0aD5HbiYmKG89cytPKGAoCmAsQ2UocChuLGAKYCkpLGAKKWApKSxwKFtvLHAoaSwiICIpLHJdLCIgIil9fSxBcmd1bWVudDp7bGVhdmU6KHtuYW1lOmUsdmFsdWU6dH0pPT5lKyI6ICIrdH0sRnJhZ21lbnRTcHJlYWQ6e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT4iLi4uIitlK08oIiAiLHAodCwiICIpKX0sSW5saW5lRnJhZ21lbnQ6e2xlYXZlOih7dHlwZUNvbmRpdGlvbjplLGRpcmVjdGl2ZXM6dCxzZWxlY3Rpb25TZXQ6bn0pPT5wKFsiLi4uIixPKCJvbiAiLGUpLHAodCwiICIpLG5dLCIgIil9LEZyYWdtZW50RGVmaW5pdGlvbjp7bGVhdmU6KHtuYW1lOmUsdHlwZUNvbmRpdGlvbjp0LHZhcmlhYmxlRGVmaW5pdGlvbnM6bixkaXJlY3RpdmVzOmksc2VsZWN0aW9uU2V0OnJ9KT0+YGZyYWdtZW50ICR7ZX0ke08oIigiLHAobiwiLCAiKSwiKSIpfSBvbiAke3R9ICR7TygiIixwKGksIiAiKSwiICIpfWArcn0sSW50VmFsdWU6e2xlYXZlOih7dmFsdWU6ZX0pPT5lfSxGbG9hdFZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sU3RyaW5nVmFsdWU6e2xlYXZlOih7dmFsdWU6ZSxibG9jazp0fSk9PnQ/bW4oZSk6Rm4oZSl9LEJvb2xlYW5WYWx1ZTp7bGVhdmU6KHt2YWx1ZTplfSk9PmU/InRydWUiOiJmYWxzZSJ9LE51bGxWYWx1ZTp7bGVhdmU6KCk9PiJudWxsIn0sRW51bVZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sTGlzdFZhbHVlOntsZWF2ZTooe3ZhbHVlczplfSk9PiJbIitwKGUsIiwgIikrIl0ifSxPYmplY3RWYWx1ZTp7bGVhdmU6KHtmaWVsZHM6ZX0pPT4ieyIrcChlLCIsICIpKyJ9In0sT2JqZWN0RmllbGQ6e2xlYXZlOih7bmFtZTplLHZhbHVlOnR9KT0+ZSsiOiAiK3R9LERpcmVjdGl2ZTp7bGVhdmU6KHtuYW1lOmUsYXJndW1lbnRzOnR9KT0+IkAiK2UrTygiKCIscCh0LCIsICIpLCIpIil9LE5hbWVkVHlwZTp7bGVhdmU6KHtuYW1lOmV9KT0+ZX0sTGlzdFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PiJbIitlKyJdIn0sTm9uTnVsbFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PmUrIiEifSxTY2hlbWFEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsZGlyZWN0aXZlczp0LG9wZXJhdGlvblR5cGVzOm59KT0+TygiIixlLGAKYCkrcChbInNjaGVtYSIscCh0LCIgIikscmUobildLCIgIil9LE9wZXJhdGlvblR5cGVEZWZpbml0aW9uOntsZWF2ZTooe29wZXJhdGlvbjplLHR5cGU6dH0pPT5lKyI6ICIrdH0sU2NhbGFyVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpufSk9Pk8oIiIsZSxgCmApK3AoWyJzY2FsYXIiLHQscChuLCIgIildLCIgIil9LE9iamVjdFR5cGVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGludGVyZmFjZXM6bixkaXJlY3RpdmVzOmksZmllbGRzOnJ9KT0+TygiIixlLGAKYCkrcChbInR5cGUiLHQsTygiaW1wbGVtZW50cyAiLHAobiwiICYgIikpLHAoaSwiICIpLHJlKHIpXSwiICIpfSxGaWVsZERlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsYXJndW1lbnRzOm4sdHlwZTppLGRpcmVjdGl2ZXM6cn0pPT5PKCIiLGUsYApgKSt0KyhDdChuKT9PKGAoCmAsQ2UocChuLGAKYCkpLGAKKWApOk8oIigiLHAobiwiLCAiKSwiKSIpKSsiOiAiK2krTygiICIscChyLCIgIikpfSxJbnB1dFZhbHVlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCx0eXBlOm4sZGVmYXVsdFZhbHVlOmksZGlyZWN0aXZlczpyfSk9Pk8oIiIsZSxgCmApK3AoW3QrIjogIituLE8oIj0gIixpKSxwKHIsIiAiKV0sIiAiKX0sSW50ZXJmYWNlVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsaW50ZXJmYWNlczpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pPT5PKCIiLGUsYApgKStwKFsiaW50ZXJmYWNlIix0LE8oImltcGxlbWVudHMgIixwKG4sIiAmICIpKSxwKGksIiAiKSxyZShyKV0sIiAiKX0sVW5pb25UeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm4sdHlwZXM6aX0pPT5PKCIiLGUsYApgKStwKFsidW5pb24iLHQscChuLCIgIiksTygiPSAiLHAoaSwiIHwgIikpXSwiICIpfSxFbnVtVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLHZhbHVlczppfSk9Pk8oIiIsZSxgCmApK3AoWyJlbnVtIix0LHAobiwiICIpLHJlKGkpXSwiICIpfSxFbnVtVmFsdWVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGRpcmVjdGl2ZXM6bn0pPT5PKCIiLGUsYApgKStwKFt0LHAobiwiICIpXSwiICIpfSxJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGRpcmVjdGl2ZXM6bixmaWVsZHM6aX0pPT5PKCIiLGUsYApgKStwKFsiaW5wdXQiLHQscChuLCIgIikscmUoaSldLCIgIil9LERpcmVjdGl2ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsYXJndW1lbnRzOm4scmVwZWF0YWJsZTppLGxvY2F0aW9uczpyfSk9Pk8oIiIsZSxgCmApKyJkaXJlY3RpdmUgQCIrdCsoQ3Qobik/TyhgKApgLENlKHAobixgCmApKSxgCilgKTpPKCIoIixwKG4sIiwgIiksIikiKSkrKGk/IiByZXBlYXRhYmxlIjoiIikrIiBvbiAiK3AociwiIHwgIil9LFNjaGVtYUV4dGVuc2lvbjp7bGVhdmU6KHtkaXJlY3RpdmVzOmUsb3BlcmF0aW9uVHlwZXM6dH0pPT5wKFsiZXh0ZW5kIHNjaGVtYSIscChlLCIgIikscmUodCldLCIgIil9LFNjYWxhclR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT5wKFsiZXh0ZW5kIHNjYWxhciIsZSxwKHQsIiAiKV0sIiAiKX0sT2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsaW50ZXJmYWNlczp0LGRpcmVjdGl2ZXM6bixmaWVsZHM6aX0pPT5wKFsiZXh0ZW5kIHR5cGUiLGUsTygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLHJlKGkpXSwiICIpfSxJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uOntsZWF2ZTooe25hbWU6ZSxpbnRlcmZhY2VzOnQsZGlyZWN0aXZlczpuLGZpZWxkczppfSk9PnAoWyJleHRlbmQgaW50ZXJmYWNlIixlLE8oImltcGxlbWVudHMgIixwKHQsIiAmICIpKSxwKG4sIiAiKSxyZShpKV0sIiAiKX0sVW5pb25UeXBlRXh0ZW5zaW9uOntsZWF2ZTooe25hbWU6ZSxkaXJlY3RpdmVzOnQsdHlwZXM6bn0pPT5wKFsiZXh0ZW5kIHVuaW9uIixlLHAodCwiICIpLE8oIj0gIixwKG4sIiB8ICIpKV0sIiAiKX0sRW51bVR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dCx2YWx1ZXM6bn0pPT5wKFsiZXh0ZW5kIGVudW0iLGUscCh0LCIgIikscmUobildLCIgIil9LElucHV0T2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LGZpZWxkczpufSk9PnAoWyJleHRlbmQgaW5wdXQiLGUscCh0LCIgIikscmUobildLCIgIil9fTtmdW5jdGlvbiBwKGUsdD0iIil7dmFyIG47cmV0dXJuKG49ZT09bnVsbD92b2lkIDA6ZS5maWx0ZXIoaT0+aSkuam9pbih0KSkhPT1udWxsJiZuIT09dm9pZCAwP246IiJ9ZnVuY3Rpb24gcmUoZSl7cmV0dXJuIE8oYHsKYCxDZShwKGUsYApgKSksYAp9YCl9ZnVuY3Rpb24gTyhlLHQsbj0iIil7cmV0dXJuIHQhPW51bGwmJnQhPT0iIj9lK3QrbjoiIn1mdW5jdGlvbiBDZShlKXtyZXR1cm4gTygiICAiLGUucmVwbGFjZSgvXG4vZyxgCiAgYCkpfWZ1bmN0aW9uIEN0KGUpe3ZhciB0O3JldHVybih0PWU9PW51bGw/dm9pZCAwOmUuc29tZShuPT5uLmluY2x1ZGVzKGAKYCkpKSE9PW51bGwmJnQhPT12b2lkIDA/dDohMX1jb25zdCBSdD1lPT57dmFyIGkscjtsZXQgdDtjb25zdCBuPWUuZGVmaW5pdGlvbnMuZmlsdGVyKHM9PnMua2luZD09PSJPcGVyYXRpb25EZWZpbml0aW9uIik7cmV0dXJuIG4ubGVuZ3RoPT09MSYmKHQ9KHI9KGk9blswXSk9PW51bGw/dm9pZCAwOmkubmFtZSk9PW51bGw/dm9pZCAwOnIudmFsdWUpLHR9LEplPWU9PntpZih0eXBlb2YgZT09InN0cmluZyIpe2xldCBuO3RyeXtjb25zdCBpPUR0KGUpO249UnQoaSl9Y2F0Y2goaSl7fXJldHVybntxdWVyeTplLG9wZXJhdGlvbk5hbWU6bn19Y29uc3QgdD1SdChlKTtyZXR1cm57cXVlcnk6am4oZSksb3BlcmF0aW9uTmFtZTp0fX07Y2xhc3MgZGUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LG4pe2NvbnN0IGk9YCR7ZGUuZXh0cmFjdE1lc3NhZ2UodCl9OiAke0pTT04uc3RyaW5naWZ5KHtyZXNwb25zZTp0LHJlcXVlc3Q6bn0pfWA7c3VwZXIoaSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsZGUucHJvdG90eXBlKSx0aGlzLnJlc3BvbnNlPXQsdGhpcy5yZXF1ZXN0PW4sdHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPT0iZnVuY3Rpb24iJiZFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLGRlKX1zdGF0aWMgZXh0cmFjdE1lc3NhZ2UodCl7dmFyIG4saSxyO3JldHVybihyPShpPShuPXQuZXJyb3JzKT09bnVsbD92b2lkIDA6blswXSk9PW51bGw/dm9pZCAwOmkubWVzc2FnZSkhPW51bGw/cjpgR3JhcGhRTCBFcnJvciAoQ29kZTogJHt0LnN0YXR1c30pYH19dmFyIEhuPXR5cGVvZiBnbG9iYWxUaGlzIT0idW5kZWZpbmVkIj9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT0idW5kZWZpbmVkIj9nbG9iYWw6dHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiP3NlbGY6e307ZnVuY3Rpb24gTHQoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRlZmF1bHQiKT9lLmRlZmF1bHQ6ZX12YXIgUWU9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIj9zZWxmOkhuLGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBzKCl7dGhpcy5mZXRjaD0hMSx0aGlzLkRPTUV4Y2VwdGlvbj1uLkRPTUV4Y2VwdGlvbn1yZXR1cm4gcy5wcm90b3R5cGU9bixuZXcgc30oKTsoZnVuY3Rpb24ocyl7KGZ1bmN0aW9uKG8pe3ZhciBjPXtzZWFyY2hQYXJhbXM6IlVSTFNlYXJjaFBhcmFtcyJpbiBzLGl0ZXJhYmxlOiJTeW1ib2wiaW4gcyYmIml0ZXJhdG9yImluIFN5bWJvbCxibG9iOiJGaWxlUmVhZGVyImluIHMmJiJCbG9iImluIHMmJmZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgQmxvYiwhMH1jYXRjaChhKXtyZXR1cm4hMX19KCksZm9ybURhdGE6IkZvcm1EYXRhImluIHMsYXJyYXlCdWZmZXI6IkFycmF5QnVmZmVyImluIHN9O2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGEmJkRhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGEpfWlmKGMuYXJyYXlCdWZmZXIpdmFyIGQ9WyJbb2JqZWN0IEludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLCJbb2JqZWN0IEludDE2QXJyYXldIiwiW29iamVjdCBVaW50MTZBcnJheV0iLCJbb2JqZWN0IEludDMyQXJyYXldIiwiW29iamVjdCBVaW50MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXSx1PUFycmF5QnVmZmVyLmlzVmlld3x8ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmQuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpPi0xfTtmdW5jdGlvbiB5KGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIiYmKGE9U3RyaW5nKGEpKSwvW15hLXowLTlcLSMkJSYnKisuXl9gfH5dL2kudGVzdChhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZSIpO3JldHVybiBhLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoYT1TdHJpbmcoYSkpLGF9ZnVuY3Rpb24gVChhKXt2YXIgZj17bmV4dDpmdW5jdGlvbigpe3ZhciBfPWEuc2hpZnQoKTtyZXR1cm57ZG9uZTpfPT09dm9pZCAwLHZhbHVlOl99fX07cmV0dXJuIGMuaXRlcmFibGUmJihmW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gZn0pLGZ9ZnVuY3Rpb24gbShhKXt0aGlzLm1hcD17fSxhIGluc3RhbmNlb2YgbT9hLmZvckVhY2goZnVuY3Rpb24oZixfKXt0aGlzLmFwcGVuZChfLGYpfSx0aGlzKTpBcnJheS5pc0FycmF5KGEpP2EuZm9yRWFjaChmdW5jdGlvbihmKXt0aGlzLmFwcGVuZChmWzBdLGZbMV0pfSx0aGlzKTphJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3RoaXMuYXBwZW5kKGYsYVtmXSl9LHRoaXMpfW0ucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihhLGYpe2E9eShhKSxmPXYoZik7dmFyIF89dGhpcy5tYXBbYV07dGhpcy5tYXBbYV09Xz9fKyIsICIrZjpmfSxtLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMubWFwW3koYSldfSxtLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9eShhKSx0aGlzLmhhcyhhKT90aGlzLm1hcFthXTpudWxsfSxtLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KHkoYSkpfSxtLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSxmKXt0aGlzLm1hcFt5KGEpXT12KGYpfSxtLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEsZil7Zm9yKHZhciBfIGluIHRoaXMubWFwKXRoaXMubWFwLmhhc093blByb3BlcnR5KF8pJiZhLmNhbGwoZix0aGlzLm1hcFtfXSxfLHRoaXMpfSxtLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihmLF8pe2EucHVzaChfKX0pLFQoYSl9LG0ucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oZil7YS5wdXNoKGYpfSksVChhKX0sbS5wcm90b3R5cGUuZW50cmllcz1mdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oZixfKXthLnB1c2goW18sZl0pfSksVChhKX0sYy5pdGVyYWJsZSYmKG0ucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09bS5wcm90b3R5cGUuZW50cmllcyk7ZnVuY3Rpb24gTihhKXtpZihhLmJvZHlVc2VkKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCJBbHJlYWR5IHJlYWQiKSk7YS5ib2R5VXNlZD0hMH1mdW5jdGlvbiBSKGEpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihmLF8pe2Eub25sb2FkPWZ1bmN0aW9uKCl7ZihhLnJlc3VsdCl9LGEub25lcnJvcj1mdW5jdGlvbigpe18oYS5lcnJvcil9fSl9ZnVuY3Rpb24gTChhKXt2YXIgZj1uZXcgRmlsZVJlYWRlcixfPVIoZik7cmV0dXJuIGYucmVhZEFzQXJyYXlCdWZmZXIoYSksX31mdW5jdGlvbiBxKGEpe3ZhciBmPW5ldyBGaWxlUmVhZGVyLF89UihmKTtyZXR1cm4gZi5yZWFkQXNUZXh0KGEpLF99ZnVuY3Rpb24gZyhhKXtmb3IodmFyIGY9bmV3IFVpbnQ4QXJyYXkoYSksXz1uZXcgQXJyYXkoZi5sZW5ndGgpLFM9MDtTPGYubGVuZ3RoO1MrKylfW1NdPVN0cmluZy5mcm9tQ2hhckNvZGUoZltTXSk7cmV0dXJuIF8uam9pbigiIil9ZnVuY3Rpb24gRShhKXtpZihhLnNsaWNlKXJldHVybiBhLnNsaWNlKDApO3ZhciBmPW5ldyBVaW50OEFycmF5KGEuYnl0ZUxlbmd0aCk7cmV0dXJuIGYuc2V0KG5ldyBVaW50OEFycmF5KGEpKSxmLmJ1ZmZlcn1mdW5jdGlvbiB3KCl7cmV0dXJuIHRoaXMuYm9keVVzZWQ9ITEsdGhpcy5faW5pdEJvZHk9ZnVuY3Rpb24oYSl7dGhpcy5fYm9keUluaXQ9YSxhP3R5cGVvZiBhPT0ic3RyaW5nIj90aGlzLl9ib2R5VGV4dD1hOmMuYmxvYiYmQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihhKT90aGlzLl9ib2R5QmxvYj1hOmMuZm9ybURhdGEmJkZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGEpP3RoaXMuX2JvZHlGb3JtRGF0YT1hOmMuc2VhcmNoUGFyYW1zJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYSk/dGhpcy5fYm9keVRleHQ9YS50b1N0cmluZygpOmMuYXJyYXlCdWZmZXImJmMuYmxvYiYmaChhKT8odGhpcy5fYm9keUFycmF5QnVmZmVyPUUoYS5idWZmZXIpLHRoaXMuX2JvZHlJbml0PW5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSk6Yy5hcnJheUJ1ZmZlciYmKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGEpfHx1KGEpKT90aGlzLl9ib2R5QXJyYXlCdWZmZXI9RShhKTp0aGlzLl9ib2R5VGV4dD1hPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTp0aGlzLl9ib2R5VGV4dD0iIix0aGlzLmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKXx8KHR5cGVvZiBhPT0ic3RyaW5nIj90aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgiKTp0aGlzLl9ib2R5QmxvYiYmdGhpcy5fYm9keUJsb2IudHlwZT90aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLHRoaXMuX2JvZHlCbG9iLnR5cGUpOmMuc2VhcmNoUGFyYW1zJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYSkmJnRoaXMuaGVhZGVycy5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IikpfSxjLmJsb2ImJih0aGlzLmJsb2I9ZnVuY3Rpb24oKXt2YXIgYT1OKHRoaXMpO2lmKGEpcmV0dXJuIGE7aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYik7aWYodGhpcy5fYm9keUFycmF5QnVmZmVyKXJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKTtpZih0aGlzLl9ib2R5Rm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKCJjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2IiKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKX0sdGhpcy5hcnJheUJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib2R5QXJyYXlCdWZmZXI/Tih0aGlzKXx8UHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcik6dGhpcy5ibG9iKCkudGhlbihMKX0pLHRoaXMudGV4dD1mdW5jdGlvbigpe3ZhciBhPU4odGhpcyk7aWYoYSlyZXR1cm4gYTtpZih0aGlzLl9ib2R5QmxvYilyZXR1cm4gcSh0aGlzLl9ib2R5QmxvYik7aWYodGhpcy5fYm9keUFycmF5QnVmZmVyKXJldHVybiBQcm9taXNlLnJlc29sdmUoZyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKTtpZih0aGlzLl9ib2R5Rm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKCJjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQiKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KX0sYy5mb3JtRGF0YSYmKHRoaXMuZm9ybURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbih4KX0pLHRoaXMuanNvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpfSx0aGlzfXZhciBrPVsiREVMRVRFIiwiR0VUIiwiSEVBRCIsIk9QVElPTlMiLCJQT1NUIiwiUFVUIl07ZnVuY3Rpb24gUChhKXt2YXIgZj1hLnRvVXBwZXJDYXNlKCk7cmV0dXJuIGsuaW5kZXhPZihmKT4tMT9mOmF9ZnVuY3Rpb24gSShhLGYpe2Y9Znx8e307dmFyIF89Zi5ib2R5O2lmKGEgaW5zdGFuY2VvZiBJKXtpZihhLmJvZHlVc2VkKXRocm93IG5ldyBUeXBlRXJyb3IoIkFscmVhZHkgcmVhZCIpO3RoaXMudXJsPWEudXJsLHRoaXMuY3JlZGVudGlhbHM9YS5jcmVkZW50aWFscyxmLmhlYWRlcnN8fCh0aGlzLmhlYWRlcnM9bmV3IG0oYS5oZWFkZXJzKSksdGhpcy5tZXRob2Q9YS5tZXRob2QsdGhpcy5tb2RlPWEubW9kZSx0aGlzLnNpZ25hbD1hLnNpZ25hbCwhXyYmYS5fYm9keUluaXQhPW51bGwmJihfPWEuX2JvZHlJbml0LGEuYm9keVVzZWQ9ITApfWVsc2UgdGhpcy51cmw9U3RyaW5nKGEpO2lmKHRoaXMuY3JlZGVudGlhbHM9Zi5jcmVkZW50aWFsc3x8dGhpcy5jcmVkZW50aWFsc3x8InNhbWUtb3JpZ2luIiwoZi5oZWFkZXJzfHwhdGhpcy5oZWFkZXJzKSYmKHRoaXMuaGVhZGVycz1uZXcgbShmLmhlYWRlcnMpKSx0aGlzLm1ldGhvZD1QKGYubWV0aG9kfHx0aGlzLm1ldGhvZHx8IkdFVCIpLHRoaXMubW9kZT1mLm1vZGV8fHRoaXMubW9kZXx8bnVsbCx0aGlzLnNpZ25hbD1mLnNpZ25hbHx8dGhpcy5zaWduYWwsdGhpcy5yZWZlcnJlcj1udWxsLCh0aGlzLm1ldGhvZD09PSJHRVQifHx0aGlzLm1ldGhvZD09PSJIRUFEIikmJl8pdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMiKTt0aGlzLl9pbml0Qm9keShfKX1JLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgSSh0aGlzLHtib2R5OnRoaXMuX2JvZHlJbml0fSl9O2Z1bmN0aW9uIHgoYSl7dmFyIGY9bmV3IEZvcm1EYXRhO3JldHVybiBhLnRyaW0oKS5zcGxpdCgiJiIpLmZvckVhY2goZnVuY3Rpb24oXyl7aWYoXyl7dmFyIFM9Xy5zcGxpdCgiPSIpLEM9Uy5zaGlmdCgpLnJlcGxhY2UoL1wrL2csIiAiKSxBPVMuam9pbigiPSIpLnJlcGxhY2UoL1wrL2csIiAiKTtmLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQoQyksZGVjb2RlVVJJQ29tcG9uZW50KEEpKX19KSxmfWZ1bmN0aW9uIHooYSl7dmFyIGY9bmV3IG0sXz1hLnJlcGxhY2UoL1xyP1xuW1x0IF0rL2csIiAiKTtyZXR1cm4gXy5zcGxpdCgvXHI/XG4vKS5mb3JFYWNoKGZ1bmN0aW9uKFMpe3ZhciBDPVMuc3BsaXQoIjoiKSxBPUMuc2hpZnQoKS50cmltKCk7aWYoQSl7dmFyIEs9Qy5qb2luKCI6IikudHJpbSgpO2YuYXBwZW5kKEEsSyl9fSksZn13LmNhbGwoSS5wcm90b3R5cGUpO2Z1bmN0aW9uIFYoYSxmKXtmfHwoZj17fSksdGhpcy50eXBlPSJkZWZhdWx0Iix0aGlzLnN0YXR1cz1mLnN0YXR1cz09PXZvaWQgMD8yMDA6Zi5zdGF0dXMsdGhpcy5vaz10aGlzLnN0YXR1cz49MjAwJiZ0aGlzLnN0YXR1czwzMDAsdGhpcy5zdGF0dXNUZXh0PSJzdGF0dXNUZXh0ImluIGY/Zi5zdGF0dXNUZXh0OiJPSyIsdGhpcy5oZWFkZXJzPW5ldyBtKGYuaGVhZGVycyksdGhpcy51cmw9Zi51cmx8fCIiLHRoaXMuX2luaXRCb2R5KGEpfXcuY2FsbChWLnByb3RvdHlwZSksVi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFYodGhpcy5fYm9keUluaXQse3N0YXR1czp0aGlzLnN0YXR1cyxzdGF0dXNUZXh0OnRoaXMuc3RhdHVzVGV4dCxoZWFkZXJzOm5ldyBtKHRoaXMuaGVhZGVycyksdXJsOnRoaXMudXJsfSl9LFYuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVihudWxsLHtzdGF0dXM6MCxzdGF0dXNUZXh0OiIifSk7cmV0dXJuIGEudHlwZT0iZXJyb3IiLGF9O3ZhciBIPVszMDEsMzAyLDMwMywzMDcsMzA4XTtWLnJlZGlyZWN0PWZ1bmN0aW9uKGEsZil7aWYoSC5pbmRleE9mKGYpPT09LTEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgc3RhdHVzIGNvZGUiKTtyZXR1cm4gbmV3IFYobnVsbCx7c3RhdHVzOmYsaGVhZGVyczp7bG9jYXRpb246YX19KX0sby5ET01FeGNlcHRpb249cy5ET01FeGNlcHRpb247dHJ5e25ldyBvLkRPTUV4Y2VwdGlvbn1jYXRjaChhKXtvLkRPTUV4Y2VwdGlvbj1mdW5jdGlvbihmLF8pe3RoaXMubWVzc2FnZT1mLHRoaXMubmFtZT1fO3ZhciBTPUVycm9yKGYpO3RoaXMuc3RhY2s9Uy5zdGFja30sby5ET01FeGNlcHRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxvLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I9by5ET01FeGNlcHRpb259ZnVuY3Rpb24gWChhLGYpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihfLFMpe3ZhciBDPW5ldyBJKGEsZik7aWYoQy5zaWduYWwmJkMuc2lnbmFsLmFib3J0ZWQpcmV0dXJuIFMobmV3IG8uRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpKTt2YXIgQT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24gSygpe0EuYWJvcnQoKX1BLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBqPXtzdGF0dXM6QS5zdGF0dXMsc3RhdHVzVGV4dDpBLnN0YXR1c1RleHQsaGVhZGVyczp6KEEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl8fCIiKX07ai51cmw9InJlc3BvbnNlVVJMImluIEE/QS5yZXNwb25zZVVSTDpqLmhlYWRlcnMuZ2V0KCJYLVJlcXVlc3QtVVJMIik7dmFyIFc9InJlc3BvbnNlImluIEE/QS5yZXNwb25zZTpBLnJlc3BvbnNlVGV4dDtfKG5ldyBWKFcsaikpfSxBLm9uZXJyb3I9ZnVuY3Rpb24oKXtTKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9LEEub250aW1lb3V0PWZ1bmN0aW9uKCl7UyhuZXcgVHlwZUVycm9yKCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkIikpfSxBLm9uYWJvcnQ9ZnVuY3Rpb24oKXtTKG5ldyBvLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9LEEub3BlbihDLm1ldGhvZCxDLnVybCwhMCksQy5jcmVkZW50aWFscz09PSJpbmNsdWRlIj9BLndpdGhDcmVkZW50aWFscz0hMDpDLmNyZWRlbnRpYWxzPT09Im9taXQiJiYoQS53aXRoQ3JlZGVudGlhbHM9ITEpLCJyZXNwb25zZVR5cGUiaW4gQSYmYy5ibG9iJiYoQS5yZXNwb25zZVR5cGU9ImJsb2IiKSxDLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihqLFcpe0Euc2V0UmVxdWVzdEhlYWRlcihXLGopfSksQy5zaWduYWwmJihDLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsSyksQS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtBLnJlYWR5U3RhdGU9PT00JiZDLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsSyl9KSxBLnNlbmQodHlwZW9mIEMuX2JvZHlJbml0PT0idW5kZWZpbmVkIj9udWxsOkMuX2JvZHlJbml0KX0pfXJldHVybiBYLnBvbHlmaWxsPSEwLHMuZmV0Y2h8fChzLmZldGNoPVgscy5IZWFkZXJzPW0scy5SZXF1ZXN0PUkscy5SZXNwb25zZT1WKSxvLkhlYWRlcnM9bSxvLlJlcXVlc3Q9SSxvLlJlc3BvbnNlPVYsby5mZXRjaD1YLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvfSkoe30pfSkoaSksaS5mZXRjaC5wb255ZmlsbD0hMCxkZWxldGUgaS5mZXRjaC5wb2x5ZmlsbDt2YXIgcj1pO3Q9ci5mZXRjaCx0LmRlZmF1bHQ9ci5mZXRjaCx0LmZldGNoPXIuZmV0Y2gsdC5IZWFkZXJzPXIuSGVhZGVycyx0LlJlcXVlc3Q9ci5SZXF1ZXN0LHQuUmVzcG9uc2U9ci5SZXNwb25zZSxlLmV4cG9ydHM9dH0pKFFlLFFlLmV4cG9ydHMpO3ZhciBYZT1RZS5leHBvcnRzLFJlPUx0KFhlKSxZbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OlJlfSk7Y29uc3QgcGU9ZT0+e2xldCB0PXt9O3JldHVybiBlJiYodHlwZW9mIEhlYWRlcnMhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgSGVhZGVyc3x8WW4mJlhlLkhlYWRlcnMmJmUgaW5zdGFuY2VvZiBYZS5IZWFkZXJzP3Q9JChlKTpBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaCgoW24saV0pPT57biYmaSE9PXZvaWQgMCYmKHRbbl09aSl9KTp0PWUpLHR9LFB0PWU9PmUucmVwbGFjZSgvKFtccyxdfCNbXlxuXHJdKykrL2csIiAiKS50cmltKCksSm49ZT0+e2lmKCFBcnJheS5pc0FycmF5KGUucXVlcnkpKXtjb25zdCBpPWUscj1bYHF1ZXJ5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KFB0KGkucXVlcnkpKX1gXTtyZXR1cm4gZS52YXJpYWJsZXMmJnIucHVzaChgdmFyaWFibGVzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGkuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KGkudmFyaWFibGVzKSl9YCksaS5vcGVyYXRpb25OYW1lJiZyLnB1c2goYG9wZXJhdGlvbk5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQoaS5vcGVyYXRpb25OYW1lKX1gKSxyLmpvaW4oIiYiKX1pZih0eXBlb2YgZS52YXJpYWJsZXMhPSJ1bmRlZmluZWQiJiYhQXJyYXkuaXNBcnJheShlLnZhcmlhYmxlcykpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIHF1ZXJ5IHdpdGggZ2l2ZW4gdmFyaWFibGUgdHlwZSwgYXJyYXkgZXhwZWN0ZWQiKTtjb25zdCB0PWUsbj1lLnF1ZXJ5LnJlZHVjZSgoaSxyLHMpPT4oaS5wdXNoKHtxdWVyeTpQdChyKSx2YXJpYWJsZXM6dC52YXJpYWJsZXM/dC5qc29uU2VyaWFsaXplci5zdHJpbmdpZnkodC52YXJpYWJsZXNbc10pOnZvaWQgMH0pLGkpLFtdKTtyZXR1cm5gcXVlcnk9JHtlbmNvZGVVUklDb21wb25lbnQodC5qc29uU2VyaWFsaXplci5zdHJpbmdpZnkobikpfWB9LFFuPWU9PnQ9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBOO2NvbnN0e3VybDpuLHF1ZXJ5OmksdmFyaWFibGVzOnIsb3BlcmF0aW9uTmFtZTpzLGZldGNoOm8sZmV0Y2hPcHRpb25zOmMsbWlkZGxld2FyZTpofT10LGQ9RCh7fSx0LmhlYWRlcnMpO2xldCB1PSIiLHk7ZT09PSJQT1NUIj8oeT1XbihpLHIscyxjLmpzb25TZXJpYWxpemVyKSx0eXBlb2YgeT09InN0cmluZyImJihkWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiIpKTp1PUpuKHtxdWVyeTppLHZhcmlhYmxlczpyLG9wZXJhdGlvbk5hbWU6cyxqc29uU2VyaWFsaXplcjooTj1jLmpzb25TZXJpYWxpemVyKSE9bnVsbD9OOkZ9KTtjb25zdCB2PUQoe21ldGhvZDplLGhlYWRlcnM6ZCxib2R5Onl9LGMpO2xldCBUPW4sbT12O2lmKGgpe2NvbnN0IFI9eWllbGQgUHJvbWlzZS5yZXNvbHZlKGgoVWUoRCh7fSx2KSx7dXJsOm4sb3BlcmF0aW9uTmFtZTpzLHZhcmlhYmxlczpyfSkpKSx7dXJsOnF9PVIsZz12ZShSLFsidXJsIl0pO1Q9cSxtPWd9cmV0dXJuIHUmJihUPWAke1R9PyR7dX1gKSx5aWVsZCBvKFQsbSl9KTtjbGFzcyBYbntjb25zdHJ1Y3Rvcih0LG49e30pe3RoaXMudXJsPXQsdGhpcy5yZXF1ZXN0Q29uZmlnPW4sdGhpcy5yYXdSZXF1ZXN0PSguLi5pKT0+Sih0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbcixzLG9dPWksYz1PZShyLHMsbyksUj10aGlzLnJlcXVlc3RDb25maWcse2hlYWRlcnM6aCxmZXRjaDpkPVJlLG1ldGhvZDp1PSJQT1NUIixyZXF1ZXN0TWlkZGxld2FyZTp5LHJlc3BvbnNlTWlkZGxld2FyZTp2fT1SLFQ9dmUoUixbImhlYWRlcnMiLCJmZXRjaCIsIm1ldGhvZCIsInJlcXVlc3RNaWRkbGV3YXJlIiwicmVzcG9uc2VNaWRkbGV3YXJlIl0pLHt1cmw6bX09dGhpcztjLnNpZ25hbCE9PXZvaWQgMCYmKFQuc2lnbmFsPWMuc2lnbmFsKTtjb25zdHtvcGVyYXRpb25OYW1lOk59PUplKGMucXVlcnkpO3JldHVybiBXZSh7dXJsOm0scXVlcnk6Yy5xdWVyeSx2YXJpYWJsZXM6Yy52YXJpYWJsZXMsaGVhZGVyczpEKEQoe30scGUoWmUoaCkpKSxwZShjLnJlcXVlc3RIZWFkZXJzKSksb3BlcmF0aW9uTmFtZTpOLGZldGNoOmQsbWV0aG9kOnUsZmV0Y2hPcHRpb25zOlQsbWlkZGxld2FyZTp5fSkudGhlbihMPT4odiYmdihMKSxMKSkuY2F0Y2goTD0+e3Rocm93IHYmJnYoTCksTH0pfSl9cmVxdWVzdCh0LC4uLm4pe3JldHVybiBKKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtpLHJdPW4scz1lZSh0LGksciksTj10aGlzLnJlcXVlc3RDb25maWcse2hlYWRlcnM6byxmZXRjaDpjPVJlLG1ldGhvZDpoPSJQT1NUIixyZXF1ZXN0TWlkZGxld2FyZTpkLHJlc3BvbnNlTWlkZGxld2FyZTp1fT1OLHk9dmUoTixbImhlYWRlcnMiLCJmZXRjaCIsIm1ldGhvZCIsInJlcXVlc3RNaWRkbGV3YXJlIiwicmVzcG9uc2VNaWRkbGV3YXJlIl0pLHt1cmw6dn09dGhpcztzLnNpZ25hbCE9PXZvaWQgMCYmKHkuc2lnbmFsPXMuc2lnbmFsKTtjb25zdHtxdWVyeTpULG9wZXJhdGlvbk5hbWU6bX09SmUocy5kb2N1bWVudCk7cmV0dXJuIFdlKHt1cmw6dixxdWVyeTpULHZhcmlhYmxlczpzLnZhcmlhYmxlcyxoZWFkZXJzOkQoRCh7fSxwZShaZShvKSkpLHBlKHMucmVxdWVzdEhlYWRlcnMpKSxvcGVyYXRpb25OYW1lOm0sZmV0Y2g6YyxtZXRob2Q6aCxmZXRjaE9wdGlvbnM6eSxtaWRkbGV3YXJlOmR9KS50aGVuKFI9Pih1JiZ1KFIpLFIuZGF0YSkpLmNhdGNoKFI9Pnt0aHJvdyB1JiZ1KFIpLFJ9KX0pfWJhdGNoUmVxdWVzdHModCxuKXt2YXIgZDtjb25zdCBpPVZlKHQsbiksaD10aGlzLnJlcXVlc3RDb25maWcse2hlYWRlcnM6cn09aCxzPXZlKGgsWyJoZWFkZXJzIl0pO2kuc2lnbmFsIT09dm9pZCAwJiYocy5zaWduYWw9aS5zaWduYWwpO2NvbnN0IG89aS5kb2N1bWVudHMubWFwKCh7ZG9jdW1lbnQ6dX0pPT5KZSh1KS5xdWVyeSksYz1pLmRvY3VtZW50cy5tYXAoKHt2YXJpYWJsZXM6dX0pPT51KTtyZXR1cm4gV2Uoe3VybDp0aGlzLnVybCxxdWVyeTpvLHZhcmlhYmxlczpjLGhlYWRlcnM6RChEKHt9LHBlKFplKHIpKSkscGUoaS5yZXF1ZXN0SGVhZGVycykpLG9wZXJhdGlvbk5hbWU6dm9pZCAwLGZldGNoOihkPXRoaXMucmVxdWVzdENvbmZpZy5mZXRjaCkhPW51bGw/ZDpSZSxtZXRob2Q6dGhpcy5yZXF1ZXN0Q29uZmlnLm1ldGhvZHx8IlBPU1QiLGZldGNoT3B0aW9uczpzLG1pZGRsZXdhcmU6dGhpcy5yZXF1ZXN0Q29uZmlnLnJlcXVlc3RNaWRkbGV3YXJlfSkudGhlbih1PT4odGhpcy5yZXF1ZXN0Q29uZmlnLnJlc3BvbnNlTWlkZGxld2FyZSYmdGhpcy5yZXF1ZXN0Q29uZmlnLnJlc3BvbnNlTWlkZGxld2FyZSh1KSx1LmRhdGEpKS5jYXRjaCh1PT57dGhyb3cgdGhpcy5yZXF1ZXN0Q29uZmlnLnJlc3BvbnNlTWlkZGxld2FyZSYmdGhpcy5yZXF1ZXN0Q29uZmlnLnJlc3BvbnNlTWlkZGxld2FyZSh1KSx1fSl9c2V0SGVhZGVycyh0KXtyZXR1cm4gdGhpcy5yZXF1ZXN0Q29uZmlnLmhlYWRlcnM9dCx0aGlzfXNldEhlYWRlcih0LG4pe2NvbnN0e2hlYWRlcnM6aX09dGhpcy5yZXF1ZXN0Q29uZmlnO3JldHVybiBpP2lbdF09bjp0aGlzLnJlcXVlc3RDb25maWcuaGVhZGVycz17W3RdOm59LHRoaXN9c2V0RW5kcG9pbnQodCl7cmV0dXJuIHRoaXMudXJsPXQsdGhpc319Y29uc3QgV2U9ZT0+Sih0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIHUseTtjb25zdHtxdWVyeTp0LHZhcmlhYmxlczpuLGZldGNoT3B0aW9uczppfT1lLHI9UW4oQigodT1lLm1ldGhvZCkhPW51bGw/dToicG9zdCIpKSxzPUFycmF5LmlzQXJyYXkoZS5xdWVyeSksbz15aWVsZCByKGUpLGM9eWllbGQgWm4obywoeT1pLmpzb25TZXJpYWxpemVyKSE9bnVsbD95OkYpLGg9QXJyYXkuaXNBcnJheShjKT8hYy5zb21lKCh7ZGF0YTpUfSk9PiFUKTohIWMuZGF0YSxkPUFycmF5LmlzQXJyYXkoYyl8fCFjLmVycm9yc3x8QXJyYXkuaXNBcnJheShjLmVycm9ycykmJiFjLmVycm9ycy5sZW5ndGh8fGkuZXJyb3JQb2xpY3k9PT0iYWxsInx8aS5lcnJvclBvbGljeT09PSJpZ25vcmUiO2lmKG8ub2smJmQmJmgpe2NvbnN0IHY9KEFycmF5LmlzQXJyYXkoYyksYykse2Vycm9yczpUfT12LG09dmUodixbImVycm9ycyJdKSxOPWkuZXJyb3JQb2xpY3k9PT0iaWdub3JlIj9tOmM7cmV0dXJuIFVlKEQoe30scz97ZGF0YTpOfTpOKSx7aGVhZGVyczpvLmhlYWRlcnMsc3RhdHVzOm8uc3RhdHVzfSl9ZWxzZXtjb25zdCBUPXR5cGVvZiBjPT0ic3RyaW5nIj97ZXJyb3I6Y306Yzt0aHJvdyBuZXcgZGUoVWUoRCh7fSxUKSx7c3RhdHVzOm8uc3RhdHVzLGhlYWRlcnM6by5oZWFkZXJzfSkse3F1ZXJ5OnQsdmFyaWFibGVzOm59KX19KSxXbj0oZSx0LG4saSk9Pntjb25zdCByPWkhPW51bGw/aTpGO2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiByLnN0cmluZ2lmeSh7cXVlcnk6ZSx2YXJpYWJsZXM6dCxvcGVyYXRpb25OYW1lOm59KTtpZih0eXBlb2YgdCE9InVuZGVmaW5lZCImJiFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNyZWF0ZSByZXF1ZXN0IGJvZHkgd2l0aCBnaXZlbiB2YXJpYWJsZSB0eXBlLCBhcnJheSBleHBlY3RlZCIpO2NvbnN0IHM9ZS5yZWR1Y2UoKG8sYyxoKT0+KG8ucHVzaCh7cXVlcnk6Yyx2YXJpYWJsZXM6dD90W2hdOnZvaWQgMH0pLG8pLFtdKTtyZXR1cm4gci5zdHJpbmdpZnkocyl9LFpuPShlLHQpPT5KKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtsZXQgbjtyZXR1cm4gZS5oZWFkZXJzLmZvckVhY2goKGkscik9PntyLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIiYmKG49aSl9KSxuJiYobi50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImFwcGxpY2F0aW9uL2pzb24iKXx8bi50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImFwcGxpY2F0aW9uL2dyYXBocWwranNvbiIpfHxuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vZ3JhcGhxbC1yZXNwb25zZStqc29uIikpP3QucGFyc2UoeWllbGQgZS50ZXh0KCkpOmUudGV4dCgpfSksWmU9ZT0+dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSgpOmU7dmFyIEtlPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24oZSx0KXt0PWUuZXhwb3J0cz1uLHQuZ2V0U2VyaWFsaXplPWk7ZnVuY3Rpb24gbihyLHMsbyxjKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocixpKHMsYyksbyl9ZnVuY3Rpb24gaShyLHMpe3ZhciBvPVtdLGM9W107cmV0dXJuIHM9PW51bGwmJihzPWZ1bmN0aW9uKGgsZCl7cmV0dXJuIG9bMF09PT1kPyJbQ2lyY3VsYXIgfl0iOiJbQ2lyY3VsYXIgfi4iK2Muc2xpY2UoMCxvLmluZGV4T2YoZCkpLmpvaW4oIi4iKSsiXSJ9KSxmdW5jdGlvbihoLGQpe2lmKG8ubGVuZ3RoPjApe3ZhciB1PW8uaW5kZXhPZih0aGlzKTt+dT9vLnNwbGljZSh1KzEpOm8ucHVzaCh0aGlzKSx+dT9jLnNwbGljZSh1LDEvMCxoKTpjLnB1c2goaCksfm8uaW5kZXhPZihkKSYmKGQ9cy5jYWxsKHRoaXMsaCxkKSl9ZWxzZSBvLnB1c2goZCk7cmV0dXJuIHI9PW51bGw/ZDpyLmNhbGwodGhpcyxoLGQpfX19KShLZSxLZS5leHBvcnRzKTt2YXIgS249S2UuZXhwb3J0cyxtZT1MdChLbik7Y29uc3QgRnQ9MWUzKjE1O3ZhciBMZT1mdW5jdGlvbigpe3JldHVybiBMZT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIG4saT0xLHI9YXJndW1lbnRzLmxlbmd0aDtpPHI7aSsrKXtuPWFyZ3VtZW50c1tpXTtmb3IodmFyIHMgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixzKSYmKHRbc109bltzXSl9cmV0dXJuIHR9LExlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dHlwZW9mIFN1cHByZXNzZWRFcnJvcj09ImZ1bmN0aW9uIiYmU3VwcHJlc3NlZEVycm9yO3ZhciBQZT1uZXcgTWFwLGV0PW5ldyBNYXAsTXQ9ITAsRmU9ITE7ZnVuY3Rpb24gQnQoZSl7cmV0dXJuIGUucmVwbGFjZSgvW1xzLF0rL2csIiAiKS50cmltKCl9ZnVuY3Rpb24gZXIoZSl7cmV0dXJuIEJ0KGUuc291cmNlLmJvZHkuc3Vic3RyaW5nKGUuc3RhcnQsZS5lbmQpKX1mdW5jdGlvbiB0cihlKXt2YXIgdD1uZXcgU2V0LG49W107cmV0dXJuIGUuZGVmaW5pdGlvbnMuZm9yRWFjaChmdW5jdGlvbihpKXtpZihpLmtpbmQ9PT0iRnJhZ21lbnREZWZpbml0aW9uIil7dmFyIHI9aS5uYW1lLnZhbHVlLHM9ZXIoaS5sb2MpLG89ZXQuZ2V0KHIpO28mJiFvLmhhcyhzKT9NdCYmY29uc29sZS53YXJuKCJXYXJuaW5nOiBmcmFnbWVudCB3aXRoIG5hbWUgIityK2AgYWxyZWFkeSBleGlzdHMuCmdyYXBocWwtdGFnIGVuZm9yY2VzIGFsbCBmcmFnbWVudCBuYW1lcyBhY3Jvc3MgeW91ciBhcHBsaWNhdGlvbiB0byBiZSB1bmlxdWU7IHJlYWQgbW9yZSBhYm91dAp0aGlzIGluIHRoZSBkb2NzOiBodHRwOi8vZGV2LmFwb2xsb2RhdGEuY29tL2NvcmUvZnJhZ21lbnRzLmh0bWwjdW5pcXVlLW5hbWVzYCk6b3x8ZXQuc2V0KHIsbz1uZXcgU2V0KSxvLmFkZChzKSx0LmhhcyhzKXx8KHQuYWRkKHMpLG4ucHVzaChpKSl9ZWxzZSBuLnB1c2goaSl9KSxMZShMZSh7fSxlKSx7ZGVmaW5pdGlvbnM6bn0pfWZ1bmN0aW9uIG5yKGUpe3ZhciB0PW5ldyBTZXQoZS5kZWZpbml0aW9ucyk7dC5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubG9jJiZkZWxldGUgaS5sb2MsT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgcz1pW3JdO3MmJnR5cGVvZiBzPT0ib2JqZWN0IiYmdC5hZGQocyl9KX0pO3ZhciBuPWUubG9jO3JldHVybiBuJiYoZGVsZXRlIG4uc3RhcnRUb2tlbixkZWxldGUgbi5lbmRUb2tlbiksZX1mdW5jdGlvbiBycihlKXt2YXIgdD1CdChlKTtpZighUGUuaGFzKHQpKXt2YXIgbj1EdChlLHtleHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlczpGZSxhbGxvd0xlZ2FjeUZyYWdtZW50VmFyaWFibGVzOkZlfSk7aWYoIW58fG4ua2luZCE9PSJEb2N1bWVudCIpdGhyb3cgbmV3IEVycm9yKCJOb3QgYSB2YWxpZCBHcmFwaFFMIGRvY3VtZW50LiIpO1BlLnNldCh0LG5yKHRyKG4pKSl9cmV0dXJuIFBlLmdldCh0KX1mdW5jdGlvbiBRKGUpe2Zvcih2YXIgdD1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0W24tMV09YXJndW1lbnRzW25dO3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKTt2YXIgaT1lWzBdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24ocixzKXtyJiZyLmtpbmQ9PT0iRG9jdW1lbnQiP2krPXIubG9jLnNvdXJjZS5ib2R5OmkrPXIsaSs9ZVtzKzFdfSkscnIoaSl9ZnVuY3Rpb24gaXIoKXtQZS5jbGVhcigpLGV0LmNsZWFyKCl9ZnVuY3Rpb24gc3IoKXtNdD0hMX1mdW5jdGlvbiBvcigpe0ZlPSEwfWZ1bmN0aW9uIGFyKCl7RmU9ITF9dmFyIE5lPXtncWw6USxyZXNldENhY2hlczppcixkaXNhYmxlRnJhZ21lbnRXYXJuaW5nczpzcixlbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlczpvcixkaXNhYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXM6YXJ9OyhmdW5jdGlvbihlKXtlLmdxbD1OZS5ncWwsZS5yZXNldENhY2hlcz1OZS5yZXNldENhY2hlcyxlLmRpc2FibGVGcmFnbWVudFdhcm5pbmdzPU5lLmRpc2FibGVGcmFnbWVudFdhcm5pbmdzLGUuZW5hYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXM9TmUuZW5hYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXMsZS5kaXNhYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXM9TmUuZGlzYWJsZUV4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzfSkoUXx8KFE9e30pKSxRLmRlZmF1bHQ9UTtjb25zdCAkdD1RYAoJZnJhZ21lbnQgTWF0Y2hQYXJ0cyBvbiBNYXRjaENvbmZpZyB7CgkJcmVnZXhWYWx1ZQoJCW1hdGNoVmFsdWUKCX0KYCxjcj1RYAoJbXV0YXRpb24gUHVzaFBheWxvYWQoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHBheWxvYWRfaWQ6IElEIQoJCSRldmVudHM6IFJlcGxheUV2ZW50c0lucHV0IQoJCSRtZXNzYWdlczogU3RyaW5nIQoJCSRyZXNvdXJjZXM6IFN0cmluZyEKCQkkd2ViX3NvY2tldF9ldmVudHM6IFN0cmluZyEKCQkkZXJyb3JzOiBbRXJyb3JPYmplY3RJbnB1dF0hCgkJJGlzX2JlYWNvbjogQm9vbGVhbgoJCSRoYXNfc2Vzc2lvbl91bmxvYWRlZDogQm9vbGVhbgoJCSRoaWdobGlnaHRfbG9nczogU3RyaW5nCgkpIHsKCQlwdXNoUGF5bG9hZCgKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQlwYXlsb2FkX2lkOiAkcGF5bG9hZF9pZAoJCQlldmVudHM6ICRldmVudHMKCQkJbWVzc2FnZXM6ICRtZXNzYWdlcwoJCQlyZXNvdXJjZXM6ICRyZXNvdXJjZXMKCQkJd2ViX3NvY2tldF9ldmVudHM6ICR3ZWJfc29ja2V0X2V2ZW50cwoJCQllcnJvcnM6ICRlcnJvcnMKCQkJaXNfYmVhY29uOiAkaXNfYmVhY29uCgkJCWhhc19zZXNzaW9uX3VubG9hZGVkOiAkaGFzX3Nlc3Npb25fdW5sb2FkZWQKCQkJaGlnaGxpZ2h0X2xvZ3M6ICRoaWdobGlnaHRfbG9ncwoJCSkKCX0KYCx1cj1RYAoJbXV0YXRpb24gUHVzaFNlc3Npb25FdmVudHMoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHBheWxvYWRfaWQ6IEludDY0SUQhCgkJJGRhdGE6IFN0cmluZyEKCSkgewoJCXB1c2hTZXNzaW9uRXZlbnRzKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXBheWxvYWRfaWQ6ICRwYXlsb2FkX2lkCgkJCWRhdGE6ICRkYXRhCgkJKQoJfQpgLGxyPVFgCgltdXRhdGlvbiBpZGVudGlmeVNlc3Npb24oCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHVzZXJfaWRlbnRpZmllcjogU3RyaW5nIQoJCSR1c2VyX29iamVjdDogQW55CgkpIHsKCQlpZGVudGlmeVNlc3Npb24oCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJdXNlcl9pZGVudGlmaWVyOiAkdXNlcl9pZGVudGlmaWVyCgkJCXVzZXJfb2JqZWN0OiAkdXNlcl9vYmplY3QKCQkpCgl9CmAsaHI9UWAKCW11dGF0aW9uIGFkZFNlc3Npb25Qcm9wZXJ0aWVzKAoJCSRzZXNzaW9uX3NlY3VyZV9pZDogU3RyaW5nIQoJCSRwcm9wZXJ0aWVzX29iamVjdDogQW55CgkpIHsKCQlhZGRTZXNzaW9uUHJvcGVydGllcygKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQlwcm9wZXJ0aWVzX29iamVjdDogJHByb3BlcnRpZXNfb2JqZWN0CgkJKQoJfQpgLGZyPVFgCgltdXRhdGlvbiBwdXNoTWV0cmljcygkbWV0cmljczogW01ldHJpY0lucHV0XSEpIHsKCQlwdXNoTWV0cmljcyhtZXRyaWNzOiAkbWV0cmljcykKCX0KYCxkcj1RYAoJbXV0YXRpb24gYWRkU2Vzc2lvbkZlZWRiYWNrKAoJCSRzZXNzaW9uX3NlY3VyZV9pZDogU3RyaW5nIQoJCSR1c2VyX25hbWU6IFN0cmluZwoJCSR1c2VyX2VtYWlsOiBTdHJpbmcKCQkkdmVyYmF0aW06IFN0cmluZyEKCQkkdGltZXN0YW1wOiBUaW1lc3RhbXAhCgkpIHsKCQlhZGRTZXNzaW9uRmVlZGJhY2soCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJdXNlcl9uYW1lOiAkdXNlcl9uYW1lCgkJCXVzZXJfZW1haWw6ICR1c2VyX2VtYWlsCgkJCXZlcmJhdGltOiAkdmVyYmF0aW0KCQkJdGltZXN0YW1wOiAkdGltZXN0YW1wCgkJKQoJfQpgLHByPVFgCgltdXRhdGlvbiBpbml0aWFsaXplU2Vzc2lvbigKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkc2Vzc2lvbl9rZXk6IFN0cmluZwoJCSRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nIQoJCSRlbmFibGVfc3RyaWN0X3ByaXZhY3k6IEJvb2xlYW4hCgkJJHByaXZhY3lfc2V0dGluZzogU3RyaW5nIQoJCSRlbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHM6IEJvb2xlYW4hCgkJJGNsaWVudFZlcnNpb246IFN0cmluZyEKCQkkZmlyc3Rsb2FkVmVyc2lvbjogU3RyaW5nIQoJCSRjbGllbnRDb25maWc6IFN0cmluZyEKCQkkZW52aXJvbm1lbnQ6IFN0cmluZyEKCQkkaWQ6IFN0cmluZyEKCQkkYXBwVmVyc2lvbjogU3RyaW5nCgkJJHNlcnZpY2VOYW1lOiBTdHJpbmchCgkJJGNsaWVudF9pZDogU3RyaW5nIQoJCSRuZXR3b3JrX3JlY29yZGluZ19kb21haW5zOiBbU3RyaW5nIV0KCQkkZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogQm9vbGVhbgoJKSB7CgkJaW5pdGlhbGl6ZVNlc3Npb24oCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJc2Vzc2lvbl9rZXk6ICRzZXNzaW9uX2tleQoJCQlvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogJG9yZ2FuaXphdGlvbl92ZXJib3NlX2lkCgkJCWVuYWJsZV9zdHJpY3RfcHJpdmFjeTogJGVuYWJsZV9zdHJpY3RfcHJpdmFjeQoJCQllbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHM6ICRlbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHMKCQkJY2xpZW50VmVyc2lvbjogJGNsaWVudFZlcnNpb24KCQkJZmlyc3Rsb2FkVmVyc2lvbjogJGZpcnN0bG9hZFZlcnNpb24KCQkJY2xpZW50Q29uZmlnOiAkY2xpZW50Q29uZmlnCgkJCWVudmlyb25tZW50OiAkZW52aXJvbm1lbnQKCQkJYXBwVmVyc2lvbjogJGFwcFZlcnNpb24KCQkJc2VydmljZU5hbWU6ICRzZXJ2aWNlTmFtZQoJCQlmaW5nZXJwcmludDogJGlkCgkJCWNsaWVudF9pZDogJGNsaWVudF9pZAoJCQluZXR3b3JrX3JlY29yZGluZ19kb21haW5zOiAkbmV0d29ya19yZWNvcmRpbmdfZG9tYWlucwoJCQlkaXNhYmxlX3Nlc3Npb25fcmVjb3JkaW5nOiAkZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZwoJCQlwcml2YWN5X3NldHRpbmc6ICRwcml2YWN5X3NldHRpbmcKCQkpIHsKCQkJc2VjdXJlX2lkCgkJCXByb2plY3RfaWQKCQkJc2FtcGxpbmcgewoJCQkJc3BhbnMgewoJCQkJCW5hbWUgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQlrZXkgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQl9CgkJCQkJZXZlbnRzIHsKCQkJCQkJbmFtZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQkJYXR0cmlidXRlcyB7CgkJCQkJCQlrZXkgewoJCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJCX0KCQkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCXNhbXBsaW5nUmF0aW8KCQkJCX0KCQkJCWxvZ3MgewoJCQkJCW1lc3NhZ2UgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCXNldmVyaXR5VGV4dCB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQkJYXR0cmlidXRlcyB7CgkJCQkJCWtleSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQkJYXR0cmlidXRlIHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCX0KCQkJCQlzYW1wbGluZ1JhdGlvCgkJCQl9CgkJCX0KCQl9Cgl9CgkkeyR0fQpgLG1yPVFgCglxdWVyeSBJZ25vcmUoJGlkOiBJRCEpIHsKCQlpZ25vcmUoaWQ6ICRpZCkKCX0KYCx5cj1RYAoJcXVlcnkgR2V0U2FtcGxpbmdDb25maWcoJG9yZ2FuaXphdGlvbl92ZXJib3NlX2lkOiBTdHJpbmchKSB7CgkJc2FtcGxpbmcob3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQ6ICRvcmdhbml6YXRpb25fdmVyYm9zZV9pZCkgewoJCQlzcGFucyB7CgkJCQluYW1lIHsKCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQl9CgkJCQlhdHRyaWJ1dGVzIHsKCQkJCQlrZXkgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQl9CgkJCQlldmVudHMgewoJCQkJCW5hbWUgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQlrZXkgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlzYW1wbGluZ1JhdGlvCgkJCX0KCQkJbG9ncyB7CgkJCQltZXNzYWdlIHsKCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQl9CgkJCQlzZXZlcml0eVRleHQgewoJCQkJCS4uLk1hdGNoUGFydHMKCQkJCX0KCQkJCWF0dHJpYnV0ZXMgewoJCQkJCWtleSB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQkJYXR0cmlidXRlIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCX0KCQkJCXNhbXBsaW5nUmF0aW8KCQkJfQoJCX0KCX0KCSR7JHR9CmAsZ3I9KGUsdCxuLGkpPT5lKCk7ZnVuY3Rpb24gdnIoZSx0PWdyKXtyZXR1cm57UHVzaFBheWxvYWQobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoY3IsbixEKEQoe30saSkscikpLCJQdXNoUGF5bG9hZCIsIm11dGF0aW9uIixuKX0sUHVzaFNlc3Npb25FdmVudHMobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QodXIsbixEKEQoe30saSkscikpLCJQdXNoU2Vzc2lvbkV2ZW50cyIsIm11dGF0aW9uIixuKX0saWRlbnRpZnlTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KGxyLG4sRChEKHt9LGkpLHIpKSwiaWRlbnRpZnlTZXNzaW9uIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uUHJvcGVydGllcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChocixuLEQoRCh7fSxpKSxyKSksImFkZFNlc3Npb25Qcm9wZXJ0aWVzIiwibXV0YXRpb24iLG4pfSxwdXNoTWV0cmljcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChmcixuLEQoRCh7fSxpKSxyKSksInB1c2hNZXRyaWNzIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uRmVlZGJhY2sobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoZHIsbixEKEQoe30saSkscikpLCJhZGRTZXNzaW9uRmVlZGJhY2siLCJtdXRhdGlvbiIsbil9LGluaXRpYWxpemVTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KHByLG4sRChEKHt9LGkpLHIpKSwiaW5pdGlhbGl6ZVNlc3Npb24iLCJtdXRhdGlvbiIsbil9LElnbm9yZShuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChtcixuLEQoRCh7fSxpKSxyKSksIklnbm9yZSIsInF1ZXJ5IixuKX0sR2V0U2FtcGxpbmdDb25maWcobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoeXIsbixEKEQoe30saSkscikpLCJHZXRTYW1wbGluZ0NvbmZpZyIsInF1ZXJ5IixuKX19fXZhciB0ZT1VaW50OEFycmF5LG5lPVVpbnQxNkFycmF5LHR0PUludDMyQXJyYXksbnQ9bmV3IHRlKFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsMCwwLDBdKSxydD1uZXcgdGUoWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMCwwXSksVXQ9bmV3IHRlKFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSksVnQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49bmV3IG5lKDMxKSxpPTA7aTwzMTsrK2kpbltpXT10Kz0xPDxlW2ktMV07Zm9yKHZhciByPW5ldyB0dChuWzMwXSksaT0xO2k8MzA7KytpKWZvcih2YXIgcz1uW2ldO3M8bltpKzFdOysrcylyW3NdPXMtbltpXTw8NXxpO3JldHVybntiOm4scn19LHF0PVZ0KG50LDIpLEVyPXF0LmIsaXQ9cXQucjtFclsyOF09MjU4LGl0WzI1OF09Mjg7Zm9yKHZhciBfcj1WdChydCwwKSxqdD1fci5yLHN0PW5ldyBuZSgzMjc2OCksTT0wO008MzI3Njg7KytNKXt2YXIgYWU9KE0mNDM2OTApPj4xfChNJjIxODQ1KTw8MTthZT0oYWUmNTI0MjgpPj4yfChhZSYxMzEwNyk8PDIsYWU9KGFlJjYxNjgwKT4+NHwoYWUmMzg1NSk8PDQsc3RbTV09KChhZSY2NTI4MCk+Pjh8KGFlJjI1NSk8PDgpPj4xfWZvcih2YXIgeGU9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgaT1lLmxlbmd0aCxyPTAscz1uZXcgbmUodCk7cjxpOysrcillW3JdJiYrK3NbZVtyXS0xXTt2YXIgbz1uZXcgbmUodCk7Zm9yKHI9MTtyPHQ7KytyKW9bcl09b1tyLTFdK3Nbci0xXTw8MTt2YXIgYztpZihuKXtjPW5ldyBuZSgxPDx0KTt2YXIgaD0xNS10O2ZvcihyPTA7cjxpOysrcilpZihlW3JdKWZvcih2YXIgZD1yPDw0fGVbcl0sdT10LWVbcl0seT1vW2Vbcl0tMV0rKzw8dSx2PXl8KDE8PHUpLTE7eTw9djsrK3kpY1tzdFt5XT4+aF09ZH1lbHNlIGZvcihjPW5ldyBuZShpKSxyPTA7cjxpOysrcillW3JdJiYoY1tyXT1zdFtvW2Vbcl0tMV0rK10+PjE1LWVbcl0pO3JldHVybiBjfSx1ZT1uZXcgdGUoMjg4KSxNPTA7TTwxNDQ7KytNKXVlW01dPTg7Zm9yKHZhciBNPTE0NDtNPDI1NjsrK00pdWVbTV09OTtmb3IodmFyIE09MjU2O008MjgwOysrTSl1ZVtNXT03O2Zvcih2YXIgTT0yODA7TTwyODg7KytNKXVlW01dPTg7Zm9yKHZhciBNZT1uZXcgdGUoMzIpLE09MDtNPDMyOysrTSlNZVtNXT01O3ZhciBicj14ZSh1ZSw5LDApLFRyPXhlKE1lLDUsMCksR3Q9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrNykvOHwwfSx6dD1mdW5jdGlvbihlLHQsbil7cmV0dXJuKG49PW51bGx8fG4+ZS5sZW5ndGgpJiYobj1lLmxlbmd0aCksbmV3IHRlKGUuc3ViYXJyYXkodCxuKSl9LG9lPWZ1bmN0aW9uKGUsdCxuKXtuPDw9dCY3O3ZhciBpPXQvOHwwO2VbaV18PW4sZVtpKzFdfD1uPj44fSxBZT1mdW5jdGlvbihlLHQsbil7bjw8PXQmNzt2YXIgaT10Lzh8MDtlW2ldfD1uLGVbaSsxXXw9bj4+OCxlW2krMl18PW4+PjE2fSxvdD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxpPTA7aTxlLmxlbmd0aDsrK2kpZVtpXSYmbi5wdXNoKHtzOmksZjplW2ldfSk7dmFyIHI9bi5sZW5ndGgscz1uLnNsaWNlKCk7aWYoIXIpcmV0dXJue3Q6UXQsbDowfTtpZihyPT0xKXt2YXIgbz1uZXcgdGUoblswXS5zKzEpO3JldHVybiBvW25bMF0uc109MSx7dDpvLGw6MX19bi5zb3J0KGZ1bmN0aW9uKHcsayl7cmV0dXJuIHcuZi1rLmZ9KSxuLnB1c2goe3M6LTEsZjoyNTAwMX0pO3ZhciBjPW5bMF0saD1uWzFdLGQ9MCx1PTEseT0yO2ZvcihuWzBdPXtzOi0xLGY6Yy5mK2guZixsOmMscjpofTt1IT1yLTE7KWM9bltuW2RdLmY8blt5XS5mP2QrKzp5KytdLGg9bltkIT11JiZuW2RdLmY8blt5XS5mP2QrKzp5KytdLG5bdSsrXT17czotMSxmOmMuZitoLmYsbDpjLHI6aH07Zm9yKHZhciB2PXNbMF0ucyxpPTE7aTxyOysraSlzW2ldLnM+diYmKHY9c1tpXS5zKTt2YXIgVD1uZXcgbmUodisxKSxtPWF0KG5bdS0xXSxULDApO2lmKG0+dCl7dmFyIGk9MCxOPTAsUj1tLXQsTD0xPDxSO2ZvcihzLnNvcnQoZnVuY3Rpb24oayxQKXtyZXR1cm4gVFtQLnNdLVRbay5zXXx8ay5mLVAuZn0pO2k8cjsrK2kpe3ZhciBxPXNbaV0ucztpZihUW3FdPnQpTis9TC0oMTw8bS1UW3FdKSxUW3FdPXQ7ZWxzZSBicmVha31mb3IoTj4+PVI7Tj4wOyl7dmFyIGc9c1tpXS5zO1RbZ108dD9OLT0xPDx0LVRbZ10rKy0xOisraX1mb3IoO2k+PTAmJk47LS1pKXt2YXIgRT1zW2ldLnM7VFtFXT09dCYmKC0tVFtFXSwrK04pfW09dH1yZXR1cm57dDpuZXcgdGUoVCksbDptfX0sYXQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnM9PS0xP01hdGgubWF4KGF0KGUubCx0LG4rMSksYXQoZS5yLHQsbisxKSk6dFtlLnNdPW59LEh0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDt0JiYhZVstLXRdOyk7Zm9yKHZhciBuPW5ldyBuZSgrK3QpLGk9MCxyPWVbMF0scz0xLG89ZnVuY3Rpb24oaCl7bltpKytdPWh9LGM9MTtjPD10OysrYylpZihlW2NdPT1yJiZjIT10KSsrcztlbHNle2lmKCFyJiZzPjIpe2Zvcig7cz4xMzg7cy09MTM4KW8oMzI3NTQpO3M+MiYmKG8ocz4xMD9zLTExPDw1fDI4NjkwOnMtMzw8NXwxMjMwNSkscz0wKX1lbHNlIGlmKHM+Myl7Zm9yKG8ociksLS1zO3M+NjtzLT02KW8oODMwNCk7cz4yJiYobyhzLTM8PDV8ODIwOCkscz0wKX1mb3IoO3MtLTspbyhyKTtzPTEscj1lW2NdfXJldHVybntjOm4uc3ViYXJyYXkoMCxpKSxuOnR9fSxJZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLGk9MDtpPHQubGVuZ3RoOysraSluKz1lW2ldKnRbaV07cmV0dXJuIG59LFl0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uLmxlbmd0aCxyPUd0KHQrMik7ZVtyXT1pJjI1NSxlW3IrMV09aT4+OCxlW3IrMl09ZVtyXV4yNTUsZVtyKzNdPWVbcisxXV4yNTU7Zm9yKHZhciBzPTA7czxpOysrcyllW3Ircys0XT1uW3NdO3JldHVybihyKzQraSkqOH0sSnQ9ZnVuY3Rpb24oZSx0LG4saSxyLHMsbyxjLGgsZCx1KXtvZSh0LHUrKyxuKSwrK3JbMjU2XTtmb3IodmFyIHk9b3QociwxNSksdj15LnQsVD15LmwsbT1vdChzLDE1KSxOPW0udCxSPW0ubCxMPUh0KHYpLHE9TC5jLGc9TC5uLEU9SHQoTiksdz1FLmMsaz1FLm4sUD1uZXcgbmUoMTkpLEk9MDtJPHEubGVuZ3RoOysrSSkrK1BbcVtJXSYzMV07Zm9yKHZhciBJPTA7STx3Lmxlbmd0aDsrK0kpKytQW3dbSV0mMzFdO2Zvcih2YXIgeD1vdChQLDcpLHo9eC50LFY9eC5sLEg9MTk7SD40JiYheltVdFtILTFdXTstLUgpO3ZhciBYPWQrNTw8MyxhPUllKHIsdWUpK0llKHMsTWUpK28sZj1JZShyLHYpK0llKHMsTikrbysxNCszKkgrSWUoUCx6KSsyKlBbMTZdKzMqUFsxN10rNypQWzE4XTtpZihoPj0wJiZYPD1hJiZYPD1mKXJldHVybiBZdCh0LHUsZS5zdWJhcnJheShoLGgrZCkpO3ZhciBfLFMsQyxBO2lmKG9lKHQsdSwxKyhmPGEpKSx1Kz0yLGY8YSl7Xz14ZSh2LFQsMCksUz12LEM9eGUoTixSLDApLEE9Tjt2YXIgSz14ZSh6LFYsMCk7b2UodCx1LGctMjU3KSxvZSh0LHUrNSxrLTEpLG9lKHQsdSsxMCxILTQpLHUrPTE0O2Zvcih2YXIgST0wO0k8SDsrK0kpb2UodCx1KzMqSSx6W1V0W0ldXSk7dSs9MypIO2Zvcih2YXIgaj1bcSx3XSxXPTA7VzwyOysrVylmb3IodmFyIHllPWpbV10sST0wO0k8eWUubGVuZ3RoOysrSSl7dmFyIGllPXllW0ldJjMxO29lKHQsdSxLW2llXSksdSs9eltpZV0saWU+MTUmJihvZSh0LHUseWVbSV0+PjUmMTI3KSx1Kz15ZVtJXT4+MTIpfX1lbHNlIF89YnIsUz11ZSxDPVRyLEE9TWU7Zm9yKHZhciBJPTA7STxjOysrSSl7dmFyIFk9aVtJXTtpZihZPjI1NSl7dmFyIGllPVk+PjE4JjMxO0FlKHQsdSxfW2llKzI1N10pLHUrPVNbaWUrMjU3XSxpZT43JiYob2UodCx1LFk+PjIzJjMxKSx1Kz1udFtpZV0pO3ZhciBnZT1ZJjMxO0FlKHQsdSxDW2dlXSksdSs9QVtnZV0sZ2U+MyYmKEFlKHQsdSxZPj41JjgxOTEpLHUrPXJ0W2dlXSl9ZWxzZSBBZSh0LHUsX1tZXSksdSs9U1tZXX1yZXR1cm4gQWUodCx1LF9bMjU2XSksdStTWzI1Nl19LE5yPW5ldyB0dChbNjU1NDAsMTMxMDgwLDEzMTA4OCwxMzExMDQsMjYyMTc2LDEwNDg3MDQsMTA0ODgzMiwyMTE0NTYwLDIxMTc2MzJdKSxRdD1uZXcgdGUoMCkseHI9ZnVuY3Rpb24oZSx0LG4saSxyLHMpe3ZhciBvPXMuenx8ZS5sZW5ndGgsYz1uZXcgdGUoaStvKzUqKDErTWF0aC5jZWlsKG8vN2UzKSkrciksaD1jLnN1YmFycmF5KGksYy5sZW5ndGgtciksZD1zLmwsdT0ocy5yfHwwKSY3O2lmKHQpe3UmJihoWzBdPXMucj4+Myk7Zm9yKHZhciB5PU5yW3QtMV0sdj15Pj4xMyxUPXkmODE5MSxtPSgxPDxuKS0xLE49cy5wfHxuZXcgbmUoMzI3NjgpLFI9cy5ofHxuZXcgbmUobSsxKSxMPU1hdGguY2VpbChuLzMpLHE9MipMLGc9ZnVuY3Rpb24ocHQpe3JldHVybihlW3B0XV5lW3B0KzFdPDxMXmVbcHQrMl08PHEpJm19LEU9bmV3IHR0KDI1ZTMpLHc9bmV3IG5lKDI4OCksaz1uZXcgbmUoMzIpLFA9MCxJPTAseD1zLml8fDAsej0wLFY9cy53fHwwLEg9MDt4KzI8bzsrK3gpe3ZhciBYPWcoeCksYT14JjMyNzY3LGY9UltYXTtpZihOW2FdPWYsUltYXT1hLFY8PXgpe3ZhciBfPW8teDtpZigoUD43ZTN8fHo+MjQ1NzYpJiYoXz40MjN8fCFkKSl7dT1KdChlLGgsMCxFLHcsayxJLHosSCx4LUgsdSksej1QPUk9MCxIPXg7Zm9yKHZhciBTPTA7UzwyODY7KytTKXdbU109MDtmb3IodmFyIFM9MDtTPDMwOysrUylrW1NdPTB9dmFyIEM9MixBPTAsSz1ULGo9YS1mJjMyNzY3O2lmKF8+MiYmWD09Zyh4LWopKWZvcih2YXIgVz1NYXRoLm1pbih2LF8pLTEseWU9TWF0aC5taW4oMzI3NjcseCksaWU9TWF0aC5taW4oMjU4LF8pO2o8PXllJiYtLUsmJmEhPWY7KXtpZihlW3grQ109PWVbeCtDLWpdKXtmb3IodmFyIFk9MDtZPGllJiZlW3grWV09PWVbeCtZLWpdOysrWSk7aWYoWT5DKXtpZihDPVksQT1qLFk+VylicmVhaztmb3IodmFyIGdlPU1hdGgubWluKGosWS0yKSx0bj0wLFM9MDtTPGdlOysrUyl7dmFyIGZ0PXgtaitTJjMyNzY3LEpyPU5bZnRdLG5uPWZ0LUpyJjMyNzY3O25uPnRuJiYodG49bm4sZj1mdCl9fX1hPWYsZj1OW2FdLGorPWEtZiYzMjc2N31pZihBKXtFW3orK109MjY4NDM1NDU2fGl0W0NdPDwxOHxqdFtBXTt2YXIgcm49aXRbQ10mMzEsc249anRbQV0mMzE7SSs9bnRbcm5dK3J0W3NuXSwrK3dbMjU3K3JuXSwrK2tbc25dLFY9eCtDLCsrUH1lbHNlIEVbeisrXT1lW3hdLCsrd1tlW3hdXX19Zm9yKHg9TWF0aC5tYXgoeCxWKTt4PG87Kyt4KUVbeisrXT1lW3hdLCsrd1tlW3hdXTt1PUp0KGUsaCxkLEUsdyxrLEkseixILHgtSCx1KSxkfHwocy5yPXUmN3xoW3UvOHwwXTw8Myx1LT03LHMuaD1SLHMucD1OLHMuaT14LHMudz1WKX1lbHNle2Zvcih2YXIgeD1zLnd8fDA7eDxvK2Q7eCs9NjU1MzUpe3ZhciBkdD14KzY1NTM1O2R0Pj1vJiYoaFt1Lzh8MF09ZCxkdD1vKSx1PVl0KGgsdSsxLGUuc3ViYXJyYXkoeCxkdCkpfXMuaT1vfXJldHVybiB6dChjLDAsaStHdCh1KStyKX0sQXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IEludDMyQXJyYXkoMjU2KSx0PTA7dDwyNTY7Kyt0KXtmb3IodmFyIG49dCxpPTk7LS1pOyluPShuJjEmJi0zMDY2NzQ5MTIpXm4+Pj4xO2VbdF09bn1yZXR1cm4gZX0oKSxJcj1mdW5jdGlvbigpe3ZhciBlPS0xO3JldHVybntwOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1lLGk9MDtpPHQubGVuZ3RoOysraSluPUFyW24mMjU1XnRbaV1dXm4+Pj44O2U9bn0sZDpmdW5jdGlvbigpe3JldHVybn5lfX19LFNyPWZ1bmN0aW9uKGUsdCxuLGkscil7aWYoIXImJihyPXtsOjF9LHQuZGljdGlvbmFyeSkpe3ZhciBzPXQuZGljdGlvbmFyeS5zdWJhcnJheSgtMzI3NjgpLG89bmV3IHRlKHMubGVuZ3RoK2UubGVuZ3RoKTtvLnNldChzKSxvLnNldChlLHMubGVuZ3RoKSxlPW8sci53PXMubGVuZ3RofXJldHVybiB4cihlLHQubGV2ZWw9PW51bGw/Njp0LmxldmVsLHQubWVtPT1udWxsP3IubD9NYXRoLmNlaWwoTWF0aC5tYXgoOCxNYXRoLm1pbigxMyxNYXRoLmxvZyhlLmxlbmd0aCkpKSoxLjUpOjIwOjEyK3QubWVtLG4saSxyKX0sY3Q9ZnVuY3Rpb24oZSx0LG4pe2Zvcig7bjsrK3QpZVt0XT1uLG4+Pj49OH0sT3I9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmZpbGVuYW1lO2lmKGVbMF09MzEsZVsxXT0xMzksZVsyXT04LGVbOF09dC5sZXZlbDwyPzQ6dC5sZXZlbD09OT8yOjAsZVs5XT0zLHQubXRpbWUhPTAmJmN0KGUsNCxNYXRoLmZsb29yKG5ldyBEYXRlKHQubXRpbWV8fERhdGUubm93KCkpLzFlMykpLG4pe2VbM109ODtmb3IodmFyIGk9MDtpPD1uLmxlbmd0aDsrK2kpZVtpKzEwXT1uLmNoYXJDb2RlQXQoaSl9fSx3cj1mdW5jdGlvbihlKXtyZXR1cm4gMTArKGUuZmlsZW5hbWU/ZS5maWxlbmFtZS5sZW5ndGgrMTowKX07ZnVuY3Rpb24gRHIoZSx0KXt0fHwodD17fSk7dmFyIG49SXIoKSxpPWUubGVuZ3RoO24ucChlKTt2YXIgcj1TcihlLHQsd3IodCksOCkscz1yLmxlbmd0aDtyZXR1cm4gT3Iocix0KSxjdChyLHMtOCxuLmQoKSksY3QocixzLTQsaSkscn12YXIgWHQ9dHlwZW9mIFRleHRFbmNvZGVyIT0idW5kZWZpbmVkIiYmbmV3IFRleHRFbmNvZGVyLGtyPXR5cGVvZiBUZXh0RGVjb2RlciE9InVuZGVmaW5lZCImJm5ldyBUZXh0RGVjb2RlcixDcj0wO3RyeXtrci5kZWNvZGUoUXQse3N0cmVhbTohMH0pLENyPTF9Y2F0Y2goZSl7fWZ1bmN0aW9uIFJyKGUsdCl7dmFyIG47aWYoWHQpcmV0dXJuIFh0LmVuY29kZShlKTtmb3IodmFyIGk9ZS5sZW5ndGgscj1uZXcgdGUoZS5sZW5ndGgrKGUubGVuZ3RoPj4xKSkscz0wLG89ZnVuY3Rpb24oZCl7cltzKytdPWR9LG49MDtuPGk7KytuKXtpZihzKzU+ci5sZW5ndGgpe3ZhciBjPW5ldyB0ZShzKzgrKGktbjw8MSkpO2Muc2V0KHIpLHI9Y312YXIgaD1lLmNoYXJDb2RlQXQobik7aDwxMjh8fHQ/byhoKTpoPDIwNDg/KG8oMTkyfGg+PjYpLG8oMTI4fGgmNjMpKTpoPjU1Mjk1JiZoPDU3MzQ0PyhoPTY1NTM2KyhoJjEwNDc1NTIpfGUuY2hhckNvZGVBdCgrK24pJjEwMjMsbygyNDB8aD4+MTgpLG8oMTI4fGg+PjEyJjYzKSxvKDEyOHxoPj42JjYzKSxvKDEyOHxoJjYzKSk6KG8oMjI0fGg+PjEyKSxvKDEyOHxoPj42JjYzKSxvKDEyOHxoJjYzKSl9cmV0dXJuIHp0KHIsMCxzKX1mdW5jdGlvbiBMcihlKXtyZXR1cm4gSih0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgdD1ScihKU09OLnN0cmluZ2lmeShlKSksbj1Ecih0KSxpPXlpZWxkIG5ldyBQcm9taXNlKHI9Pntjb25zdCBzPW5ldyBGaWxlUmVhZGVyO3Mub25sb2FkPSgpPT5yKHMucmVzdWx0KSxzLnJlYWRBc0RhdGFVUkwobmV3IEJsb2IoW25ldyBVaW50OEFycmF5KG4pXSkpfSk7cmV0dXJue2NvbXByZXNzZWRCYXNlNjQ6aS5zbGljZShpLmluZGV4T2YoIiwiKSsxKSxjb21wcmVzc2VkU2l6ZTpuLmxlbmd0aCxidWZmZXJMZW5ndGg6dC5sZW5ndGh9fSl9Y29uc3QgdXQ9e0JBU0VfVVJMOiIvIixERVY6ITEsTU9ERToicHJvZHVjdGlvbiIsUFJPRDohMCxTU1I6ITF9LFByPVsiZGVidWciLCJsb2ciLCJpbmZvIiwid2FybiIsImVycm9yIl0sbHQ9U3ltYm9sLmZvcigiQGxhdW5jaGRhcmtseS9vMTF5LnNka0xvZ2dlciIpLEZyPSgoKT0+e3RyeXtyZXR1cm4odXQ9PW51bGw/dm9pZCAwOnV0LkRFQlVHKT09PSJ0cnVlIn1jYXRjaChlKXtyZXR1cm4hMX19KSgpLEJlPSgoKT0+e3ZhciBuO2NvbnN0IGU9Z2xvYmFsVGhpcyx0PShuPWVbbHRdKSE9bnVsbD9uOmVbbHRdPXtkZWJ1Z0VuYWJsZWQ6ITEsc3VwcHJlc3NEZXB0aDowfTtyZXR1cm4gRnImJih0LmRlYnVnRW5hYmxlZD0hMCksdH0pKCksTXI9KCk9PkJlLmRlYnVnRW5hYmxlZCxodD1lPT57QmUuc3VwcHJlc3NEZXB0aCsrO3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7QmUuc3VwcHJlc3NEZXB0aC0tfX0sQnI9ZT0+UHIuaW5jbHVkZXMoZSk/ZToibG9nIiwkcj0oZSwuLi50KT0+e0JlLmRlYnVnRW5hYmxlZCYmaHQoKCk9Pnt2YXIgbjt0cnl7KChuPWNvbnNvbGVbQnIoZSldKSE9bnVsbD9uOmNvbnNvbGUubG9nKS5hcHBseShjb25zb2xlLHQpfWNhdGNoKGkpe319KX07Y2xhc3MgVXJ7Y29uc3RydWN0b3IodCxuKXt5dCh0aGlzLCJkZWJ1ZyIpO3l0KHRoaXMsIm5hbWUiKTt0aGlzLmRlYnVnPXQsdGhpcy5uYW1lPW59cHJlZml4KCl7bGV0IHQ9YFske0RhdGUubm93KCl9XWA7cmV0dXJuIHRoaXMubmFtZSYmKHQrPWAgLSAke3RoaXMubmFtZX1gKSx0fWxvZyguLi50KXt0aGlzLmRlYnVnJiZodCgoKT0+Y29uc29sZS5sb2cuYXBwbHkoY29uc29sZSxbdGhpcy5wcmVmaXgoKSwuLi50XSkpfXdhcm4oLi4udCl7KHRoaXMuZGVidWd8fE1yKCkpJiZodCgoKT0+Y29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsW3RoaXMucHJlZml4KCksLi4udF0pKX19dmFyIFd0PShlPT4oZS5CaWxsaW5nUXVvdGFFeGNlZWRlZD0iQmlsbGluZ1F1b3RhRXhjZWVkZWQiLGUpKShXdHx8e30pO2NvbnN0IFZyPTMscXI9MWUzLGpyPTUwMCxHcj1bV3QuQmlsbGluZ1F1b3RhRXhjZWVkZWQudG9TdHJpbmcoKV0senI9ZT0+e3ZhciBuO3JldHVybigobj1lLnJlc3BvbnNlLmVycm9ycyk9PW51bGw/dm9pZCAwOm4uZmluZChpPT5Hci5pbmNsdWRlcyhpLm1lc3NhZ2UpKSk9PT12b2lkIDB9LEhyPSgpPT57Y29uc3QgZT0odCxuLGkscixzPTApPT5KKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7cmV0dXJuIHlpZWxkIHQoKX1jYXRjaChvKXtpZihvIGluc3RhbmNlb2YgZGUmJiF6cihvKSl0aHJvdyBvO2lmKHM8VnIpcmV0dXJuIHlpZWxkIG5ldyBQcm9taXNlKGM9PnNldFRpbWVvdXQoYyxxcitqcipNYXRoLnBvdygyLHMpKSkseWllbGQgZSh0LG4saSxyLHMrMSk7dGhyb3cgJHIoImVycm9yIixgaGlnaGxpZ2h0LmlvOiBkYXRhIHJlcXVlc3QgZmFpbGVkIGFmdGVyICR7c30gcmV0cmllc2ApLG99fSk7cmV0dXJuIGV9LFp0PTUsS3Q9MmUzLFlyPVsibnVtYmVyIiwic3RyaW5nIiwiYm9vbGVhbiJdO3ZhciBaPShlPT4oZVtlLkluaXRpYWxpemU9MF09IkluaXRpYWxpemUiLGVbZS5SZXNldD0xXT0iUmVzZXQiLGVbZS5Bc3luY0V2ZW50cz0yXT0iQXN5bmNFdmVudHMiLGVbZS5JZGVudGlmeT0zXT0iSWRlbnRpZnkiLGVbZS5Qcm9wZXJ0aWVzPTRdPSJQcm9wZXJ0aWVzIixlW2UuTWV0cmljcz01XT0iTWV0cmljcyIsZVtlLkZlZWRiYWNrPTZdPSJGZWVkYmFjayIsZVtlLkN1c3RvbUV2ZW50PTddPSJDdXN0b21FdmVudCIsZVtlLlN0b3A9OF09IlN0b3AiLGVbZS5HZXRTdGF0dXM9OV09IkdldFN0YXR1cyIsZSkpKFp8fHt9KTtjb25zdCBTZT1zZWxmO2Z1bmN0aW9uIGVuKGUsdCl7Y29uc3Qgbj17fSxpPVtdLHI9W107Zm9yKGNvbnN0W3Msb11vZiBPYmplY3QuZW50cmllcyhlKSl7aWYobz09bnVsbCljb250aW51ZTtZci5pbmNsdWRlcyh0eXBlb2Ygbyl8fGkucHVzaCh7W3NdOm99KTtsZXQgYzt0eXBlb2Ygbz09InN0cmluZyI/Yz1vOmM9bWUobyksYy5sZW5ndGg+S3QmJihyLnB1c2goe1tzXTpvfSksYz1jLnN1YnN0cmluZygwLEt0KSksbltzXT1jfXJldHVybiB0IT09InNlc3Npb24iJiYoaS5sZW5ndGg+MCYmY29uc29sZS53YXJuKGBIaWdobGlnaHQgd2FzIHBhc3NlZCBvbmUgb3IgbW9yZSAke3R9IHByb3BlcnRpZXMgbm90IG9mIHR5cGUgc3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4uYCxpKSxyLmxlbmd0aD4wJiZjb25zb2xlLndhcm4oYEhpZ2hsaWdodCB3YXMgcGFzc2VkIG9uZSBvciBtb3JlICR7dH0gcHJvcGVydGllcyBleGNlZWRpbmcgMjAwMCBjaGFyYWN0ZXJzLCB3aGljaCB3aWxsIGJlIHRydW5jYXRlZC5gLHIpKSxufXtsZXQgZSx0LG4saT0wLHI9MCxzPSExLG89MCxjPW5ldyBVcighMSwiW3dvcmtlcl0iKTtjb25zdCBoPVtdLGQ9W10sdT0oKT0+byE9PTAmJmk8WnQmJiEhKG4hPW51bGwmJm4ubGVuZ3RoKSx5PShnLEUpPT57U2UucG9zdE1lc3NhZ2Uoe3Jlc3BvbnNlOnt0eXBlOlouQ3VzdG9tRXZlbnQsdGFnOmcscGF5bG9hZDpFfX0pfSx2PWc9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e2lkOkUsZXZlbnRzOncsbWVzc2FnZXM6ayxlcnJvcnM6UCxyZXNvdXJjZXNTdHJpbmc6SSx3ZWJTb2NrZXRFdmVudHNTdHJpbmc6eCxoYXNTZXNzaW9uVW5sb2FkZWQ6eixoaWdobGlnaHRMb2dzOlZ9PWcsSD1tZSh7bWVzc2FnZXM6a30pO2xldCBYPXtzZXNzaW9uX3NlY3VyZV9pZDpuLHBheWxvYWRfaWQ6RS50b1N0cmluZygpLGV2ZW50czp7ZXZlbnRzOnd9LG1lc3NhZ2VzOkgscmVzb3VyY2VzOkksd2ViX3NvY2tldF9ldmVudHM6eCxlcnJvcnM6UCxpc19iZWFjb246ITEsaGFzX3Nlc3Npb25fdW5sb2FkZWQ6en07ViYmKFguaGlnaGxpZ2h0X2xvZ3M9Vik7Y29uc3R7Y29tcHJlc3NlZEJhc2U2NDphLGJ1ZmZlckxlbmd0aDpmLGNvbXByZXNzZWRTaXplOl99PXlpZWxkIExyKFgpLFM9e3R5cGU6Wi5Bc3luY0V2ZW50cyxpZDpFLGV2ZW50c1NpemU6Zixjb21wcmVzc2VkU2l6ZTphLmxlbmd0aH07Yy5sb2coYFB1c2hpbmcgcGF5bG9hZDogJHtKU09OLnN0cmluZ2lmeSh7c2Vzc2lvblNlY3VyZUlEOm4saWQ6RSxmaXJzdFNJRDpNYXRoLm1pbiguLi5YLmV2ZW50cy5ldmVudHMubWFwKFc9Plc9PW51bGw/dm9pZCAwOlcuX3NpZCkuZmlsdGVyKFc9PiEhVykpLGV2ZW50c0xlbmd0aDpYLmV2ZW50cy5ldmVudHMubGVuZ3RoLG1lc3NhZ2VzTGVuZ3RoOmsubGVuZ3RoLHJlc291cmNlc0xlbmd0aDpJLmxlbmd0aCx3ZWJTb2NrZXRMZW5ndGg6eC5sZW5ndGgsZXJyb3JzTGVuZ3RoOlAubGVuZ3RoLGJ1Zkxlbmd0aDpmLGNvbXByZXNzZWRMZW5ndGg6Xyxjb21wcmVzc2VkQmFzZTY0TGVuZ3RoOmEubGVuZ3RofSx2b2lkIDAsMil9YCk7Y29uc3QgQz1lLlB1c2hTZXNzaW9uRXZlbnRzKHtzZXNzaW9uX3NlY3VyZV9pZDpuLHBheWxvYWRfaWQ6RS50b1N0cmluZygpLGRhdGE6YX0pO2xldCBBPVByb21pc2UucmVzb2x2ZSgpO2gubGVuZ3RoJiYoQT1lLnB1c2hNZXRyaWNzKHttZXRyaWNzOmh9KSxoLnNwbGljZSgwKSk7bGV0IEs9cGVyZm9ybWFuY2Uubm93KCk7Y29uc3Qgaj1zZXRJbnRlcnZhbCgoKT0+e0smJnBlcmZvcm1hbmNlLm5vdygpLUs+RnQmJihjb25zb2xlLndhcm4oYFVwbG9hZGluZyBwdXNoUGF5bG9hZCB0b29rIHRvbyBsb25nLCBmYWlsdXJlIG51bWJlciAjJHtyfS5gKSxyKz0xLGNsZWFySW50ZXJ2YWwoaikscj49WnQmJihjb25zb2xlLndhcm4oIlVwbG9hZGluZyBwdXNoUGF5bG9hZCB0b29rIHRvbyBsb25nLCBzdG9wcGluZyByZWNvcmRpbmcgdG8gYXZvaWQgT09NLiIpLFNlLnBvc3RNZXNzYWdlKHtyZXNwb25zZTp7dHlwZTpaLlN0b3AscmVxdWVzdFN0YXJ0OkssYXN5bmNFdmVudHNSZXNwb25zZTpTfX0pLG0oe3R5cGU6Wi5Qcm9wZXJ0aWVzLHByb3BlcnRpZXNPYmplY3Q6e3N0b3BSZWFzb246IlB1c2ggUGF5bG9hZCBUaW1lb3V0In0scHJvcGVydHlUeXBlOnt0eXBlOiJ0cmFjayJ9fSkpKX0sMTAwKTt0cnl7eWllbGQgUHJvbWlzZS5hbGwoW0MsQV0pLHImJnBlcmZvcm1hbmNlLm5vdygpLUs8PUZ0JiYoY29uc29sZS53YXJuKGBwdXNoUGF5bG9hZCBzdWNjZWVkZWQgYWZ0ZXIgIyR7cn0gZmFpbHVyZXMsIHJlc2V0dGluZyBzdG9wIHN3aXRjaC5gKSxyPTApfWZpbmFsbHl7Sz0wLGNsZWFySW50ZXJ2YWwoail9U2UucG9zdE1lc3NhZ2Uoe3Jlc3BvbnNlOlN9KX0pLFQ9Zz0+Sih0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3R7dXNlck9iamVjdDpFLHVzZXJJZGVudGlmaWVyOncsc291cmNlOmt9PWc7az09PSJzZWdtZW50Ij95KCJTZWdtZW50IElkZW50aWZ5IixtZShEKHt1c2VySWRlbnRpZmllcjp3fSxFKSkpOnkoIklkZW50aWZ5IixtZShEKHt1c2VySWRlbnRpZmllcjp3fSxFKSkpLHlpZWxkIGUuaWRlbnRpZnlTZXNzaW9uKHtzZXNzaW9uX3NlY3VyZV9pZDpuLHVzZXJfaWRlbnRpZmllcjp3LHVzZXJfb2JqZWN0OmVuKEUsInVzZXIiKX0pO2NvbnN0IFA9az09PSJzZWdtZW50Ij9rOiJkZWZhdWx0IjtjLmxvZyhgSWRlbnRpZnkgKCR7d30sIHNvdXJjZTogJHtQfSkgdy8gb2JqOiAke21lKEUpfSBAICR7dH1gKX0pLG09Zz0+Sih0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3R7cHJvcGVydGllc09iamVjdDpFLHByb3BlcnR5VHlwZTp3fT1nO2xldCBrOyh3PT1udWxsP3ZvaWQgMDp3LnR5cGUpPT09InNlc3Npb24iPyhrPSJTZXNzaW9uIix5aWVsZCBlLmFkZFNlc3Npb25Qcm9wZXJ0aWVzKHtzZXNzaW9uX3NlY3VyZV9pZDpuLHByb3BlcnRpZXNfb2JqZWN0OmVuKEUsInNlc3Npb24iKX0pKToodz09bnVsbD92b2lkIDA6dy5zb3VyY2UpPT09InNlZ21lbnQiP2s9IlNlZ21lbnQiOms9IlRyYWNrIixrIT09IlNlc3Npb24iJiZ5KGssbWUoRSkpLGMubG9nKGBBZGRpbmcgJHtrfSBQcm9wZXJ0aWVzIHRvIHNlc3Npb24gKCR7bn0pIHcvIG9iajogJHtKU09OLnN0cmluZ2lmeShFKX0gQCAke3R9YCl9KSxOPWc9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe2gucHVzaCguLi5nLm1ldHJpY3MubWFwKEU9Pih7bmFtZTpFLm5hbWUsdmFsdWU6RS52YWx1ZSxzZXNzaW9uX3NlY3VyZV9pZDpuLGNhdGVnb3J5OkUuY2F0ZWdvcnksZ3JvdXA6RS5ncm91cCx0aW1lc3RhbXA6RS50aW1lc3RhbXAudG9JU09TdHJpbmcoKSx0YWdzOkUudGFnc30pKSl9KSxSPWc9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3RpbWVzdGFtcDpFLHZlcmJhdGltOncsdXNlckVtYWlsOmssdXNlck5hbWU6UH09Zzt5aWVsZCBlLmFkZFNlc3Npb25GZWVkYmFjayh7c2Vzc2lvbl9zZWN1cmVfaWQ6bix0aW1lc3RhbXA6RSx2ZXJiYXRpbTp3LHVzZXJfZW1haWw6ayx1c2VyX25hbWU6UH0pfSksTD1nPT5KKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtnLnR5cGU9PT1aLkFzeW5jRXZlbnRzP3lpZWxkIHYoZyk6Zy50eXBlPT09Wi5JZGVudGlmeT95aWVsZCBUKGcpOmcudHlwZT09PVouUHJvcGVydGllcz95aWVsZCBtKGcpOmcudHlwZT09PVouTWV0cmljcz95aWVsZCBOKGcpOmcudHlwZT09PVouRmVlZGJhY2smJih5aWVsZCBSKGcpKX0pLHE9KCk9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe2Zvcig7ZC5sZW5ndGg+MCYmdSgpOyl7Y29uc3QgZz1kLnNoaWZ0KCk7dHJ5e3lpZWxkIEwoZyksaT0wfWNhdGNoKEUpe3MmJmNvbnNvbGUuZXJyb3IoRSksaSs9MX19fSk7U2Uub25tZXNzYWdlPWZ1bmN0aW9uKGcpe3JldHVybiBKKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZihnLmRhdGEubWVzc2FnZS50eXBlPT09Wi5Jbml0aWFsaXplKXt0PWcuZGF0YS5tZXNzYWdlLmJhY2tlbmQsbj1nLmRhdGEubWVzc2FnZS5zZXNzaW9uU2VjdXJlSUQscz1nLmRhdGEubWVzc2FnZS5kZWJ1ZyxvPWcuZGF0YS5tZXNzYWdlLnJlY29yZGluZ1N0YXJ0VGltZSxjLmRlYnVnPXMsZT12cihuZXcgWG4odCx7aGVhZGVyczp7fX0pLEhyKCkpLHlpZWxkIHEoKTtyZXR1cm59aWYoZy5kYXRhLm1lc3NhZ2UudHlwZT09PVouUmVzZXQpe2QubGVuZ3RoPTAsaC5sZW5ndGg9MCxpPTAscj0wLG49IiIsbz0wO3JldHVybn1pZihnLmRhdGEubWVzc2FnZS50eXBlPT09Wi5HZXRTdGF0dXMpe1NlLnBvc3RNZXNzYWdlKHtyZXNwb25zZTp7dHlwZTpaLkdldFN0YXR1cyxwZW5kaW5nQ291bnQ6ZC5sZW5ndGgsaW5pdGlhbGl6ZWQ6dSgpfX0pO3JldHVybn1pZighdSgpKXtkLnB1c2goZy5kYXRhLm1lc3NhZ2UpO3JldHVybn10cnl7eWllbGQgTChnLmRhdGEubWVzc2FnZSksaT0wLHlpZWxkIHEoKX1jYXRjaChFKXtzJiZjb25zb2xlLmVycm9yKEUpLGkrPTF9fSl9fX0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWhpZ2hsaWdodC1jbGllbnQtd29ya2VyLURyRFBSQ3J2LmpzLm1hcAo=", Uu = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), En = typeof self != "undefined" && self.Blob && new Blob([Uu(Al)], { type: "text/javascript;charset=utf-8" });
10325
- function Ku(e) {
10324
+ const _l = "dmFyIFFyPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxYcj1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgV3I9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyICRlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIG9uPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYW49T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgbXQ9KEYsQiwkKT0+QiBpbiBGP1FyKEYsQix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6JH0pOkZbQl09JCxEPShGLEIpPT57Zm9yKHZhciAkIGluIEJ8fChCPXt9KSlvbi5jYWxsKEIsJCkmJm10KEYsJCxCWyRdKTtpZigkZSlmb3IodmFyICQgb2YgJGUoQikpYW4uY2FsbChCLCQpJiZtdChGLCQsQlskXSk7cmV0dXJuIEZ9LFVlPShGLEIpPT5YcihGLFdyKEIpKTt2YXIgdmU9KEYsQik9Pnt2YXIgJD17fTtmb3IodmFyIGVlIGluIEYpb24uY2FsbChGLGVlKSYmQi5pbmRleE9mKGVlKTwwJiYoJFtlZV09RltlZV0pO2lmKEYhPW51bGwmJiRlKWZvcih2YXIgZWUgb2YgJGUoRikpQi5pbmRleE9mKGVlKTwwJiZhbi5jYWxsKEYsZWUpJiYoJFtlZV09RltlZV0pO3JldHVybiAkfTt2YXIgeXQ9KEYsQiwkKT0+bXQoRix0eXBlb2YgQiE9InN5bWJvbCI/QisiIjpCLCQpO3ZhciBKPShGLEIsJCk9Pm5ldyBQcm9taXNlKChlZSxPZSk9Pnt2YXIgVmU9c2U9Pnt0cnl7RWUoJC5uZXh0KHNlKSl9Y2F0Y2goX2Upe09lKF9lKX19LGxlPXNlPT57dHJ5e0VlKCQudGhyb3coc2UpKX1jYXRjaChfZSl7T2UoX2UpfX0sRWU9c2U9PnNlLmRvbmU/ZWUoc2UudmFsdWUpOlByb21pc2UucmVzb2x2ZShzZS52YWx1ZSkudGhlbihWZSxsZSk7RWUoKCQ9JC5hcHBseShGLEIpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NvbnN0IEY9SlNPTixCPWU9PmUudG9VcHBlckNhc2UoKSwkPWU9Pntjb25zdCB0PXt9O3JldHVybiBlLmZvckVhY2goKG4saSk9Pnt0W2ldPW59KSx0fSxlZT0oZSx0LG4pPT5lLmRvY3VtZW50P2U6e2RvY3VtZW50OmUsdmFyaWFibGVzOnQscmVxdWVzdEhlYWRlcnM6bixzaWduYWw6dm9pZCAwfSxPZT0oZSx0LG4pPT5lLnF1ZXJ5P2U6e3F1ZXJ5OmUsdmFyaWFibGVzOnQscmVxdWVzdEhlYWRlcnM6bixzaWduYWw6dm9pZCAwfSxWZT0oZSx0KT0+ZS5kb2N1bWVudHM/ZTp7ZG9jdW1lbnRzOmUscmVxdWVzdEhlYWRlcnM6dCxzaWduYWw6dm9pZCAwfTtmdW5jdGlvbiBsZShlLHQpe2lmKCEhIWUpdGhyb3cgbmV3IEVycm9yKHQpfWZ1bmN0aW9uIEVlKGUpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsfWZ1bmN0aW9uIHNlKGUsdCl7aWYoISEhZSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgaW52YXJpYW50IHRyaWdnZXJlZC4iKX1jb25zdCBfZT0vXHJcbnxbXG5ccl0vZztmdW5jdGlvbiBxZShlLHQpe2xldCBuPTAsaT0xO2Zvcihjb25zdCByIG9mIGUuYm9keS5tYXRjaEFsbChfZSkpe2lmKHR5cGVvZiByLmluZGV4PT0ibnVtYmVyInx8c2UoITEpLHIuaW5kZXg+PXQpYnJlYWs7bj1yLmluZGV4K3JbMF0ubGVuZ3RoLGkrPTF9cmV0dXJue2xpbmU6aSxjb2x1bW46dCsxLW59fWZ1bmN0aW9uIGNuKGUpe3JldHVybiBndChlLnNvdXJjZSxxZShlLnNvdXJjZSxlLnN0YXJ0KSl9ZnVuY3Rpb24gZ3QoZSx0KXtjb25zdCBuPWUubG9jYXRpb25PZmZzZXQuY29sdW1uLTEsaT0iIi5wYWRTdGFydChuKStlLmJvZHkscj10LmxpbmUtMSxzPWUubG9jYXRpb25PZmZzZXQubGluZS0xLG89dC5saW5lK3MsYz10LmxpbmU9PT0xP246MCxoPXQuY29sdW1uK2MsZD1gJHtlLm5hbWV9OiR7b306JHtofQpgLHU9aS5zcGxpdCgvXHJcbnxbXG5ccl0vZykseT11W3JdO2lmKHkubGVuZ3RoPjEyMCl7Y29uc3Qgdj1NYXRoLmZsb29yKGgvODApLFQ9aCU4MCxtPVtdO2ZvcihsZXQgTj0wO048eS5sZW5ndGg7Tis9ODApbS5wdXNoKHkuc2xpY2UoTixOKzgwKSk7cmV0dXJuIGQrdnQoW1tgJHtvfSB8YCxtWzBdXSwuLi5tLnNsaWNlKDEsdisxKS5tYXAoTj0+WyJ8IixOXSksWyJ8IiwiXiIucGFkU3RhcnQoVCldLFsifCIsbVt2KzFdXV0pfXJldHVybiBkK3Z0KFtbYCR7by0xfSB8YCx1W3ItMV1dLFtgJHtvfSB8YCx5XSxbInwiLCJeIi5wYWRTdGFydChoKV0sW2Ake28rMX0gfGAsdVtyKzFdXV0pfWZ1bmN0aW9uIHZ0KGUpe2NvbnN0IHQ9ZS5maWx0ZXIoKFtpLHJdKT0+ciE9PXZvaWQgMCksbj1NYXRoLm1heCguLi50Lm1hcCgoW2ldKT0+aS5sZW5ndGgpKTtyZXR1cm4gdC5tYXAoKFtpLHJdKT0+aS5wYWRTdGFydChuKSsocj8iICIrcjoiIikpLmpvaW4oYApgKX1mdW5jdGlvbiB1bihlKXtjb25zdCB0PWVbMF07cmV0dXJuIHQ9PW51bGx8fCJraW5kImluIHR8fCJsZW5ndGgiaW4gdD97bm9kZXM6dCxzb3VyY2U6ZVsxXSxwb3NpdGlvbnM6ZVsyXSxwYXRoOmVbM10sb3JpZ2luYWxFcnJvcjplWzRdLGV4dGVuc2lvbnM6ZVs1XX06dH1jbGFzcyBqZSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsLi4ubil7dmFyIGkscixzO2NvbnN0e25vZGVzOm8sc291cmNlOmMscG9zaXRpb25zOmgscGF0aDpkLG9yaWdpbmFsRXJyb3I6dSxleHRlbnNpb25zOnl9PXVuKG4pO3N1cGVyKHQpLHRoaXMubmFtZT0iR3JhcGhRTEVycm9yIix0aGlzLnBhdGg9ZCE9bnVsbD9kOnZvaWQgMCx0aGlzLm9yaWdpbmFsRXJyb3I9dSE9bnVsbD91OnZvaWQgMCx0aGlzLm5vZGVzPUV0KEFycmF5LmlzQXJyYXkobyk/bzpvP1tvXTp2b2lkIDApO2NvbnN0IHY9RXQoKGk9dGhpcy5ub2Rlcyk9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLm1hcChtPT5tLmxvYykuZmlsdGVyKG09Pm0hPW51bGwpKTt0aGlzLnNvdXJjZT1jIT1udWxsP2M6dj09bnVsbHx8KHI9dlswXSk9PT1udWxsfHxyPT09dm9pZCAwP3ZvaWQgMDpyLnNvdXJjZSx0aGlzLnBvc2l0aW9ucz1oIT1udWxsP2g6dj09bnVsbD92b2lkIDA6di5tYXAobT0+bS5zdGFydCksdGhpcy5sb2NhdGlvbnM9aCYmYz9oLm1hcChtPT5xZShjLG0pKTp2PT1udWxsP3ZvaWQgMDp2Lm1hcChtPT5xZShtLnNvdXJjZSxtLnN0YXJ0KSk7Y29uc3QgVD1FZSh1PT1udWxsP3ZvaWQgMDp1LmV4dGVuc2lvbnMpP3U9PW51bGw/dm9pZCAwOnUuZXh0ZW5zaW9uczp2b2lkIDA7dGhpcy5leHRlbnNpb25zPShzPXkhPW51bGw/eTpUKSE9PW51bGwmJnMhPT12b2lkIDA/czpPYmplY3QuY3JlYXRlKG51bGwpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse21lc3NhZ2U6e3dyaXRhYmxlOiEwLGVudW1lcmFibGU6ITB9LG5hbWU6e2VudW1lcmFibGU6ITF9LG5vZGVzOntlbnVtZXJhYmxlOiExfSxzb3VyY2U6e2VudW1lcmFibGU6ITF9LHBvc2l0aW9uczp7ZW51bWVyYWJsZTohMX0sb3JpZ2luYWxFcnJvcjp7ZW51bWVyYWJsZTohMX19KSx1IT1udWxsJiZ1LnN0YWNrP09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOnUuc3RhY2ssd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxqZSk6T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YWNrIix7dmFsdWU6RXJyb3IoKS5zdGFjayx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJHcmFwaFFMRXJyb3IifXRvU3RyaW5nKCl7bGV0IHQ9dGhpcy5tZXNzYWdlO2lmKHRoaXMubm9kZXMpZm9yKGNvbnN0IG4gb2YgdGhpcy5ub2RlcyluLmxvYyYmKHQrPWAKCmArY24obi5sb2MpKTtlbHNlIGlmKHRoaXMuc291cmNlJiZ0aGlzLmxvY2F0aW9ucylmb3IoY29uc3QgbiBvZiB0aGlzLmxvY2F0aW9ucyl0Kz1gCgpgK2d0KHRoaXMuc291cmNlLG4pO3JldHVybiB0fXRvSlNPTigpe2NvbnN0IHQ9e21lc3NhZ2U6dGhpcy5tZXNzYWdlfTtyZXR1cm4gdGhpcy5sb2NhdGlvbnMhPW51bGwmJih0LmxvY2F0aW9ucz10aGlzLmxvY2F0aW9ucyksdGhpcy5wYXRoIT1udWxsJiYodC5wYXRoPXRoaXMucGF0aCksdGhpcy5leHRlbnNpb25zIT1udWxsJiZPYmplY3Qua2V5cyh0aGlzLmV4dGVuc2lvbnMpLmxlbmd0aD4wJiYodC5leHRlbnNpb25zPXRoaXMuZXh0ZW5zaW9ucyksdH19ZnVuY3Rpb24gRXQoZSl7cmV0dXJuIGU9PT12b2lkIDB8fGUubGVuZ3RoPT09MD92b2lkIDA6ZX1mdW5jdGlvbiBHKGUsdCxuKXtyZXR1cm4gbmV3IGplKGBTeW50YXggRXJyb3I6ICR7bn1gLHtzb3VyY2U6ZSxwb3NpdGlvbnM6W3RdfSl9Y2xhc3MgbG57Y29uc3RydWN0b3IodCxuLGkpe3RoaXMuc3RhcnQ9dC5zdGFydCx0aGlzLmVuZD1uLmVuZCx0aGlzLnN0YXJ0VG9rZW49dCx0aGlzLmVuZFRva2VuPW4sdGhpcy5zb3VyY2U9aX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJMb2NhdGlvbiJ9dG9KU09OKCl7cmV0dXJue3N0YXJ0OnRoaXMuc3RhcnQsZW5kOnRoaXMuZW5kfX19Y2xhc3MgX3R7Y29uc3RydWN0b3IodCxuLGkscixzLG8pe3RoaXMua2luZD10LHRoaXMuc3RhcnQ9bix0aGlzLmVuZD1pLHRoaXMubGluZT1yLHRoaXMuY29sdW1uPXMsdGhpcy52YWx1ZT1vLHRoaXMucHJldj1udWxsLHRoaXMubmV4dD1udWxsfWdldFtTeW1ib2wudG9TdHJpbmdUYWddKCl7cmV0dXJuIlRva2VuIn10b0pTT04oKXtyZXR1cm57a2luZDp0aGlzLmtpbmQsdmFsdWU6dGhpcy52YWx1ZSxsaW5lOnRoaXMubGluZSxjb2x1bW46dGhpcy5jb2x1bW59fX1jb25zdCBidD17TmFtZTpbXSxEb2N1bWVudDpbImRlZmluaXRpb25zIl0sT3BlcmF0aW9uRGVmaW5pdGlvbjpbIm5hbWUiLCJ2YXJpYWJsZURlZmluaXRpb25zIiwiZGlyZWN0aXZlcyIsInNlbGVjdGlvblNldCJdLFZhcmlhYmxlRGVmaW5pdGlvbjpbInZhcmlhYmxlIiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImRpcmVjdGl2ZXMiXSxWYXJpYWJsZTpbIm5hbWUiXSxTZWxlY3Rpb25TZXQ6WyJzZWxlY3Rpb25zIl0sRmllbGQ6WyJhbGlhcyIsIm5hbWUiLCJhcmd1bWVudHMiLCJkaXJlY3RpdmVzIiwic2VsZWN0aW9uU2V0Il0sQXJndW1lbnQ6WyJuYW1lIiwidmFsdWUiXSxGcmFnbWVudFNwcmVhZDpbIm5hbWUiLCJkaXJlY3RpdmVzIl0sSW5saW5lRnJhZ21lbnQ6WyJ0eXBlQ29uZGl0aW9uIiwiZGlyZWN0aXZlcyIsInNlbGVjdGlvblNldCJdLEZyYWdtZW50RGVmaW5pdGlvbjpbIm5hbWUiLCJ2YXJpYWJsZURlZmluaXRpb25zIiwidHlwZUNvbmRpdGlvbiIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxJbnRWYWx1ZTpbXSxGbG9hdFZhbHVlOltdLFN0cmluZ1ZhbHVlOltdLEJvb2xlYW5WYWx1ZTpbXSxOdWxsVmFsdWU6W10sRW51bVZhbHVlOltdLExpc3RWYWx1ZTpbInZhbHVlcyJdLE9iamVjdFZhbHVlOlsiZmllbGRzIl0sT2JqZWN0RmllbGQ6WyJuYW1lIiwidmFsdWUiXSxEaXJlY3RpdmU6WyJuYW1lIiwiYXJndW1lbnRzIl0sTmFtZWRUeXBlOlsibmFtZSJdLExpc3RUeXBlOlsidHlwZSJdLE5vbk51bGxUeXBlOlsidHlwZSJdLFNjaGVtYURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsImRpcmVjdGl2ZXMiLCJvcGVyYXRpb25UeXBlcyJdLE9wZXJhdGlvblR5cGVEZWZpbml0aW9uOlsidHlwZSJdLFNjYWxhclR5cGVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGlyZWN0aXZlcyJdLE9iamVjdFR5cGVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiaW50ZXJmYWNlcyIsImRpcmVjdGl2ZXMiLCJmaWVsZHMiXSxGaWVsZERlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJhcmd1bWVudHMiLCJ0eXBlIiwiZGlyZWN0aXZlcyJdLElucHV0VmFsdWVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImRpcmVjdGl2ZXMiXSxJbnRlcmZhY2VUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sVW5pb25UeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiLCJ0eXBlcyJdLEVudW1UeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiLCJ2YWx1ZXMiXSxFbnVtVmFsdWVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGlyZWN0aXZlcyJdLElucHV0T2JqZWN0VHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sRGlyZWN0aXZlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImFyZ3VtZW50cyIsImxvY2F0aW9ucyJdLFNjaGVtYUV4dGVuc2lvbjpbImRpcmVjdGl2ZXMiLCJvcGVyYXRpb25UeXBlcyJdLFNjYWxhclR5cGVFeHRlbnNpb246WyJuYW1lIiwiZGlyZWN0aXZlcyJdLE9iamVjdFR5cGVFeHRlbnNpb246WyJuYW1lIiwiaW50ZXJmYWNlcyIsImRpcmVjdGl2ZXMiLCJmaWVsZHMiXSxJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sVW5pb25UeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiLCJ0eXBlcyJdLEVudW1UeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiLCJ2YWx1ZXMiXSxJbnB1dE9iamVjdFR5cGVFeHRlbnNpb246WyJuYW1lIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdfSxobj1uZXcgU2V0KE9iamVjdC5rZXlzKGJ0KSk7ZnVuY3Rpb24gVHQoZSl7Y29uc3QgdD1lPT1udWxsP3ZvaWQgMDplLmtpbmQ7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIiYmaG4uaGFzKHQpfXZhciBoZTsoZnVuY3Rpb24oZSl7ZS5RVUVSWT0icXVlcnkiLGUuTVVUQVRJT049Im11dGF0aW9uIixlLlNVQlNDUklQVElPTj0ic3Vic2NyaXB0aW9uIn0pKGhlfHwoaGU9e30pKTt2YXIgR2U7KGZ1bmN0aW9uKGUpe2UuUVVFUlk9IlFVRVJZIixlLk1VVEFUSU9OPSJNVVRBVElPTiIsZS5TVUJTQ1JJUFRJT049IlNVQlNDUklQVElPTiIsZS5GSUVMRD0iRklFTEQiLGUuRlJBR01FTlRfREVGSU5JVElPTj0iRlJBR01FTlRfREVGSU5JVElPTiIsZS5GUkFHTUVOVF9TUFJFQUQ9IkZSQUdNRU5UX1NQUkVBRCIsZS5JTkxJTkVfRlJBR01FTlQ9IklOTElORV9GUkFHTUVOVCIsZS5WQVJJQUJMRV9ERUZJTklUSU9OPSJWQVJJQUJMRV9ERUZJTklUSU9OIixlLlNDSEVNQT0iU0NIRU1BIixlLlNDQUxBUj0iU0NBTEFSIixlLk9CSkVDVD0iT0JKRUNUIixlLkZJRUxEX0RFRklOSVRJT049IkZJRUxEX0RFRklOSVRJT04iLGUuQVJHVU1FTlRfREVGSU5JVElPTj0iQVJHVU1FTlRfREVGSU5JVElPTiIsZS5JTlRFUkZBQ0U9IklOVEVSRkFDRSIsZS5VTklPTj0iVU5JT04iLGUuRU5VTT0iRU5VTSIsZS5FTlVNX1ZBTFVFPSJFTlVNX1ZBTFVFIixlLklOUFVUX09CSkVDVD0iSU5QVVRfT0JKRUNUIixlLklOUFVUX0ZJRUxEX0RFRklOSVRJT049IklOUFVUX0ZJRUxEX0RFRklOSVRJT04ifSkoR2V8fChHZT17fSkpO3ZhciBiOyhmdW5jdGlvbihlKXtlLk5BTUU9Ik5hbWUiLGUuRE9DVU1FTlQ9IkRvY3VtZW50IixlLk9QRVJBVElPTl9ERUZJTklUSU9OPSJPcGVyYXRpb25EZWZpbml0aW9uIixlLlZBUklBQkxFX0RFRklOSVRJT049IlZhcmlhYmxlRGVmaW5pdGlvbiIsZS5TRUxFQ1RJT05fU0VUPSJTZWxlY3Rpb25TZXQiLGUuRklFTEQ9IkZpZWxkIixlLkFSR1VNRU5UPSJBcmd1bWVudCIsZS5GUkFHTUVOVF9TUFJFQUQ9IkZyYWdtZW50U3ByZWFkIixlLklOTElORV9GUkFHTUVOVD0iSW5saW5lRnJhZ21lbnQiLGUuRlJBR01FTlRfREVGSU5JVElPTj0iRnJhZ21lbnREZWZpbml0aW9uIixlLlZBUklBQkxFPSJWYXJpYWJsZSIsZS5JTlQ9IkludFZhbHVlIixlLkZMT0FUPSJGbG9hdFZhbHVlIixlLlNUUklORz0iU3RyaW5nVmFsdWUiLGUuQk9PTEVBTj0iQm9vbGVhblZhbHVlIixlLk5VTEw9Ik51bGxWYWx1ZSIsZS5FTlVNPSJFbnVtVmFsdWUiLGUuTElTVD0iTGlzdFZhbHVlIixlLk9CSkVDVD0iT2JqZWN0VmFsdWUiLGUuT0JKRUNUX0ZJRUxEPSJPYmplY3RGaWVsZCIsZS5ESVJFQ1RJVkU9IkRpcmVjdGl2ZSIsZS5OQU1FRF9UWVBFPSJOYW1lZFR5cGUiLGUuTElTVF9UWVBFPSJMaXN0VHlwZSIsZS5OT05fTlVMTF9UWVBFPSJOb25OdWxsVHlwZSIsZS5TQ0hFTUFfREVGSU5JVElPTj0iU2NoZW1hRGVmaW5pdGlvbiIsZS5PUEVSQVRJT05fVFlQRV9ERUZJTklUSU9OPSJPcGVyYXRpb25UeXBlRGVmaW5pdGlvbiIsZS5TQ0FMQVJfVFlQRV9ERUZJTklUSU9OPSJTY2FsYXJUeXBlRGVmaW5pdGlvbiIsZS5PQkpFQ1RfVFlQRV9ERUZJTklUSU9OPSJPYmplY3RUeXBlRGVmaW5pdGlvbiIsZS5GSUVMRF9ERUZJTklUSU9OPSJGaWVsZERlZmluaXRpb24iLGUuSU5QVVRfVkFMVUVfREVGSU5JVElPTj0iSW5wdXRWYWx1ZURlZmluaXRpb24iLGUuSU5URVJGQUNFX1RZUEVfREVGSU5JVElPTj0iSW50ZXJmYWNlVHlwZURlZmluaXRpb24iLGUuVU5JT05fVFlQRV9ERUZJTklUSU9OPSJVbmlvblR5cGVEZWZpbml0aW9uIixlLkVOVU1fVFlQRV9ERUZJTklUSU9OPSJFbnVtVHlwZURlZmluaXRpb24iLGUuRU5VTV9WQUxVRV9ERUZJTklUSU9OPSJFbnVtVmFsdWVEZWZpbml0aW9uIixlLklOUFVUX09CSkVDVF9UWVBFX0RFRklOSVRJT049IklucHV0T2JqZWN0VHlwZURlZmluaXRpb24iLGUuRElSRUNUSVZFX0RFRklOSVRJT049IkRpcmVjdGl2ZURlZmluaXRpb24iLGUuU0NIRU1BX0VYVEVOU0lPTj0iU2NoZW1hRXh0ZW5zaW9uIixlLlNDQUxBUl9UWVBFX0VYVEVOU0lPTj0iU2NhbGFyVHlwZUV4dGVuc2lvbiIsZS5PQkpFQ1RfVFlQRV9FWFRFTlNJT049Ik9iamVjdFR5cGVFeHRlbnNpb24iLGUuSU5URVJGQUNFX1RZUEVfRVhURU5TSU9OPSJJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uIixlLlVOSU9OX1RZUEVfRVhURU5TSU9OPSJVbmlvblR5cGVFeHRlbnNpb24iLGUuRU5VTV9UWVBFX0VYVEVOU0lPTj0iRW51bVR5cGVFeHRlbnNpb24iLGUuSU5QVVRfT0JKRUNUX1RZUEVfRVhURU5TSU9OPSJJbnB1dE9iamVjdFR5cGVFeHRlbnNpb24ifSkoYnx8KGI9e30pKTtmdW5jdGlvbiB6ZShlKXtyZXR1cm4gZT09PTl8fGU9PT0zMn1mdW5jdGlvbiBiZShlKXtyZXR1cm4gZT49NDgmJmU8PTU3fWZ1bmN0aW9uIE50KGUpe3JldHVybiBlPj05NyYmZTw9MTIyfHxlPj02NSYmZTw9OTB9ZnVuY3Rpb24geHQoZSl7cmV0dXJuIE50KGUpfHxlPT09OTV9ZnVuY3Rpb24gZm4oZSl7cmV0dXJuIE50KGUpfHxiZShlKXx8ZT09PTk1fWZ1bmN0aW9uIGRuKGUpe3ZhciB0O2xldCBuPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGk9bnVsbCxyPS0xO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7KytvKXt2YXIgcztjb25zdCBjPWVbb10saD1wbihjKTtoIT09Yy5sZW5ndGgmJihpPShzPWkpIT09bnVsbCYmcyE9PXZvaWQgMD9zOm8scj1vLG8hPT0wJiZoPG4mJihuPWgpKX1yZXR1cm4gZS5tYXAoKG8sYyk9PmM9PT0wP286by5zbGljZShuKSkuc2xpY2UoKHQ9aSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6MCxyKzEpfWZ1bmN0aW9uIHBuKGUpe2xldCB0PTA7Zm9yKDt0PGUubGVuZ3RoJiZ6ZShlLmNoYXJDb2RlQXQodCkpOykrK3Q7cmV0dXJuIHR9ZnVuY3Rpb24gbW4oZSx0KXtjb25zdCBuPWUucmVwbGFjZSgvIiIiL2csJ1xcIiIiJyksaT1uLnNwbGl0KC9cclxufFtcblxyXS9nKSxyPWkubGVuZ3RoPT09MSxzPWkubGVuZ3RoPjEmJmkuc2xpY2UoMSkuZXZlcnkoVD0+VC5sZW5ndGg9PT0wfHx6ZShULmNoYXJDb2RlQXQoMCkpKSxvPW4uZW5kc1dpdGgoJ1xcIiIiJyksYz1lLmVuZHNXaXRoKCciJykmJiFvLGg9ZS5lbmRzV2l0aCgiXFwiKSxkPWN8fGgsdT0hcnx8ZS5sZW5ndGg+NzB8fGR8fHN8fG87bGV0IHk9IiI7Y29uc3Qgdj1yJiZ6ZShlLmNoYXJDb2RlQXQoMCkpO3JldHVybih1JiYhdnx8cykmJih5Kz1gCmApLHkrPW4sKHV8fGQpJiYoeSs9YApgKSwnIiIiJyt5KyciIiInfXZhciBsOyhmdW5jdGlvbihlKXtlLlNPRj0iPFNPRj4iLGUuRU9GPSI8RU9GPiIsZS5CQU5HPSIhIixlLkRPTExBUj0iJCIsZS5BTVA9IiYiLGUuUEFSRU5fTD0iKCIsZS5QQVJFTl9SPSIpIixlLlNQUkVBRD0iLi4uIixlLkNPTE9OPSI6IixlLkVRVUFMUz0iPSIsZS5BVD0iQCIsZS5CUkFDS0VUX0w9IlsiLGUuQlJBQ0tFVF9SPSJdIixlLkJSQUNFX0w9InsiLGUuUElQRT0ifCIsZS5CUkFDRV9SPSJ9IixlLk5BTUU9Ik5hbWUiLGUuSU5UPSJJbnQiLGUuRkxPQVQ9IkZsb2F0IixlLlNUUklORz0iU3RyaW5nIixlLkJMT0NLX1NUUklORz0iQmxvY2tTdHJpbmciLGUuQ09NTUVOVD0iQ29tbWVudCJ9KShsfHwobD17fSkpO2NsYXNzIHlue2NvbnN0cnVjdG9yKHQpe2NvbnN0IG49bmV3IF90KGwuU09GLDAsMCwwLDApO3RoaXMuc291cmNlPXQsdGhpcy5sYXN0VG9rZW49bix0aGlzLnRva2VuPW4sdGhpcy5saW5lPTEsdGhpcy5saW5lU3RhcnQ9MH1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJMZXhlciJ9YWR2YW5jZSgpe3JldHVybiB0aGlzLmxhc3RUb2tlbj10aGlzLnRva2VuLHRoaXMudG9rZW49dGhpcy5sb29rYWhlYWQoKX1sb29rYWhlYWQoKXtsZXQgdD10aGlzLnRva2VuO2lmKHQua2luZCE9PWwuRU9GKWRvIGlmKHQubmV4dCl0PXQubmV4dDtlbHNle2NvbnN0IG49dm4odGhpcyx0LmVuZCk7dC5uZXh0PW4sbi5wcmV2PXQsdD1ufXdoaWxlKHQua2luZD09PWwuQ09NTUVOVCk7cmV0dXJuIHR9fWZ1bmN0aW9uIGduKGUpe3JldHVybiBlPT09bC5CQU5HfHxlPT09bC5ET0xMQVJ8fGU9PT1sLkFNUHx8ZT09PWwuUEFSRU5fTHx8ZT09PWwuUEFSRU5fUnx8ZT09PWwuU1BSRUFEfHxlPT09bC5DT0xPTnx8ZT09PWwuRVFVQUxTfHxlPT09bC5BVHx8ZT09PWwuQlJBQ0tFVF9MfHxlPT09bC5CUkFDS0VUX1J8fGU9PT1sLkJSQUNFX0x8fGU9PT1sLlBJUEV8fGU9PT1sLkJSQUNFX1J9ZnVuY3Rpb24gZmUoZSl7cmV0dXJuIGU+PTAmJmU8PTU1Mjk1fHxlPj01NzM0NCYmZTw9MTExNDExMX1mdW5jdGlvbiB3ZShlLHQpe3JldHVybiBBdChlLmNoYXJDb2RlQXQodCkpJiZJdChlLmNoYXJDb2RlQXQodCsxKSl9ZnVuY3Rpb24gQXQoZSl7cmV0dXJuIGU+PTU1Mjk2JiZlPD01NjMxOX1mdW5jdGlvbiBJdChlKXtyZXR1cm4gZT49NTYzMjAmJmU8PTU3MzQzfWZ1bmN0aW9uIGNlKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LmNvZGVQb2ludEF0KHQpO2lmKG49PT12b2lkIDApcmV0dXJuIGwuRU9GO2lmKG4+PTMyJiZuPD0xMjYpe2NvbnN0IGk9U3RyaW5nLmZyb21Db2RlUG9pbnQobik7cmV0dXJuIGk9PT0nIic/YCciJ2A6YCIke2l9ImB9cmV0dXJuIlUrIituLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnBhZFN0YXJ0KDQsIjAiKX1mdW5jdGlvbiBVKGUsdCxuLGkscil7Y29uc3Qgcz1lLmxpbmUsbz0xK24tZS5saW5lU3RhcnQ7cmV0dXJuIG5ldyBfdCh0LG4saSxzLG8scil9ZnVuY3Rpb24gdm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1uLmxlbmd0aDtsZXQgcj10O2Zvcig7cjxpOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQocik7c3dpdGNoKHMpe2Nhc2UgNjUyNzk6Y2FzZSA5OmNhc2UgMzI6Y2FzZSA0NDorK3I7Y29udGludWU7Y2FzZSAxMDorK3IsKytlLmxpbmUsZS5saW5lU3RhcnQ9cjtjb250aW51ZTtjYXNlIDEzOm4uY2hhckNvZGVBdChyKzEpPT09MTA/cis9MjorK3IsKytlLmxpbmUsZS5saW5lU3RhcnQ9cjtjb250aW51ZTtjYXNlIDM1OnJldHVybiBFbihlLHIpO2Nhc2UgMzM6cmV0dXJuIFUoZSxsLkJBTkcscixyKzEpO2Nhc2UgMzY6cmV0dXJuIFUoZSxsLkRPTExBUixyLHIrMSk7Y2FzZSAzODpyZXR1cm4gVShlLGwuQU1QLHIscisxKTtjYXNlIDQwOnJldHVybiBVKGUsbC5QQVJFTl9MLHIscisxKTtjYXNlIDQxOnJldHVybiBVKGUsbC5QQVJFTl9SLHIscisxKTtjYXNlIDQ2OmlmKG4uY2hhckNvZGVBdChyKzEpPT09NDYmJm4uY2hhckNvZGVBdChyKzIpPT09NDYpcmV0dXJuIFUoZSxsLlNQUkVBRCxyLHIrMyk7YnJlYWs7Y2FzZSA1ODpyZXR1cm4gVShlLGwuQ09MT04scixyKzEpO2Nhc2UgNjE6cmV0dXJuIFUoZSxsLkVRVUFMUyxyLHIrMSk7Y2FzZSA2NDpyZXR1cm4gVShlLGwuQVQscixyKzEpO2Nhc2UgOTE6cmV0dXJuIFUoZSxsLkJSQUNLRVRfTCxyLHIrMSk7Y2FzZSA5MzpyZXR1cm4gVShlLGwuQlJBQ0tFVF9SLHIscisxKTtjYXNlIDEyMzpyZXR1cm4gVShlLGwuQlJBQ0VfTCxyLHIrMSk7Y2FzZSAxMjQ6cmV0dXJuIFUoZSxsLlBJUEUscixyKzEpO2Nhc2UgMTI1OnJldHVybiBVKGUsbC5CUkFDRV9SLHIscisxKTtjYXNlIDM0OnJldHVybiBuLmNoYXJDb2RlQXQocisxKT09PTM0JiZuLmNoYXJDb2RlQXQocisyKT09PTM0P0FuKGUscik6Ym4oZSxyKX1pZihiZShzKXx8cz09PTQ1KXJldHVybiBfbihlLHIscyk7aWYoeHQocykpcmV0dXJuIEluKGUscik7dGhyb3cgRyhlLnNvdXJjZSxyLHM9PT0zOT9gVW5leHBlY3RlZCBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyICgnKSwgZGlkIHlvdSBtZWFuIHRvIHVzZSBhIGRvdWJsZSBxdW90ZSAoIik/YDpmZShzKXx8d2UobixyKT9gVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICR7Y2UoZSxyKX0uYDpgSW52YWxpZCBjaGFyYWN0ZXI6ICR7Y2UoZSxyKX0uYCl9cmV0dXJuIFUoZSxsLkVPRixpLGkpfWZ1bmN0aW9uIEVuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxO2Zvcig7cjxpOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQocik7aWYocz09PTEwfHxzPT09MTMpYnJlYWs7aWYoZmUocykpKytyO2Vsc2UgaWYod2UobixyKSlyKz0yO2Vsc2UgYnJlYWt9cmV0dXJuIFUoZSxsLkNPTU1FTlQsdCxyLG4uc2xpY2UodCsxLHIpKX1mdW5jdGlvbiBfbihlLHQsbil7Y29uc3QgaT1lLnNvdXJjZS5ib2R5O2xldCByPXQscz1uLG89ITE7aWYocz09PTQ1JiYocz1pLmNoYXJDb2RlQXQoKytyKSkscz09PTQ4KXtpZihzPWkuY2hhckNvZGVBdCgrK3IpLGJlKHMpKXRocm93IEcoZS5zb3VyY2UscixgSW52YWxpZCBudW1iZXIsIHVuZXhwZWN0ZWQgZGlnaXQgYWZ0ZXIgMDogJHtjZShlLHIpfS5gKX1lbHNlIHI9SGUoZSxyLHMpLHM9aS5jaGFyQ29kZUF0KHIpO2lmKHM9PT00NiYmKG89ITAscz1pLmNoYXJDb2RlQXQoKytyKSxyPUhlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKSksKHM9PT02OXx8cz09PTEwMSkmJihvPSEwLHM9aS5jaGFyQ29kZUF0KCsrciksKHM9PT00M3x8cz09PTQ1KSYmKHM9aS5jaGFyQ29kZUF0KCsrcikpLHI9SGUoZSxyLHMpLHM9aS5jaGFyQ29kZUF0KHIpKSxzPT09NDZ8fHh0KHMpKXRocm93IEcoZS5zb3VyY2UscixgSW52YWxpZCBudW1iZXIsIGV4cGVjdGVkIGRpZ2l0IGJ1dCBnb3Q6ICR7Y2UoZSxyKX0uYCk7cmV0dXJuIFUoZSxvP2wuRkxPQVQ6bC5JTlQsdCxyLGkuc2xpY2UodCxyKSl9ZnVuY3Rpb24gSGUoZSx0LG4pe2lmKCFiZShuKSl0aHJvdyBHKGUuc291cmNlLHQsYEludmFsaWQgbnVtYmVyLCBleHBlY3RlZCBkaWdpdCBidXQgZ290OiAke2NlKGUsdCl9LmApO2NvbnN0IGk9ZS5zb3VyY2UuYm9keTtsZXQgcj10KzE7Zm9yKDtiZShpLmNoYXJDb2RlQXQocikpOykrK3I7cmV0dXJuIHJ9ZnVuY3Rpb24gYm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1uLmxlbmd0aDtsZXQgcj10KzEscz1yLG89IiI7Zm9yKDtyPGk7KXtjb25zdCBjPW4uY2hhckNvZGVBdChyKTtpZihjPT09MzQpcmV0dXJuIG8rPW4uc2xpY2UocyxyKSxVKGUsbC5TVFJJTkcsdCxyKzEsbyk7aWYoYz09PTkyKXtvKz1uLnNsaWNlKHMscik7Y29uc3QgaD1uLmNoYXJDb2RlQXQocisxKT09PTExNz9uLmNoYXJDb2RlQXQocisyKT09PTEyMz9UbihlLHIpOk5uKGUscik6eG4oZSxyKTtvKz1oLnZhbHVlLHIrPWguc2l6ZSxzPXI7Y29udGludWV9aWYoYz09PTEwfHxjPT09MTMpYnJlYWs7aWYoZmUoYykpKytyO2Vsc2UgaWYod2UobixyKSlyKz0yO2Vsc2UgdGhyb3cgRyhlLnNvdXJjZSxyLGBJbnZhbGlkIGNoYXJhY3RlciB3aXRoaW4gU3RyaW5nOiAke2NlKGUscil9LmApfXRocm93IEcoZS5zb3VyY2UsciwiVW50ZXJtaW5hdGVkIHN0cmluZy4iKX1mdW5jdGlvbiBUbihlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keTtsZXQgaT0wLHI9Mztmb3IoO3I8MTI7KXtjb25zdCBzPW4uY2hhckNvZGVBdCh0K3IrKyk7aWYocz09PTEyNSl7aWYocjw1fHwhZmUoaSkpYnJlYWs7cmV0dXJue3ZhbHVlOlN0cmluZy5mcm9tQ29kZVBvaW50KGkpLHNpemU6cn19aWYoaT1pPDw0fFRlKHMpLGk8MClicmVha310aHJvdyBHKGUuc291cmNlLHQsYEludmFsaWQgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2U6ICIke24uc2xpY2UodCx0K3IpfSIuYCl9ZnVuY3Rpb24gTm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1TdChuLHQrMik7aWYoZmUoaSkpcmV0dXJue3ZhbHVlOlN0cmluZy5mcm9tQ29kZVBvaW50KGkpLHNpemU6Nn07aWYoQXQoaSkmJm4uY2hhckNvZGVBdCh0KzYpPT09OTImJm4uY2hhckNvZGVBdCh0KzcpPT09MTE3KXtjb25zdCByPVN0KG4sdCs4KTtpZihJdChyKSlyZXR1cm57dmFsdWU6U3RyaW5nLmZyb21Db2RlUG9pbnQoaSxyKSxzaXplOjEyfX10aHJvdyBHKGUuc291cmNlLHQsYEludmFsaWQgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2U6ICIke24uc2xpY2UodCx0KzYpfSIuYCl9ZnVuY3Rpb24gU3QoZSx0KXtyZXR1cm4gVGUoZS5jaGFyQ29kZUF0KHQpKTw8MTJ8VGUoZS5jaGFyQ29kZUF0KHQrMSkpPDw4fFRlKGUuY2hhckNvZGVBdCh0KzIpKTw8NHxUZShlLmNoYXJDb2RlQXQodCszKSl9ZnVuY3Rpb24gVGUoZSl7cmV0dXJuIGU+PTQ4JiZlPD01Nz9lLTQ4OmU+PTY1JiZlPD03MD9lLTU1OmU+PTk3JiZlPD0xMDI/ZS04NzotMX1mdW5jdGlvbiB4bihlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keTtzd2l0Y2gobi5jaGFyQ29kZUF0KHQrMSkpe2Nhc2UgMzQ6cmV0dXJue3ZhbHVlOiciJyxzaXplOjJ9O2Nhc2UgOTI6cmV0dXJue3ZhbHVlOiJcXCIsc2l6ZToyfTtjYXNlIDQ3OnJldHVybnt2YWx1ZToiLyIsc2l6ZToyfTtjYXNlIDk4OnJldHVybnt2YWx1ZToiXGIiLHNpemU6Mn07Y2FzZSAxMDI6cmV0dXJue3ZhbHVlOiJcZiIsc2l6ZToyfTtjYXNlIDExMDpyZXR1cm57dmFsdWU6YApgLHNpemU6Mn07Y2FzZSAxMTQ6cmV0dXJue3ZhbHVlOiJcciIsc2l6ZToyfTtjYXNlIDExNjpyZXR1cm57dmFsdWU6IgkiLHNpemU6Mn19dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U6ICIke24uc2xpY2UodCx0KzIpfSIuYCl9ZnVuY3Rpb24gQW4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1uLmxlbmd0aDtsZXQgcj1lLmxpbmVTdGFydCxzPXQrMyxvPXMsYz0iIjtjb25zdCBoPVtdO2Zvcig7czxpOyl7Y29uc3QgZD1uLmNoYXJDb2RlQXQocyk7aWYoZD09PTM0JiZuLmNoYXJDb2RlQXQocysxKT09PTM0JiZuLmNoYXJDb2RlQXQocysyKT09PTM0KXtjKz1uLnNsaWNlKG8scyksaC5wdXNoKGMpO2NvbnN0IHU9VShlLGwuQkxPQ0tfU1RSSU5HLHQscyszLGRuKGgpLmpvaW4oYApgKSk7cmV0dXJuIGUubGluZSs9aC5sZW5ndGgtMSxlLmxpbmVTdGFydD1yLHV9aWYoZD09PTkyJiZuLmNoYXJDb2RlQXQocysxKT09PTM0JiZuLmNoYXJDb2RlQXQocysyKT09PTM0JiZuLmNoYXJDb2RlQXQocyszKT09PTM0KXtjKz1uLnNsaWNlKG8scyksbz1zKzEscys9NDtjb250aW51ZX1pZihkPT09MTB8fGQ9PT0xMyl7Yys9bi5zbGljZShvLHMpLGgucHVzaChjKSxkPT09MTMmJm4uY2hhckNvZGVBdChzKzEpPT09MTA/cys9MjorK3MsYz0iIixvPXMscj1zO2NvbnRpbnVlfWlmKGZlKGQpKSsrcztlbHNlIGlmKHdlKG4scykpcys9MjtlbHNlIHRocm93IEcoZS5zb3VyY2UscyxgSW52YWxpZCBjaGFyYWN0ZXIgd2l0aGluIFN0cmluZzogJHtjZShlLHMpfS5gKX10aHJvdyBHKGUuc291cmNlLHMsIlVudGVybWluYXRlZCBzdHJpbmcuIil9ZnVuY3Rpb24gSW4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHksaT1uLmxlbmd0aDtsZXQgcj10KzE7Zm9yKDtyPGk7KXtjb25zdCBzPW4uY2hhckNvZGVBdChyKTtpZihmbihzKSkrK3I7ZWxzZSBicmVha31yZXR1cm4gVShlLGwuTkFNRSx0LHIsbi5zbGljZSh0LHIpKX1jb25zdCBTbj0xMCxPdD0yO2Z1bmN0aW9uIFllKGUpe3JldHVybiBEZShlLFtdKX1mdW5jdGlvbiBEZShlLHQpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJzdHJpbmciOnJldHVybiBKU09OLnN0cmluZ2lmeShlKTtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gZS5uYW1lP2BbZnVuY3Rpb24gJHtlLm5hbWV9XWA6IltmdW5jdGlvbl0iO2Nhc2Uib2JqZWN0IjpyZXR1cm4gT24oZSx0KTtkZWZhdWx0OnJldHVybiBTdHJpbmcoZSl9fWZ1bmN0aW9uIE9uKGUsdCl7aWYoZT09PW51bGwpcmV0dXJuIm51bGwiO2lmKHQuaW5jbHVkZXMoZSkpcmV0dXJuIltDaXJjdWxhcl0iO2NvbnN0IG49Wy4uLnQsZV07aWYod24oZSkpe2NvbnN0IGk9ZS50b0pTT04oKTtpZihpIT09ZSlyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2k6RGUoaSxuKX1lbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGtuKGUsbik7cmV0dXJuIERuKGUsbil9ZnVuY3Rpb24gd24oZSl7cmV0dXJuIHR5cGVvZiBlLnRvSlNPTj09ImZ1bmN0aW9uIn1mdW5jdGlvbiBEbihlLHQpe2NvbnN0IG49T2JqZWN0LmVudHJpZXMoZSk7cmV0dXJuIG4ubGVuZ3RoPT09MD8ie30iOnQubGVuZ3RoPk90PyJbIitDbihlKSsiXSI6InsgIituLm1hcCgoW3Isc10pPT5yKyI6ICIrRGUocyx0KSkuam9pbigiLCAiKSsiIH0ifWZ1bmN0aW9uIGtuKGUsdCl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiJbXSI7aWYodC5sZW5ndGg+T3QpcmV0dXJuIltBcnJheV0iO2NvbnN0IG49TWF0aC5taW4oU24sZS5sZW5ndGgpLGk9ZS5sZW5ndGgtbixyPVtdO2ZvcihsZXQgcz0wO3M8bjsrK3Mpci5wdXNoKERlKGVbc10sdCkpO3JldHVybiBpPT09MT9yLnB1c2goIi4uLiAxIG1vcmUgaXRlbSIpOmk+MSYmci5wdXNoKGAuLi4gJHtpfSBtb3JlIGl0ZW1zYCksIlsiK3Iuam9pbigiLCAiKSsiXSJ9ZnVuY3Rpb24gQ24oZSl7Y29uc3QgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkucmVwbGFjZSgvXlxbb2JqZWN0IC8sIiIpLnJlcGxhY2UoL10kLywiIik7aWYodD09PSJPYmplY3QiJiZ0eXBlb2YgZS5jb25zdHJ1Y3Rvcj09ImZ1bmN0aW9uIil7Y29uc3Qgbj1lLmNvbnN0cnVjdG9yLm5hbWU7aWYodHlwZW9mIG49PSJzdHJpbmciJiZuIT09IiIpcmV0dXJuIG59cmV0dXJuIHR9Y29uc3QgUm49Z2xvYmFsVGhpcy5wcm9jZXNzJiZwcm9jZXNzLmVudi5OT0RFX0VOVj09PSJwcm9kdWN0aW9uIj9mdW5jdGlvbih0LG4pe3JldHVybiB0IGluc3RhbmNlb2Ygbn06ZnVuY3Rpb24odCxuKXtpZih0IGluc3RhbmNlb2YgbilyZXR1cm4hMDtpZih0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsKXt2YXIgaTtjb25zdCByPW4ucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10scz1TeW1ib2wudG9TdHJpbmdUYWcgaW4gdD90W1N5bWJvbC50b1N0cmluZ1RhZ106KGk9dC5jb25zdHJ1Y3Rvcik9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLm5hbWU7aWYocj09PXMpe2NvbnN0IG89WWUodCk7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlICR7cn0gIiR7b30iIGZyb20gYW5vdGhlciBtb2R1bGUgb3IgcmVhbG0uCgpFbnN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiAiZ3JhcGhxbCIgaW4gdGhlIG5vZGVfbW9kdWxlcwpkaXJlY3RvcnkuIElmIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiAiZ3JhcGhxbCIgYXJlIHRoZSBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIKcmVsaWVkIG9uIG1vZHVsZXMsIHVzZSAicmVzb2x1dGlvbnMiIHRvIGVuc3VyZSBvbmx5IG9uZSB2ZXJzaW9uIGlzIGluc3RhbGxlZC4KCmh0dHBzOi8veWFybnBrZy5jb20vZW4vZG9jcy9zZWxlY3RpdmUtdmVyc2lvbi1yZXNvbHV0aW9ucwoKRHVwbGljYXRlICJncmFwaHFsIiBtb2R1bGVzIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZGlmZmVyZW50CnZlcnNpb25zIG1heSBoYXZlIGRpZmZlcmVudCBjYXBhYmlsaXRpZXMgYW5kIGJlaGF2aW9yLiBUaGUgZGF0YSBmcm9tIG9uZQp2ZXJzaW9uIHVzZWQgaW4gdGhlIGZ1bmN0aW9uIGZyb20gYW5vdGhlciBjb3VsZCBwcm9kdWNlIGNvbmZ1c2luZyBhbmQKc3B1cmlvdXMgcmVzdWx0cy5gKX19cmV0dXJuITF9O2NsYXNzIHd0e2NvbnN0cnVjdG9yKHQsbj0iR3JhcGhRTCByZXF1ZXN0IixpPXtsaW5lOjEsY29sdW1uOjF9KXt0eXBlb2YgdD09InN0cmluZyJ8fGxlKCExLGBCb2R5IG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkOiAke1llKHQpfS5gKSx0aGlzLmJvZHk9dCx0aGlzLm5hbWU9bix0aGlzLmxvY2F0aW9uT2Zmc2V0PWksdGhpcy5sb2NhdGlvbk9mZnNldC5saW5lPjB8fGxlKCExLCJsaW5lIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKSx0aGlzLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbj4wfHxsZSghMSwiY29sdW1uIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJTb3VyY2UifX1mdW5jdGlvbiBMbihlKXtyZXR1cm4gUm4oZSx3dCl9ZnVuY3Rpb24gRHQoZSx0KXtjb25zdCBuPW5ldyBQbihlLHQpLGk9bi5wYXJzZURvY3VtZW50KCk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJ0b2tlbkNvdW50Iix7ZW51bWVyYWJsZTohMSx2YWx1ZTpuLnRva2VuQ291bnR9KSxpfWNsYXNzIFBue2NvbnN0cnVjdG9yKHQsbj17fSl7Y29uc3QgaT1Mbih0KT90Om5ldyB3dCh0KTt0aGlzLl9sZXhlcj1uZXcgeW4oaSksdGhpcy5fb3B0aW9ucz1uLHRoaXMuX3Rva2VuQ291bnRlcj0wfWdldCB0b2tlbkNvdW50KCl7cmV0dXJuIHRoaXMuX3Rva2VuQ291bnRlcn1wYXJzZU5hbWUoKXtjb25zdCB0PXRoaXMuZXhwZWN0VG9rZW4obC5OQU1FKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5OQU1FLHZhbHVlOnQudmFsdWV9KX1wYXJzZURvY3VtZW50KCl7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpiLkRPQ1VNRU5ULGRlZmluaXRpb25zOnRoaXMubWFueShsLlNPRix0aGlzLnBhcnNlRGVmaW5pdGlvbixsLkVPRil9KX1wYXJzZURlZmluaXRpb24oKXtpZih0aGlzLnBlZWsobC5CUkFDRV9MKSlyZXR1cm4gdGhpcy5wYXJzZU9wZXJhdGlvbkRlZmluaXRpb24oKTtjb25zdCB0PXRoaXMucGVla0Rlc2NyaXB0aW9uKCksbj10P3RoaXMuX2xleGVyLmxvb2thaGVhZCgpOnRoaXMuX2xleGVyLnRva2VuO2lmKG4ua2luZD09PWwuTkFNRSl7c3dpdGNoKG4udmFsdWUpe2Nhc2Uic2NoZW1hIjpyZXR1cm4gdGhpcy5wYXJzZVNjaGVtYURlZmluaXRpb24oKTtjYXNlInNjYWxhciI6cmV0dXJuIHRoaXMucGFyc2VTY2FsYXJUeXBlRGVmaW5pdGlvbigpO2Nhc2UidHlwZSI6cmV0dXJuIHRoaXMucGFyc2VPYmplY3RUeXBlRGVmaW5pdGlvbigpO2Nhc2UiaW50ZXJmYWNlIjpyZXR1cm4gdGhpcy5wYXJzZUludGVyZmFjZVR5cGVEZWZpbml0aW9uKCk7Y2FzZSJ1bmlvbiI6cmV0dXJuIHRoaXMucGFyc2VVbmlvblR5cGVEZWZpbml0aW9uKCk7Y2FzZSJlbnVtIjpyZXR1cm4gdGhpcy5wYXJzZUVudW1UeXBlRGVmaW5pdGlvbigpO2Nhc2UiaW5wdXQiOnJldHVybiB0aGlzLnBhcnNlSW5wdXRPYmplY3RUeXBlRGVmaW5pdGlvbigpO2Nhc2UiZGlyZWN0aXZlIjpyZXR1cm4gdGhpcy5wYXJzZURpcmVjdGl2ZURlZmluaXRpb24oKX1pZih0KXRocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLHRoaXMuX2xleGVyLnRva2VuLnN0YXJ0LCJVbmV4cGVjdGVkIGRlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbnMgYXJlIHN1cHBvcnRlZCBvbmx5IG9uIHR5cGUgZGVmaW5pdGlvbnMuIik7c3dpdGNoKG4udmFsdWUpe2Nhc2UicXVlcnkiOmNhc2UibXV0YXRpb24iOmNhc2Uic3Vic2NyaXB0aW9uIjpyZXR1cm4gdGhpcy5wYXJzZU9wZXJhdGlvbkRlZmluaXRpb24oKTtjYXNlImZyYWdtZW50IjpyZXR1cm4gdGhpcy5wYXJzZUZyYWdtZW50RGVmaW5pdGlvbigpO2Nhc2UiZXh0ZW5kIjpyZXR1cm4gdGhpcy5wYXJzZVR5cGVTeXN0ZW1FeHRlbnNpb24oKX19dGhyb3cgdGhpcy51bmV4cGVjdGVkKG4pfXBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47aWYodGhpcy5wZWVrKGwuQlJBQ0VfTCkpcmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOmIuT1BFUkFUSU9OX0RFRklOSVRJT04sb3BlcmF0aW9uOmhlLlFVRVJZLG5hbWU6dm9pZCAwLHZhcmlhYmxlRGVmaW5pdGlvbnM6W10sZGlyZWN0aXZlczpbXSxzZWxlY3Rpb25TZXQ6dGhpcy5wYXJzZVNlbGVjdGlvblNldCgpfSk7Y29uc3Qgbj10aGlzLnBhcnNlT3BlcmF0aW9uVHlwZSgpO2xldCBpO3JldHVybiB0aGlzLnBlZWsobC5OQU1FKSYmKGk9dGhpcy5wYXJzZU5hbWUoKSksdGhpcy5ub2RlKHQse2tpbmQ6Yi5PUEVSQVRJT05fREVGSU5JVElPTixvcGVyYXRpb246bixuYW1lOmksdmFyaWFibGVEZWZpbml0aW9uczp0aGlzLnBhcnNlVmFyaWFibGVEZWZpbml0aW9ucygpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KX1wYXJzZU9wZXJhdGlvblR5cGUoKXtjb25zdCB0PXRoaXMuZXhwZWN0VG9rZW4obC5OQU1FKTtzd2l0Y2godC52YWx1ZSl7Y2FzZSJxdWVyeSI6cmV0dXJuIGhlLlFVRVJZO2Nhc2UibXV0YXRpb24iOnJldHVybiBoZS5NVVRBVElPTjtjYXNlInN1YnNjcmlwdGlvbiI6cmV0dXJuIGhlLlNVQlNDUklQVElPTn10aHJvdyB0aGlzLnVuZXhwZWN0ZWQodCl9cGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuUEFSRU5fTCx0aGlzLnBhcnNlVmFyaWFibGVEZWZpbml0aW9uLGwuUEFSRU5fUil9cGFyc2VWYXJpYWJsZURlZmluaXRpb24oKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOmIuVkFSSUFCTEVfREVGSU5JVElPTix2YXJpYWJsZTp0aGlzLnBhcnNlVmFyaWFibGUoKSx0eXBlOih0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pLHRoaXMucGFyc2VUeXBlUmVmZXJlbmNlKCkpLGRlZmF1bHRWYWx1ZTp0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4obC5FUVVBTFMpP3RoaXMucGFyc2VDb25zdFZhbHVlTGl0ZXJhbCgpOnZvaWQgMCxkaXJlY3RpdmVzOnRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKX0pfXBhcnNlVmFyaWFibGUoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuRE9MTEFSKSx0aGlzLm5vZGUodCx7a2luZDpiLlZBUklBQkxFLG5hbWU6dGhpcy5wYXJzZU5hbWUoKX0pfXBhcnNlU2VsZWN0aW9uU2V0KCl7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpiLlNFTEVDVElPTl9TRVQsc2VsZWN0aW9uczp0aGlzLm1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VTZWxlY3Rpb24sbC5CUkFDRV9SKX0pfXBhcnNlU2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMucGVlayhsLlNQUkVBRCk/dGhpcy5wYXJzZUZyYWdtZW50KCk6dGhpcy5wYXJzZUZpZWxkKCl9cGFyc2VGaWVsZCgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlTmFtZSgpO2xldCBpLHI7cmV0dXJuIHRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkNPTE9OKT8oaT1uLHI9dGhpcy5wYXJzZU5hbWUoKSk6cj1uLHRoaXMubm9kZSh0LHtraW5kOmIuRklFTEQsYWxpYXM6aSxuYW1lOnIsYXJndW1lbnRzOnRoaXMucGFyc2VBcmd1bWVudHMoITEpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpLHNlbGVjdGlvblNldDp0aGlzLnBlZWsobC5CUkFDRV9MKT90aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCk6dm9pZCAwfSl9cGFyc2VBcmd1bWVudHModCl7Y29uc3Qgbj10P3RoaXMucGFyc2VDb25zdEFyZ3VtZW50OnRoaXMucGFyc2VBcmd1bWVudDtyZXR1cm4gdGhpcy5vcHRpb25hbE1hbnkobC5QQVJFTl9MLG4sbC5QQVJFTl9SKX1wYXJzZUFyZ3VtZW50KHQ9ITEpe2NvbnN0IG49dGhpcy5fbGV4ZXIudG9rZW4saT10aGlzLnBhcnNlTmFtZSgpO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pLHRoaXMubm9kZShuLHtraW5kOmIuQVJHVU1FTlQsbmFtZTppLHZhbHVlOnRoaXMucGFyc2VWYWx1ZUxpdGVyYWwodCl9KX1wYXJzZUNvbnN0QXJndW1lbnQoKXtyZXR1cm4gdGhpcy5wYXJzZUFyZ3VtZW50KCEwKX1wYXJzZUZyYWdtZW50KCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdFRva2VuKGwuU1BSRUFEKTtjb25zdCBuPXRoaXMuZXhwZWN0T3B0aW9uYWxLZXl3b3JkKCJvbiIpO3JldHVybiFuJiZ0aGlzLnBlZWsobC5OQU1FKT90aGlzLm5vZGUodCx7a2luZDpiLkZSQUdNRU5UX1NQUkVBRCxuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSxkaXJlY3RpdmVzOnRoaXMucGFyc2VEaXJlY3RpdmVzKCExKX0pOnRoaXMubm9kZSh0LHtraW5kOmIuSU5MSU5FX0ZSQUdNRU5ULHR5cGVDb25kaXRpb246bj90aGlzLnBhcnNlTmFtZWRUeXBlKCk6dm9pZCAwLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KX1wYXJzZUZyYWdtZW50RGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47cmV0dXJuIHRoaXMuZXhwZWN0S2V5d29yZCgiZnJhZ21lbnQiKSx0aGlzLl9vcHRpb25zLmFsbG93TGVnYWN5RnJhZ21lbnRWYXJpYWJsZXM9PT0hMD90aGlzLm5vZGUodCx7a2luZDpiLkZSQUdNRU5UX0RFRklOSVRJT04sbmFtZTp0aGlzLnBhcnNlRnJhZ21lbnROYW1lKCksdmFyaWFibGVEZWZpbml0aW9uczp0aGlzLnBhcnNlVmFyaWFibGVEZWZpbml0aW9ucygpLHR5cGVDb25kaXRpb246KHRoaXMuZXhwZWN0S2V5d29yZCgib24iKSx0aGlzLnBhcnNlTmFtZWRUeXBlKCkpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KTp0aGlzLm5vZGUodCx7a2luZDpiLkZSQUdNRU5UX0RFRklOSVRJT04sbmFtZTp0aGlzLnBhcnNlRnJhZ21lbnROYW1lKCksdHlwZUNvbmRpdGlvbjoodGhpcy5leHBlY3RLZXl3b3JkKCJvbiIpLHRoaXMucGFyc2VOYW1lZFR5cGUoKSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlRnJhZ21lbnROYW1lKCl7aWYodGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0ib24iKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLnBhcnNlTmFtZSgpfXBhcnNlVmFsdWVMaXRlcmFsKHQpe2NvbnN0IG49dGhpcy5fbGV4ZXIudG9rZW47c3dpdGNoKG4ua2luZCl7Y2FzZSBsLkJSQUNLRVRfTDpyZXR1cm4gdGhpcy5wYXJzZUxpc3QodCk7Y2FzZSBsLkJSQUNFX0w6cmV0dXJuIHRoaXMucGFyc2VPYmplY3QodCk7Y2FzZSBsLklOVDpyZXR1cm4gdGhpcy5hZHZhbmNlTGV4ZXIoKSx0aGlzLm5vZGUobix7a2luZDpiLklOVCx2YWx1ZTpuLnZhbHVlfSk7Y2FzZSBsLkZMT0FUOnJldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZShuLHtraW5kOmIuRkxPQVQsdmFsdWU6bi52YWx1ZX0pO2Nhc2UgbC5TVFJJTkc6Y2FzZSBsLkJMT0NLX1NUUklORzpyZXR1cm4gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwoKTtjYXNlIGwuTkFNRTpzd2l0Y2godGhpcy5hZHZhbmNlTGV4ZXIoKSxuLnZhbHVlKXtjYXNlInRydWUiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpiLkJPT0xFQU4sdmFsdWU6ITB9KTtjYXNlImZhbHNlIjpyZXR1cm4gdGhpcy5ub2RlKG4se2tpbmQ6Yi5CT09MRUFOLHZhbHVlOiExfSk7Y2FzZSJudWxsIjpyZXR1cm4gdGhpcy5ub2RlKG4se2tpbmQ6Yi5OVUxMfSk7ZGVmYXVsdDpyZXR1cm4gdGhpcy5ub2RlKG4se2tpbmQ6Yi5FTlVNLHZhbHVlOm4udmFsdWV9KX1jYXNlIGwuRE9MTEFSOmlmKHQpaWYodGhpcy5leHBlY3RUb2tlbihsLkRPTExBUiksdGhpcy5fbGV4ZXIudG9rZW4ua2luZD09PWwuTkFNRSl7Y29uc3QgaT10aGlzLl9sZXhlci50b2tlbi52YWx1ZTt0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBVbmV4cGVjdGVkIHZhcmlhYmxlICIkJHtpfSIgaW4gY29uc3RhbnQgdmFsdWUuYCl9ZWxzZSB0aHJvdyB0aGlzLnVuZXhwZWN0ZWQobik7cmV0dXJuIHRoaXMucGFyc2VWYXJpYWJsZSgpO2RlZmF1bHQ6dGhyb3cgdGhpcy51bmV4cGVjdGVkKCl9fXBhcnNlQ29uc3RWYWx1ZUxpdGVyYWwoKXtyZXR1cm4gdGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCghMCl9cGFyc2VTdHJpbmdMaXRlcmFsKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gdGhpcy5hZHZhbmNlTGV4ZXIoKSx0aGlzLm5vZGUodCx7a2luZDpiLlNUUklORyx2YWx1ZTp0LnZhbHVlLGJsb2NrOnQua2luZD09PWwuQkxPQ0tfU1RSSU5HfSl9cGFyc2VMaXN0KHQpe2NvbnN0IG49KCk9PnRoaXMucGFyc2VWYWx1ZUxpdGVyYWwodCk7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpiLkxJU1QsdmFsdWVzOnRoaXMuYW55KGwuQlJBQ0tFVF9MLG4sbC5CUkFDS0VUX1IpfSl9cGFyc2VPYmplY3QodCl7Y29uc3Qgbj0oKT0+dGhpcy5wYXJzZU9iamVjdEZpZWxkKHQpO3JldHVybiB0aGlzLm5vZGUodGhpcy5fbGV4ZXIudG9rZW4se2tpbmQ6Yi5PQkpFQ1QsZmllbGRzOnRoaXMuYW55KGwuQlJBQ0VfTCxuLGwuQlJBQ0VfUil9KX1wYXJzZU9iamVjdEZpZWxkKHQpe2NvbnN0IG49dGhpcy5fbGV4ZXIudG9rZW4saT10aGlzLnBhcnNlTmFtZSgpO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pLHRoaXMubm9kZShuLHtraW5kOmIuT0JKRUNUX0ZJRUxELG5hbWU6aSx2YWx1ZTp0aGlzLnBhcnNlVmFsdWVMaXRlcmFsKHQpfSl9cGFyc2VEaXJlY3RpdmVzKHQpe2NvbnN0IG49W107Zm9yKDt0aGlzLnBlZWsobC5BVCk7KW4ucHVzaCh0aGlzLnBhcnNlRGlyZWN0aXZlKHQpKTtyZXR1cm4gbn1wYXJzZUNvbnN0RGlyZWN0aXZlcygpe3JldHVybiB0aGlzLnBhcnNlRGlyZWN0aXZlcyghMCl9cGFyc2VEaXJlY3RpdmUodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gdGhpcy5leHBlY3RUb2tlbihsLkFUKSx0aGlzLm5vZGUobix7a2luZDpiLkRJUkVDVElWRSxuYW1lOnRoaXMucGFyc2VOYW1lKCksYXJndW1lbnRzOnRoaXMucGFyc2VBcmd1bWVudHModCl9KX1wYXJzZVR5cGVSZWZlcmVuY2UoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO2xldCBuO2lmKHRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkJSQUNLRVRfTCkpe2NvbnN0IGk9dGhpcy5wYXJzZVR5cGVSZWZlcmVuY2UoKTt0aGlzLmV4cGVjdFRva2VuKGwuQlJBQ0tFVF9SKSxuPXRoaXMubm9kZSh0LHtraW5kOmIuTElTVF9UWVBFLHR5cGU6aX0pfWVsc2Ugbj10aGlzLnBhcnNlTmFtZWRUeXBlKCk7cmV0dXJuIHRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkJBTkcpP3RoaXMubm9kZSh0LHtraW5kOmIuTk9OX05VTExfVFlQRSx0eXBlOm59KTpufXBhcnNlTmFtZWRUeXBlKCl7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpiLk5BTUVEX1RZUEUsbmFtZTp0aGlzLnBhcnNlTmFtZSgpfSl9cGVla0Rlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMucGVlayhsLlNUUklORyl8fHRoaXMucGVlayhsLkJMT0NLX1NUUklORyl9cGFyc2VEZXNjcmlwdGlvbigpe2lmKHRoaXMucGVla0Rlc2NyaXB0aW9uKCkpcmV0dXJuIHRoaXMucGFyc2VTdHJpbmdMaXRlcmFsKCl9cGFyc2VTY2hlbWFEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgic2NoZW1hIik7Y29uc3QgaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscj10aGlzLm1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VPcGVyYXRpb25UeXBlRGVmaW5pdGlvbixsLkJSQUNFX1IpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLlNDSEVNQV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sZGlyZWN0aXZlczppLG9wZXJhdGlvblR5cGVzOnJ9KX1wYXJzZU9wZXJhdGlvblR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VPcGVyYXRpb25UeXBlKCk7dGhpcy5leHBlY3RUb2tlbihsLkNPTE9OKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lZFR5cGUoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5PUEVSQVRJT05fVFlQRV9ERUZJTklUSU9OLG9wZXJhdGlvbjpuLHR5cGU6aX0pfXBhcnNlU2NhbGFyVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJzY2FsYXIiKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOmIuU0NBTEFSX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnJ9KX1wYXJzZU9iamVjdFR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgidHlwZSIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHM9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLG89dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5PQkpFQ1RfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGludGVyZmFjZXM6cixkaXJlY3RpdmVzOnMsZmllbGRzOm99KX1wYXJzZUltcGxlbWVudHNJbnRlcmZhY2VzKCl7cmV0dXJuIHRoaXMuZXhwZWN0T3B0aW9uYWxLZXl3b3JkKCJpbXBsZW1lbnRzIik/dGhpcy5kZWxpbWl0ZWRNYW55KGwuQU1QLHRoaXMucGFyc2VOYW1lZFR5cGUpOltdfXBhcnNlRmllbGRzRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZUZpZWxkRGVmaW5pdGlvbixsLkJSQUNFX1IpfXBhcnNlRmllbGREZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpLGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VBcmd1bWVudERlZnMoKTt0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pO2NvbnN0IHM9dGhpcy5wYXJzZVR5cGVSZWZlcmVuY2UoKSxvPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5GSUVMRF9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGFyZ3VtZW50czpyLHR5cGU6cyxkaXJlY3RpdmVzOm99KX1wYXJzZUFyZ3VtZW50RGVmcygpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLlBBUkVOX0wsdGhpcy5wYXJzZUlucHV0VmFsdWVEZWYsbC5QQVJFTl9SKX1wYXJzZUlucHV0VmFsdWVEZWYoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlTmFtZSgpO3RoaXMuZXhwZWN0VG9rZW4obC5DT0xPTik7Y29uc3Qgcj10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpO2xldCBzO3RoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkVRVUFMUykmJihzPXRoaXMucGFyc2VDb25zdFZhbHVlTGl0ZXJhbCgpKTtjb25zdCBvPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5JTlBVVF9WQUxVRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLHR5cGU6cixkZWZhdWx0VmFsdWU6cyxkaXJlY3RpdmVzOm99KX1wYXJzZUludGVyZmFjZVR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgiaW50ZXJmYWNlIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUltcGxlbWVudHNJbnRlcmZhY2VzKCkscz10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCksbz10aGlzLnBhcnNlRmllbGRzRGVmaW5pdGlvbigpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLklOVEVSRkFDRV9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksaW50ZXJmYWNlczpyLGRpcmVjdGl2ZXM6cyxmaWVsZHM6b30pfXBhcnNlVW5pb25UeXBlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoInVuaW9uIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZVVuaW9uTWVtYmVyVHlwZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5VTklPTl9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksZGlyZWN0aXZlczpyLHR5cGVzOnN9KX1wYXJzZVVuaW9uTWVtYmVyVHlwZXMoKXtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuRVFVQUxTKT90aGlzLmRlbGltaXRlZE1hbnkobC5QSVBFLHRoaXMucGFyc2VOYW1lZFR5cGUpOltdfXBhcnNlRW51bVR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgiZW51bSIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VFbnVtVmFsdWVzRGVmaW5pdGlvbigpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLkVOVU1fVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cix2YWx1ZXM6c30pfXBhcnNlRW51bVZhbHVlc0RlZmluaXRpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25hbE1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VFbnVtVmFsdWVEZWZpbml0aW9uLGwuQlJBQ0VfUil9cGFyc2VFbnVtVmFsdWVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpLGk9dGhpcy5wYXJzZUVudW1WYWx1ZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5FTlVNX1ZBTFVFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksZGlyZWN0aXZlczpyfSl9cGFyc2VFbnVtVmFsdWVOYW1lKCl7aWYodGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0idHJ1ZSJ8fHRoaXMuX2xleGVyLnRva2VuLnZhbHVlPT09ImZhbHNlInx8dGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0ibnVsbCIpdGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2UsdGhpcy5fbGV4ZXIudG9rZW4uc3RhcnQsYCR7a2UodGhpcy5fbGV4ZXIudG9rZW4pfSBpcyByZXNlcnZlZCBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIGFuIGVudW0gdmFsdWUuYCk7cmV0dXJuIHRoaXMucGFyc2VOYW1lKCl9cGFyc2VJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgiaW5wdXQiKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscz10aGlzLnBhcnNlSW5wdXRGaWVsZHNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOmIuSU5QVVRfT0JKRUNUX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnIsZmllbGRzOnN9KX1wYXJzZUlucHV0RmllbGRzRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZUlucHV0VmFsdWVEZWYsbC5CUkFDRV9SKX1wYXJzZVR5cGVTeXN0ZW1FeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLmxvb2thaGVhZCgpO2lmKHQua2luZD09PWwuTkFNRSlzd2l0Y2godC52YWx1ZSl7Y2FzZSJzY2hlbWEiOnJldHVybiB0aGlzLnBhcnNlU2NoZW1hRXh0ZW5zaW9uKCk7Y2FzZSJzY2FsYXIiOnJldHVybiB0aGlzLnBhcnNlU2NhbGFyVHlwZUV4dGVuc2lvbigpO2Nhc2UidHlwZSI6cmV0dXJuIHRoaXMucGFyc2VPYmplY3RUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJpbnRlcmZhY2UiOnJldHVybiB0aGlzLnBhcnNlSW50ZXJmYWNlVHlwZUV4dGVuc2lvbigpO2Nhc2UidW5pb24iOnJldHVybiB0aGlzLnBhcnNlVW5pb25UeXBlRXh0ZW5zaW9uKCk7Y2FzZSJlbnVtIjpyZXR1cm4gdGhpcy5wYXJzZUVudW1UeXBlRXh0ZW5zaW9uKCk7Y2FzZSJpbnB1dCI6cmV0dXJuIHRoaXMucGFyc2VJbnB1dE9iamVjdFR5cGVFeHRlbnNpb24oKX10aHJvdyB0aGlzLnVuZXhwZWN0ZWQodCl9cGFyc2VTY2hlbWFFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJzY2hlbWEiKTtjb25zdCBuPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxpPXRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlT3BlcmF0aW9uVHlwZURlZmluaXRpb24sbC5CUkFDRV9SKTtpZihuLmxlbmd0aD09PTAmJmkubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5TQ0hFTUFfRVhURU5TSU9OLGRpcmVjdGl2ZXM6bixvcGVyYXRpb25UeXBlczppfSl9cGFyc2VTY2FsYXJUeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgic2NhbGFyIik7Y29uc3Qgbj10aGlzLnBhcnNlTmFtZSgpLGk9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO2lmKGkubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5TQ0FMQVJfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGRpcmVjdGl2ZXM6aX0pfXBhcnNlT2JqZWN0VHlwZUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoInR5cGUiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VGaWVsZHNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTAmJnMubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5PQkpFQ1RfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGludGVyZmFjZXM6aSxkaXJlY3RpdmVzOnIsZmllbGRzOnN9KX1wYXJzZUludGVyZmFjZVR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJpbnRlcmZhY2UiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VGaWVsZHNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTAmJnMubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5JTlRFUkZBQ0VfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGludGVyZmFjZXM6aSxkaXJlY3RpdmVzOnIsZmllbGRzOnN9KX1wYXJzZVVuaW9uVHlwZUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoInVuaW9uIik7Y29uc3Qgbj10aGlzLnBhcnNlTmFtZSgpLGk9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHI9dGhpcy5wYXJzZVVuaW9uTWVtYmVyVHlwZXMoKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6Yi5VTklPTl9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppLHR5cGVzOnJ9KX1wYXJzZUVudW1UeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgiZW51bSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMucGFyc2VFbnVtVmFsdWVzRGVmaW5pdGlvbigpO2lmKGkubGVuZ3RoPT09MCYmci5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLkVOVU1fVFlQRV9FWFRFTlNJT04sbmFtZTpuLGRpcmVjdGl2ZXM6aSx2YWx1ZXM6cn0pfXBhcnNlSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgiaW5wdXQiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscj10aGlzLnBhcnNlSW5wdXRGaWVsZHNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTApdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOmIuSU5QVVRfT0JKRUNUX1RZUEVfRVhURU5TSU9OLG5hbWU6bixkaXJlY3RpdmVzOmksZmllbGRzOnJ9KX1wYXJzZURpcmVjdGl2ZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJkaXJlY3RpdmUiKSx0aGlzLmV4cGVjdFRva2VuKGwuQVQpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VBcmd1bWVudERlZnMoKSxzPXRoaXMuZXhwZWN0T3B0aW9uYWxLZXl3b3JkKCJyZXBlYXRhYmxlIik7dGhpcy5leHBlY3RLZXl3b3JkKCJvbiIpO2NvbnN0IG89dGhpcy5wYXJzZURpcmVjdGl2ZUxvY2F0aW9ucygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpiLkRJUkVDVElWRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGFyZ3VtZW50czpyLHJlcGVhdGFibGU6cyxsb2NhdGlvbnM6b30pfXBhcnNlRGlyZWN0aXZlTG9jYXRpb25zKCl7cmV0dXJuIHRoaXMuZGVsaW1pdGVkTWFueShsLlBJUEUsdGhpcy5wYXJzZURpcmVjdGl2ZUxvY2F0aW9uKX1wYXJzZURpcmVjdGl2ZUxvY2F0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VOYW1lKCk7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEdlLG4udmFsdWUpKXJldHVybiBuO3Rocm93IHRoaXMudW5leHBlY3RlZCh0KX1ub2RlKHQsbil7cmV0dXJuIHRoaXMuX29wdGlvbnMubm9Mb2NhdGlvbiE9PSEwJiYobi5sb2M9bmV3IGxuKHQsdGhpcy5fbGV4ZXIubGFzdFRva2VuLHRoaXMuX2xleGVyLnNvdXJjZSkpLG59cGVlayh0KXtyZXR1cm4gdGhpcy5fbGV4ZXIudG9rZW4ua2luZD09PXR9ZXhwZWN0VG9rZW4odCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtpZihuLmtpbmQ9PT10KXJldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLG47dGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2Usbi5zdGFydCxgRXhwZWN0ZWQgJHtrdCh0KX0sIGZvdW5kICR7a2Uobil9LmApfWV4cGVjdE9wdGlvbmFsVG9rZW4odCl7cmV0dXJuIHRoaXMuX2xleGVyLnRva2VuLmtpbmQ9PT10Pyh0aGlzLmFkdmFuY2VMZXhlcigpLCEwKTohMX1leHBlY3RLZXl3b3JkKHQpe2NvbnN0IG49dGhpcy5fbGV4ZXIudG9rZW47aWYobi5raW5kPT09bC5OQU1FJiZuLnZhbHVlPT09dCl0aGlzLmFkdmFuY2VMZXhlcigpO2Vsc2UgdGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2Usbi5zdGFydCxgRXhwZWN0ZWQgIiR7dH0iLCBmb3VuZCAke2tlKG4pfS5gKX1leHBlY3RPcHRpb25hbEtleXdvcmQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gbi5raW5kPT09bC5OQU1FJiZuLnZhbHVlPT09dD8odGhpcy5hZHZhbmNlTGV4ZXIoKSwhMCk6ITF9dW5leHBlY3RlZCh0KXtjb25zdCBuPXQhPW51bGw/dDp0aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gRyh0aGlzLl9sZXhlci5zb3VyY2Usbi5zdGFydCxgVW5leHBlY3RlZCAke2tlKG4pfS5gKX1hbnkodCxuLGkpe3RoaXMuZXhwZWN0VG9rZW4odCk7Y29uc3Qgcj1bXTtmb3IoOyF0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4oaSk7KXIucHVzaChuLmNhbGwodGhpcykpO3JldHVybiByfW9wdGlvbmFsTWFueSh0LG4saSl7aWYodGhpcy5leHBlY3RPcHRpb25hbFRva2VuKHQpKXtjb25zdCByPVtdO2RvIHIucHVzaChuLmNhbGwodGhpcykpO3doaWxlKCF0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4oaSkpO3JldHVybiByfXJldHVybltdfW1hbnkodCxuLGkpe3RoaXMuZXhwZWN0VG9rZW4odCk7Y29uc3Qgcj1bXTtkbyByLnB1c2gobi5jYWxsKHRoaXMpKTt3aGlsZSghdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGkpKTtyZXR1cm4gcn1kZWxpbWl0ZWRNYW55KHQsbil7dGhpcy5leHBlY3RPcHRpb25hbFRva2VuKHQpO2NvbnN0IGk9W107ZG8gaS5wdXNoKG4uY2FsbCh0aGlzKSk7d2hpbGUodGhpcy5leHBlY3RPcHRpb25hbFRva2VuKHQpKTtyZXR1cm4gaX1hZHZhbmNlTGV4ZXIoKXtjb25zdHttYXhUb2tlbnM6dH09dGhpcy5fb3B0aW9ucyxuPXRoaXMuX2xleGVyLmFkdmFuY2UoKTtpZihuLmtpbmQhPT1sLkVPRiYmKCsrdGhpcy5fdG9rZW5Db3VudGVyLHQhPT12b2lkIDAmJnRoaXMuX3Rva2VuQ291bnRlcj50KSl0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBEb2N1bWVudCBjb250YWlucyBtb3JlIHRoYXQgJHt0fSB0b2tlbnMuIFBhcnNpbmcgYWJvcnRlZC5gKX19ZnVuY3Rpb24ga2UoZSl7Y29uc3QgdD1lLnZhbHVlO3JldHVybiBrdChlLmtpbmQpKyh0IT1udWxsP2AgIiR7dH0iYDoiIil9ZnVuY3Rpb24ga3QoZSl7cmV0dXJuIGduKGUpP2AiJHtlfSJgOmV9ZnVuY3Rpb24gRm4oZSl7cmV0dXJuYCIke2UucmVwbGFjZShNbixCbil9ImB9Y29uc3QgTW49L1tceDAwLVx4MWZceDIyXHg1Y1x4N2YtXHg5Zl0vZztmdW5jdGlvbiBCbihlKXtyZXR1cm4gJG5bZS5jaGFyQ29kZUF0KDApXX1jb25zdCAkbj1bIlxcdTAwMDAiLCJcXHUwMDAxIiwiXFx1MDAwMiIsIlxcdTAwMDMiLCJcXHUwMDA0IiwiXFx1MDAwNSIsIlxcdTAwMDYiLCJcXHUwMDA3IiwiXFxiIiwiXFx0IiwiXFxuIiwiXFx1MDAwQiIsIlxcZiIsIlxcciIsIlxcdTAwMEUiLCJcXHUwMDBGIiwiXFx1MDAxMCIsIlxcdTAwMTEiLCJcXHUwMDEyIiwiXFx1MDAxMyIsIlxcdTAwMTQiLCJcXHUwMDE1IiwiXFx1MDAxNiIsIlxcdTAwMTciLCJcXHUwMDE4IiwiXFx1MDAxOSIsIlxcdTAwMUEiLCJcXHUwMDFCIiwiXFx1MDAxQyIsIlxcdTAwMUQiLCJcXHUwMDFFIiwiXFx1MDAxRiIsIiIsIiIsJ1xcIicsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIlxcXFwiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCJcXHUwMDdGIiwiXFx1MDA4MCIsIlxcdTAwODEiLCJcXHUwMDgyIiwiXFx1MDA4MyIsIlxcdTAwODQiLCJcXHUwMDg1IiwiXFx1MDA4NiIsIlxcdTAwODciLCJcXHUwMDg4IiwiXFx1MDA4OSIsIlxcdTAwOEEiLCJcXHUwMDhCIiwiXFx1MDA4QyIsIlxcdTAwOEQiLCJcXHUwMDhFIiwiXFx1MDA4RiIsIlxcdTAwOTAiLCJcXHUwMDkxIiwiXFx1MDA5MiIsIlxcdTAwOTMiLCJcXHUwMDk0IiwiXFx1MDA5NSIsIlxcdTAwOTYiLCJcXHUwMDk3IiwiXFx1MDA5OCIsIlxcdTAwOTkiLCJcXHUwMDlBIiwiXFx1MDA5QiIsIlxcdTAwOUMiLCJcXHUwMDlEIiwiXFx1MDA5RSIsIlxcdTAwOUYiXSxVbj1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiBWbihlLHQsbj1idCl7Y29uc3QgaT1uZXcgTWFwO2Zvcihjb25zdCBMIG9mIE9iamVjdC52YWx1ZXMoYikpaS5zZXQoTCxxbih0LEwpKTtsZXQgcixzPUFycmF5LmlzQXJyYXkoZSksbz1bZV0sYz0tMSxoPVtdLGQ9ZSx1LHk7Y29uc3Qgdj1bXSxUPVtdO2Rve2MrKztjb25zdCBMPWM9PT1vLmxlbmd0aCxxPUwmJmgubGVuZ3RoIT09MDtpZihMKXtpZih1PVQubGVuZ3RoPT09MD92b2lkIDA6dlt2Lmxlbmd0aC0xXSxkPXkseT1ULnBvcCgpLHEpaWYocyl7ZD1kLnNsaWNlKCk7bGV0IEU9MDtmb3IoY29uc3RbdyxrXW9mIGgpe2NvbnN0IFA9dy1FO2s9PT1udWxsPyhkLnNwbGljZShQLDEpLEUrKyk6ZFtQXT1rfX1lbHNle2Q9RCh7fSxkKTtmb3IoY29uc3RbRSx3XW9mIGgpZFtFXT13fWM9ci5pbmRleCxvPXIua2V5cyxoPXIuZWRpdHMscz1yLmluQXJyYXkscj1yLnByZXZ9ZWxzZSBpZih5KXtpZih1PXM/YzpvW2NdLGQ9eVt1XSxkPT1udWxsKWNvbnRpbnVlO3YucHVzaCh1KX1sZXQgZztpZighQXJyYXkuaXNBcnJheShkKSl7dmFyIG0sTjtUdChkKXx8bGUoITEsYEludmFsaWQgQVNUIE5vZGU6ICR7WWUoZCl9LmApO2NvbnN0IEU9TD8obT1pLmdldChkLmtpbmQpKT09PW51bGx8fG09PT12b2lkIDA/dm9pZCAwOm0ubGVhdmU6KE49aS5nZXQoZC5raW5kKSk9PT1udWxsfHxOPT09dm9pZCAwP3ZvaWQgMDpOLmVudGVyO2lmKGc9RT09bnVsbD92b2lkIDA6RS5jYWxsKHQsZCx1LHksdixUKSxnPT09VW4pYnJlYWs7aWYoZz09PSExKXtpZighTCl7di5wb3AoKTtjb250aW51ZX19ZWxzZSBpZihnIT09dm9pZCAwJiYoaC5wdXNoKFt1LGddKSwhTCkpaWYoVHQoZykpZD1nO2Vsc2V7di5wb3AoKTtjb250aW51ZX19aWYoZz09PXZvaWQgMCYmcSYmaC5wdXNoKFt1LGRdKSxMKXYucG9wKCk7ZWxzZXt2YXIgUjtyPXtpbkFycmF5OnMsaW5kZXg6YyxrZXlzOm8sZWRpdHM6aCxwcmV2OnJ9LHM9QXJyYXkuaXNBcnJheShkKSxvPXM/ZDooUj1uW2Qua2luZF0pIT09bnVsbCYmUiE9PXZvaWQgMD9SOltdLGM9LTEsaD1bXSx5JiZULnB1c2goeSkseT1kfX13aGlsZShyIT09dm9pZCAwKTtyZXR1cm4gaC5sZW5ndGghPT0wP2hbaC5sZW5ndGgtMV1bMV06ZX1mdW5jdGlvbiBxbihlLHQpe2NvbnN0IG49ZVt0XTtyZXR1cm4gdHlwZW9mIG49PSJvYmplY3QiP246dHlwZW9mIG49PSJmdW5jdGlvbiI/e2VudGVyOm4sbGVhdmU6dm9pZCAwfTp7ZW50ZXI6ZS5lbnRlcixsZWF2ZTplLmxlYXZlfX1mdW5jdGlvbiBqbihlKXtyZXR1cm4gVm4oZSx6bil9Y29uc3QgR249ODAsem49e05hbWU6e2xlYXZlOmU9PmUudmFsdWV9LFZhcmlhYmxlOntsZWF2ZTplPT4iJCIrZS5uYW1lfSxEb2N1bWVudDp7bGVhdmU6ZT0+cChlLmRlZmluaXRpb25zLGAKCmApfSxPcGVyYXRpb25EZWZpbml0aW9uOntsZWF2ZShlKXtjb25zdCB0PU8oIigiLHAoZS52YXJpYWJsZURlZmluaXRpb25zLCIsICIpLCIpIiksbj1wKFtlLm9wZXJhdGlvbixwKFtlLm5hbWUsdF0pLHAoZS5kaXJlY3RpdmVzLCIgIildLCIgIik7cmV0dXJuKG49PT0icXVlcnkiPyIiOm4rIiAiKStlLnNlbGVjdGlvblNldH19LFZhcmlhYmxlRGVmaW5pdGlvbjp7bGVhdmU6KHt2YXJpYWJsZTplLHR5cGU6dCxkZWZhdWx0VmFsdWU6bixkaXJlY3RpdmVzOml9KT0+ZSsiOiAiK3QrTygiID0gIixuKStPKCIgIixwKGksIiAiKSl9LFNlbGVjdGlvblNldDp7bGVhdmU6KHtzZWxlY3Rpb25zOmV9KT0+cmUoZSl9LEZpZWxkOntsZWF2ZSh7YWxpYXM6ZSxuYW1lOnQsYXJndW1lbnRzOm4sZGlyZWN0aXZlczppLHNlbGVjdGlvblNldDpyfSl7Y29uc3Qgcz1PKCIiLGUsIjogIikrdDtsZXQgbz1zK08oIigiLHAobiwiLCAiKSwiKSIpO3JldHVybiBvLmxlbmd0aD5HbiYmKG89cytPKGAoCmAsQ2UocChuLGAKYCkpLGAKKWApKSxwKFtvLHAoaSwiICIpLHJdLCIgIil9fSxBcmd1bWVudDp7bGVhdmU6KHtuYW1lOmUsdmFsdWU6dH0pPT5lKyI6ICIrdH0sRnJhZ21lbnRTcHJlYWQ6e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT4iLi4uIitlK08oIiAiLHAodCwiICIpKX0sSW5saW5lRnJhZ21lbnQ6e2xlYXZlOih7dHlwZUNvbmRpdGlvbjplLGRpcmVjdGl2ZXM6dCxzZWxlY3Rpb25TZXQ6bn0pPT5wKFsiLi4uIixPKCJvbiAiLGUpLHAodCwiICIpLG5dLCIgIil9LEZyYWdtZW50RGVmaW5pdGlvbjp7bGVhdmU6KHtuYW1lOmUsdHlwZUNvbmRpdGlvbjp0LHZhcmlhYmxlRGVmaW5pdGlvbnM6bixkaXJlY3RpdmVzOmksc2VsZWN0aW9uU2V0OnJ9KT0+YGZyYWdtZW50ICR7ZX0ke08oIigiLHAobiwiLCAiKSwiKSIpfSBvbiAke3R9ICR7TygiIixwKGksIiAiKSwiICIpfWArcn0sSW50VmFsdWU6e2xlYXZlOih7dmFsdWU6ZX0pPT5lfSxGbG9hdFZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sU3RyaW5nVmFsdWU6e2xlYXZlOih7dmFsdWU6ZSxibG9jazp0fSk9PnQ/bW4oZSk6Rm4oZSl9LEJvb2xlYW5WYWx1ZTp7bGVhdmU6KHt2YWx1ZTplfSk9PmU/InRydWUiOiJmYWxzZSJ9LE51bGxWYWx1ZTp7bGVhdmU6KCk9PiJudWxsIn0sRW51bVZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sTGlzdFZhbHVlOntsZWF2ZTooe3ZhbHVlczplfSk9PiJbIitwKGUsIiwgIikrIl0ifSxPYmplY3RWYWx1ZTp7bGVhdmU6KHtmaWVsZHM6ZX0pPT4ieyIrcChlLCIsICIpKyJ9In0sT2JqZWN0RmllbGQ6e2xlYXZlOih7bmFtZTplLHZhbHVlOnR9KT0+ZSsiOiAiK3R9LERpcmVjdGl2ZTp7bGVhdmU6KHtuYW1lOmUsYXJndW1lbnRzOnR9KT0+IkAiK2UrTygiKCIscCh0LCIsICIpLCIpIil9LE5hbWVkVHlwZTp7bGVhdmU6KHtuYW1lOmV9KT0+ZX0sTGlzdFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PiJbIitlKyJdIn0sTm9uTnVsbFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PmUrIiEifSxTY2hlbWFEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsZGlyZWN0aXZlczp0LG9wZXJhdGlvblR5cGVzOm59KT0+TygiIixlLGAKYCkrcChbInNjaGVtYSIscCh0LCIgIikscmUobildLCIgIil9LE9wZXJhdGlvblR5cGVEZWZpbml0aW9uOntsZWF2ZTooe29wZXJhdGlvbjplLHR5cGU6dH0pPT5lKyI6ICIrdH0sU2NhbGFyVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpufSk9Pk8oIiIsZSxgCmApK3AoWyJzY2FsYXIiLHQscChuLCIgIildLCIgIil9LE9iamVjdFR5cGVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGludGVyZmFjZXM6bixkaXJlY3RpdmVzOmksZmllbGRzOnJ9KT0+TygiIixlLGAKYCkrcChbInR5cGUiLHQsTygiaW1wbGVtZW50cyAiLHAobiwiICYgIikpLHAoaSwiICIpLHJlKHIpXSwiICIpfSxGaWVsZERlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsYXJndW1lbnRzOm4sdHlwZTppLGRpcmVjdGl2ZXM6cn0pPT5PKCIiLGUsYApgKSt0KyhDdChuKT9PKGAoCmAsQ2UocChuLGAKYCkpLGAKKWApOk8oIigiLHAobiwiLCAiKSwiKSIpKSsiOiAiK2krTygiICIscChyLCIgIikpfSxJbnB1dFZhbHVlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCx0eXBlOm4sZGVmYXVsdFZhbHVlOmksZGlyZWN0aXZlczpyfSk9Pk8oIiIsZSxgCmApK3AoW3QrIjogIituLE8oIj0gIixpKSxwKHIsIiAiKV0sIiAiKX0sSW50ZXJmYWNlVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsaW50ZXJmYWNlczpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pPT5PKCIiLGUsYApgKStwKFsiaW50ZXJmYWNlIix0LE8oImltcGxlbWVudHMgIixwKG4sIiAmICIpKSxwKGksIiAiKSxyZShyKV0sIiAiKX0sVW5pb25UeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm4sdHlwZXM6aX0pPT5PKCIiLGUsYApgKStwKFsidW5pb24iLHQscChuLCIgIiksTygiPSAiLHAoaSwiIHwgIikpXSwiICIpfSxFbnVtVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLHZhbHVlczppfSk9Pk8oIiIsZSxgCmApK3AoWyJlbnVtIix0LHAobiwiICIpLHJlKGkpXSwiICIpfSxFbnVtVmFsdWVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGRpcmVjdGl2ZXM6bn0pPT5PKCIiLGUsYApgKStwKFt0LHAobiwiICIpXSwiICIpfSxJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGRpcmVjdGl2ZXM6bixmaWVsZHM6aX0pPT5PKCIiLGUsYApgKStwKFsiaW5wdXQiLHQscChuLCIgIikscmUoaSldLCIgIil9LERpcmVjdGl2ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsYXJndW1lbnRzOm4scmVwZWF0YWJsZTppLGxvY2F0aW9uczpyfSk9Pk8oIiIsZSxgCmApKyJkaXJlY3RpdmUgQCIrdCsoQ3Qobik/TyhgKApgLENlKHAobixgCmApKSxgCilgKTpPKCIoIixwKG4sIiwgIiksIikiKSkrKGk/IiByZXBlYXRhYmxlIjoiIikrIiBvbiAiK3AociwiIHwgIil9LFNjaGVtYUV4dGVuc2lvbjp7bGVhdmU6KHtkaXJlY3RpdmVzOmUsb3BlcmF0aW9uVHlwZXM6dH0pPT5wKFsiZXh0ZW5kIHNjaGVtYSIscChlLCIgIikscmUodCldLCIgIil9LFNjYWxhclR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT5wKFsiZXh0ZW5kIHNjYWxhciIsZSxwKHQsIiAiKV0sIiAiKX0sT2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsaW50ZXJmYWNlczp0LGRpcmVjdGl2ZXM6bixmaWVsZHM6aX0pPT5wKFsiZXh0ZW5kIHR5cGUiLGUsTygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLHJlKGkpXSwiICIpfSxJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uOntsZWF2ZTooe25hbWU6ZSxpbnRlcmZhY2VzOnQsZGlyZWN0aXZlczpuLGZpZWxkczppfSk9PnAoWyJleHRlbmQgaW50ZXJmYWNlIixlLE8oImltcGxlbWVudHMgIixwKHQsIiAmICIpKSxwKG4sIiAiKSxyZShpKV0sIiAiKX0sVW5pb25UeXBlRXh0ZW5zaW9uOntsZWF2ZTooe25hbWU6ZSxkaXJlY3RpdmVzOnQsdHlwZXM6bn0pPT5wKFsiZXh0ZW5kIHVuaW9uIixlLHAodCwiICIpLE8oIj0gIixwKG4sIiB8ICIpKV0sIiAiKX0sRW51bVR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dCx2YWx1ZXM6bn0pPT5wKFsiZXh0ZW5kIGVudW0iLGUscCh0LCIgIikscmUobildLCIgIil9LElucHV0T2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LGZpZWxkczpufSk9PnAoWyJleHRlbmQgaW5wdXQiLGUscCh0LCIgIikscmUobildLCIgIil9fTtmdW5jdGlvbiBwKGUsdD0iIil7dmFyIG47cmV0dXJuKG49ZT09bnVsbD92b2lkIDA6ZS5maWx0ZXIoaT0+aSkuam9pbih0KSkhPT1udWxsJiZuIT09dm9pZCAwP246IiJ9ZnVuY3Rpb24gcmUoZSl7cmV0dXJuIE8oYHsKYCxDZShwKGUsYApgKSksYAp9YCl9ZnVuY3Rpb24gTyhlLHQsbj0iIil7cmV0dXJuIHQhPW51bGwmJnQhPT0iIj9lK3QrbjoiIn1mdW5jdGlvbiBDZShlKXtyZXR1cm4gTygiICAiLGUucmVwbGFjZSgvXG4vZyxgCiAgYCkpfWZ1bmN0aW9uIEN0KGUpe3ZhciB0O3JldHVybih0PWU9PW51bGw/dm9pZCAwOmUuc29tZShuPT5uLmluY2x1ZGVzKGAKYCkpKSE9PW51bGwmJnQhPT12b2lkIDA/dDohMX1jb25zdCBSdD1lPT57dmFyIGkscjtsZXQgdDtjb25zdCBuPWUuZGVmaW5pdGlvbnMuZmlsdGVyKHM9PnMua2luZD09PSJPcGVyYXRpb25EZWZpbml0aW9uIik7cmV0dXJuIG4ubGVuZ3RoPT09MSYmKHQ9KHI9KGk9blswXSk9PW51bGw/dm9pZCAwOmkubmFtZSk9PW51bGw/dm9pZCAwOnIudmFsdWUpLHR9LEplPWU9PntpZih0eXBlb2YgZT09InN0cmluZyIpe2xldCBuO3RyeXtjb25zdCBpPUR0KGUpO249UnQoaSl9Y2F0Y2goaSl7fXJldHVybntxdWVyeTplLG9wZXJhdGlvbk5hbWU6bn19Y29uc3QgdD1SdChlKTtyZXR1cm57cXVlcnk6am4oZSksb3BlcmF0aW9uTmFtZTp0fX07Y2xhc3MgZGUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LG4pe2NvbnN0IGk9YCR7ZGUuZXh0cmFjdE1lc3NhZ2UodCl9OiAke0pTT04uc3RyaW5naWZ5KHtyZXNwb25zZTp0LHJlcXVlc3Q6bn0pfWA7c3VwZXIoaSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsZGUucHJvdG90eXBlKSx0aGlzLnJlc3BvbnNlPXQsdGhpcy5yZXF1ZXN0PW4sdHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPT0iZnVuY3Rpb24iJiZFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLGRlKX1zdGF0aWMgZXh0cmFjdE1lc3NhZ2UodCl7dmFyIG4saSxyO3JldHVybihyPShpPShuPXQuZXJyb3JzKT09bnVsbD92b2lkIDA6blswXSk9PW51bGw/dm9pZCAwOmkubWVzc2FnZSkhPW51bGw/cjpgR3JhcGhRTCBFcnJvciAoQ29kZTogJHt0LnN0YXR1c30pYH19dmFyIEhuPXR5cGVvZiBnbG9iYWxUaGlzIT0idW5kZWZpbmVkIj9nbG9iYWxUaGlzOnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT0idW5kZWZpbmVkIj9nbG9iYWw6dHlwZW9mIHNlbGYhPSJ1bmRlZmluZWQiP3NlbGY6e307ZnVuY3Rpb24gTHQoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZSYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImRlZmF1bHQiKT9lLmRlZmF1bHQ6ZX12YXIgUWU9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIj9zZWxmOkhuLGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBzKCl7dGhpcy5mZXRjaD0hMSx0aGlzLkRPTUV4Y2VwdGlvbj1uLkRPTUV4Y2VwdGlvbn1yZXR1cm4gcy5wcm90b3R5cGU9bixuZXcgc30oKTsoZnVuY3Rpb24ocyl7KGZ1bmN0aW9uKG8pe3ZhciBjPXtzZWFyY2hQYXJhbXM6IlVSTFNlYXJjaFBhcmFtcyJpbiBzLGl0ZXJhYmxlOiJTeW1ib2wiaW4gcyYmIml0ZXJhdG9yImluIFN5bWJvbCxibG9iOiJGaWxlUmVhZGVyImluIHMmJiJCbG9iImluIHMmJmZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgQmxvYiwhMH1jYXRjaChhKXtyZXR1cm4hMX19KCksZm9ybURhdGE6IkZvcm1EYXRhImluIHMsYXJyYXlCdWZmZXI6IkFycmF5QnVmZmVyImluIHN9O2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGEmJkRhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGEpfWlmKGMuYXJyYXlCdWZmZXIpdmFyIGQ9WyJbb2JqZWN0IEludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLCJbb2JqZWN0IEludDE2QXJyYXldIiwiW29iamVjdCBVaW50MTZBcnJheV0iLCJbb2JqZWN0IEludDMyQXJyYXldIiwiW29iamVjdCBVaW50MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLCJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXSx1PUFycmF5QnVmZmVyLmlzVmlld3x8ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmQuaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpPi0xfTtmdW5jdGlvbiB5KGEpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIiYmKGE9U3RyaW5nKGEpKSwvW15hLXowLTlcLSMkJSYnKisuXl9gfH5dL2kudGVzdChhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZSIpO3JldHVybiBhLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoYT1TdHJpbmcoYSkpLGF9ZnVuY3Rpb24gVChhKXt2YXIgZj17bmV4dDpmdW5jdGlvbigpe3ZhciBfPWEuc2hpZnQoKTtyZXR1cm57ZG9uZTpfPT09dm9pZCAwLHZhbHVlOl99fX07cmV0dXJuIGMuaXRlcmFibGUmJihmW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gZn0pLGZ9ZnVuY3Rpb24gbShhKXt0aGlzLm1hcD17fSxhIGluc3RhbmNlb2YgbT9hLmZvckVhY2goZnVuY3Rpb24oZixfKXt0aGlzLmFwcGVuZChfLGYpfSx0aGlzKTpBcnJheS5pc0FycmF5KGEpP2EuZm9yRWFjaChmdW5jdGlvbihmKXt0aGlzLmFwcGVuZChmWzBdLGZbMV0pfSx0aGlzKTphJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3RoaXMuYXBwZW5kKGYsYVtmXSl9LHRoaXMpfW0ucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihhLGYpe2E9eShhKSxmPXYoZik7dmFyIF89dGhpcy5tYXBbYV07dGhpcy5tYXBbYV09Xz9fKyIsICIrZjpmfSxtLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMubWFwW3koYSldfSxtLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9eShhKSx0aGlzLmhhcyhhKT90aGlzLm1hcFthXTpudWxsfSxtLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KHkoYSkpfSxtLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYSxmKXt0aGlzLm1hcFt5KGEpXT12KGYpfSxtLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEsZil7Zm9yKHZhciBfIGluIHRoaXMubWFwKXRoaXMubWFwLmhhc093blByb3BlcnR5KF8pJiZhLmNhbGwoZix0aGlzLm1hcFtfXSxfLHRoaXMpfSxtLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihmLF8pe2EucHVzaChfKX0pLFQoYSl9LG0ucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oZil7YS5wdXNoKGYpfSksVChhKX0sbS5wcm90b3R5cGUuZW50cmllcz1mdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oZixfKXthLnB1c2goW18sZl0pfSksVChhKX0sYy5pdGVyYWJsZSYmKG0ucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09bS5wcm90b3R5cGUuZW50cmllcyk7ZnVuY3Rpb24gTihhKXtpZihhLmJvZHlVc2VkKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKCJBbHJlYWR5IHJlYWQiKSk7YS5ib2R5VXNlZD0hMH1mdW5jdGlvbiBSKGEpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihmLF8pe2Eub25sb2FkPWZ1bmN0aW9uKCl7ZihhLnJlc3VsdCl9LGEub25lcnJvcj1mdW5jdGlvbigpe18oYS5lcnJvcil9fSl9ZnVuY3Rpb24gTChhKXt2YXIgZj1uZXcgRmlsZVJlYWRlcixfPVIoZik7cmV0dXJuIGYucmVhZEFzQXJyYXlCdWZmZXIoYSksX31mdW5jdGlvbiBxKGEpe3ZhciBmPW5ldyBGaWxlUmVhZGVyLF89UihmKTtyZXR1cm4gZi5yZWFkQXNUZXh0KGEpLF99ZnVuY3Rpb24gZyhhKXtmb3IodmFyIGY9bmV3IFVpbnQ4QXJyYXkoYSksXz1uZXcgQXJyYXkoZi5sZW5ndGgpLFM9MDtTPGYubGVuZ3RoO1MrKylfW1NdPVN0cmluZy5mcm9tQ2hhckNvZGUoZltTXSk7cmV0dXJuIF8uam9pbigiIil9ZnVuY3Rpb24gRShhKXtpZihhLnNsaWNlKXJldHVybiBhLnNsaWNlKDApO3ZhciBmPW5ldyBVaW50OEFycmF5KGEuYnl0ZUxlbmd0aCk7cmV0dXJuIGYuc2V0KG5ldyBVaW50OEFycmF5KGEpKSxmLmJ1ZmZlcn1mdW5jdGlvbiB3KCl7cmV0dXJuIHRoaXMuYm9keVVzZWQ9ITEsdGhpcy5faW5pdEJvZHk9ZnVuY3Rpb24oYSl7dGhpcy5fYm9keUluaXQ9YSxhP3R5cGVvZiBhPT0ic3RyaW5nIj90aGlzLl9ib2R5VGV4dD1hOmMuYmxvYiYmQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihhKT90aGlzLl9ib2R5QmxvYj1hOmMuZm9ybURhdGEmJkZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGEpP3RoaXMuX2JvZHlGb3JtRGF0YT1hOmMuc2VhcmNoUGFyYW1zJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYSk/dGhpcy5fYm9keVRleHQ9YS50b1N0cmluZygpOmMuYXJyYXlCdWZmZXImJmMuYmxvYiYmaChhKT8odGhpcy5fYm9keUFycmF5QnVmZmVyPUUoYS5idWZmZXIpLHRoaXMuX2JvZHlJbml0PW5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSk6Yy5hcnJheUJ1ZmZlciYmKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGEpfHx1KGEpKT90aGlzLl9ib2R5QXJyYXlCdWZmZXI9RShhKTp0aGlzLl9ib2R5VGV4dD1hPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTp0aGlzLl9ib2R5VGV4dD0iIix0aGlzLmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKXx8KHR5cGVvZiBhPT0ic3RyaW5nIj90aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgiKTp0aGlzLl9ib2R5QmxvYiYmdGhpcy5fYm9keUJsb2IudHlwZT90aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLHRoaXMuX2JvZHlCbG9iLnR5cGUpOmMuc2VhcmNoUGFyYW1zJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoYSkmJnRoaXMuaGVhZGVycy5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IikpfSxjLmJsb2ImJih0aGlzLmJsb2I9ZnVuY3Rpb24oKXt2YXIgYT1OKHRoaXMpO2lmKGEpcmV0dXJuIGE7aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYik7aWYodGhpcy5fYm9keUFycmF5QnVmZmVyKXJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKTtpZih0aGlzLl9ib2R5Rm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKCJjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIGJsb2IiKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKX0sdGhpcy5hcnJheUJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ib2R5QXJyYXlCdWZmZXI/Tih0aGlzKXx8UHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcik6dGhpcy5ibG9iKCkudGhlbihMKX0pLHRoaXMudGV4dD1mdW5jdGlvbigpe3ZhciBhPU4odGhpcyk7aWYoYSlyZXR1cm4gYTtpZih0aGlzLl9ib2R5QmxvYilyZXR1cm4gcSh0aGlzLl9ib2R5QmxvYik7aWYodGhpcy5fYm9keUFycmF5QnVmZmVyKXJldHVybiBQcm9taXNlLnJlc29sdmUoZyh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKTtpZih0aGlzLl9ib2R5Rm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKCJjb3VsZCBub3QgcmVhZCBGb3JtRGF0YSBib2R5IGFzIHRleHQiKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KX0sYy5mb3JtRGF0YSYmKHRoaXMuZm9ybURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbih4KX0pLHRoaXMuanNvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpfSx0aGlzfXZhciBrPVsiREVMRVRFIiwiR0VUIiwiSEVBRCIsIk9QVElPTlMiLCJQT1NUIiwiUFVUIl07ZnVuY3Rpb24gUChhKXt2YXIgZj1hLnRvVXBwZXJDYXNlKCk7cmV0dXJuIGsuaW5kZXhPZihmKT4tMT9mOmF9ZnVuY3Rpb24gSShhLGYpe2Y9Znx8e307dmFyIF89Zi5ib2R5O2lmKGEgaW5zdGFuY2VvZiBJKXtpZihhLmJvZHlVc2VkKXRocm93IG5ldyBUeXBlRXJyb3IoIkFscmVhZHkgcmVhZCIpO3RoaXMudXJsPWEudXJsLHRoaXMuY3JlZGVudGlhbHM9YS5jcmVkZW50aWFscyxmLmhlYWRlcnN8fCh0aGlzLmhlYWRlcnM9bmV3IG0oYS5oZWFkZXJzKSksdGhpcy5tZXRob2Q9YS5tZXRob2QsdGhpcy5tb2RlPWEubW9kZSx0aGlzLnNpZ25hbD1hLnNpZ25hbCwhXyYmYS5fYm9keUluaXQhPW51bGwmJihfPWEuX2JvZHlJbml0LGEuYm9keVVzZWQ9ITApfWVsc2UgdGhpcy51cmw9U3RyaW5nKGEpO2lmKHRoaXMuY3JlZGVudGlhbHM9Zi5jcmVkZW50aWFsc3x8dGhpcy5jcmVkZW50aWFsc3x8InNhbWUtb3JpZ2luIiwoZi5oZWFkZXJzfHwhdGhpcy5oZWFkZXJzKSYmKHRoaXMuaGVhZGVycz1uZXcgbShmLmhlYWRlcnMpKSx0aGlzLm1ldGhvZD1QKGYubWV0aG9kfHx0aGlzLm1ldGhvZHx8IkdFVCIpLHRoaXMubW9kZT1mLm1vZGV8fHRoaXMubW9kZXx8bnVsbCx0aGlzLnNpZ25hbD1mLnNpZ25hbHx8dGhpcy5zaWduYWwsdGhpcy5yZWZlcnJlcj1udWxsLCh0aGlzLm1ldGhvZD09PSJHRVQifHx0aGlzLm1ldGhvZD09PSJIRUFEIikmJl8pdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMiKTt0aGlzLl9pbml0Qm9keShfKX1JLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgSSh0aGlzLHtib2R5OnRoaXMuX2JvZHlJbml0fSl9O2Z1bmN0aW9uIHgoYSl7dmFyIGY9bmV3IEZvcm1EYXRhO3JldHVybiBhLnRyaW0oKS5zcGxpdCgiJiIpLmZvckVhY2goZnVuY3Rpb24oXyl7aWYoXyl7dmFyIFM9Xy5zcGxpdCgiPSIpLEM9Uy5zaGlmdCgpLnJlcGxhY2UoL1wrL2csIiAiKSxBPVMuam9pbigiPSIpLnJlcGxhY2UoL1wrL2csIiAiKTtmLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQoQyksZGVjb2RlVVJJQ29tcG9uZW50KEEpKX19KSxmfWZ1bmN0aW9uIHooYSl7dmFyIGY9bmV3IG0sXz1hLnJlcGxhY2UoL1xyP1xuW1x0IF0rL2csIiAiKTtyZXR1cm4gXy5zcGxpdCgvXHI/XG4vKS5mb3JFYWNoKGZ1bmN0aW9uKFMpe3ZhciBDPVMuc3BsaXQoIjoiKSxBPUMuc2hpZnQoKS50cmltKCk7aWYoQSl7dmFyIEs9Qy5qb2luKCI6IikudHJpbSgpO2YuYXBwZW5kKEEsSyl9fSksZn13LmNhbGwoSS5wcm90b3R5cGUpO2Z1bmN0aW9uIFYoYSxmKXtmfHwoZj17fSksdGhpcy50eXBlPSJkZWZhdWx0Iix0aGlzLnN0YXR1cz1mLnN0YXR1cz09PXZvaWQgMD8yMDA6Zi5zdGF0dXMsdGhpcy5vaz10aGlzLnN0YXR1cz49MjAwJiZ0aGlzLnN0YXR1czwzMDAsdGhpcy5zdGF0dXNUZXh0PSJzdGF0dXNUZXh0ImluIGY/Zi5zdGF0dXNUZXh0OiJPSyIsdGhpcy5oZWFkZXJzPW5ldyBtKGYuaGVhZGVycyksdGhpcy51cmw9Zi51cmx8fCIiLHRoaXMuX2luaXRCb2R5KGEpfXcuY2FsbChWLnByb3RvdHlwZSksVi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFYodGhpcy5fYm9keUluaXQse3N0YXR1czp0aGlzLnN0YXR1cyxzdGF0dXNUZXh0OnRoaXMuc3RhdHVzVGV4dCxoZWFkZXJzOm5ldyBtKHRoaXMuaGVhZGVycyksdXJsOnRoaXMudXJsfSl9LFYuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgVihudWxsLHtzdGF0dXM6MCxzdGF0dXNUZXh0OiIifSk7cmV0dXJuIGEudHlwZT0iZXJyb3IiLGF9O3ZhciBIPVszMDEsMzAyLDMwMywzMDcsMzA4XTtWLnJlZGlyZWN0PWZ1bmN0aW9uKGEsZil7aWYoSC5pbmRleE9mKGYpPT09LTEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgc3RhdHVzIGNvZGUiKTtyZXR1cm4gbmV3IFYobnVsbCx7c3RhdHVzOmYsaGVhZGVyczp7bG9jYXRpb246YX19KX0sby5ET01FeGNlcHRpb249cy5ET01FeGNlcHRpb247dHJ5e25ldyBvLkRPTUV4Y2VwdGlvbn1jYXRjaChhKXtvLkRPTUV4Y2VwdGlvbj1mdW5jdGlvbihmLF8pe3RoaXMubWVzc2FnZT1mLHRoaXMubmFtZT1fO3ZhciBTPUVycm9yKGYpO3RoaXMuc3RhY2s9Uy5zdGFja30sby5ET01FeGNlcHRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxvLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I9by5ET01FeGNlcHRpb259ZnVuY3Rpb24gWChhLGYpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihfLFMpe3ZhciBDPW5ldyBJKGEsZik7aWYoQy5zaWduYWwmJkMuc2lnbmFsLmFib3J0ZWQpcmV0dXJuIFMobmV3IG8uRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpKTt2YXIgQT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24gSygpe0EuYWJvcnQoKX1BLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBqPXtzdGF0dXM6QS5zdGF0dXMsc3RhdHVzVGV4dDpBLnN0YXR1c1RleHQsaGVhZGVyczp6KEEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl8fCIiKX07ai51cmw9InJlc3BvbnNlVVJMImluIEE/QS5yZXNwb25zZVVSTDpqLmhlYWRlcnMuZ2V0KCJYLVJlcXVlc3QtVVJMIik7dmFyIFc9InJlc3BvbnNlImluIEE/QS5yZXNwb25zZTpBLnJlc3BvbnNlVGV4dDtfKG5ldyBWKFcsaikpfSxBLm9uZXJyb3I9ZnVuY3Rpb24oKXtTKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9LEEub250aW1lb3V0PWZ1bmN0aW9uKCl7UyhuZXcgVHlwZUVycm9yKCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkIikpfSxBLm9uYWJvcnQ9ZnVuY3Rpb24oKXtTKG5ldyBvLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9LEEub3BlbihDLm1ldGhvZCxDLnVybCwhMCksQy5jcmVkZW50aWFscz09PSJpbmNsdWRlIj9BLndpdGhDcmVkZW50aWFscz0hMDpDLmNyZWRlbnRpYWxzPT09Im9taXQiJiYoQS53aXRoQ3JlZGVudGlhbHM9ITEpLCJyZXNwb25zZVR5cGUiaW4gQSYmYy5ibG9iJiYoQS5yZXNwb25zZVR5cGU9ImJsb2IiKSxDLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihqLFcpe0Euc2V0UmVxdWVzdEhlYWRlcihXLGopfSksQy5zaWduYWwmJihDLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsSyksQS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtBLnJlYWR5U3RhdGU9PT00JiZDLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsSyl9KSxBLnNlbmQodHlwZW9mIEMuX2JvZHlJbml0PT0idW5kZWZpbmVkIj9udWxsOkMuX2JvZHlJbml0KX0pfXJldHVybiBYLnBvbHlmaWxsPSEwLHMuZmV0Y2h8fChzLmZldGNoPVgscy5IZWFkZXJzPW0scy5SZXF1ZXN0PUkscy5SZXNwb25zZT1WKSxvLkhlYWRlcnM9bSxvLlJlcXVlc3Q9SSxvLlJlc3BvbnNlPVYsby5mZXRjaD1YLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvfSkoe30pfSkoaSksaS5mZXRjaC5wb255ZmlsbD0hMCxkZWxldGUgaS5mZXRjaC5wb2x5ZmlsbDt2YXIgcj1pO3Q9ci5mZXRjaCx0LmRlZmF1bHQ9ci5mZXRjaCx0LmZldGNoPXIuZmV0Y2gsdC5IZWFkZXJzPXIuSGVhZGVycyx0LlJlcXVlc3Q9ci5SZXF1ZXN0LHQuUmVzcG9uc2U9ci5SZXNwb25zZSxlLmV4cG9ydHM9dH0pKFFlLFFlLmV4cG9ydHMpO3ZhciBYZT1RZS5leHBvcnRzLFJlPUx0KFhlKSxZbj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OlJlfSk7Y29uc3QgcGU9ZT0+e2xldCB0PXt9O3JldHVybiBlJiYodHlwZW9mIEhlYWRlcnMhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgSGVhZGVyc3x8WW4mJlhlLkhlYWRlcnMmJmUgaW5zdGFuY2VvZiBYZS5IZWFkZXJzP3Q9JChlKTpBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaCgoW24saV0pPT57biYmaSE9PXZvaWQgMCYmKHRbbl09aSl9KTp0PWUpLHR9LFB0PWU9PmUucmVwbGFjZSgvKFtccyxdfCNbXlxuXHJdKykrL2csIiAiKS50cmltKCksSm49ZT0+e2lmKCFBcnJheS5pc0FycmF5KGUucXVlcnkpKXtjb25zdCBpPWUscj1bYHF1ZXJ5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KFB0KGkucXVlcnkpKX1gXTtyZXR1cm4gZS52YXJpYWJsZXMmJnIucHVzaChgdmFyaWFibGVzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGkuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KGkudmFyaWFibGVzKSl9YCksaS5vcGVyYXRpb25OYW1lJiZyLnB1c2goYG9wZXJhdGlvbk5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQoaS5vcGVyYXRpb25OYW1lKX1gKSxyLmpvaW4oIiYiKX1pZih0eXBlb2YgZS52YXJpYWJsZXMhPSJ1bmRlZmluZWQiJiYhQXJyYXkuaXNBcnJheShlLnZhcmlhYmxlcykpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIHF1ZXJ5IHdpdGggZ2l2ZW4gdmFyaWFibGUgdHlwZSwgYXJyYXkgZXhwZWN0ZWQiKTtjb25zdCB0PWUsbj1lLnF1ZXJ5LnJlZHVjZSgoaSxyLHMpPT4oaS5wdXNoKHtxdWVyeTpQdChyKSx2YXJpYWJsZXM6dC52YXJpYWJsZXM/dC5qc29uU2VyaWFsaXplci5zdHJpbmdpZnkodC52YXJpYWJsZXNbc10pOnZvaWQgMH0pLGkpLFtdKTtyZXR1cm5gcXVlcnk9JHtlbmNvZGVVUklDb21wb25lbnQodC5qc29uU2VyaWFsaXplci5zdHJpbmdpZnkobikpfWB9LFFuPWU9PnQ9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBOO2NvbnN0e3VybDpuLHF1ZXJ5OmksdmFyaWFibGVzOnIsb3BlcmF0aW9uTmFtZTpzLGZldGNoOm8sZmV0Y2hPcHRpb25zOmMsbWlkZGxld2FyZTpofT10LGQ9RCh7fSx0LmhlYWRlcnMpO2xldCB1PSIiLHk7ZT09PSJQT1NUIj8oeT1XbihpLHIscyxjLmpzb25TZXJpYWxpemVyKSx0eXBlb2YgeT09InN0cmluZyImJihkWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24vanNvbiIpKTp1PUpuKHtxdWVyeTppLHZhcmlhYmxlczpyLG9wZXJhdGlvbk5hbWU6cyxqc29uU2VyaWFsaXplcjooTj1jLmpzb25TZXJpYWxpemVyKSE9bnVsbD9OOkZ9KTtjb25zdCB2PUQoe21ldGhvZDplLGhlYWRlcnM6ZCxib2R5Onl9LGMpO2xldCBUPW4sbT12O2lmKGgpe2NvbnN0IFI9eWllbGQgUHJvbWlzZS5yZXNvbHZlKGgoVWUoRCh7fSx2KSx7dXJsOm4sb3BlcmF0aW9uTmFtZTpzLHZhcmlhYmxlczpyfSkpKSx7dXJsOnF9PVIsZz12ZShSLFsidXJsIl0pO1Q9cSxtPWd9cmV0dXJuIHUmJihUPWAke1R9PyR7dX1gKSx5aWVsZCBvKFQsbSl9KTtjbGFzcyBYbntjb25zdHJ1Y3Rvcih0LG49e30pe3RoaXMudXJsPXQsdGhpcy5yZXF1ZXN0Q29uZmlnPW4sdGhpcy5yYXdSZXF1ZXN0PSguLi5pKT0+Sih0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbcixzLG9dPWksYz1PZShyLHMsbyksUj10aGlzLnJlcXVlc3RDb25maWcse2hlYWRlcnM6aCxmZXRjaDpkPVJlLG1ldGhvZDp1PSJQT1NUIixyZXF1ZXN0TWlkZGxld2FyZTp5LHJlc3BvbnNlTWlkZGxld2FyZTp2fT1SLFQ9dmUoUixbImhlYWRlcnMiLCJmZXRjaCIsIm1ldGhvZCIsInJlcXVlc3RNaWRkbGV3YXJlIiwicmVzcG9uc2VNaWRkbGV3YXJlIl0pLHt1cmw6bX09dGhpcztjLnNpZ25hbCE9PXZvaWQgMCYmKFQuc2lnbmFsPWMuc2lnbmFsKTtjb25zdHtvcGVyYXRpb25OYW1lOk59PUplKGMucXVlcnkpO3JldHVybiBXZSh7dXJsOm0scXVlcnk6Yy5xdWVyeSx2YXJpYWJsZXM6Yy52YXJpYWJsZXMsaGVhZGVyczpEKEQoe30scGUoWmUoaCkpKSxwZShjLnJlcXVlc3RIZWFkZXJzKSksb3BlcmF0aW9uTmFtZTpOLGZldGNoOmQsbWV0aG9kOnUsZmV0Y2hPcHRpb25zOlQsbWlkZGxld2FyZTp5fSkudGhlbihMPT4odiYmdihMKSxMKSkuY2F0Y2goTD0+e3Rocm93IHYmJnYoTCksTH0pfSl9cmVxdWVzdCh0LC4uLm4pe3JldHVybiBKKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtpLHJdPW4scz1lZSh0LGksciksTj10aGlzLnJlcXVlc3RDb25maWcse2hlYWRlcnM6byxmZXRjaDpjPVJlLG1ldGhvZDpoPSJQT1NUIixyZXF1ZXN0TWlkZGxld2FyZTpkLHJlc3BvbnNlTWlkZGxld2FyZTp1fT1OLHk9dmUoTixbImhlYWRlcnMiLCJmZXRjaCIsIm1ldGhvZCIsInJlcXVlc3RNaWRkbGV3YXJlIiwicmVzcG9uc2VNaWRkbGV3YXJlIl0pLHt1cmw6dn09dGhpcztzLnNpZ25hbCE9PXZvaWQgMCYmKHkuc2lnbmFsPXMuc2lnbmFsKTtjb25zdHtxdWVyeTpULG9wZXJhdGlvbk5hbWU6bX09SmUocy5kb2N1bWVudCk7cmV0dXJuIFdlKHt1cmw6dixxdWVyeTpULHZhcmlhYmxlczpzLnZhcmlhYmxlcyxoZWFkZXJzOkQoRCh7fSxwZShaZShvKSkpLHBlKHMucmVxdWVzdEhlYWRlcnMpKSxvcGVyYXRpb25OYW1lOm0sZmV0Y2g6YyxtZXRob2Q6aCxmZXRjaE9wdGlvbnM6eSxtaWRkbGV3YXJlOmR9KS50aGVuKFI9Pih1JiZ1KFIpLFIuZGF0YSkpLmNhdGNoKFI9Pnt0aHJvdyB1JiZ1KFIpLFJ9KX0pfWJhdGNoUmVxdWVzdHModCxuKXt2YXIgZDtjb25zdCBpPVZlKHQsbiksaD10aGlzLnJlcXVlc3RDb25maWcse2hlYWRlcnM6cn09aCxzPXZlKGgsWyJoZWFkZXJzIl0pO2kuc2lnbmFsIT09dm9pZCAwJiYocy5zaWduYWw9aS5zaWduYWwpO2NvbnN0IG89aS5kb2N1bWVudHMubWFwKCh7ZG9jdW1lbnQ6dX0pPT5KZSh1KS5xdWVyeSksYz1pLmRvY3VtZW50cy5tYXAoKHt2YXJpYWJsZXM6dX0pPT51KTtyZXR1cm4gV2Uoe3VybDp0aGlzLnVybCxxdWVyeTpvLHZhcmlhYmxlczpjLGhlYWRlcnM6RChEKHt9LHBlKFplKHIpKSkscGUoaS5yZXF1ZXN0SGVhZGVycykpLG9wZXJhdGlvbk5hbWU6dm9pZCAwLGZldGNoOihkPXRoaXMucmVxdWVzdENvbmZpZy5mZXRjaCkhPW51bGw/ZDpSZSxtZXRob2Q6dGhpcy5yZXF1ZXN0Q29uZmlnLm1ldGhvZHx8IlBPU1QiLGZldGNoT3B0aW9uczpzLG1pZGRsZXdhcmU6dGhpcy5yZXF1ZXN0Q29uZmlnLnJlcXVlc3RNaWRkbGV3YXJlfSkudGhlbih1PT4odGhpcy5yZXF1ZXN0Q29uZmlnLnJlc3BvbnNlTWlkZGxld2FyZSYmdGhpcy5yZXF1ZXN0Q29uZmlnLnJlc3BvbnNlTWlkZGxld2FyZSh1KSx1LmRhdGEpKS5jYXRjaCh1PT57dGhyb3cgdGhpcy5yZXF1ZXN0Q29uZmlnLnJlc3BvbnNlTWlkZGxld2FyZSYmdGhpcy5yZXF1ZXN0Q29uZmlnLnJlc3BvbnNlTWlkZGxld2FyZSh1KSx1fSl9c2V0SGVhZGVycyh0KXtyZXR1cm4gdGhpcy5yZXF1ZXN0Q29uZmlnLmhlYWRlcnM9dCx0aGlzfXNldEhlYWRlcih0LG4pe2NvbnN0e2hlYWRlcnM6aX09dGhpcy5yZXF1ZXN0Q29uZmlnO3JldHVybiBpP2lbdF09bjp0aGlzLnJlcXVlc3RDb25maWcuaGVhZGVycz17W3RdOm59LHRoaXN9c2V0RW5kcG9pbnQodCl7cmV0dXJuIHRoaXMudXJsPXQsdGhpc319Y29uc3QgV2U9ZT0+Sih0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIHUseTtjb25zdHtxdWVyeTp0LHZhcmlhYmxlczpuLGZldGNoT3B0aW9uczppfT1lLHI9UW4oQigodT1lLm1ldGhvZCkhPW51bGw/dToicG9zdCIpKSxzPUFycmF5LmlzQXJyYXkoZS5xdWVyeSksbz15aWVsZCByKGUpLGM9eWllbGQgWm4obywoeT1pLmpzb25TZXJpYWxpemVyKSE9bnVsbD95OkYpLGg9QXJyYXkuaXNBcnJheShjKT8hYy5zb21lKCh7ZGF0YTpUfSk9PiFUKTohIWMuZGF0YSxkPUFycmF5LmlzQXJyYXkoYyl8fCFjLmVycm9yc3x8QXJyYXkuaXNBcnJheShjLmVycm9ycykmJiFjLmVycm9ycy5sZW5ndGh8fGkuZXJyb3JQb2xpY3k9PT0iYWxsInx8aS5lcnJvclBvbGljeT09PSJpZ25vcmUiO2lmKG8ub2smJmQmJmgpe2NvbnN0IHY9KEFycmF5LmlzQXJyYXkoYyksYykse2Vycm9yczpUfT12LG09dmUodixbImVycm9ycyJdKSxOPWkuZXJyb3JQb2xpY3k9PT0iaWdub3JlIj9tOmM7cmV0dXJuIFVlKEQoe30scz97ZGF0YTpOfTpOKSx7aGVhZGVyczpvLmhlYWRlcnMsc3RhdHVzOm8uc3RhdHVzfSl9ZWxzZXtjb25zdCBUPXR5cGVvZiBjPT0ic3RyaW5nIj97ZXJyb3I6Y306Yzt0aHJvdyBuZXcgZGUoVWUoRCh7fSxUKSx7c3RhdHVzOm8uc3RhdHVzLGhlYWRlcnM6by5oZWFkZXJzfSkse3F1ZXJ5OnQsdmFyaWFibGVzOm59KX19KSxXbj0oZSx0LG4saSk9Pntjb25zdCByPWkhPW51bGw/aTpGO2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiByLnN0cmluZ2lmeSh7cXVlcnk6ZSx2YXJpYWJsZXM6dCxvcGVyYXRpb25OYW1lOm59KTtpZih0eXBlb2YgdCE9InVuZGVmaW5lZCImJiFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNyZWF0ZSByZXF1ZXN0IGJvZHkgd2l0aCBnaXZlbiB2YXJpYWJsZSB0eXBlLCBhcnJheSBleHBlY3RlZCIpO2NvbnN0IHM9ZS5yZWR1Y2UoKG8sYyxoKT0+KG8ucHVzaCh7cXVlcnk6Yyx2YXJpYWJsZXM6dD90W2hdOnZvaWQgMH0pLG8pLFtdKTtyZXR1cm4gci5zdHJpbmdpZnkocyl9LFpuPShlLHQpPT5KKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtsZXQgbjtyZXR1cm4gZS5oZWFkZXJzLmZvckVhY2goKGkscik9PntyLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIiYmKG49aSl9KSxuJiYobi50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImFwcGxpY2F0aW9uL2pzb24iKXx8bi50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoImFwcGxpY2F0aW9uL2dyYXBocWwranNvbiIpfHxuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vZ3JhcGhxbC1yZXNwb25zZStqc29uIikpP3QucGFyc2UoeWllbGQgZS50ZXh0KCkpOmUudGV4dCgpfSksWmU9ZT0+dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSgpOmU7dmFyIEtlPXtleHBvcnRzOnt9fTsoZnVuY3Rpb24oZSx0KXt0PWUuZXhwb3J0cz1uLHQuZ2V0U2VyaWFsaXplPWk7ZnVuY3Rpb24gbihyLHMsbyxjKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocixpKHMsYyksbyl9ZnVuY3Rpb24gaShyLHMpe3ZhciBvPVtdLGM9W107cmV0dXJuIHM9PW51bGwmJihzPWZ1bmN0aW9uKGgsZCl7cmV0dXJuIG9bMF09PT1kPyJbQ2lyY3VsYXIgfl0iOiJbQ2lyY3VsYXIgfi4iK2Muc2xpY2UoMCxvLmluZGV4T2YoZCkpLmpvaW4oIi4iKSsiXSJ9KSxmdW5jdGlvbihoLGQpe2lmKG8ubGVuZ3RoPjApe3ZhciB1PW8uaW5kZXhPZih0aGlzKTt+dT9vLnNwbGljZSh1KzEpOm8ucHVzaCh0aGlzKSx+dT9jLnNwbGljZSh1LDEvMCxoKTpjLnB1c2goaCksfm8uaW5kZXhPZihkKSYmKGQ9cy5jYWxsKHRoaXMsaCxkKSl9ZWxzZSBvLnB1c2goZCk7cmV0dXJuIHI9PW51bGw/ZDpyLmNhbGwodGhpcyxoLGQpfX19KShLZSxLZS5leHBvcnRzKTt2YXIgS249S2UuZXhwb3J0cyxtZT1MdChLbik7Y29uc3QgRnQ9MWUzKjE1O3ZhciBMZT1mdW5jdGlvbigpe3JldHVybiBMZT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIG4saT0xLHI9YXJndW1lbnRzLmxlbmd0aDtpPHI7aSsrKXtuPWFyZ3VtZW50c1tpXTtmb3IodmFyIHMgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixzKSYmKHRbc109bltzXSl9cmV0dXJuIHR9LExlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dHlwZW9mIFN1cHByZXNzZWRFcnJvcj09ImZ1bmN0aW9uIiYmU3VwcHJlc3NlZEVycm9yO3ZhciBQZT1uZXcgTWFwLGV0PW5ldyBNYXAsTXQ9ITAsRmU9ITE7ZnVuY3Rpb24gQnQoZSl7cmV0dXJuIGUucmVwbGFjZSgvW1xzLF0rL2csIiAiKS50cmltKCl9ZnVuY3Rpb24gZXIoZSl7cmV0dXJuIEJ0KGUuc291cmNlLmJvZHkuc3Vic3RyaW5nKGUuc3RhcnQsZS5lbmQpKX1mdW5jdGlvbiB0cihlKXt2YXIgdD1uZXcgU2V0LG49W107cmV0dXJuIGUuZGVmaW5pdGlvbnMuZm9yRWFjaChmdW5jdGlvbihpKXtpZihpLmtpbmQ9PT0iRnJhZ21lbnREZWZpbml0aW9uIil7dmFyIHI9aS5uYW1lLnZhbHVlLHM9ZXIoaS5sb2MpLG89ZXQuZ2V0KHIpO28mJiFvLmhhcyhzKT9NdCYmY29uc29sZS53YXJuKCJXYXJuaW5nOiBmcmFnbWVudCB3aXRoIG5hbWUgIityK2AgYWxyZWFkeSBleGlzdHMuCmdyYXBocWwtdGFnIGVuZm9yY2VzIGFsbCBmcmFnbWVudCBuYW1lcyBhY3Jvc3MgeW91ciBhcHBsaWNhdGlvbiB0byBiZSB1bmlxdWU7IHJlYWQgbW9yZSBhYm91dAp0aGlzIGluIHRoZSBkb2NzOiBodHRwOi8vZGV2LmFwb2xsb2RhdGEuY29tL2NvcmUvZnJhZ21lbnRzLmh0bWwjdW5pcXVlLW5hbWVzYCk6b3x8ZXQuc2V0KHIsbz1uZXcgU2V0KSxvLmFkZChzKSx0LmhhcyhzKXx8KHQuYWRkKHMpLG4ucHVzaChpKSl9ZWxzZSBuLnB1c2goaSl9KSxMZShMZSh7fSxlKSx7ZGVmaW5pdGlvbnM6bn0pfWZ1bmN0aW9uIG5yKGUpe3ZhciB0PW5ldyBTZXQoZS5kZWZpbml0aW9ucyk7dC5mb3JFYWNoKGZ1bmN0aW9uKGkpe2kubG9jJiZkZWxldGUgaS5sb2MsT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgcz1pW3JdO3MmJnR5cGVvZiBzPT0ib2JqZWN0IiYmdC5hZGQocyl9KX0pO3ZhciBuPWUubG9jO3JldHVybiBuJiYoZGVsZXRlIG4uc3RhcnRUb2tlbixkZWxldGUgbi5lbmRUb2tlbiksZX1mdW5jdGlvbiBycihlKXt2YXIgdD1CdChlKTtpZighUGUuaGFzKHQpKXt2YXIgbj1EdChlLHtleHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlczpGZSxhbGxvd0xlZ2FjeUZyYWdtZW50VmFyaWFibGVzOkZlfSk7aWYoIW58fG4ua2luZCE9PSJEb2N1bWVudCIpdGhyb3cgbmV3IEVycm9yKCJOb3QgYSB2YWxpZCBHcmFwaFFMIGRvY3VtZW50LiIpO1BlLnNldCh0LG5yKHRyKG4pKSl9cmV0dXJuIFBlLmdldCh0KX1mdW5jdGlvbiBRKGUpe2Zvcih2YXIgdD1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0W24tMV09YXJndW1lbnRzW25dO3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKTt2YXIgaT1lWzBdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24ocixzKXtyJiZyLmtpbmQ9PT0iRG9jdW1lbnQiP2krPXIubG9jLnNvdXJjZS5ib2R5OmkrPXIsaSs9ZVtzKzFdfSkscnIoaSl9ZnVuY3Rpb24gaXIoKXtQZS5jbGVhcigpLGV0LmNsZWFyKCl9ZnVuY3Rpb24gc3IoKXtNdD0hMX1mdW5jdGlvbiBvcigpe0ZlPSEwfWZ1bmN0aW9uIGFyKCl7RmU9ITF9dmFyIE5lPXtncWw6USxyZXNldENhY2hlczppcixkaXNhYmxlRnJhZ21lbnRXYXJuaW5nczpzcixlbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlczpvcixkaXNhYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXM6YXJ9OyhmdW5jdGlvbihlKXtlLmdxbD1OZS5ncWwsZS5yZXNldENhY2hlcz1OZS5yZXNldENhY2hlcyxlLmRpc2FibGVGcmFnbWVudFdhcm5pbmdzPU5lLmRpc2FibGVGcmFnbWVudFdhcm5pbmdzLGUuZW5hYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXM9TmUuZW5hYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXMsZS5kaXNhYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXM9TmUuZGlzYWJsZUV4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzfSkoUXx8KFE9e30pKSxRLmRlZmF1bHQ9UTtjb25zdCAkdD1RYAoJZnJhZ21lbnQgTWF0Y2hQYXJ0cyBvbiBNYXRjaENvbmZpZyB7CgkJcmVnZXhWYWx1ZQoJCW1hdGNoVmFsdWUKCX0KYCxjcj1RYAoJbXV0YXRpb24gUHVzaFBheWxvYWQoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHBheWxvYWRfaWQ6IElEIQoJCSRldmVudHM6IFJlcGxheUV2ZW50c0lucHV0IQoJCSRtZXNzYWdlczogU3RyaW5nIQoJCSRyZXNvdXJjZXM6IFN0cmluZyEKCQkkd2ViX3NvY2tldF9ldmVudHM6IFN0cmluZyEKCQkkZXJyb3JzOiBbRXJyb3JPYmplY3RJbnB1dF0hCgkJJGlzX2JlYWNvbjogQm9vbGVhbgoJCSRoYXNfc2Vzc2lvbl91bmxvYWRlZDogQm9vbGVhbgoJCSRoaWdobGlnaHRfbG9nczogU3RyaW5nCgkpIHsKCQlwdXNoUGF5bG9hZCgKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQlwYXlsb2FkX2lkOiAkcGF5bG9hZF9pZAoJCQlldmVudHM6ICRldmVudHMKCQkJbWVzc2FnZXM6ICRtZXNzYWdlcwoJCQlyZXNvdXJjZXM6ICRyZXNvdXJjZXMKCQkJd2ViX3NvY2tldF9ldmVudHM6ICR3ZWJfc29ja2V0X2V2ZW50cwoJCQllcnJvcnM6ICRlcnJvcnMKCQkJaXNfYmVhY29uOiAkaXNfYmVhY29uCgkJCWhhc19zZXNzaW9uX3VubG9hZGVkOiAkaGFzX3Nlc3Npb25fdW5sb2FkZWQKCQkJaGlnaGxpZ2h0X2xvZ3M6ICRoaWdobGlnaHRfbG9ncwoJCSkKCX0KYCx1cj1RYAoJbXV0YXRpb24gUHVzaFNlc3Npb25FdmVudHMoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHBheWxvYWRfaWQ6IEludDY0SUQhCgkJJGRhdGE6IFN0cmluZyEKCSkgewoJCXB1c2hTZXNzaW9uRXZlbnRzKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXBheWxvYWRfaWQ6ICRwYXlsb2FkX2lkCgkJCWRhdGE6ICRkYXRhCgkJKQoJfQpgLGxyPVFgCgltdXRhdGlvbiBpZGVudGlmeVNlc3Npb24oCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHVzZXJfaWRlbnRpZmllcjogU3RyaW5nIQoJCSR1c2VyX29iamVjdDogQW55CgkpIHsKCQlpZGVudGlmeVNlc3Npb24oCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJdXNlcl9pZGVudGlmaWVyOiAkdXNlcl9pZGVudGlmaWVyCgkJCXVzZXJfb2JqZWN0OiAkdXNlcl9vYmplY3QKCQkpCgl9CmAsaHI9UWAKCW11dGF0aW9uIGFkZFNlc3Npb25Qcm9wZXJ0aWVzKAoJCSRzZXNzaW9uX3NlY3VyZV9pZDogU3RyaW5nIQoJCSRwcm9wZXJ0aWVzX29iamVjdDogQW55CgkpIHsKCQlhZGRTZXNzaW9uUHJvcGVydGllcygKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQlwcm9wZXJ0aWVzX29iamVjdDogJHByb3BlcnRpZXNfb2JqZWN0CgkJKQoJfQpgLGZyPVFgCgltdXRhdGlvbiBwdXNoTWV0cmljcygkbWV0cmljczogW01ldHJpY0lucHV0XSEpIHsKCQlwdXNoTWV0cmljcyhtZXRyaWNzOiAkbWV0cmljcykKCX0KYCxkcj1RYAoJbXV0YXRpb24gYWRkU2Vzc2lvbkZlZWRiYWNrKAoJCSRzZXNzaW9uX3NlY3VyZV9pZDogU3RyaW5nIQoJCSR1c2VyX25hbWU6IFN0cmluZwoJCSR1c2VyX2VtYWlsOiBTdHJpbmcKCQkkdmVyYmF0aW06IFN0cmluZyEKCQkkdGltZXN0YW1wOiBUaW1lc3RhbXAhCgkpIHsKCQlhZGRTZXNzaW9uRmVlZGJhY2soCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJdXNlcl9uYW1lOiAkdXNlcl9uYW1lCgkJCXVzZXJfZW1haWw6ICR1c2VyX2VtYWlsCgkJCXZlcmJhdGltOiAkdmVyYmF0aW0KCQkJdGltZXN0YW1wOiAkdGltZXN0YW1wCgkJKQoJfQpgLHByPVFgCgltdXRhdGlvbiBpbml0aWFsaXplU2Vzc2lvbigKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkc2Vzc2lvbl9rZXk6IFN0cmluZwoJCSRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nIQoJCSRlbmFibGVfc3RyaWN0X3ByaXZhY3k6IEJvb2xlYW4hCgkJJHByaXZhY3lfc2V0dGluZzogU3RyaW5nIQoJCSRlbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHM6IEJvb2xlYW4hCgkJJGNsaWVudFZlcnNpb246IFN0cmluZyEKCQkkZmlyc3Rsb2FkVmVyc2lvbjogU3RyaW5nIQoJCSRjbGllbnRDb25maWc6IFN0cmluZyEKCQkkZW52aXJvbm1lbnQ6IFN0cmluZyEKCQkkaWQ6IFN0cmluZyEKCQkkYXBwVmVyc2lvbjogU3RyaW5nCgkJJHNlcnZpY2VOYW1lOiBTdHJpbmchCgkJJGNsaWVudF9pZDogU3RyaW5nIQoJCSRuZXR3b3JrX3JlY29yZGluZ19kb21haW5zOiBbU3RyaW5nIV0KCQkkZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogQm9vbGVhbgoJKSB7CgkJaW5pdGlhbGl6ZVNlc3Npb24oCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJc2Vzc2lvbl9rZXk6ICRzZXNzaW9uX2tleQoJCQlvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogJG9yZ2FuaXphdGlvbl92ZXJib3NlX2lkCgkJCWVuYWJsZV9zdHJpY3RfcHJpdmFjeTogJGVuYWJsZV9zdHJpY3RfcHJpdmFjeQoJCQllbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHM6ICRlbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHMKCQkJY2xpZW50VmVyc2lvbjogJGNsaWVudFZlcnNpb24KCQkJZmlyc3Rsb2FkVmVyc2lvbjogJGZpcnN0bG9hZFZlcnNpb24KCQkJY2xpZW50Q29uZmlnOiAkY2xpZW50Q29uZmlnCgkJCWVudmlyb25tZW50OiAkZW52aXJvbm1lbnQKCQkJYXBwVmVyc2lvbjogJGFwcFZlcnNpb24KCQkJc2VydmljZU5hbWU6ICRzZXJ2aWNlTmFtZQoJCQlmaW5nZXJwcmludDogJGlkCgkJCWNsaWVudF9pZDogJGNsaWVudF9pZAoJCQluZXR3b3JrX3JlY29yZGluZ19kb21haW5zOiAkbmV0d29ya19yZWNvcmRpbmdfZG9tYWlucwoJCQlkaXNhYmxlX3Nlc3Npb25fcmVjb3JkaW5nOiAkZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZwoJCQlwcml2YWN5X3NldHRpbmc6ICRwcml2YWN5X3NldHRpbmcKCQkpIHsKCQkJc2VjdXJlX2lkCgkJCXByb2plY3RfaWQKCQkJc2FtcGxpbmcgewoJCQkJc3BhbnMgewoJCQkJCW5hbWUgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQlrZXkgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQl9CgkJCQkJZXZlbnRzIHsKCQkJCQkJbmFtZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQkJYXR0cmlidXRlcyB7CgkJCQkJCQlrZXkgewoJCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJCX0KCQkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCXNhbXBsaW5nUmF0aW8KCQkJCX0KCQkJCWxvZ3MgewoJCQkJCW1lc3NhZ2UgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCXNldmVyaXR5VGV4dCB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQkJYXR0cmlidXRlcyB7CgkJCQkJCWtleSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQkJYXR0cmlidXRlIHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCX0KCQkJCQlzYW1wbGluZ1JhdGlvCgkJCQl9CgkJCX0KCQl9Cgl9CgkkeyR0fQpgLG1yPVFgCglxdWVyeSBJZ25vcmUoJGlkOiBJRCEpIHsKCQlpZ25vcmUoaWQ6ICRpZCkKCX0KYCx5cj1RYAoJcXVlcnkgR2V0U2FtcGxpbmdDb25maWcoJG9yZ2FuaXphdGlvbl92ZXJib3NlX2lkOiBTdHJpbmchKSB7CgkJc2FtcGxpbmcob3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQ6ICRvcmdhbml6YXRpb25fdmVyYm9zZV9pZCkgewoJCQlzcGFucyB7CgkJCQluYW1lIHsKCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQl9CgkJCQlhdHRyaWJ1dGVzIHsKCQkJCQlrZXkgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQl9CgkJCQlldmVudHMgewoJCQkJCW5hbWUgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQlrZXkgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlzYW1wbGluZ1JhdGlvCgkJCX0KCQkJbG9ncyB7CgkJCQltZXNzYWdlIHsKCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQl9CgkJCQlzZXZlcml0eVRleHQgewoJCQkJCS4uLk1hdGNoUGFydHMKCQkJCX0KCQkJCWF0dHJpYnV0ZXMgewoJCQkJCWtleSB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQkJYXR0cmlidXRlIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCX0KCQkJCXNhbXBsaW5nUmF0aW8KCQkJfQoJCX0KCX0KCSR7JHR9CmAsZ3I9KGUsdCxuLGkpPT5lKCk7ZnVuY3Rpb24gdnIoZSx0PWdyKXtyZXR1cm57UHVzaFBheWxvYWQobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoY3IsbixEKEQoe30saSkscikpLCJQdXNoUGF5bG9hZCIsIm11dGF0aW9uIixuKX0sUHVzaFNlc3Npb25FdmVudHMobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QodXIsbixEKEQoe30saSkscikpLCJQdXNoU2Vzc2lvbkV2ZW50cyIsIm11dGF0aW9uIixuKX0saWRlbnRpZnlTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KGxyLG4sRChEKHt9LGkpLHIpKSwiaWRlbnRpZnlTZXNzaW9uIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uUHJvcGVydGllcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChocixuLEQoRCh7fSxpKSxyKSksImFkZFNlc3Npb25Qcm9wZXJ0aWVzIiwibXV0YXRpb24iLG4pfSxwdXNoTWV0cmljcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChmcixuLEQoRCh7fSxpKSxyKSksInB1c2hNZXRyaWNzIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uRmVlZGJhY2sobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoZHIsbixEKEQoe30saSkscikpLCJhZGRTZXNzaW9uRmVlZGJhY2siLCJtdXRhdGlvbiIsbil9LGluaXRpYWxpemVTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KHByLG4sRChEKHt9LGkpLHIpKSwiaW5pdGlhbGl6ZVNlc3Npb24iLCJtdXRhdGlvbiIsbil9LElnbm9yZShuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChtcixuLEQoRCh7fSxpKSxyKSksIklnbm9yZSIsInF1ZXJ5IixuKX0sR2V0U2FtcGxpbmdDb25maWcobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoeXIsbixEKEQoe30saSkscikpLCJHZXRTYW1wbGluZ0NvbmZpZyIsInF1ZXJ5IixuKX19fXZhciB0ZT1VaW50OEFycmF5LG5lPVVpbnQxNkFycmF5LHR0PUludDMyQXJyYXksbnQ9bmV3IHRlKFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsMCwwLDBdKSxydD1uZXcgdGUoWzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMCwwXSksVXQ9bmV3IHRlKFsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XSksVnQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49bmV3IG5lKDMxKSxpPTA7aTwzMTsrK2kpbltpXT10Kz0xPDxlW2ktMV07Zm9yKHZhciByPW5ldyB0dChuWzMwXSksaT0xO2k8MzA7KytpKWZvcih2YXIgcz1uW2ldO3M8bltpKzFdOysrcylyW3NdPXMtbltpXTw8NXxpO3JldHVybntiOm4scn19LHF0PVZ0KG50LDIpLEVyPXF0LmIsaXQ9cXQucjtFclsyOF09MjU4LGl0WzI1OF09Mjg7Zm9yKHZhciBfcj1WdChydCwwKSxqdD1fci5yLHN0PW5ldyBuZSgzMjc2OCksTT0wO008MzI3Njg7KytNKXt2YXIgYWU9KE0mNDM2OTApPj4xfChNJjIxODQ1KTw8MTthZT0oYWUmNTI0MjgpPj4yfChhZSYxMzEwNyk8PDIsYWU9KGFlJjYxNjgwKT4+NHwoYWUmMzg1NSk8PDQsc3RbTV09KChhZSY2NTI4MCk+Pjh8KGFlJjI1NSk8PDgpPj4xfWZvcih2YXIgeGU9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgaT1lLmxlbmd0aCxyPTAscz1uZXcgbmUodCk7cjxpOysrcillW3JdJiYrK3NbZVtyXS0xXTt2YXIgbz1uZXcgbmUodCk7Zm9yKHI9MTtyPHQ7KytyKW9bcl09b1tyLTFdK3Nbci0xXTw8MTt2YXIgYztpZihuKXtjPW5ldyBuZSgxPDx0KTt2YXIgaD0xNS10O2ZvcihyPTA7cjxpOysrcilpZihlW3JdKWZvcih2YXIgZD1yPDw0fGVbcl0sdT10LWVbcl0seT1vW2Vbcl0tMV0rKzw8dSx2PXl8KDE8PHUpLTE7eTw9djsrK3kpY1tzdFt5XT4+aF09ZH1lbHNlIGZvcihjPW5ldyBuZShpKSxyPTA7cjxpOysrcillW3JdJiYoY1tyXT1zdFtvW2Vbcl0tMV0rK10+PjE1LWVbcl0pO3JldHVybiBjfSx1ZT1uZXcgdGUoMjg4KSxNPTA7TTwxNDQ7KytNKXVlW01dPTg7Zm9yKHZhciBNPTE0NDtNPDI1NjsrK00pdWVbTV09OTtmb3IodmFyIE09MjU2O008MjgwOysrTSl1ZVtNXT03O2Zvcih2YXIgTT0yODA7TTwyODg7KytNKXVlW01dPTg7Zm9yKHZhciBNZT1uZXcgdGUoMzIpLE09MDtNPDMyOysrTSlNZVtNXT01O3ZhciBicj14ZSh1ZSw5LDApLFRyPXhlKE1lLDUsMCksR3Q9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrNykvOHwwfSx6dD1mdW5jdGlvbihlLHQsbil7cmV0dXJuKG49PW51bGx8fG4+ZS5sZW5ndGgpJiYobj1lLmxlbmd0aCksbmV3IHRlKGUuc3ViYXJyYXkodCxuKSl9LG9lPWZ1bmN0aW9uKGUsdCxuKXtuPDw9dCY3O3ZhciBpPXQvOHwwO2VbaV18PW4sZVtpKzFdfD1uPj44fSxBZT1mdW5jdGlvbihlLHQsbil7bjw8PXQmNzt2YXIgaT10Lzh8MDtlW2ldfD1uLGVbaSsxXXw9bj4+OCxlW2krMl18PW4+PjE2fSxvdD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxpPTA7aTxlLmxlbmd0aDsrK2kpZVtpXSYmbi5wdXNoKHtzOmksZjplW2ldfSk7dmFyIHI9bi5sZW5ndGgscz1uLnNsaWNlKCk7aWYoIXIpcmV0dXJue3Q6UXQsbDowfTtpZihyPT0xKXt2YXIgbz1uZXcgdGUoblswXS5zKzEpO3JldHVybiBvW25bMF0uc109MSx7dDpvLGw6MX19bi5zb3J0KGZ1bmN0aW9uKHcsayl7cmV0dXJuIHcuZi1rLmZ9KSxuLnB1c2goe3M6LTEsZjoyNTAwMX0pO3ZhciBjPW5bMF0saD1uWzFdLGQ9MCx1PTEseT0yO2ZvcihuWzBdPXtzOi0xLGY6Yy5mK2guZixsOmMscjpofTt1IT1yLTE7KWM9bltuW2RdLmY8blt5XS5mP2QrKzp5KytdLGg9bltkIT11JiZuW2RdLmY8blt5XS5mP2QrKzp5KytdLG5bdSsrXT17czotMSxmOmMuZitoLmYsbDpjLHI6aH07Zm9yKHZhciB2PXNbMF0ucyxpPTE7aTxyOysraSlzW2ldLnM+diYmKHY9c1tpXS5zKTt2YXIgVD1uZXcgbmUodisxKSxtPWF0KG5bdS0xXSxULDApO2lmKG0+dCl7dmFyIGk9MCxOPTAsUj1tLXQsTD0xPDxSO2ZvcihzLnNvcnQoZnVuY3Rpb24oayxQKXtyZXR1cm4gVFtQLnNdLVRbay5zXXx8ay5mLVAuZn0pO2k8cjsrK2kpe3ZhciBxPXNbaV0ucztpZihUW3FdPnQpTis9TC0oMTw8bS1UW3FdKSxUW3FdPXQ7ZWxzZSBicmVha31mb3IoTj4+PVI7Tj4wOyl7dmFyIGc9c1tpXS5zO1RbZ108dD9OLT0xPDx0LVRbZ10rKy0xOisraX1mb3IoO2k+PTAmJk47LS1pKXt2YXIgRT1zW2ldLnM7VFtFXT09dCYmKC0tVFtFXSwrK04pfW09dH1yZXR1cm57dDpuZXcgdGUoVCksbDptfX0sYXQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnM9PS0xP01hdGgubWF4KGF0KGUubCx0LG4rMSksYXQoZS5yLHQsbisxKSk6dFtlLnNdPW59LEh0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDt0JiYhZVstLXRdOyk7Zm9yKHZhciBuPW5ldyBuZSgrK3QpLGk9MCxyPWVbMF0scz0xLG89ZnVuY3Rpb24oaCl7bltpKytdPWh9LGM9MTtjPD10OysrYylpZihlW2NdPT1yJiZjIT10KSsrcztlbHNle2lmKCFyJiZzPjIpe2Zvcig7cz4xMzg7cy09MTM4KW8oMzI3NTQpO3M+MiYmKG8ocz4xMD9zLTExPDw1fDI4NjkwOnMtMzw8NXwxMjMwNSkscz0wKX1lbHNlIGlmKHM+Myl7Zm9yKG8ociksLS1zO3M+NjtzLT02KW8oODMwNCk7cz4yJiYobyhzLTM8PDV8ODIwOCkscz0wKX1mb3IoO3MtLTspbyhyKTtzPTEscj1lW2NdfXJldHVybntjOm4uc3ViYXJyYXkoMCxpKSxuOnR9fSxJZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLGk9MDtpPHQubGVuZ3RoOysraSluKz1lW2ldKnRbaV07cmV0dXJuIG59LFl0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uLmxlbmd0aCxyPUd0KHQrMik7ZVtyXT1pJjI1NSxlW3IrMV09aT4+OCxlW3IrMl09ZVtyXV4yNTUsZVtyKzNdPWVbcisxXV4yNTU7Zm9yKHZhciBzPTA7czxpOysrcyllW3Ircys0XT1uW3NdO3JldHVybihyKzQraSkqOH0sSnQ9ZnVuY3Rpb24oZSx0LG4saSxyLHMsbyxjLGgsZCx1KXtvZSh0LHUrKyxuKSwrK3JbMjU2XTtmb3IodmFyIHk9b3QociwxNSksdj15LnQsVD15LmwsbT1vdChzLDE1KSxOPW0udCxSPW0ubCxMPUh0KHYpLHE9TC5jLGc9TC5uLEU9SHQoTiksdz1FLmMsaz1FLm4sUD1uZXcgbmUoMTkpLEk9MDtJPHEubGVuZ3RoOysrSSkrK1BbcVtJXSYzMV07Zm9yKHZhciBJPTA7STx3Lmxlbmd0aDsrK0kpKytQW3dbSV0mMzFdO2Zvcih2YXIgeD1vdChQLDcpLHo9eC50LFY9eC5sLEg9MTk7SD40JiYheltVdFtILTFdXTstLUgpO3ZhciBYPWQrNTw8MyxhPUllKHIsdWUpK0llKHMsTWUpK28sZj1JZShyLHYpK0llKHMsTikrbysxNCszKkgrSWUoUCx6KSsyKlBbMTZdKzMqUFsxN10rNypQWzE4XTtpZihoPj0wJiZYPD1hJiZYPD1mKXJldHVybiBZdCh0LHUsZS5zdWJhcnJheShoLGgrZCkpO3ZhciBfLFMsQyxBO2lmKG9lKHQsdSwxKyhmPGEpKSx1Kz0yLGY8YSl7Xz14ZSh2LFQsMCksUz12LEM9eGUoTixSLDApLEE9Tjt2YXIgSz14ZSh6LFYsMCk7b2UodCx1LGctMjU3KSxvZSh0LHUrNSxrLTEpLG9lKHQsdSsxMCxILTQpLHUrPTE0O2Zvcih2YXIgST0wO0k8SDsrK0kpb2UodCx1KzMqSSx6W1V0W0ldXSk7dSs9MypIO2Zvcih2YXIgaj1bcSx3XSxXPTA7VzwyOysrVylmb3IodmFyIHllPWpbV10sST0wO0k8eWUubGVuZ3RoOysrSSl7dmFyIGllPXllW0ldJjMxO29lKHQsdSxLW2llXSksdSs9eltpZV0saWU+MTUmJihvZSh0LHUseWVbSV0+PjUmMTI3KSx1Kz15ZVtJXT4+MTIpfX1lbHNlIF89YnIsUz11ZSxDPVRyLEE9TWU7Zm9yKHZhciBJPTA7STxjOysrSSl7dmFyIFk9aVtJXTtpZihZPjI1NSl7dmFyIGllPVk+PjE4JjMxO0FlKHQsdSxfW2llKzI1N10pLHUrPVNbaWUrMjU3XSxpZT43JiYob2UodCx1LFk+PjIzJjMxKSx1Kz1udFtpZV0pO3ZhciBnZT1ZJjMxO0FlKHQsdSxDW2dlXSksdSs9QVtnZV0sZ2U+MyYmKEFlKHQsdSxZPj41JjgxOTEpLHUrPXJ0W2dlXSl9ZWxzZSBBZSh0LHUsX1tZXSksdSs9U1tZXX1yZXR1cm4gQWUodCx1LF9bMjU2XSksdStTWzI1Nl19LE5yPW5ldyB0dChbNjU1NDAsMTMxMDgwLDEzMTA4OCwxMzExMDQsMjYyMTc2LDEwNDg3MDQsMTA0ODgzMiwyMTE0NTYwLDIxMTc2MzJdKSxRdD1uZXcgdGUoMCkseHI9ZnVuY3Rpb24oZSx0LG4saSxyLHMpe3ZhciBvPXMuenx8ZS5sZW5ndGgsYz1uZXcgdGUoaStvKzUqKDErTWF0aC5jZWlsKG8vN2UzKSkrciksaD1jLnN1YmFycmF5KGksYy5sZW5ndGgtciksZD1zLmwsdT0ocy5yfHwwKSY3O2lmKHQpe3UmJihoWzBdPXMucj4+Myk7Zm9yKHZhciB5PU5yW3QtMV0sdj15Pj4xMyxUPXkmODE5MSxtPSgxPDxuKS0xLE49cy5wfHxuZXcgbmUoMzI3NjgpLFI9cy5ofHxuZXcgbmUobSsxKSxMPU1hdGguY2VpbChuLzMpLHE9MipMLGc9ZnVuY3Rpb24ocHQpe3JldHVybihlW3B0XV5lW3B0KzFdPDxMXmVbcHQrMl08PHEpJm19LEU9bmV3IHR0KDI1ZTMpLHc9bmV3IG5lKDI4OCksaz1uZXcgbmUoMzIpLFA9MCxJPTAseD1zLml8fDAsej0wLFY9cy53fHwwLEg9MDt4KzI8bzsrK3gpe3ZhciBYPWcoeCksYT14JjMyNzY3LGY9UltYXTtpZihOW2FdPWYsUltYXT1hLFY8PXgpe3ZhciBfPW8teDtpZigoUD43ZTN8fHo+MjQ1NzYpJiYoXz40MjN8fCFkKSl7dT1KdChlLGgsMCxFLHcsayxJLHosSCx4LUgsdSksej1QPUk9MCxIPXg7Zm9yKHZhciBTPTA7UzwyODY7KytTKXdbU109MDtmb3IodmFyIFM9MDtTPDMwOysrUylrW1NdPTB9dmFyIEM9MixBPTAsSz1ULGo9YS1mJjMyNzY3O2lmKF8+MiYmWD09Zyh4LWopKWZvcih2YXIgVz1NYXRoLm1pbih2LF8pLTEseWU9TWF0aC5taW4oMzI3NjcseCksaWU9TWF0aC5taW4oMjU4LF8pO2o8PXllJiYtLUsmJmEhPWY7KXtpZihlW3grQ109PWVbeCtDLWpdKXtmb3IodmFyIFk9MDtZPGllJiZlW3grWV09PWVbeCtZLWpdOysrWSk7aWYoWT5DKXtpZihDPVksQT1qLFk+VylicmVhaztmb3IodmFyIGdlPU1hdGgubWluKGosWS0yKSx0bj0wLFM9MDtTPGdlOysrUyl7dmFyIGZ0PXgtaitTJjMyNzY3LEpyPU5bZnRdLG5uPWZ0LUpyJjMyNzY3O25uPnRuJiYodG49bm4sZj1mdCl9fX1hPWYsZj1OW2FdLGorPWEtZiYzMjc2N31pZihBKXtFW3orK109MjY4NDM1NDU2fGl0W0NdPDwxOHxqdFtBXTt2YXIgcm49aXRbQ10mMzEsc249anRbQV0mMzE7SSs9bnRbcm5dK3J0W3NuXSwrK3dbMjU3K3JuXSwrK2tbc25dLFY9eCtDLCsrUH1lbHNlIEVbeisrXT1lW3hdLCsrd1tlW3hdXX19Zm9yKHg9TWF0aC5tYXgoeCxWKTt4PG87Kyt4KUVbeisrXT1lW3hdLCsrd1tlW3hdXTt1PUp0KGUsaCxkLEUsdyxrLEkseixILHgtSCx1KSxkfHwocy5yPXUmN3xoW3UvOHwwXTw8Myx1LT03LHMuaD1SLHMucD1OLHMuaT14LHMudz1WKX1lbHNle2Zvcih2YXIgeD1zLnd8fDA7eDxvK2Q7eCs9NjU1MzUpe3ZhciBkdD14KzY1NTM1O2R0Pj1vJiYoaFt1Lzh8MF09ZCxkdD1vKSx1PVl0KGgsdSsxLGUuc3ViYXJyYXkoeCxkdCkpfXMuaT1vfXJldHVybiB6dChjLDAsaStHdCh1KStyKX0sQXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IEludDMyQXJyYXkoMjU2KSx0PTA7dDwyNTY7Kyt0KXtmb3IodmFyIG49dCxpPTk7LS1pOyluPShuJjEmJi0zMDY2NzQ5MTIpXm4+Pj4xO2VbdF09bn1yZXR1cm4gZX0oKSxJcj1mdW5jdGlvbigpe3ZhciBlPS0xO3JldHVybntwOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1lLGk9MDtpPHQubGVuZ3RoOysraSluPUFyW24mMjU1XnRbaV1dXm4+Pj44O2U9bn0sZDpmdW5jdGlvbigpe3JldHVybn5lfX19LFNyPWZ1bmN0aW9uKGUsdCxuLGkscil7aWYoIXImJihyPXtsOjF9LHQuZGljdGlvbmFyeSkpe3ZhciBzPXQuZGljdGlvbmFyeS5zdWJhcnJheSgtMzI3NjgpLG89bmV3IHRlKHMubGVuZ3RoK2UubGVuZ3RoKTtvLnNldChzKSxvLnNldChlLHMubGVuZ3RoKSxlPW8sci53PXMubGVuZ3RofXJldHVybiB4cihlLHQubGV2ZWw9PW51bGw/Njp0LmxldmVsLHQubWVtPT1udWxsP3IubD9NYXRoLmNlaWwoTWF0aC5tYXgoOCxNYXRoLm1pbigxMyxNYXRoLmxvZyhlLmxlbmd0aCkpKSoxLjUpOjIwOjEyK3QubWVtLG4saSxyKX0sY3Q9ZnVuY3Rpb24oZSx0LG4pe2Zvcig7bjsrK3QpZVt0XT1uLG4+Pj49OH0sT3I9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmZpbGVuYW1lO2lmKGVbMF09MzEsZVsxXT0xMzksZVsyXT04LGVbOF09dC5sZXZlbDwyPzQ6dC5sZXZlbD09OT8yOjAsZVs5XT0zLHQubXRpbWUhPTAmJmN0KGUsNCxNYXRoLmZsb29yKG5ldyBEYXRlKHQubXRpbWV8fERhdGUubm93KCkpLzFlMykpLG4pe2VbM109ODtmb3IodmFyIGk9MDtpPD1uLmxlbmd0aDsrK2kpZVtpKzEwXT1uLmNoYXJDb2RlQXQoaSl9fSx3cj1mdW5jdGlvbihlKXtyZXR1cm4gMTArKGUuZmlsZW5hbWU/ZS5maWxlbmFtZS5sZW5ndGgrMTowKX07ZnVuY3Rpb24gRHIoZSx0KXt0fHwodD17fSk7dmFyIG49SXIoKSxpPWUubGVuZ3RoO24ucChlKTt2YXIgcj1TcihlLHQsd3IodCksOCkscz1yLmxlbmd0aDtyZXR1cm4gT3Iocix0KSxjdChyLHMtOCxuLmQoKSksY3QocixzLTQsaSkscn12YXIgWHQ9dHlwZW9mIFRleHRFbmNvZGVyIT0idW5kZWZpbmVkIiYmbmV3IFRleHRFbmNvZGVyLGtyPXR5cGVvZiBUZXh0RGVjb2RlciE9InVuZGVmaW5lZCImJm5ldyBUZXh0RGVjb2RlcixDcj0wO3RyeXtrci5kZWNvZGUoUXQse3N0cmVhbTohMH0pLENyPTF9Y2F0Y2goZSl7fWZ1bmN0aW9uIFJyKGUsdCl7dmFyIG47aWYoWHQpcmV0dXJuIFh0LmVuY29kZShlKTtmb3IodmFyIGk9ZS5sZW5ndGgscj1uZXcgdGUoZS5sZW5ndGgrKGUubGVuZ3RoPj4xKSkscz0wLG89ZnVuY3Rpb24oZCl7cltzKytdPWR9LG49MDtuPGk7KytuKXtpZihzKzU+ci5sZW5ndGgpe3ZhciBjPW5ldyB0ZShzKzgrKGktbjw8MSkpO2Muc2V0KHIpLHI9Y312YXIgaD1lLmNoYXJDb2RlQXQobik7aDwxMjh8fHQ/byhoKTpoPDIwNDg/KG8oMTkyfGg+PjYpLG8oMTI4fGgmNjMpKTpoPjU1Mjk1JiZoPDU3MzQ0PyhoPTY1NTM2KyhoJjEwNDc1NTIpfGUuY2hhckNvZGVBdCgrK24pJjEwMjMsbygyNDB8aD4+MTgpLG8oMTI4fGg+PjEyJjYzKSxvKDEyOHxoPj42JjYzKSxvKDEyOHxoJjYzKSk6KG8oMjI0fGg+PjEyKSxvKDEyOHxoPj42JjYzKSxvKDEyOHxoJjYzKSl9cmV0dXJuIHp0KHIsMCxzKX1mdW5jdGlvbiBMcihlKXtyZXR1cm4gSih0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgdD1ScihKU09OLnN0cmluZ2lmeShlKSksbj1Ecih0KSxpPXlpZWxkIG5ldyBQcm9taXNlKHI9Pntjb25zdCBzPW5ldyBGaWxlUmVhZGVyO3Mub25sb2FkPSgpPT5yKHMucmVzdWx0KSxzLnJlYWRBc0RhdGFVUkwobmV3IEJsb2IoW25ldyBVaW50OEFycmF5KG4pXSkpfSk7cmV0dXJue2NvbXByZXNzZWRCYXNlNjQ6aS5zbGljZShpLmluZGV4T2YoIiwiKSsxKSxjb21wcmVzc2VkU2l6ZTpuLmxlbmd0aCxidWZmZXJMZW5ndGg6dC5sZW5ndGh9fSl9Y29uc3QgdXQ9e0JBU0VfVVJMOiIvIixERVY6ITEsTU9ERToicHJvZHVjdGlvbiIsUFJPRDohMCxTU1I6ITF9LFByPVsiZGVidWciLCJsb2ciLCJpbmZvIiwid2FybiIsImVycm9yIl0sbHQ9U3ltYm9sLmZvcigiQGxhdW5jaGRhcmtseS9vMTF5LnNka0xvZ2dlciIpLEZyPSgoKT0+e3RyeXtyZXR1cm4odXQ9PW51bGw/dm9pZCAwOnV0LkRFQlVHKT09PSJ0cnVlIn1jYXRjaChlKXtyZXR1cm4hMX19KSgpLEJlPSgoKT0+e3ZhciBuO2NvbnN0IGU9Z2xvYmFsVGhpcyx0PShuPWVbbHRdKSE9bnVsbD9uOmVbbHRdPXtkZWJ1Z0VuYWJsZWQ6ITEsc3VwcHJlc3NEZXB0aDowfTtyZXR1cm4gRnImJih0LmRlYnVnRW5hYmxlZD0hMCksdH0pKCksTXI9KCk9PkJlLmRlYnVnRW5hYmxlZCxodD1lPT57QmUuc3VwcHJlc3NEZXB0aCsrO3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7QmUuc3VwcHJlc3NEZXB0aC0tfX0sQnI9ZT0+UHIuaW5jbHVkZXMoZSk/ZToibG9nIiwkcj0oZSwuLi50KT0+e0JlLmRlYnVnRW5hYmxlZCYmaHQoKCk9Pnt2YXIgbjt0cnl7KChuPWNvbnNvbGVbQnIoZSldKSE9bnVsbD9uOmNvbnNvbGUubG9nKS5hcHBseShjb25zb2xlLHQpfWNhdGNoKGkpe319KX07Y2xhc3MgVXJ7Y29uc3RydWN0b3IodCxuKXt5dCh0aGlzLCJkZWJ1ZyIpO3l0KHRoaXMsIm5hbWUiKTt0aGlzLmRlYnVnPXQsdGhpcy5uYW1lPW59cHJlZml4KCl7bGV0IHQ9YFske0RhdGUubm93KCl9XWA7cmV0dXJuIHRoaXMubmFtZSYmKHQrPWAgLSAke3RoaXMubmFtZX1gKSx0fWxvZyguLi50KXt0aGlzLmRlYnVnJiZodCgoKT0+Y29uc29sZS5sb2cuYXBwbHkoY29uc29sZSxbdGhpcy5wcmVmaXgoKSwuLi50XSkpfXdhcm4oLi4udCl7KHRoaXMuZGVidWd8fE1yKCkpJiZodCgoKT0+Y29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsW3RoaXMucHJlZml4KCksLi4udF0pKX19dmFyIFd0PShlPT4oZS5CaWxsaW5nUXVvdGFFeGNlZWRlZD0iQmlsbGluZ1F1b3RhRXhjZWVkZWQiLGUpKShXdHx8e30pO2NvbnN0IFZyPTMscXI9MWUzLGpyPTUwMCxHcj1bV3QuQmlsbGluZ1F1b3RhRXhjZWVkZWQudG9TdHJpbmcoKV0senI9ZT0+e3ZhciBuO3JldHVybigobj1lLnJlc3BvbnNlLmVycm9ycyk9PW51bGw/dm9pZCAwOm4uZmluZChpPT5Hci5pbmNsdWRlcyhpLm1lc3NhZ2UpKSk9PT12b2lkIDB9LEhyPSgpPT57Y29uc3QgZT0odCxuLGkscixzPTApPT5KKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7cmV0dXJuIHlpZWxkIHQoKX1jYXRjaChvKXtpZihvIGluc3RhbmNlb2YgZGUmJiF6cihvKSl0aHJvdyBvO2lmKHM8VnIpcmV0dXJuIHlpZWxkIG5ldyBQcm9taXNlKGM9PnNldFRpbWVvdXQoYyxxcitqcipNYXRoLnBvdygyLHMpKSkseWllbGQgZSh0LG4saSxyLHMrMSk7dGhyb3cgJHIoImVycm9yIixgaGlnaGxpZ2h0LmlvOiBkYXRhIHJlcXVlc3QgZmFpbGVkIGFmdGVyICR7c30gcmV0cmllc2ApLG99fSk7cmV0dXJuIGV9LFp0PTUsS3Q9MmUzLFlyPVsibnVtYmVyIiwic3RyaW5nIiwiYm9vbGVhbiJdO3ZhciBaPShlPT4oZVtlLkluaXRpYWxpemU9MF09IkluaXRpYWxpemUiLGVbZS5SZXNldD0xXT0iUmVzZXQiLGVbZS5Bc3luY0V2ZW50cz0yXT0iQXN5bmNFdmVudHMiLGVbZS5JZGVudGlmeT0zXT0iSWRlbnRpZnkiLGVbZS5Qcm9wZXJ0aWVzPTRdPSJQcm9wZXJ0aWVzIixlW2UuTWV0cmljcz01XT0iTWV0cmljcyIsZVtlLkZlZWRiYWNrPTZdPSJGZWVkYmFjayIsZVtlLkN1c3RvbUV2ZW50PTddPSJDdXN0b21FdmVudCIsZVtlLlN0b3A9OF09IlN0b3AiLGVbZS5HZXRTdGF0dXM9OV09IkdldFN0YXR1cyIsZSkpKFp8fHt9KTtjb25zdCBTZT1zZWxmO2Z1bmN0aW9uIGVuKGUsdCl7Y29uc3Qgbj17fSxpPVtdLHI9W107Zm9yKGNvbnN0W3Msb11vZiBPYmplY3QuZW50cmllcyhlKSl7aWYobz09bnVsbCljb250aW51ZTtZci5pbmNsdWRlcyh0eXBlb2Ygbyl8fGkucHVzaCh7W3NdOm99KTtsZXQgYzt0eXBlb2Ygbz09InN0cmluZyI/Yz1vOmM9bWUobyksYy5sZW5ndGg+S3QmJihyLnB1c2goe1tzXTpvfSksYz1jLnN1YnN0cmluZygwLEt0KSksbltzXT1jfXJldHVybiB0IT09InNlc3Npb24iJiYoaS5sZW5ndGg+MCYmY29uc29sZS53YXJuKGBIaWdobGlnaHQgd2FzIHBhc3NlZCBvbmUgb3IgbW9yZSAke3R9IHByb3BlcnRpZXMgbm90IG9mIHR5cGUgc3RyaW5nLCBudW1iZXIsIG9yIGJvb2xlYW4uYCxpKSxyLmxlbmd0aD4wJiZjb25zb2xlLndhcm4oYEhpZ2hsaWdodCB3YXMgcGFzc2VkIG9uZSBvciBtb3JlICR7dH0gcHJvcGVydGllcyBleGNlZWRpbmcgMjAwMCBjaGFyYWN0ZXJzLCB3aGljaCB3aWxsIGJlIHRydW5jYXRlZC5gLHIpKSxufXtsZXQgZSx0LG4saT0wLHI9MCxzPSExLG89MCxjPW5ldyBVcighMSwiW3dvcmtlcl0iKTtjb25zdCBoPVtdLGQ9W10sdT0oKT0+byE9PTAmJmk8WnQmJiEhKG4hPW51bGwmJm4ubGVuZ3RoKSx5PShnLEUpPT57U2UucG9zdE1lc3NhZ2Uoe3Jlc3BvbnNlOnt0eXBlOlouQ3VzdG9tRXZlbnQsdGFnOmcscGF5bG9hZDpFfX0pfSx2PWc9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e2lkOkUsZXZlbnRzOncsbWVzc2FnZXM6ayxlcnJvcnM6UCxyZXNvdXJjZXNTdHJpbmc6SSx3ZWJTb2NrZXRFdmVudHNTdHJpbmc6eCxoYXNTZXNzaW9uVW5sb2FkZWQ6eixoaWdobGlnaHRMb2dzOlZ9PWcsSD1tZSh7bWVzc2FnZXM6a30pO2xldCBYPXtzZXNzaW9uX3NlY3VyZV9pZDpuLHBheWxvYWRfaWQ6RS50b1N0cmluZygpLGV2ZW50czp7ZXZlbnRzOnd9LG1lc3NhZ2VzOkgscmVzb3VyY2VzOkksd2ViX3NvY2tldF9ldmVudHM6eCxlcnJvcnM6UCxpc19iZWFjb246ITEsaGFzX3Nlc3Npb25fdW5sb2FkZWQ6en07ViYmKFguaGlnaGxpZ2h0X2xvZ3M9Vik7Y29uc3R7Y29tcHJlc3NlZEJhc2U2NDphLGJ1ZmZlckxlbmd0aDpmLGNvbXByZXNzZWRTaXplOl99PXlpZWxkIExyKFgpLFM9e3R5cGU6Wi5Bc3luY0V2ZW50cyxpZDpFLGV2ZW50c1NpemU6Zixjb21wcmVzc2VkU2l6ZTphLmxlbmd0aH07Yy5sb2coYFB1c2hpbmcgcGF5bG9hZDogJHtKU09OLnN0cmluZ2lmeSh7c2Vzc2lvblNlY3VyZUlEOm4saWQ6RSxmaXJzdFNJRDpNYXRoLm1pbiguLi5YLmV2ZW50cy5ldmVudHMubWFwKFc9Plc9PW51bGw/dm9pZCAwOlcuX3NpZCkuZmlsdGVyKFc9PiEhVykpLGV2ZW50c0xlbmd0aDpYLmV2ZW50cy5ldmVudHMubGVuZ3RoLG1lc3NhZ2VzTGVuZ3RoOmsubGVuZ3RoLHJlc291cmNlc0xlbmd0aDpJLmxlbmd0aCx3ZWJTb2NrZXRMZW5ndGg6eC5sZW5ndGgsZXJyb3JzTGVuZ3RoOlAubGVuZ3RoLGJ1Zkxlbmd0aDpmLGNvbXByZXNzZWRMZW5ndGg6Xyxjb21wcmVzc2VkQmFzZTY0TGVuZ3RoOmEubGVuZ3RofSx2b2lkIDAsMil9YCk7Y29uc3QgQz1lLlB1c2hTZXNzaW9uRXZlbnRzKHtzZXNzaW9uX3NlY3VyZV9pZDpuLHBheWxvYWRfaWQ6RS50b1N0cmluZygpLGRhdGE6YX0pO2xldCBBPVByb21pc2UucmVzb2x2ZSgpO2gubGVuZ3RoJiYoQT1lLnB1c2hNZXRyaWNzKHttZXRyaWNzOmh9KSxoLnNwbGljZSgwKSk7bGV0IEs9cGVyZm9ybWFuY2Uubm93KCk7Y29uc3Qgaj1zZXRJbnRlcnZhbCgoKT0+e0smJnBlcmZvcm1hbmNlLm5vdygpLUs+RnQmJihjb25zb2xlLndhcm4oYFVwbG9hZGluZyBwdXNoUGF5bG9hZCB0b29rIHRvbyBsb25nLCBmYWlsdXJlIG51bWJlciAjJHtyfS5gKSxyKz0xLGNsZWFySW50ZXJ2YWwoaikscj49WnQmJihjb25zb2xlLndhcm4oIlVwbG9hZGluZyBwdXNoUGF5bG9hZCB0b29rIHRvbyBsb25nLCBzdG9wcGluZyByZWNvcmRpbmcgdG8gYXZvaWQgT09NLiIpLFNlLnBvc3RNZXNzYWdlKHtyZXNwb25zZTp7dHlwZTpaLlN0b3AscmVxdWVzdFN0YXJ0OkssYXN5bmNFdmVudHNSZXNwb25zZTpTfX0pLG0oe3R5cGU6Wi5Qcm9wZXJ0aWVzLHByb3BlcnRpZXNPYmplY3Q6e3N0b3BSZWFzb246IlB1c2ggUGF5bG9hZCBUaW1lb3V0In0scHJvcGVydHlUeXBlOnt0eXBlOiJ0cmFjayJ9fSkpKX0sMTAwKTt0cnl7eWllbGQgUHJvbWlzZS5hbGwoW0MsQV0pLHImJnBlcmZvcm1hbmNlLm5vdygpLUs8PUZ0JiYoY29uc29sZS53YXJuKGBwdXNoUGF5bG9hZCBzdWNjZWVkZWQgYWZ0ZXIgIyR7cn0gZmFpbHVyZXMsIHJlc2V0dGluZyBzdG9wIHN3aXRjaC5gKSxyPTApfWZpbmFsbHl7Sz0wLGNsZWFySW50ZXJ2YWwoail9U2UucG9zdE1lc3NhZ2Uoe3Jlc3BvbnNlOlN9KX0pLFQ9Zz0+Sih0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3R7dXNlck9iamVjdDpFLHVzZXJJZGVudGlmaWVyOncsc291cmNlOmt9PWc7az09PSJzZWdtZW50Ij95KCJTZWdtZW50IElkZW50aWZ5IixtZShEKHt1c2VySWRlbnRpZmllcjp3fSxFKSkpOnkoIklkZW50aWZ5IixtZShEKHt1c2VySWRlbnRpZmllcjp3fSxFKSkpLHlpZWxkIGUuaWRlbnRpZnlTZXNzaW9uKHtzZXNzaW9uX3NlY3VyZV9pZDpuLHVzZXJfaWRlbnRpZmllcjp3LHVzZXJfb2JqZWN0OmVuKEUsInVzZXIiKX0pO2NvbnN0IFA9az09PSJzZWdtZW50Ij9rOiJkZWZhdWx0IjtjLmxvZyhgSWRlbnRpZnkgKCR7d30sIHNvdXJjZTogJHtQfSkgdy8gb2JqOiAke21lKEUpfSBAICR7dH1gKX0pLG09Zz0+Sih0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3R7cHJvcGVydGllc09iamVjdDpFLHByb3BlcnR5VHlwZTp3fT1nO2xldCBrOyh3PT1udWxsP3ZvaWQgMDp3LnR5cGUpPT09InNlc3Npb24iPyhrPSJTZXNzaW9uIix5aWVsZCBlLmFkZFNlc3Npb25Qcm9wZXJ0aWVzKHtzZXNzaW9uX3NlY3VyZV9pZDpuLHByb3BlcnRpZXNfb2JqZWN0OmVuKEUsInNlc3Npb24iKX0pKToodz09bnVsbD92b2lkIDA6dy5zb3VyY2UpPT09InNlZ21lbnQiP2s9IlNlZ21lbnQiOms9IlRyYWNrIixrIT09IlNlc3Npb24iJiZ5KGssbWUoRSkpLGMubG9nKGBBZGRpbmcgJHtrfSBQcm9wZXJ0aWVzIHRvIHNlc3Npb24gKCR7bn0pIHcvIG9iajogJHtKU09OLnN0cmluZ2lmeShFKX0gQCAke3R9YCl9KSxOPWc9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe2gucHVzaCguLi5nLm1ldHJpY3MubWFwKEU9Pih7bmFtZTpFLm5hbWUsdmFsdWU6RS52YWx1ZSxzZXNzaW9uX3NlY3VyZV9pZDpuLGNhdGVnb3J5OkUuY2F0ZWdvcnksZ3JvdXA6RS5ncm91cCx0aW1lc3RhbXA6RS50aW1lc3RhbXAudG9JU09TdHJpbmcoKSx0YWdzOkUudGFnc30pKSl9KSxSPWc9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3RpbWVzdGFtcDpFLHZlcmJhdGltOncsdXNlckVtYWlsOmssdXNlck5hbWU6UH09Zzt5aWVsZCBlLmFkZFNlc3Npb25GZWVkYmFjayh7c2Vzc2lvbl9zZWN1cmVfaWQ6bix0aW1lc3RhbXA6RSx2ZXJiYXRpbTp3LHVzZXJfZW1haWw6ayx1c2VyX25hbWU6UH0pfSksTD1nPT5KKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtnLnR5cGU9PT1aLkFzeW5jRXZlbnRzP3lpZWxkIHYoZyk6Zy50eXBlPT09Wi5JZGVudGlmeT95aWVsZCBUKGcpOmcudHlwZT09PVouUHJvcGVydGllcz95aWVsZCBtKGcpOmcudHlwZT09PVouTWV0cmljcz95aWVsZCBOKGcpOmcudHlwZT09PVouRmVlZGJhY2smJih5aWVsZCBSKGcpKX0pLHE9KCk9PkoodGhpcyxudWxsLGZ1bmN0aW9uKigpe2Zvcig7ZC5sZW5ndGg+MCYmdSgpOyl7Y29uc3QgZz1kLnNoaWZ0KCk7dHJ5e3lpZWxkIEwoZyksaT0wfWNhdGNoKEUpe3MmJmNvbnNvbGUuZXJyb3IoRSksaSs9MX19fSk7U2Uub25tZXNzYWdlPWZ1bmN0aW9uKGcpe3JldHVybiBKKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZihnLmRhdGEubWVzc2FnZS50eXBlPT09Wi5Jbml0aWFsaXplKXt0PWcuZGF0YS5tZXNzYWdlLmJhY2tlbmQsbj1nLmRhdGEubWVzc2FnZS5zZXNzaW9uU2VjdXJlSUQscz1nLmRhdGEubWVzc2FnZS5kZWJ1ZyxvPWcuZGF0YS5tZXNzYWdlLnJlY29yZGluZ1N0YXJ0VGltZSxjLmRlYnVnPXMsZT12cihuZXcgWG4odCx7aGVhZGVyczp7fX0pLEhyKCkpLHlpZWxkIHEoKTtyZXR1cm59aWYoZy5kYXRhLm1lc3NhZ2UudHlwZT09PVouUmVzZXQpe2QubGVuZ3RoPTAsaC5sZW5ndGg9MCxpPTAscj0wLG49IiIsbz0wO3JldHVybn1pZihnLmRhdGEubWVzc2FnZS50eXBlPT09Wi5HZXRTdGF0dXMpe1NlLnBvc3RNZXNzYWdlKHtyZXNwb25zZTp7dHlwZTpaLkdldFN0YXR1cyxwZW5kaW5nQ291bnQ6ZC5sZW5ndGgsaW5pdGlhbGl6ZWQ6dSgpfX0pO3JldHVybn1pZighdSgpKXtkLnB1c2goZy5kYXRhLm1lc3NhZ2UpO3JldHVybn10cnl7eWllbGQgTChnLmRhdGEubWVzc2FnZSksaT0wLHlpZWxkIHEoKX1jYXRjaChFKXtzJiZjb25zb2xlLmVycm9yKEUpLGkrPTF9fSl9fX0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWhpZ2hsaWdodC1jbGllbnQtd29ya2VyLURyRFBSQ3J2LmpzLm1hcAo=", Ku = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), En = typeof self != "undefined" && self.Blob && new Blob([Ku(_l)], { type: "text/javascript;charset=utf-8" });
10325
+ function Fu(e) {
10326
10326
  let t;
10327
10327
  try {
10328
10328
  if (t = En && (self.URL || self.webkitURL).createObjectURL(En), !t) throw "";
@@ -10334,7 +10334,7 @@ function Ku(e) {
10334
10334
  }), s;
10335
10335
  } catch (s) {
10336
10336
  return new Worker(
10337
- "data:text/javascript;base64," + Al,
10337
+ "data:text/javascript;base64," + _l,
10338
10338
  {
10339
10339
  name: e == null ? void 0 : e.name
10340
10340
  }
@@ -10344,7 +10344,7 @@ function Ku(e) {
10344
10344
  }
10345
10345
  }
10346
10346
  var Je = /* @__PURE__ */ ((e) => (e[e.Initialize = 0] = "Initialize", e[e.Reset = 1] = "Reset", e[e.AsyncEvents = 2] = "AsyncEvents", e[e.Identify = 3] = "Identify", e[e.Properties = 4] = "Properties", e[e.Metrics = 5] = "Metrics", e[e.Feedback = 6] = "Feedback", e[e.CustomEvent = 7] = "CustomEvent", e[e.Stop = 8] = "Stop", e[e.GetStatus = 9] = "GetStatus", e))(Je || {});
10347
- const Fu = ({
10347
+ const Mu = ({
10348
10348
  apiKey: e
10349
10349
  }) => {
10350
10350
  (function(t, s) {
@@ -10427,7 +10427,7 @@ const Fu = ({
10427
10427
  return a = (!a || a.length === 0 ? "$default_instance" : a).toLowerCase(), Object.prototype.hasOwnProperty.call(l._iq, a) || (l._iq[a] = { _q: [] }, o(l._iq[a])), l._iq[a];
10428
10428
  }, t.amplitude = l;
10429
10429
  })(window, document);
10430
- }, Mu = ({
10430
+ }, zu = ({
10431
10431
  projectToken: e
10432
10432
  }) => {
10433
10433
  if (window.mixpanel)
@@ -10474,13 +10474,13 @@ const Fu = ({
10474
10474
  }
10475
10475
  })(document, window.mixpanel || []);
10476
10476
  const t = document.createElement("script");
10477
- t.src = zu, document.head.appendChild(t), t.addEventListener("load", () => {
10477
+ t.src = Hu, document.head.appendChild(t), t.addEventListener("load", () => {
10478
10478
  var s;
10479
10479
  (s = window.mixpanel) == null || s.init(e);
10480
10480
  });
10481
- }, zu = "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";
10481
+ }, Hu = "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";
10482
10482
  var bt;
10483
- class Hu {
10483
+ class Ou {
10484
10484
  constructor(t) {
10485
10485
  H(this, "options");
10486
10486
  /** Determines if the client is running on a Highlight property (e.g. frontend). */
@@ -10522,6 +10522,7 @@ class Hu {
10522
10522
  H(this, "_isCrossOriginIframe");
10523
10523
  H(this, "_eventBytesSinceSnapshot");
10524
10524
  H(this, "_lastSnapshotTime");
10525
+ H(this, "_snapshotPayloadIds");
10525
10526
  H(this, "_lastVisibilityChangeTime");
10526
10527
  H(this, "pushPayloadTimerId");
10527
10528
  H(this, "hasSessionUnloaded");
@@ -10531,9 +10532,9 @@ class Hu {
10531
10532
  H(this, "_recordStop");
10532
10533
  H(this, "_integrations", []);
10533
10534
  var l, c, u, f, b, m;
10534
- this.options = t, typeof ((l = this.options) == null ? void 0 : l.debug) == "boolean" ? this.debugOptions = this.options.debug ? { clientInteractions: !0 } : {} : this.debugOptions = (u = (c = this.options) == null ? void 0 : c.debug) != null ? u : {}, this.logger = new Co(this.debugOptions.clientInteractions), (f = this.options) != null && f.debug && xo(!0), this._worker = new Ku(), this._worker.onmessage = (h) => {
10535
+ this.options = t, typeof ((l = this.options) == null ? void 0 : l.debug) == "boolean" ? this.debugOptions = this.options.debug ? { clientInteractions: !0 } : {} : this.debugOptions = (u = (c = this.options) == null ? void 0 : c.debug) != null ? u : {}, this.logger = new xo(this.debugOptions.clientInteractions), (f = this.options) != null && f.debug && vo(!0), this._worker = new Fu(), this._worker.onmessage = (h) => {
10535
10536
  var d, r, n;
10536
- ((d = h.data.response) == null ? void 0 : d.type) === Je.AsyncEvents ? (this._eventBytesSinceSnapshot += h.data.response.eventsSize, this.logger.log(
10537
+ ((d = h.data.response) == null ? void 0 : d.type) === Je.AsyncEvents ? (this._snapshotPayloadIds.delete(h.data.response.id) || (this._eventBytesSinceSnapshot += h.data.response.eventsSize), this.logger.log(
10537
10538
  `Web worker sent payloadID ${h.data.response.id} size ${h.data.response.eventsSize} bytes, compression ratio ${h.data.response.eventsSize / h.data.response.compressedSize}.
10538
10539
  Total since snapshot: ${(this._eventBytesSinceSnapshot / 1e6).toFixed(1)}MB`
10539
10540
  )) : ((r = h.data.response) == null ? void 0 : r.type) === Je.CustomEvent ? this.addCustomEvent(
@@ -10596,21 +10597,21 @@ class Hu {
10596
10597
  canvasFactor: 0.5,
10597
10598
  canvasMaxSnapshotDimension: 360,
10598
10599
  canvasClearWebGLBuffer: !0,
10599
- dataUrlOptions: to()
10600
+ dataUrlOptions: io()
10600
10601
  }, (r = t.samplingStrategy) != null ? r : {
10601
10602
  canvas: 2
10602
10603
  }), this._backendUrl = (n = t == null ? void 0 : t.backendUrl) != null ? n : "https://pub.observability.app.launchdarkly.com", this._backendUrl[0] === "/" && (this._backendUrl = new URL(this._backendUrl, document.baseURI).href);
10603
- const s = new ro(`${this._backendUrl}`, {
10604
+ const s = new no(`${this._backendUrl}`, {
10604
10605
  headers: {}
10605
10606
  });
10606
- As(this, bt, io(s, so())), this.environment = (i = t.environment) != null ? i : "production", this.appVersion = t.appVersion, this.serviceName = (o = t.serviceName) != null ? o : "browser", typeof t.organizationID == "string" ? this.organizationID = t.organizationID : this.organizationID = t.organizationID.toString(), this.isRunningOnHighlight = this.organizationID === "1" || this.organizationID === "1jdkoe52", this.firstloadVersion = t.firstloadVersion || "unknown", this.sessionShortcut = t.sessionShortcut || !1, this._onToggleFeedbackFormVisibility = () => {
10607
+ As(this, bt, so(s, ro())), this.environment = (i = t.environment) != null ? i : "production", this.appVersion = t.appVersion, this.serviceName = (o = t.serviceName) != null ? o : "browser", typeof t.organizationID == "string" ? this.organizationID = t.organizationID : this.organizationID = t.organizationID.toString(), this.isRunningOnHighlight = this.organizationID === "1" || this.organizationID === "1jdkoe52", this.firstloadVersion = t.firstloadVersion || "unknown", this.sessionShortcut = t.sessionShortcut || !1, this._onToggleFeedbackFormVisibility = () => {
10607
10608
  };
10608
10609
  const a = t, { firstloadVersion: l } = a, c = st(a, ["firstloadVersion"]);
10609
10610
  this._optionsInternal = c, this.listeners = [], this.events = [], this.hasSessionUnloaded = !1, this.hasPushedData = !1, window.Intercom && window.Intercom("onShow", () => {
10610
10611
  window.Intercom("update", {
10611
10612
  highlightSessionURL: this.getCurrentSessionURLWithTimestamp()
10612
10613
  }), this.addProperties({ event: "Intercom onShow" });
10613
- }), this._eventBytesSinceSnapshot = 0, this._lastSnapshotTime = (/* @__PURE__ */ new Date()).getTime(), this._lastVisibilityChangeTime = (/* @__PURE__ */ new Date()).getTime();
10614
+ }), this._eventBytesSinceSnapshot = 0, this._lastSnapshotTime = (/* @__PURE__ */ new Date()).getTime(), this._snapshotPayloadIds = /* @__PURE__ */ new Set(), this._lastVisibilityChangeTime = (/* @__PURE__ */ new Date()).getTime();
10614
10615
  }
10615
10616
  identify(t, s = {}, l) {
10616
10617
  if (!t || t === "") {
@@ -10751,7 +10752,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10751
10752
  a.bind(this);
10752
10753
  const p = !!this._recordStop;
10753
10754
  this._recordStop && (this._recordStop(), this._recordStop = void 0);
10754
- const [X, Z] = ru(
10755
+ const [X, Z] = nu(
10755
10756
  this.privacySetting,
10756
10757
  this.options.maskAllInputs,
10757
10758
  this.options.maskInputOptions
@@ -10763,7 +10764,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10763
10764
  blockSelector: this.options.blockSelector,
10764
10765
  emit: a,
10765
10766
  recordCrossOriginIframes: this.options.recordCrossOriginIframe,
10766
- privacySetting: nu(
10767
+ privacySetting: lu(
10767
10768
  this.privacySetting,
10768
10769
  this.options.maskPiiText
10769
10770
  ),
@@ -10789,7 +10790,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10789
10790
  collectFonts: this.inlineImages,
10790
10791
  inlineStylesheet: this.inlineStylesheet,
10791
10792
  styleSheetResyncInterval: this.styleSheetResyncInterval,
10792
- plugins: [Jo()],
10793
+ plugins: [Yo()],
10793
10794
  logger: typeof this.options.debug == "boolean" && this.options.debug || typeof this.options.debug == "object" && this.options.debug.domRecording ? {
10794
10795
  debug: this.logger.log,
10795
10796
  warn: Me.bind(
@@ -10818,7 +10819,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10818
10819
  this.logger.log("Ignoring visibility event due to manual stop.");
10819
10820
  return;
10820
10821
  }
10821
- (/* @__PURE__ */ new Date()).getTime() - this._lastVisibilityChangeTime < no || (this._lastVisibilityChangeTime = (/* @__PURE__ */ new Date()).getTime(), this.logger.log(`Detected window ${t ? "hidden" : "visible"}.`), t ? (this.addCustomEvent("TabHidden", !0), this.options.disableBackgroundRecording && this.stop()) : (this.options.disableBackgroundRecording && (yield this.start()), this.addCustomEvent("TabHidden", !1)));
10822
+ (/* @__PURE__ */ new Date()).getTime() - this._lastVisibilityChangeTime < lo || (this._lastVisibilityChangeTime = (/* @__PURE__ */ new Date()).getTime(), this.logger.log(`Detected window ${t ? "hidden" : "visible"}.`), t ? (this.addCustomEvent("TabHidden", !0), this.options.disableBackgroundRecording && this.stop()) : (this.options.disableBackgroundRecording && (yield this.start()), this.addCustomEvent("TabHidden", !1)));
10822
10823
  });
10823
10824
  }
10824
10825
  _setupCrossOriginIframe() {
@@ -10865,7 +10866,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10865
10866
  try {
10866
10867
  const c = this;
10867
10868
  this.enableSegmentIntegration && this.listeners.push(
10868
- cu((f) => {
10869
+ uu((f) => {
10869
10870
  if (f.type === "track") {
10870
10871
  const b = {};
10871
10872
  b["segment-event"] = f.event, c.addProperties(b, {
@@ -10885,24 +10886,24 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10885
10886
  }
10886
10887
  })
10887
10888
  ), this.listeners.push(
10888
- lo((f) => {
10889
+ oo((f) => {
10889
10890
  this.reloaded ? (this.addCustomEvent("Reload", f), this.reloaded = !1, c.addProperties(
10890
10891
  { reload: !0 },
10891
10892
  { type: "session" }
10892
10893
  )) : this.addCustomEvent("Navigate", f);
10893
10894
  })
10894
10895
  ), this.listeners.push(
10895
- oo(
10896
+ ao(
10896
10897
  (f) => {
10897
10898
  this.addCustomEvent("Viewport", f);
10898
10899
  }
10899
10900
  )
10900
10901
  ), this.listeners.push(
10901
- lu((f, b) => {
10902
+ ou((f, b) => {
10902
10903
  let m = null, h = null;
10903
10904
  if (b && b.target) {
10904
10905
  const d = b.target;
10905
- m = ao(d), h = d.textContent, h && h.length > 2e3 && (h = h.substring(0, 2e3));
10906
+ m = co(d), h = d.textContent, h && h.length > 2e3 && (h = h.substring(0, 2e3));
10906
10907
  }
10907
10908
  this.addCustomEvent("Click", {
10908
10909
  clickTarget: f,
@@ -10911,11 +10912,11 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10911
10912
  });
10912
10913
  })
10913
10914
  ), this.listeners.push(
10914
- ou((f) => {
10915
+ au((f) => {
10915
10916
  f && this.addCustomEvent("Focus", f);
10916
10917
  })
10917
10918
  ), this.sessionShortcut && this.listeners.push(
10918
- du(this.sessionShortcut, () => {
10919
+ hu(this.sessionShortcut, () => {
10919
10920
  window.open(
10920
10921
  this.getCurrentSessionURLWithTimestamp(),
10921
10922
  "_blank"
@@ -10926,7 +10927,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10926
10927
  ({ visible: f }) => {
10927
10928
  this._visibilityHandler(!f);
10928
10929
  }
10929
- ), this.logger.log("Set up Electron highlight.run events.")) : (au(
10930
+ ), this.logger.log("Set up Electron highlight.run events.")) : (cu(
10930
10931
  (f) => this._visibilityHandler(f)
10931
10932
  ), this.logger.log("Set up document visibility listener.")), this._hasPreviouslyInitialized = !0);
10932
10933
  const u = () => {
@@ -10986,7 +10987,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10986
10987
  return fe(this, null, function* () {
10987
10988
  var t;
10988
10989
  try {
10989
- this.state === "Recording" && this.listeners && !this.sessionData.sessionKey && this.sessionData.sessionStartTime && Date.now() - this.sessionData.sessionStartTime > co && (this.logger.log("Resetting session", {
10990
+ this.state === "Recording" && this.listeners && !this.sessionData.sessionKey && this.sessionData.sessionStartTime && Date.now() - this.sessionData.sessionStartTime > uo && (this.logger.log("Resetting session", {
10990
10991
  start: this.sessionData.sessionStartTime
10991
10992
  }), yield this._reset({}));
10992
10993
  let s;
@@ -10994,7 +10995,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
10994
10995
  let c = new Blob(
10995
10996
  [
10996
10997
  JSON.stringify({
10997
- query: yo(Zo),
10998
+ query: Zo(go),
10998
10999
  variables: l
10999
11000
  })
11000
11001
  ],
@@ -11012,7 +11013,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
11012
11013
  }
11013
11014
  this.state === "Recording" && (this.pushPayloadTimerId && (clearTimeout(this.pushPayloadTimerId), this.pushPayloadTimerId = void 0), this.pushPayloadTimerId = setTimeout(() => {
11014
11015
  this._save();
11015
- }, uo));
11016
+ }, ho));
11016
11017
  });
11017
11018
  }
11018
11019
  /**
@@ -11039,13 +11040,13 @@ To: ${this._backendUrl}
11039
11040
  Org: ${this.organizationID}
11040
11041
  SessionSecureID: ${this.sessionData.sessionSecureID}`
11041
11042
  );
11042
- const f = (/* @__PURE__ */ new Date()).getTime(), b = Su();
11043
+ const f = (/* @__PURE__ */ new Date()).getTime(), b = Xu();
11043
11044
  if (t) {
11044
11045
  const m = {
11045
11046
  session_secure_id: this.sessionData.sessionSecureID,
11046
11047
  payload_id: f.toString(),
11047
11048
  events: { events: l },
11048
- messages: ho({ messages: [] }),
11049
+ messages: po({ messages: [] }),
11049
11050
  resources: JSON.stringify({ resources: [] }),
11050
11051
  web_socket_events: JSON.stringify({
11051
11052
  webSocketEvents: []
@@ -11054,14 +11055,14 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
11054
11055
  is_beacon: !1,
11055
11056
  has_session_unloaded: this.hasSessionUnloaded,
11056
11057
  highlight_logs: b || void 0
11057
- }, { compressedBase64: h } = yield Tu(m);
11058
+ }, { compressedBase64: h } = yield Uu(m);
11058
11059
  yield t({
11059
11060
  session_secure_id: this.sessionData.sessionSecureID,
11060
11061
  payload_id: f.toString(),
11061
11062
  data: h
11062
11063
  });
11063
11064
  } else
11064
- this._worker.postMessage({
11065
+ l.some((m) => m.type === Qn.FullSnapshot) && this._snapshotPayloadIds.add(f), this._worker.postMessage({
11065
11066
  message: {
11066
11067
  type: Je.AsyncEvents,
11067
11068
  id: f,
@@ -11076,7 +11077,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
11076
11077
  highlightLogs: b
11077
11078
  }
11078
11079
  });
11079
- rt(this.sessionData), this.events = this.events.slice(l.length), Xu(b);
11080
+ rt(this.sessionData), this.events = this.events.slice(l.length), Ru(b);
11080
11081
  });
11081
11082
  }
11082
11083
  takeFullSnapshot() {
@@ -11090,7 +11091,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
11090
11091
  }), Ne.takeFullSnapshot(), this._eventBytesSinceSnapshot = 0, this._lastSnapshotTime = (/* @__PURE__ */ new Date()).getTime();
11091
11092
  }
11092
11093
  register(t, s) {
11093
- this._integrations.push(new po(t, s));
11094
+ this._integrations.push(new mo(t, s));
11094
11095
  }
11095
11096
  getHooks(t) {
11096
11097
  return this._integrations.flatMap((s) => {
@@ -11130,16 +11131,16 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
11130
11131
  }
11131
11132
  getFrontendUrl() {
11132
11133
  var s, l;
11133
- const t = this._backendUrl.match(mo);
11134
+ const t = this._backendUrl.match(fo);
11134
11135
  if (t && ((s = t == null ? void 0 : t.groups) != null && s.domain)) {
11135
- const c = (l = t.groups.domain) != null ? l : "", u = fo[c];
11136
- return u ? `https://${u}${bo}` : tr;
11136
+ const c = (l = t.groups.domain) != null ? l : "", u = bo[c];
11137
+ return u ? `https://${u}${yo}` : tr;
11137
11138
  }
11138
11139
  return tr;
11139
11140
  }
11140
11141
  }
11141
11142
  bt = new WeakMap();
11142
- class Qu extends go {
11143
+ class Du extends So {
11143
11144
  constructor(s) {
11144
11145
  super(s);
11145
11146
  H(this, "record");
@@ -11173,18 +11174,18 @@ class Qu extends go {
11173
11174
  this.configureSession(s, l);
11174
11175
  const i = me(K({}, l), {
11175
11176
  organizationID: s,
11176
- firstloadVersion: So,
11177
+ firstloadVersion: Xo,
11177
11178
  environment: (l == null ? void 0 : l.environment) || "production",
11178
11179
  appVersion: l == null ? void 0 : l.version,
11179
11180
  sessionSecureID: this.sessionSecureID,
11180
11181
  privacySetting: (c = l == null ? void 0 : l.privacySetting) != null ? c : "strict"
11181
11182
  });
11182
- this.record = new Hu(i);
11183
+ this.record = new Ou(i);
11183
11184
  const o = l != null && l.manualStart ? void 0 : this.record.start();
11184
- vo.load(this.record, {
11185
+ Lo.load(this.record, {
11185
11186
  ready: !(l != null && l.manualStart),
11186
11187
  started: o
11187
- }), !((f = (u = l == null ? void 0 : l.integrations) == null ? void 0 : u.mixpanel) != null && f.disabled) && ((m = (b = l == null ? void 0 : l.integrations) == null ? void 0 : b.mixpanel) != null && m.projectToken) && Mu(l.integrations.mixpanel), !((d = (h = l == null ? void 0 : l.integrations) == null ? void 0 : h.amplitude) != null && d.disabled) && ((n = (r = l == null ? void 0 : l.integrations) == null ? void 0 : r.amplitude) != null && n.apiKey) && Fu(l.integrations.amplitude);
11188
+ }), !((f = (u = l == null ? void 0 : l.integrations) == null ? void 0 : u.mixpanel) != null && f.disabled) && ((m = (b = l == null ? void 0 : l.integrations) == null ? void 0 : b.mixpanel) != null && m.projectToken) && zu(l.integrations.mixpanel), !((d = (h = l == null ? void 0 : l.integrations) == null ? void 0 : h.amplitude) != null && d.disabled) && ((n = (r = l == null ? void 0 : l.integrations) == null ? void 0 : r.amplitude) != null && n.apiKey) && Mu(l.integrations.amplitude);
11188
11189
  } catch (i) {
11189
11190
  Me(
11190
11191
  "Error initializing @launchdarkly/session-replay SDK",
@@ -11205,12 +11206,12 @@ class Qu extends go {
11205
11206
  getHooks(s) {
11206
11207
  var c, u, f, b;
11207
11208
  const l = K(K({
11208
- [wo]: s.sdk.name,
11209
- [Io]: s.sdk.version,
11210
- [Wo]: s.clientSideId,
11211
- [Vo]: "LaunchDarkly"
11212
- }, (c = s.application) != null && c.id ? { [Go]: s.application.id } : {}), (u = s.application) != null && u.version ? {
11213
- [Ro]: s.application.version
11209
+ [Co]: s.sdk.name,
11210
+ [wo]: s.sdk.version,
11211
+ [Io]: s.clientSideId,
11212
+ [Wo]: "LaunchDarkly"
11213
+ }, (c = s.application) != null && c.id ? { [Vo]: s.application.id } : {}), (u = s.application) != null && u.version ? {
11214
+ [Go]: s.application.version
11214
11215
  } : {});
11215
11216
  return this.initialize(
11216
11217
  (b = (f = s.sdkKey) != null ? f : s.mobileKey) != null ? b : s.clientSideId,
@@ -11225,7 +11226,7 @@ class Qu extends go {
11225
11226
  for (const S of (i = (n = (r = this.record) == null ? void 0 : r.getHooks) == null ? void 0 : n.call(r, s)) != null ? i : [])
11226
11227
  (o = S.afterIdentify) == null || o.call(S, m, h, d);
11227
11228
  if (d.status === "completed") {
11228
- const S = me(K({}, Xo(m.context)), {
11229
+ const S = me(K({}, Ro(m.context)), {
11229
11230
  key: (X = (p = (a = this.options) == null ? void 0 : a.contextFriendlyName) == null ? void 0 : p.call(
11230
11231
  a,
11231
11232
  m.context
@@ -11260,25 +11261,26 @@ class Qu extends go {
11260
11261
  }
11261
11262
  }
11262
11263
  export {
11263
- lu as C,
11264
- ou as F,
11264
+ ou as C,
11265
+ Qn as E,
11266
+ au as F,
11265
11267
  Kn as I,
11266
11268
  Je as M,
11267
- au as P,
11268
- Qu as R,
11269
- cu as S,
11270
- Ku as W,
11269
+ cu as P,
11270
+ Du as R,
11271
+ uu as S,
11272
+ Fu as W,
11271
11273
  Fn as a,
11272
- du as b,
11274
+ hu as b,
11273
11275
  Nn as c,
11274
- Xu as d,
11275
- Jo as e,
11276
- nu as f,
11277
- Su as g,
11278
- ru as h,
11279
- Fu as i,
11280
- Tu as p,
11276
+ Ru as d,
11277
+ Yo as e,
11278
+ lu as f,
11279
+ Xu as g,
11280
+ nu as h,
11281
+ Mu as i,
11282
+ Uu as p,
11281
11283
  Ne as r,
11282
- Mu as s
11284
+ zu as s
11283
11285
  };
11284
- //# sourceMappingURL=record-CwkFdJT0.js.map
11286
+ //# sourceMappingURL=record-Bgkzgi9x.js.map