@launchdarkly/session-replay 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,14 +14,14 @@ var Wc = Object.defineProperty, Cc = (e, t, i) => t in e ? Wc(e, t, { enumerable
14
14
  }, o = (a) => a.done ? s(a.value) : Promise.resolve(a.value).then(r, l);
15
15
  o((i = i.apply(e, t)).next());
16
16
  });
17
- const Sr = /* @__PURE__ */ Object.create(null), We = (e, t, ...i) => {
17
+ const Sr = /* @__PURE__ */ Object.create(null), Ze = (e, t, ...i) => {
18
18
  const s = `[@launchdarkly plugins]: (${e}): `;
19
19
  console[t].apply(console, [s, ...i]), kc(s, ...i);
20
20
  }, Jt = (e, t, i, ...s) => {
21
- Sr[`${e}-${t}`] || (Sr[`${e}-${t}`] = !0, We(e, i, ...s));
21
+ Sr[`${e}-${t}`] || (Sr[`${e}-${t}`] = !0, Ze(e, i, ...s));
22
22
  }, kc = (e, ...t) => Rc(void 0, null, function* () {
23
23
  try {
24
- const { LDObserve: i } = yield import("./LDObserve-BrEGi-h9.js");
24
+ const { LDObserve: i } = yield import("./LDObserve-Bg1A5bz4.js");
25
25
  i.recordLog(`${e}${t}`, "warn");
26
26
  } catch {
27
27
  }
@@ -50,7 +50,7 @@ class Bo {
50
50
  try {
51
51
  return this._sdk[t](...i);
52
52
  } catch (s) {
53
- We(
53
+ Ze(
54
54
  `Error executing buffered call to ${t}:`,
55
55
  "error",
56
56
  s
@@ -62,7 +62,7 @@ class Bo {
62
62
  }
63
63
  }
64
64
  _enqueue(t) {
65
- this._callBuffer.length < this._capacity ? (this._callBuffer.push(t), this._exceededCapacity = !1) : (this._exceededCapacity || (this._exceededCapacity = !0, We(
65
+ this._callBuffer.length < this._capacity ? (this._callBuffer.push(t), this._exceededCapacity = !1) : (this._exceededCapacity || (this._exceededCapacity = !0, Ze(
66
66
  "Exceeded event queue capacity. Increase capacity to avoid dropping events.",
67
67
  "warn"
68
68
  )), this._droppedEvents += 1);
@@ -73,7 +73,7 @@ class Bo {
73
73
  try {
74
74
  this._sdk[i](...s);
75
75
  } catch (n) {
76
- We(
76
+ Ze(
77
77
  `Error executing buffered call to ${i}:`,
78
78
  "error",
79
79
  n
@@ -1043,7 +1043,7 @@ function cu(e) {
1043
1043
  function rl(e, t) {
1044
1044
  return new uu(e, t).parseDocument();
1045
1045
  }
1046
- let uu = class {
1046
+ class uu {
1047
1047
  constructor(t, i = {}) {
1048
1048
  const s = cu(t) ? t : new nl(t);
1049
1049
  this._lexer = new Pc(s), this._options = i, this._tokenCounter = 0;
@@ -2143,7 +2143,7 @@ let uu = class {
2143
2143
  `Document contains more that ${t} tokens. Parsing aborted.`
2144
2144
  );
2145
2145
  }
2146
- };
2146
+ }
2147
2147
  function ni(e) {
2148
2148
  const t = e.value;
2149
2149
  return ol(e.kind) + (t != null ? ` "${t}"` : "");
@@ -2435,7 +2435,7 @@ const gu = 80, Zu = {
2435
2435
  leave: ({ variable: e, type: t, defaultValue: i, directives: s }) => e + ": " + t + O(" = ", i) + O(" ", C(s, " "))
2436
2436
  },
2437
2437
  SelectionSet: {
2438
- leave: ({ selections: e }) => Ve(e)
2438
+ leave: ({ selections: e }) => Xe(e)
2439
2439
  },
2440
2440
  Field: {
2441
2441
  leave({ alias: e, name: t, arguments: i, directives: s, selectionSet: n }) {
@@ -2516,7 +2516,7 @@ const gu = 80, Zu = {
2516
2516
  // Type System Definitions
2517
2517
  SchemaDefinition: {
2518
2518
  leave: ({ description: e, directives: t, operationTypes: i }) => O("", e, `
2519
- `) + C(["schema", C(t, " "), Ve(i)], " ")
2519
+ `) + C(["schema", C(t, " "), Xe(i)], " ")
2520
2520
  },
2521
2521
  OperationTypeDefinition: {
2522
2522
  leave: ({ operation: e, type: t }) => e + ": " + t
@@ -2533,7 +2533,7 @@ const gu = 80, Zu = {
2533
2533
  t,
2534
2534
  O("implements ", C(i, " & ")),
2535
2535
  C(s, " "),
2536
- Ve(n)
2536
+ Xe(n)
2537
2537
  ],
2538
2538
  " "
2539
2539
  )
@@ -2560,7 +2560,7 @@ const gu = 80, Zu = {
2560
2560
  t,
2561
2561
  O("implements ", C(i, " & ")),
2562
2562
  C(s, " "),
2563
- Ve(n)
2563
+ Xe(n)
2564
2564
  ],
2565
2565
  " "
2566
2566
  )
@@ -2574,7 +2574,7 @@ const gu = 80, Zu = {
2574
2574
  },
2575
2575
  EnumTypeDefinition: {
2576
2576
  leave: ({ description: e, name: t, directives: i, values: s }) => O("", e, `
2577
- `) + C(["enum", t, C(i, " "), Ve(s)], " ")
2577
+ `) + C(["enum", t, C(i, " "), Xe(s)], " ")
2578
2578
  },
2579
2579
  EnumValueDefinition: {
2580
2580
  leave: ({ description: e, name: t, directives: i }) => O("", e, `
@@ -2582,7 +2582,7 @@ const gu = 80, Zu = {
2582
2582
  },
2583
2583
  InputObjectTypeDefinition: {
2584
2584
  leave: ({ description: e, name: t, directives: i, fields: s }) => O("", e, `
2585
- `) + C(["input", t, C(i, " "), Ve(s)], " ")
2585
+ `) + C(["input", t, C(i, " "), Xe(s)], " ")
2586
2586
  },
2587
2587
  DirectiveDefinition: {
2588
2588
  leave: ({ description: e, name: t, arguments: i, repeatable: s, locations: n }) => O("", e, `
@@ -2593,7 +2593,7 @@ const gu = 80, Zu = {
2593
2593
  },
2594
2594
  SchemaExtension: {
2595
2595
  leave: ({ directives: e, operationTypes: t }) => C(
2596
- ["extend schema", C(e, " "), Ve(t)],
2596
+ ["extend schema", C(e, " "), Xe(t)],
2597
2597
  " "
2598
2598
  )
2599
2599
  },
@@ -2607,7 +2607,7 @@ const gu = 80, Zu = {
2607
2607
  e,
2608
2608
  O("implements ", C(t, " & ")),
2609
2609
  C(i, " "),
2610
- Ve(s)
2610
+ Xe(s)
2611
2611
  ],
2612
2612
  " "
2613
2613
  )
@@ -2619,7 +2619,7 @@ const gu = 80, Zu = {
2619
2619
  e,
2620
2620
  O("implements ", C(t, " & ")),
2621
2621
  C(i, " "),
2622
- Ve(s)
2622
+ Xe(s)
2623
2623
  ],
2624
2624
  " "
2625
2625
  )
@@ -2636,17 +2636,17 @@ const gu = 80, Zu = {
2636
2636
  )
2637
2637
  },
2638
2638
  EnumTypeExtension: {
2639
- leave: ({ name: e, directives: t, values: i }) => C(["extend enum", e, C(t, " "), Ve(i)], " ")
2639
+ leave: ({ name: e, directives: t, values: i }) => C(["extend enum", e, C(t, " "), Xe(i)], " ")
2640
2640
  },
2641
2641
  InputObjectTypeExtension: {
2642
- leave: ({ name: e, directives: t, fields: i }) => C(["extend input", e, C(t, " "), Ve(i)], " ")
2642
+ leave: ({ name: e, directives: t, fields: i }) => C(["extend input", e, C(t, " "), Xe(i)], " ")
2643
2643
  }
2644
2644
  };
2645
2645
  function C(e, t = "") {
2646
2646
  var i;
2647
2647
  return (i = e?.filter((s) => s).join(t)) !== null && i !== void 0 ? i : "";
2648
2648
  }
2649
- function Ve(e) {
2649
+ function Xe(e) {
2650
2650
  return O(`{
2651
2651
  `, wi(C(e, `
2652
2652
  `)), `
@@ -2969,16 +2969,16 @@ var $s = { exports: {} };
2969
2969
  headers: k(U.getAllResponseHeaders() || "")
2970
2970
  };
2971
2971
  ie.url = "responseURL" in U ? U.responseURL : ie.headers.get("X-Request-URL");
2972
- var Se = "response" in U ? U.response : U.responseText;
2973
- T(new Y(Se, ie));
2972
+ var Ge = "response" in U ? U.response : U.responseText;
2973
+ T(new Y(Ge, ie));
2974
2974
  }, U.onerror = function() {
2975
2975
  _(new TypeError("Network request failed"));
2976
2976
  }, U.ontimeout = function() {
2977
2977
  _(new TypeError("Network request failed"));
2978
2978
  }, U.onabort = function() {
2979
2979
  _(new l.DOMException("Aborted", "AbortError"));
2980
- }, U.open(B.method, B.url, !0), B.credentials === "include" ? U.withCredentials = !0 : B.credentials === "omit" && (U.withCredentials = !1), "responseType" in U && o.blob && (U.responseType = "blob"), B.headers.forEach(function(ie, Se) {
2981
- U.setRequestHeader(Se, ie);
2980
+ }, U.open(B.method, B.url, !0), B.credentials === "include" ? U.withCredentials = !0 : B.credentials === "omit" && (U.withCredentials = !1), "responseType" in U && o.blob && (U.responseType = "blob"), B.headers.forEach(function(ie, Ge) {
2981
+ U.setRequestHeader(Ge, ie);
2982
2982
  }), B.signal && (B.signal.addEventListener("abort", $), U.onreadystatechange = function() {
2983
2983
  U.readyState === 4 && B.signal.removeEventListener("abort", $);
2984
2984
  }), U.send(typeof B._bodyInit > "u" ? null : B._bodyInit);
@@ -3606,7 +3606,7 @@ const wr = 1e3, ed = 1e3 * 2, td = 4 * 60 * 60 * 1e3, bl = 15 * 60 * 1e3, vr = {
3606
3606
  bytes: 16e6,
3607
3607
  time: 5e3
3608
3608
  }
3609
- }, id = 100, xr = "app.highlight.io", sd = "app.launchdarkly.com", nd = {
3609
+ }, id = 100, xr = "app.highlight.io", sd = "https://app.launchdarkly.com", nd = {
3610
3610
  "observability.ld-stg.launchdarkly.com": "ld-stg.launchdarkly.com",
3611
3611
  "observability.app.launchdarkly.com": "app.launchdarkly.com",
3612
3612
  "observability.app.ld.catamorphic.com": "app.ld.catamorphic.com"
@@ -3742,7 +3742,7 @@ const Ut = new ad(), Pi = new cd(), Pn = () => {
3742
3742
  zi = e;
3743
3743
  }, Tr = (e) => {
3744
3744
  nn = e;
3745
- }, Ie = (e) => {
3745
+ }, Se = (e) => {
3746
3746
  try {
3747
3747
  return Pn().getItem(e);
3748
3748
  } catch (t) {
@@ -3801,12 +3801,12 @@ const ds = (e) => `${ye.SESSION_DATA}_${e}`, hd = () => {
3801
3801
  typeof globalThis < "u" && e != null && e.length && (globalThis.persistentSessionSecureID = e);
3802
3802
  }, fl = () => {
3803
3803
  var e;
3804
- return (e = Ie(ye.SESSION_ID)) != null ? e : "";
3804
+ return (e = Se(ye.SESSION_ID)) != null ? e : "";
3805
3805
  }, wt = (e) => {
3806
3806
  Je(ye.SESSION_ID, e);
3807
3807
  }, md = (e) => {
3808
3808
  const t = ds(e);
3809
- return JSON.parse(Ie(t) || "{}");
3809
+ return JSON.parse(Se(t) || "{}");
3810
3810
  }, Ni = (e) => {
3811
3811
  e || (e = fl());
3812
3812
  let t = md(e);
@@ -3875,7 +3875,7 @@ function Rd(e) {
3875
3875
  [t]: gl(e[t].key)
3876
3876
  })).reduce((t, i) => M(M({}, t), i), {}) : e.key;
3877
3877
  }
3878
- let kd = class {
3878
+ class kd {
3879
3879
  constructor(t, i) {
3880
3880
  Lt(this, "client"), Lt(this, "metadata"), this.client = t, this.metadata = i;
3881
3881
  }
@@ -3915,8 +3915,8 @@ let kd = class {
3915
3915
  })
3916
3916
  );
3917
3917
  }
3918
- };
3919
- class wd extends Bo {
3918
+ }
3919
+ let wd = class extends Bo {
3920
3920
  constructor(t, i) {
3921
3921
  super(), Lt(this, "client"), this.client = new kd(t, i);
3922
3922
  }
@@ -3950,11 +3950,14 @@ class wd extends Bo {
3950
3950
  track(t, i) {
3951
3951
  return this._bufferCall("track", [t, i]);
3952
3952
  }
3953
- }
3953
+ };
3954
+ const vd = "9.18.15", xd = {
3955
+ version: vd
3956
+ }, Td = xd.version;
3954
3957
  function Il(e, t) {
3955
- return xd(e);
3958
+ return Jd(e);
3956
3959
  }
3957
- function vd(e) {
3960
+ function Nd(e) {
3958
3961
  if (e.id.length)
3959
3962
  return `#${e.id}`;
3960
3963
  if (e.classList.length) {
@@ -3965,11 +3968,11 @@ function vd(e) {
3965
3968
  }
3966
3969
  return e.nodeName.toLowerCase();
3967
3970
  }
3968
- const xd = (e) => {
3971
+ const Jd = (e) => {
3969
3972
  let t = "";
3970
3973
  const i = e.getAttribute("class"), s = e.getAttribute("id");
3971
3974
  return s && (t = t.concat(Jr(s, "#"))), i && (t = t.concat(Jr(i, "."))), t === "" && (t = t.concat(e.tagName.toLowerCase())), t;
3972
- }, Jr = (e, t) => `${t}${e.trim().split(" ").join(t)}`, Td = (e) => {
3975
+ }, Jr = (e, t) => `${t}${e.trim().split(" ").join(t)}`, Ld = (e) => {
3973
3976
  let t;
3974
3977
  const i = () => {
3975
3978
  clearTimeout(t), t = setTimeout(() => {
@@ -4000,7 +4003,7 @@ const xd = (e) => {
4000
4003
  );
4001
4004
  return i;
4002
4005
  };
4003
- let Nd = class {
4006
+ let Yd = class {
4004
4007
  constructor(t) {
4005
4008
  Lt(this, "sessionSecureID");
4006
4009
  try {
@@ -4017,7 +4020,7 @@ let Nd = class {
4017
4020
  lastPushTime: Date.now()
4018
4021
  }));
4019
4022
  } catch (i) {
4020
- We(
4023
+ Ze(
4021
4024
  "Error initializing @launchdarkly observability plugin",
4022
4025
  "error",
4023
4026
  i
@@ -4025,7 +4028,7 @@ let Nd = class {
4025
4028
  }
4026
4029
  }
4027
4030
  };
4028
- var Jd = (e, t, i) => new Promise((s, n) => {
4031
+ var Ud = (e, t, i) => new Promise((s, n) => {
4029
4032
  var r = (a) => {
4030
4033
  try {
4031
4034
  o(i.next(a));
@@ -4046,7 +4049,7 @@ class Lr extends Bo {
4046
4049
  return this._isLoaded ? this._bufferCall("getSession", []) : null;
4047
4050
  }
4048
4051
  start(t) {
4049
- return Jd(this, null, function* () {
4052
+ return Ud(this, null, function* () {
4050
4053
  return this._bufferCall("start", [t]);
4051
4054
  });
4052
4055
  }
@@ -4065,14 +4068,14 @@ class Lr extends Bo {
4065
4068
  }
4066
4069
  let Rt;
4067
4070
  typeof globalThis < "u" ? globalThis.LDRecord ? Rt = globalThis.LDRecord : (Rt = new Lr(), globalThis.LDRecord = Rt) : Rt = new Lr();
4068
- var Ld = Object.defineProperty, Yd = Object.defineProperties, Ud = Object.getOwnPropertyDescriptors, Bi = Object.getOwnPropertySymbols, Sl = Object.prototype.hasOwnProperty, Gl = Object.prototype.propertyIsEnumerable, ln = (e, t, i) => t in e ? Ld(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, F = (e, t) => {
4071
+ var Fd = Object.defineProperty, Kd = Object.defineProperties, Od = Object.getOwnPropertyDescriptors, Bi = Object.getOwnPropertySymbols, Sl = Object.prototype.hasOwnProperty, Gl = Object.prototype.propertyIsEnumerable, ln = (e, t, i) => t in e ? Fd(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, F = (e, t) => {
4069
4072
  for (var i in t || (t = {}))
4070
4073
  Sl.call(t, i) && ln(e, i, t[i]);
4071
4074
  if (Bi)
4072
4075
  for (var i of Bi(t))
4073
4076
  Gl.call(t, i) && ln(e, i, t[i]);
4074
4077
  return e;
4075
- }, ge = (e, t) => Yd(e, Ud(t)), ot = (e, t) => {
4078
+ }, ge = (e, t) => Kd(e, Od(t)), ot = (e, t) => {
4076
4079
  var i = {};
4077
4080
  for (var s in e)
4078
4081
  Sl.call(e, s) && t.indexOf(s) < 0 && (i[s] = e[s]);
@@ -4096,13 +4099,13 @@ var Ld = Object.defineProperty, Yd = Object.defineProperties, Ud = Object.getOwn
4096
4099
  }, o = (a) => a.done ? s(a.value) : Promise.resolve(a.value).then(r, l);
4097
4100
  o((i = i.apply(e, t)).next());
4098
4101
  });
4099
- const Fd = {
4102
+ const Md = {
4100
4103
  key: "_sid"
4101
- }, Kd = "rrweb/sequential-id@1", Od = (e) => {
4102
- const t = Fd;
4104
+ }, Ed = "rrweb/sequential-id@1", Hd = (e) => {
4105
+ const t = Md;
4103
4106
  let i = 0;
4104
4107
  return {
4105
- name: Kd,
4108
+ name: Ed,
4106
4109
  eventProcessor(s) {
4107
4110
  return Object.assign(s, {
4108
4111
  [t.key]: ++i
@@ -4111,7 +4114,7 @@ const Fd = {
4111
4114
  options: t
4112
4115
  };
4113
4116
  };
4114
- var Md = Object.defineProperty, Ed = (e, t, i) => t in e ? Md(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, S = (e, t, i) => Ed(e, typeof t != "symbol" ? t + "" : t, i), Yr, Hd = Object.defineProperty, zd = (e, t, i) => t in e ? Hd(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, Ur = (e, t, i) => zd(e, typeof t != "symbol" ? t + "" : t, i), le = /* @__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))(le || {});
4117
+ var zd = Object.defineProperty, Pd = (e, t, i) => t in e ? zd(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, S = (e, t, i) => Pd(e, typeof t != "symbol" ? t + "" : t, i), Yr, Bd = Object.defineProperty, Dd = (e, t, i) => t in e ? Bd(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, Ur = (e, t, i) => Dd(e, typeof t != "symbol" ? t + "" : t, i), le = /* @__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))(le || {});
4115
4118
  const Fr = {
4116
4119
  Node: ["childNodes", "parentNode", "parentElement", "textContent"],
4117
4120
  ShadowRoot: ["host", "styleSheets"],
@@ -4122,7 +4125,7 @@ const Fr = {
4122
4125
  ShadowRoot: ["getSelection"],
4123
4126
  Element: [],
4124
4127
  MutationObserver: ["constructor"]
4125
- }, oi = {}, Pd = () => !!globalThis.Zone;
4128
+ }, oi = {}, jd = () => !!globalThis.Zone;
4126
4129
  function Bn(e) {
4127
4130
  if (oi[e])
4128
4131
  return oi[e];
@@ -4139,7 +4142,7 @@ function Bn(e) {
4139
4142
  return typeof i[o] == "function" && ((a = i[o]) == null ? void 0 : a.toString().includes("[native code]"));
4140
4143
  }
4141
4144
  ));
4142
- if (n && l && !Pd())
4145
+ if (n && l && !jd())
4143
4146
  return oi[e] = t.prototype, t.prototype;
4144
4147
  try {
4145
4148
  const o = document.createElement("iframe");
@@ -4176,43 +4179,43 @@ function Vl(e, t, i) {
4176
4179
  const n = Bn(e)[i];
4177
4180
  return typeof n != "function" ? t[i] : (Js[s] = n, n.bind(t));
4178
4181
  }
4179
- function Bd(e) {
4182
+ function Qd(e) {
4180
4183
  return Me("Node", e, "childNodes");
4181
4184
  }
4182
- function Dd(e) {
4185
+ function Ad(e) {
4183
4186
  return Me("Node", e, "parentNode");
4184
4187
  }
4185
- function jd(e) {
4188
+ function _d(e) {
4186
4189
  return Me("Node", e, "parentElement");
4187
4190
  }
4188
- function Qd(e) {
4191
+ function $d(e) {
4189
4192
  return Me("Node", e, "textContent");
4190
4193
  }
4191
- function Ad(e, t) {
4194
+ function qd(e, t) {
4192
4195
  return Vl("Node", e, "contains")(t);
4193
4196
  }
4194
- function _d(e) {
4197
+ function eh(e) {
4195
4198
  return Vl("Node", e, "getRootNode")();
4196
4199
  }
4197
- function $d(e) {
4200
+ function th(e) {
4198
4201
  return !e || !("host" in e) ? null : Me("ShadowRoot", e, "host");
4199
4202
  }
4200
- function qd(e) {
4203
+ function ih(e) {
4201
4204
  return e.styleSheets;
4202
4205
  }
4203
- function eh(e) {
4206
+ function sh(e) {
4204
4207
  return !e || !("shadowRoot" in e) ? null : Me("Element", e, "shadowRoot");
4205
4208
  }
4206
- function th(e, t) {
4209
+ function nh(e, t) {
4207
4210
  return Me("Element", e, "querySelector")(t);
4208
4211
  }
4209
- function ih(e, t) {
4212
+ function rh(e, t) {
4210
4213
  return Me("Element", e, "querySelectorAll")(t);
4211
4214
  }
4212
- function sh() {
4215
+ function oh() {
4213
4216
  return Bn("MutationObserver").constructor;
4214
4217
  }
4215
- function nh(e, t, i) {
4218
+ function lh(e, t, i) {
4216
4219
  try {
4217
4220
  if (!(t in e))
4218
4221
  return () => {
@@ -4232,19 +4235,19 @@ function nh(e, t, i) {
4232
4235
  }
4233
4236
  }
4234
4237
  const ce = {
4235
- childNodes: Bd,
4236
- parentNode: Dd,
4237
- parentElement: jd,
4238
- textContent: Qd,
4239
- contains: Ad,
4240
- getRootNode: _d,
4241
- host: $d,
4242
- styleSheets: qd,
4243
- shadowRoot: eh,
4244
- querySelector: th,
4245
- querySelectorAll: ih,
4246
- mutationObserver: sh,
4247
- patch: nh
4238
+ childNodes: Qd,
4239
+ parentNode: Ad,
4240
+ parentElement: _d,
4241
+ textContent: $d,
4242
+ contains: qd,
4243
+ getRootNode: eh,
4244
+ host: th,
4245
+ styleSheets: ih,
4246
+ shadowRoot: sh,
4247
+ querySelector: nh,
4248
+ querySelectorAll: rh,
4249
+ mutationObserver: oh,
4250
+ patch: lh
4248
4251
  };
4249
4252
  function Xl(e) {
4250
4253
  return e.nodeType === e.ELEMENT_NODE;
@@ -4260,13 +4263,13 @@ function vt(e) {
4260
4263
  function xt(e) {
4261
4264
  return Object.prototype.toString.call(e) === "[object ShadowRoot]";
4262
4265
  }
4263
- function rh(e) {
4266
+ function ah(e) {
4264
4267
  return e.includes(" background-clip: text;") && !e.includes(" -webkit-background-clip: text;") && (e = e.replace(
4265
4268
  /\sbackground-clip:\s*text;/g,
4266
4269
  " -webkit-background-clip: text; background-clip: text;"
4267
4270
  )), e;
4268
4271
  }
4269
- function oh(e) {
4272
+ function ch(e) {
4270
4273
  const { cssText: t } = e;
4271
4274
  if (t.split('"').length < 3) return t;
4272
4275
  const i = ["@import", `url(${JSON.stringify(e.href)})`];
@@ -4283,36 +4286,36 @@ function an(e) {
4283
4286
  t,
4284
4287
  (n) => Wl(n, i)
4285
4288
  ).join("");
4286
- return rh(s);
4289
+ return ah(s);
4287
4290
  } catch {
4288
4291
  return null;
4289
4292
  }
4290
4293
  }
4291
4294
  function Wl(e, t) {
4292
- if (ah(e)) {
4295
+ if (dh(e)) {
4293
4296
  let i;
4294
4297
  try {
4295
4298
  i = // for same-origin stylesheets,
4296
4299
  // we can access the imported stylesheet rules directly
4297
4300
  an(e.styleSheet) || // work around browser issues with the raw string `@import url(...)` statement
4298
- oh(e);
4301
+ ch(e);
4299
4302
  } catch {
4300
4303
  i = e.cssText;
4301
4304
  }
4302
4305
  return e.styleSheet.href ? Qi(i, e.styleSheet.href) : i;
4303
4306
  } else {
4304
4307
  let i = e.cssText;
4305
- return ch(e) && e.selectorText.includes(":") && (i = lh(i)), t ? Qi(i, t) : i;
4308
+ return hh(e) && e.selectorText.includes(":") && (i = uh(i)), t ? Qi(i, t) : i;
4306
4309
  }
4307
4310
  }
4308
- function lh(e) {
4311
+ function uh(e) {
4309
4312
  const t = /(\[(?:[\w-]+)[^\\])(:(?:[\w-]+)\])/gm;
4310
4313
  return e.replace(t, "$1\\$2");
4311
4314
  }
4312
- function ah(e) {
4315
+ function dh(e) {
4313
4316
  return "styleSheet" in e;
4314
4317
  }
4315
- function ch(e) {
4318
+ function hh(e) {
4316
4319
  return "selectorText" in e;
4317
4320
  }
4318
4321
  class Cl {
@@ -4364,7 +4367,7 @@ class Cl {
4364
4367
  this.idNodeMap = /* @__PURE__ */ new Map(), this.nodeMetaMap = /* @__PURE__ */ new WeakMap();
4365
4368
  }
4366
4369
  }
4367
- function uh() {
4370
+ function ph() {
4368
4371
  return new Cl();
4369
4372
  }
4370
4373
  function Di({
@@ -4388,7 +4391,7 @@ function lt(e) {
4388
4391
  return e.toLowerCase();
4389
4392
  }
4390
4393
  const Or = "__rrweb_original__";
4391
- function dh(e) {
4394
+ function mh(e) {
4392
4395
  const t = e.getContext("2d");
4393
4396
  if (!t) return !0;
4394
4397
  const i = 50;
@@ -4426,24 +4429,24 @@ function Rl(e, t) {
4426
4429
  const n = /\.([0-9a-z]+)(?:$)/i, r = s.pathname.match(n);
4427
4430
  return (i = r?.[1]) != null ? i : null;
4428
4431
  }
4429
- function hh(e) {
4432
+ function bh(e) {
4430
4433
  let t = "";
4431
4434
  return e.indexOf("//") > -1 ? t = e.split("/").slice(0, 3).join("/") : t = e.split("/")[0], t = t.split("?")[0], t;
4432
4435
  }
4433
- const ph = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm, mh = /^(?:[a-z+]+:)?\/\//i, bh = /^www\..*/i, fh = /^(data:)([^,]*),(.*)/i;
4436
+ const fh = /url\((?:(')([^']*)'|(")(.*?)"|([^)]*))\)/gm, yh = /^(?:[a-z+]+:)?\/\//i, gh = /^www\..*/i, Zh = /^(data:)([^,]*),(.*)/i;
4434
4437
  function Qi(e, t) {
4435
4438
  return (e || "").replace(
4436
- ph,
4439
+ fh,
4437
4440
  (i, s, n, r, l, o) => {
4438
4441
  const a = n || l || o, c = s || r || "";
4439
4442
  if (!a)
4440
4443
  return i;
4441
- if (mh.test(a) || bh.test(a))
4444
+ if (yh.test(a) || gh.test(a))
4442
4445
  return `url(${c}${a}${c})`;
4443
- if (fh.test(a))
4446
+ if (Zh.test(a))
4444
4447
  return `url(${c}${a}${c})`;
4445
4448
  if (a[0] === "/")
4446
- return `url(${c}${hh(t) + a}${c})`;
4449
+ return `url(${c}${bh(t) + a}${c})`;
4447
4450
  const u = t.split("/"), h = a.split("/");
4448
4451
  u.pop();
4449
4452
  for (const m of h)
@@ -4455,7 +4458,7 @@ function Qi(e, t) {
4455
4458
  function li(e, t = !1) {
4456
4459
  return t ? e.replace(/(\/\*[^*]*\*\/)|[\s;]/g, "") : e.replace(/(\/\*[^*]*\*\/)|[\s;]/g, "").replace(/0px/g, "0");
4457
4460
  }
4458
- function yh(e, t, i = !1) {
4461
+ function Ih(e, t, i = !1) {
4459
4462
  const s = Array.from(t.childNodes), n = [];
4460
4463
  let r = 0;
4461
4464
  if (s.length > 1 && e && typeof e == "string") {
@@ -4521,8 +4524,8 @@ function yh(e, t, i = !1) {
4521
4524
  }
4522
4525
  return n.push(e), n;
4523
4526
  }
4524
- function gh(e, t) {
4525
- return yh(e, t).join("/* rr_split */");
4527
+ function Sh(e, t) {
4528
+ return Ih(e, t).join("/* rr_split */");
4526
4529
  }
4527
4530
  function Dn(e) {
4528
4531
  return e = e.replace(/[^ -~]+/g, ""), e = e?.split(" ").map((t) => Math.random().toString(20).substring(2, t.length)).join(" ") || "", e;
@@ -4530,23 +4533,23 @@ function Dn(e) {
4530
4533
  function cn(e) {
4531
4534
  return e === "img" || e === "video" || e === "audio" || e === "source";
4532
4535
  }
4533
- const Zh = new RegExp(
4536
+ const Gh = new RegExp(
4534
4537
  /[a-zA-Z0-9.!#$%&'*+=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*/
4535
- ), Ih = new RegExp(/[0-9]{9,16}/), Sh = new RegExp(/[0-9]{3}-?[0-9]{2}-?[0-9]{4}/), Gh = new RegExp(
4538
+ ), Vh = new RegExp(/[0-9]{9,16}/), Xh = new RegExp(/[0-9]{3}-?[0-9]{2}-?[0-9]{4}/), Wh = new RegExp(
4536
4539
  /[+]?[(]?[0-9]{3}[)]?[-\s.]?[0-9]{3}[-\s.]?[0-9]{4,6}/
4537
- ), Vh = new RegExp(/[0-9]{4}-?[0-9]{4}-?[0-9]{4}-?[0-9]{4}/), Xh = new RegExp(
4540
+ ), Ch = new RegExp(/[0-9]{4}-?[0-9]{4}-?[0-9]{4}-?[0-9]{4}/), Rh = new RegExp(
4538
4541
  /[0-9]{1,5}.?[0-9]{0,3}\s[a-zA-Z]{2,30}\s[a-zA-Z]{2,15}/
4539
- ), Wh = new RegExp(/(?:[0-9]{1,3}.){3}[0-9]{1,3}/), Ch = [
4540
- Zh,
4541
- Ih,
4542
- Sh,
4542
+ ), kh = new RegExp(/(?:[0-9]{1,3}.){3}[0-9]{1,3}/), wh = [
4543
4543
  Gh,
4544
4544
  Vh,
4545
4545
  Xh,
4546
- Wh
4546
+ Wh,
4547
+ Ch,
4548
+ Rh,
4549
+ kh
4547
4550
  ];
4548
4551
  function kl(e) {
4549
- return e ? Ch.some((t) => t.test(e)) : !1;
4552
+ return e ? wh.some((t) => t.test(e)) : !1;
4550
4553
  }
4551
4554
  const wl = ({
4552
4555
  maskInputOptions: e,
@@ -4557,20 +4560,20 @@ const wl = ({
4557
4560
  const n = i && i.toLowerCase();
4558
4561
  return s !== "true" && (!!e[t.toLowerCase()] || !!(n && e[n]));
4559
4562
  };
4560
- let Rh = 1;
4561
- const kh = new RegExp("[^a-z0-9-_:]"), Ft = -2;
4563
+ let vh = 1;
4564
+ const xh = new RegExp("[^a-z0-9-_:]"), Ft = -2;
4562
4565
  function vl() {
4563
- return Rh++;
4566
+ return vh++;
4564
4567
  }
4565
- function wh(e) {
4568
+ function Th(e) {
4566
4569
  if (e instanceof HTMLFormElement)
4567
4570
  return "form";
4568
4571
  const t = lt(e.tagName);
4569
- return kh.test(t) ? "div" : t;
4572
+ return xh.test(t) ? "div" : t;
4570
4573
  }
4571
4574
  let $e, Mr;
4572
- const vh = /^[^ \t\n\r\u000c]+/, xh = /^[, \t\n\r\u000c]+/;
4573
- function Th(e, t) {
4575
+ const Nh = /^[^ \t\n\r\u000c]+/, Jh = /^[, \t\n\r\u000c]+/;
4576
+ function Lh(e, t) {
4574
4577
  if (t.trim() === "")
4575
4578
  return t;
4576
4579
  let i = 0;
@@ -4580,8 +4583,8 @@ function Th(e, t) {
4580
4583
  return o ? (l = o[0], i += l.length, l) : "";
4581
4584
  }
4582
4585
  const n = [];
4583
- for (; s(xh), !(i >= t.length); ) {
4584
- let r = s(vh);
4586
+ for (; s(Jh), !(i >= t.length); ) {
4587
+ let r = s(Nh);
4585
4588
  if (r.slice(-1) === ",")
4586
4589
  r = Ai(e, r.substring(0, r.length - 1)), n.push(r);
4587
4590
  else {
@@ -4609,7 +4612,7 @@ const Er = /* @__PURE__ */ new WeakMap();
4609
4612
  function Ai(e, t) {
4610
4613
  return !t || t.trim() === "" ? t : jn(e, t);
4611
4614
  }
4612
- function Nh(e) {
4615
+ function Yh(e) {
4613
4616
  return !!(e.tagName === "svg" || e.ownerSVGElement);
4614
4617
  }
4615
4618
  function jn(e, t) {
@@ -4621,7 +4624,7 @@ function jn(e, t) {
4621
4624
  return i.setAttribute("href", t), i.href;
4622
4625
  }
4623
4626
  function xl(e, t, i, s) {
4624
- return s && (i === "src" || i === "href" && !(t === "use" && s[0] === "#") || i === "xlink:href" && s[0] !== "#" || i === "background" && (t === "table" || t === "td" || t === "th") ? Ai(e, s) : i === "srcset" ? Th(e, s) : i === "style" ? Qi(s, jn(e)) : t === "object" && i === "data" ? Ai(e, s) : s);
4627
+ return s && (i === "src" || i === "href" && !(t === "use" && s[0] === "#") || i === "xlink:href" && s[0] !== "#" || i === "background" && (t === "table" || t === "td" || t === "th") ? Ai(e, s) : i === "srcset" ? Lh(e, s) : i === "style" ? Qi(s, jn(e)) : t === "object" && i === "data" ? Ai(e, s) : s);
4625
4628
  }
4626
4629
  function Tl(e, t, i) {
4627
4630
  return (e === "video" || e === "audio") && t === "autoplay";
@@ -4679,7 +4682,7 @@ function Nl(e, t, i, s) {
4679
4682
  }
4680
4683
  return !1;
4681
4684
  }
4682
- function Jh(e, t, i) {
4685
+ function Uh(e, t, i) {
4683
4686
  const s = e.contentWindow;
4684
4687
  if (!s)
4685
4688
  return;
@@ -4703,7 +4706,7 @@ function Jh(e, t, i) {
4703
4706
  return setTimeout(t, 0), e.addEventListener("load", t);
4704
4707
  e.addEventListener("load", t);
4705
4708
  }
4706
- function Lh(e, t, i) {
4709
+ function Fh(e, t, i) {
4707
4710
  let s = !1, n;
4708
4711
  try {
4709
4712
  n = e.sheet;
@@ -4718,7 +4721,7 @@ function Lh(e, t, i) {
4718
4721
  clearTimeout(r), s = !0, t();
4719
4722
  });
4720
4723
  }
4721
- function Yh(e, t) {
4724
+ function Kh(e, t) {
4722
4725
  const {
4723
4726
  doc: i,
4724
4727
  mirror: s,
@@ -4738,7 +4741,7 @@ function Yh(e, t) {
4738
4741
  newlyAddedElement: Z = !1,
4739
4742
  cssCaptured: X = !1,
4740
4743
  privacySetting: R
4741
- } = t, W = Uh(i, s);
4744
+ } = t, W = Oh(i, s);
4742
4745
  switch (e.nodeType) {
4743
4746
  case e.DOCUMENT_NODE:
4744
4747
  return e.compatMode !== "CSS1Compat" ? {
@@ -4759,7 +4762,7 @@ function Yh(e, t) {
4759
4762
  rootId: W
4760
4763
  };
4761
4764
  case e.ELEMENT_NODE:
4762
- return Kh(e, {
4765
+ return Eh(e, {
4763
4766
  doc: i,
4764
4767
  blockClass: n,
4765
4768
  blockSelector: r,
@@ -4777,7 +4780,7 @@ function Yh(e, t) {
4777
4780
  rootId: W
4778
4781
  });
4779
4782
  case e.TEXT_NODE:
4780
- return Fh(e, {
4783
+ return Mh(e, {
4781
4784
  doc: i,
4782
4785
  needsMask: l,
4783
4786
  maskTextFn: u,
@@ -4801,12 +4804,12 @@ function Yh(e, t) {
4801
4804
  return !1;
4802
4805
  }
4803
4806
  }
4804
- function Uh(e, t) {
4807
+ function Oh(e, t) {
4805
4808
  if (!t.hasNode(e)) return;
4806
4809
  const i = t.getId(e);
4807
4810
  return i === 1 ? void 0 : i;
4808
4811
  }
4809
- function Fh(e, t) {
4812
+ function Mh(e, t) {
4810
4813
  var i;
4811
4814
  const { needsMask: s, maskTextFn: n, privacySetting: r, rootId: l, cssCaptured: o } = t, a = ce.parentNode(e), c = a && a.tagName;
4812
4815
  let u = "";
@@ -4827,7 +4830,7 @@ function Fh(e, t) {
4827
4830
  rootId: l
4828
4831
  };
4829
4832
  }
4830
- function Kh(e, t) {
4833
+ function Eh(e, t) {
4831
4834
  const {
4832
4835
  doc: i,
4833
4836
  blockClass: s,
@@ -4847,7 +4850,7 @@ function Kh(e, t) {
4847
4850
  } = t;
4848
4851
  let Z = Hr(e, s, n);
4849
4852
  const X = Hr(e, a, null), R = d === "strict";
4850
- let W = wh(e), G = {};
4853
+ let W = Th(e), G = {};
4851
4854
  const w = e.attributes.length;
4852
4855
  for (let V = 0; V < w; V++) {
4853
4856
  const k = e.attributes[V];
@@ -4867,7 +4870,7 @@ function Kh(e, t) {
4867
4870
  let V = an(
4868
4871
  e.sheet
4869
4872
  );
4870
- V && (e.childNodes.length > 1 && (V = gh(V, e)), G._cssText = V);
4873
+ V && (e.childNodes.length > 1 && (V = Sh(V, e)), G._cssText = V);
4871
4874
  }
4872
4875
  if (W === "input" || W === "textarea" || W === "select") {
4873
4876
  const V = e.value, k = e.checked;
@@ -4883,7 +4886,7 @@ function Kh(e, t) {
4883
4886
  }
4884
4887
  if (W === "option" && (e.selected && !l.select ? G.selected = !0 : delete G.selected), W === "dialog" && e.open && (G.rr_open_mode = e.matches("dialog:modal") ? "modal" : "non-modal"), W === "canvas" && m) {
4885
4888
  if (e.__context === "2d")
4886
- dh(e);
4889
+ mh(e);
4887
4890
  else if (!("__context" in e)) {
4888
4891
  const V = e.toDataURL(
4889
4892
  c.type,
@@ -4963,7 +4966,7 @@ function Kh(e, t) {
4963
4966
  tagName: W,
4964
4967
  attributes: G,
4965
4968
  childNodes: [],
4966
- isSVG: Nh(e) || void 0,
4969
+ isSVG: Yh(e) || void 0,
4967
4970
  needBlock: Z,
4968
4971
  needMask: X,
4969
4972
  rootId: I,
@@ -4973,7 +4976,7 @@ function Kh(e, t) {
4973
4976
  function q(e) {
4974
4977
  return e == null ? "" : e.toLowerCase();
4975
4978
  }
4976
- function Oh(e, t) {
4979
+ function Hh(e, t) {
4977
4980
  return !!(t.comment && e.type === le.Comment || e.type === le.Element && (t.script && // script tag
4978
4981
  (e.tagName === "script" || // (module)preload link
4979
4982
  e.tagName === "link" && (e.attributes.rel === "preload" && e.attributes.as === "script" || e.attributes.rel === "modulepreload") || // prefetch link
@@ -5017,7 +5020,7 @@ function it(e, t) {
5017
5020
  o,
5018
5021
  Y === void 0
5019
5022
  ));
5020
- const te = Yh(e, {
5023
+ const te = Kh(e, {
5021
5024
  doc: i,
5022
5025
  mirror: s,
5023
5026
  blockClass: n,
@@ -5040,7 +5043,7 @@ function it(e, t) {
5040
5043
  if (!te)
5041
5044
  return console.warn(e, "not serialized"), null;
5042
5045
  let f;
5043
- s.hasNode(e) ? f = s.getId(e) : Oh(te, p) || !ee && te.type === le.Text && !te.textContent.replace(/^\s+|\s+$/gm, "").length ? f = Ft : f = vl();
5046
+ s.hasNode(e) ? f = s.getId(e) : Hh(te, p) || !ee && te.type === le.Text && !te.textContent.replace(/^\s+|\s+$/gm, "").length ? f = Ft : f = vl();
5044
5047
  const y = Object.assign(te, { id: f });
5045
5048
  if (s.add(e, y), f === Ft)
5046
5049
  return null;
@@ -5087,20 +5090,20 @@ function it(e, t) {
5087
5090
  };
5088
5091
  if (!(y.type === le.Element && y.tagName === "textarea" && y.attributes.value !== void 0)) {
5089
5092
  y.type === le.Element && y.attributes._cssText !== void 0 && typeof y.attributes._cssText == "string" && ($.cssCaptured = !0);
5090
- for (const Se of Array.from(ce.childNodes(e))) {
5091
- const Fe = it(Se, $);
5093
+ for (const Ge of Array.from(ce.childNodes(e))) {
5094
+ const Fe = it(Ge, $);
5092
5095
  Fe && y.childNodes.push(Fe);
5093
5096
  }
5094
5097
  }
5095
5098
  let ie = null;
5096
5099
  if (Xl(e) && (ie = ce.shadowRoot(e)))
5097
- for (const Se of Array.from(ce.childNodes(ie))) {
5098
- const Fe = it(Se, $);
5100
+ for (const Ge of Array.from(ce.childNodes(ie))) {
5101
+ const Fe = it(Ge, $);
5099
5102
  Fe && (xt(ie) && (Fe.isShadow = !0), y.childNodes.push(Fe));
5100
5103
  }
5101
5104
  }
5102
5105
  const U = ce.parentNode(e);
5103
- return U && vt(U) && xt(U) && (y.isShadow = !0), y.type === le.Element && y.tagName === "iframe" && Jh(
5106
+ return U && vt(U) && xt(U) && (y.isShadow = !0), y.type === le.Element && y.tagName === "iframe" && Uh(
5104
5107
  e,
5105
5108
  () => {
5106
5109
  const $ = e.contentDocument;
@@ -5139,7 +5142,7 @@ function it(e, t) {
5139
5142
  }
5140
5143
  },
5141
5144
  W
5142
- ), y.type === le.Element && y.tagName === "link" && typeof y.attributes.rel == "string" && (y.attributes.rel === "stylesheet" || y.attributes.rel === "preload" && typeof y.attributes.href == "string" && Rl(y.attributes.href) === "css") && Lh(
5145
+ ), y.type === le.Element && y.tagName === "link" && typeof y.attributes.rel == "string" && (y.attributes.rel === "stylesheet" || y.attributes.rel === "preload" && typeof y.attributes.href == "string" && Rl(y.attributes.href) === "css") && Fh(
5143
5146
  e,
5144
5147
  () => {
5145
5148
  if (G) {
@@ -5179,7 +5182,7 @@ function it(e, t) {
5179
5182
  w
5180
5183
  ), y;
5181
5184
  }
5182
- function Mh(e, t) {
5185
+ function zh(e, t) {
5183
5186
  const {
5184
5187
  mirror: i = new Cl(),
5185
5188
  blockClass: s = "highlight-block",
@@ -5266,7 +5269,7 @@ function Mh(e, t) {
5266
5269
  privacySetting: v
5267
5270
  });
5268
5271
  }
5269
- function Eh(e) {
5272
+ function Ph(e) {
5270
5273
  if (e.__esModule) return e;
5271
5274
  var t = e.default;
5272
5275
  if (typeof t == "function") {
@@ -5290,12 +5293,12 @@ var Qn = { exports: {} }, J = String, Jl = function() {
5290
5293
  };
5291
5294
  Qn.exports = Jl();
5292
5295
  Qn.exports.createColors = Jl;
5293
- var Hh = Qn.exports;
5294
- const zh = {}, Ph = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5296
+ var Bh = Qn.exports;
5297
+ const Dh = {}, jh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5295
5298
  __proto__: null,
5296
- default: zh
5297
- }, Symbol.toStringTag, { value: "Module" })), Ce = /* @__PURE__ */ Eh(Ph);
5298
- let zr = Hh, Pr = Ce, un = class Ll extends Error {
5299
+ default: Dh
5300
+ }, Symbol.toStringTag, { value: "Module" })), Ce = /* @__PURE__ */ Ph(jh);
5301
+ let zr = Bh, Pr = Ce, un = class Ll extends Error {
5299
5302
  constructor(t, i, s, n, r, l) {
5300
5303
  super(t), this.name = "CssSyntaxError", this.reason = t, r && (this.file = r), n && (this.source = n), l && (this.plugin = l), typeof i < "u" && typeof s < "u" && (typeof i == "number" ? (this.line = i, this.column = s) : (this.line = i.line, this.column = i.column, this.endLine = s.line, this.endColumn = s.column)), this.setMessage(), Error.captureStackTrace && Error.captureStackTrace(this, Ll);
5301
5304
  }
@@ -5360,7 +5363,7 @@ const Br = {
5360
5363
  indent: " ",
5361
5364
  semicolon: !1
5362
5365
  };
5363
- function Bh(e) {
5366
+ function Qh(e) {
5364
5367
  return e[0].toUpperCase() + e.slice(1);
5365
5368
  }
5366
5369
  let dn = class {
@@ -5431,7 +5434,7 @@ let dn = class {
5431
5434
  if (i === "before" || i === "after")
5432
5435
  return this.beforeAfter(e, i);
5433
5436
  {
5434
- let l = "raw" + Bh(i);
5437
+ let l = "raw" + Qh(i);
5435
5438
  this[l] ? s = this[l](r, e) : r.walk((o) => {
5436
5439
  if (s = o.raws[t], typeof s < "u") return !1;
5437
5440
  });
@@ -5530,16 +5533,16 @@ let dn = class {
5530
5533
  };
5531
5534
  var Yl = dn;
5532
5535
  dn.default = dn;
5533
- let Dh = Yl;
5536
+ let Ah = Yl;
5534
5537
  function hn(e, t) {
5535
- new Dh(t).stringify(e);
5538
+ new Ah(t).stringify(e);
5536
5539
  }
5537
5540
  var hs = hn;
5538
5541
  hn.default = hn;
5539
5542
  var Qt = {};
5540
5543
  Qt.isClean = Symbol("isClean");
5541
5544
  Qt.my = Symbol("my");
5542
- let jh = An, Qh = Yl, Ah = hs, { isClean: gt, my: _h } = Qt;
5545
+ let _h = An, $h = Yl, qh = hs, { isClean: gt, my: ep } = Qt;
5543
5546
  function pn(e, t) {
5544
5547
  let i = new e.constructor();
5545
5548
  for (let s in e) {
@@ -5568,7 +5571,7 @@ let mn = class {
5568
5571
  return this;
5569
5572
  }
5570
5573
  constructor(e = {}) {
5571
- this.raws = {}, this[gt] = !1, this[_h] = !0;
5574
+ this.raws = {}, this[gt] = !1, this[ep] = !0;
5572
5575
  for (let t in e)
5573
5576
  if (t === "nodes") {
5574
5577
  this.nodes = [];
@@ -5625,7 +5628,7 @@ let mn = class {
5625
5628
  t
5626
5629
  );
5627
5630
  }
5628
- return new jh(e);
5631
+ return new _h(e);
5629
5632
  }
5630
5633
  getProxyProcessor() {
5631
5634
  return {
@@ -5710,7 +5713,7 @@ let mn = class {
5710
5713
  return (i.line < t.line || i.line === t.line && i.column <= t.column) && (i = { column: t.column + 1, line: t.line }), { end: i, start: t };
5711
5714
  }
5712
5715
  raw(e, t) {
5713
- return new Qh().raw(this, e, t);
5716
+ return new $h().raw(this, e, t);
5714
5717
  }
5715
5718
  remove() {
5716
5719
  return this.parent && this.parent.removeChild(this), this.parent = void 0, this;
@@ -5756,7 +5759,7 @@ let mn = class {
5756
5759
  toProxy() {
5757
5760
  return this.proxyCache || (this.proxyCache = new Proxy(this, this.getProxyProcessor())), this.proxyCache;
5758
5761
  }
5759
- toString(e = Ah) {
5762
+ toString(e = qh) {
5760
5763
  e.stringify && (e = e.stringify);
5761
5764
  let t = "";
5762
5765
  return e(this, (i) => {
@@ -5771,14 +5774,14 @@ let mn = class {
5771
5774
  };
5772
5775
  var ps = mn;
5773
5776
  mn.default = mn;
5774
- let $h = ps, bn = class extends $h {
5777
+ let tp = ps, bn = class extends tp {
5775
5778
  constructor(e) {
5776
5779
  super(e), this.type = "comment";
5777
5780
  }
5778
5781
  };
5779
5782
  var ms = bn;
5780
5783
  bn.default = bn;
5781
- let qh = ps, fn = class extends qh {
5784
+ let ip = ps, fn = class extends ip {
5782
5785
  get variable() {
5783
5786
  return this.prop.startsWith("--") || this.prop[0] === "$";
5784
5787
  }
@@ -5788,7 +5791,7 @@ let qh = ps, fn = class extends qh {
5788
5791
  };
5789
5792
  var bs = fn;
5790
5793
  fn.default = fn;
5791
- let Ul = ms, Fl = bs, ep = ps, { isClean: Kl, my: Ol } = Qt, _n, Ml, El, $n;
5794
+ let Ul = ms, Fl = bs, sp = ps, { isClean: Kl, my: Ol } = Qt, _n, Ml, El, $n;
5792
5795
  function Hl(e) {
5793
5796
  return e.map((t) => (t.nodes && (t.nodes = Hl(t.nodes)), delete t.source, t));
5794
5797
  }
@@ -5797,7 +5800,7 @@ function zl(e) {
5797
5800
  for (let t of e.proxyOf.nodes)
5798
5801
  zl(t);
5799
5802
  }
5800
- let Ye = class Pl extends ep {
5803
+ let Ye = class Pl extends sp {
5801
5804
  get first() {
5802
5805
  if (this.proxyOf.nodes)
5803
5806
  return this.proxyOf.nodes[0];
@@ -6019,7 +6022,7 @@ let Bl = je, $i = class extends Bl {
6019
6022
  var qn = $i;
6020
6023
  $i.default = $i;
6021
6024
  Bl.registerAtRule($i);
6022
- let tp = je, Dl, jl, Kt = class extends tp {
6025
+ let np = je, Dl, jl, Kt = class extends np {
6023
6026
  constructor(e) {
6024
6027
  super(F({ type: "document" }, e)), this.nodes || (this.nodes = []);
6025
6028
  }
@@ -6035,15 +6038,15 @@ Kt.registerProcessor = (e) => {
6035
6038
  };
6036
6039
  var er = Kt;
6037
6040
  Kt.default = Kt;
6038
- let ip = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", sp = (e = 21) => {
6041
+ let rp = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", op = (e = 21) => {
6039
6042
  let t = "", i = e | 0;
6040
6043
  for (; i--; )
6041
- t += ip[Math.random() * 64 | 0];
6044
+ t += rp[Math.random() * 64 | 0];
6042
6045
  return t;
6043
6046
  };
6044
- var np = { nanoid: sp };
6045
- let { existsSync: rp, readFileSync: op } = Ce, { dirname: Ls, join: lp } = Ce, { SourceMapConsumer: Dr, SourceMapGenerator: jr } = Ce;
6046
- function ap(e) {
6047
+ var lp = { nanoid: op };
6048
+ let { existsSync: ap, readFileSync: cp } = Ce, { dirname: Ls, join: up } = Ce, { SourceMapConsumer: Dr, SourceMapGenerator: jr } = Ce;
6049
+ function dp(e) {
6047
6050
  return Buffer ? Buffer.from(e, "base64").toString() : window.atob(e);
6048
6051
  }
6049
6052
  let yn = class {
@@ -6062,7 +6065,7 @@ let yn = class {
6062
6065
  return decodeURIComponent(e.substr(r[0].length));
6063
6066
  let l = e.match(t) || e.match(i);
6064
6067
  if (l)
6065
- return ap(e.substr(l[0].length));
6068
+ return dp(e.substr(l[0].length));
6066
6069
  let o = e.match(/data:application\/json;([^,]+),/)[1];
6067
6070
  throw new Error("Unsupported source map encoding " + o);
6068
6071
  }
@@ -6079,8 +6082,8 @@ let yn = class {
6079
6082
  i > -1 && s > -1 && (this.annotation = this.getAnnotationURL(e.substring(i, s)));
6080
6083
  }
6081
6084
  loadFile(e) {
6082
- if (this.root = Ls(e), rp(e))
6083
- return this.mapFile = e, op(e, "utf-8").toString().trim();
6085
+ if (this.root = Ls(e), ap(e))
6086
+ return this.mapFile = e, cp(e, "utf-8").toString().trim();
6084
6087
  }
6085
6088
  loadMap(e, t) {
6086
6089
  if (t === !1) return !1;
@@ -6113,7 +6116,7 @@ let yn = class {
6113
6116
  return this.decodeInline(this.annotation);
6114
6117
  if (this.annotation) {
6115
6118
  let i = this.annotation;
6116
- return e && (i = lp(Ls(e), i)), this.loadFile(i);
6119
+ return e && (i = up(Ls(e), i)), this.loadFile(i);
6117
6120
  }
6118
6121
  }
6119
6122
  }
@@ -6126,22 +6129,22 @@ let yn = class {
6126
6129
  };
6127
6130
  var Ql = yn;
6128
6131
  yn.default = yn;
6129
- let { nanoid: cp } = np, { isAbsolute: gn, resolve: Zn } = Ce, { SourceMapConsumer: up, SourceMapGenerator: dp } = Ce, { fileURLToPath: Qr, pathToFileURL: ai } = Ce, Ar = An, hp = Ql, Ys = Ce, Us = Symbol("fromOffsetCache"), pp = !!(up && dp), _r = !!(Zn && gn), qi = class {
6132
+ let { nanoid: hp } = lp, { isAbsolute: gn, resolve: Zn } = Ce, { SourceMapConsumer: pp, SourceMapGenerator: mp } = Ce, { fileURLToPath: Qr, pathToFileURL: ai } = Ce, Ar = An, bp = Ql, Ys = Ce, Us = Symbol("fromOffsetCache"), fp = !!(pp && mp), _r = !!(Zn && gn), qi = class {
6130
6133
  get from() {
6131
6134
  return this.file || this.id;
6132
6135
  }
6133
6136
  constructor(e, t = {}) {
6134
6137
  if (e === null || typeof e > "u" || typeof e == "object" && !e.toString)
6135
6138
  throw new Error(`PostCSS received ${e} instead of CSS string`);
6136
- if (this.css = e.toString(), this.css[0] === "\uFEFF" || this.css[0] === "￾" ? (this.hasBOM = !0, this.css = this.css.slice(1)) : this.hasBOM = !1, this.document = this.css, t.document && (this.document = t.document.toString()), t.from && (!_r || /^\w+:\/\//.test(t.from) || gn(t.from) ? this.file = t.from : this.file = Zn(t.from)), _r && pp) {
6137
- let i = new hp(this.css, t);
6139
+ if (this.css = e.toString(), this.css[0] === "\uFEFF" || this.css[0] === "￾" ? (this.hasBOM = !0, this.css = this.css.slice(1)) : this.hasBOM = !1, this.document = this.css, t.document && (this.document = t.document.toString()), t.from && (!_r || /^\w+:\/\//.test(t.from) || gn(t.from) ? this.file = t.from : this.file = Zn(t.from)), _r && fp) {
6140
+ let i = new bp(this.css, t);
6138
6141
  if (i.text) {
6139
6142
  this.map = i;
6140
6143
  let s = i.consumer().file;
6141
6144
  !this.file && s && (this.file = this.mapResolve(s));
6142
6145
  }
6143
6146
  }
6144
- this.file || (this.id = "<input css " + cp(6) + ">"), this.map && (this.map.file = this.from);
6147
+ this.file || (this.id = "<input css " + hp(6) + ">"), this.map && (this.map.file = this.from);
6145
6148
  }
6146
6149
  error(e, t, i, s = {}) {
6147
6150
  let n, r, l;
@@ -6301,9 +6304,9 @@ let Ot = {
6301
6304
  };
6302
6305
  var ql = Ot;
6303
6306
  Ot.default = Ot;
6304
- let ea = je, mp = ql, es = class extends ea {
6307
+ let ea = je, yp = ql, es = class extends ea {
6305
6308
  get selectors() {
6306
- return mp.comma(this.selector);
6309
+ return yp.comma(this.selector);
6307
6310
  }
6308
6311
  set selectors(e) {
6309
6312
  let t = this.selector ? this.selector.match(/,\s*/) : null, i = t ? t[0] : "," + this.raw("between", "beforeOpen");
@@ -6316,16 +6319,16 @@ let ea = je, mp = ql, es = class extends ea {
6316
6319
  var tr = es;
6317
6320
  es.default = es;
6318
6321
  ea.registerRule(es);
6319
- let bp = qn, fp = ms, yp = bs, gp = fs, Zp = Ql, Ip = At, Sp = tr;
6322
+ let gp = qn, Zp = ms, Ip = bs, Sp = fs, Gp = Ql, Vp = At, Xp = tr;
6320
6323
  function Mt(e, t) {
6321
6324
  if (Array.isArray(e)) return e.map((r) => Mt(r));
6322
6325
  let i = e, { inputs: s } = i, n = ot(i, ["inputs"]);
6323
6326
  if (s) {
6324
6327
  t = [];
6325
6328
  for (let r of s) {
6326
- let l = ge(F({}, r), { __proto__: gp.prototype });
6329
+ let l = ge(F({}, r), { __proto__: Sp.prototype });
6327
6330
  l.map && (l.map = ge(F({}, l.map), {
6328
- __proto__: Zp.prototype
6331
+ __proto__: Gp.prototype
6329
6332
  })), t.push(l);
6330
6333
  }
6331
6334
  }
@@ -6334,20 +6337,20 @@ function Mt(e, t) {
6334
6337
  n.source = o, l != null && (n.source.input = t[l]);
6335
6338
  }
6336
6339
  if (n.type === "root")
6337
- return new Ip(n);
6340
+ return new Vp(n);
6338
6341
  if (n.type === "decl")
6339
- return new yp(n);
6342
+ return new Ip(n);
6340
6343
  if (n.type === "rule")
6341
- return new Sp(n);
6344
+ return new Xp(n);
6342
6345
  if (n.type === "comment")
6343
- return new fp(n);
6346
+ return new Zp(n);
6344
6347
  if (n.type === "atrule")
6345
- return new bp(n);
6348
+ return new gp(n);
6346
6349
  throw new Error("Unknown node type: " + e.type);
6347
6350
  }
6348
- var Gp = Mt;
6351
+ var Wp = Mt;
6349
6352
  Mt.default = Mt;
6350
- let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsumer: na, SourceMapGenerator: Li } = Ce, { pathToFileURL: $r } = Ce, Vp = fs, Xp = !!(na && Li), Wp = !!(Ji && ia && ta && sa), Cp = class {
6353
+ let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsumer: na, SourceMapGenerator: Li } = Ce, { pathToFileURL: $r } = Ce, Cp = fs, Rp = !!(na && Li), kp = !!(Ji && ia && ta && sa), wp = class {
6351
6354
  constructor(e, t, i, s) {
6352
6355
  this.stringify = e, this.mapOpts = i.map || {}, this.root = t, this.opts = i, this.css = s, this.originalCSS = s, this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute, this.memoizedFileURLs = /* @__PURE__ */ new Map(), this.memoizedPaths = /* @__PURE__ */ new Map(), this.memoizedURLs = /* @__PURE__ */ new Map();
6353
6356
  }
@@ -6375,7 +6378,7 @@ let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsume
6375
6378
  } else this.css && (this.css = this.css.replace(/\n*\/\*#[\S\s]*?\*\/$/gm, ""));
6376
6379
  }
6377
6380
  generate() {
6378
- if (this.clearAnnotation(), Wp && Xp && this.isMap())
6381
+ if (this.clearAnnotation(), kp && Rp && this.isMap())
6379
6382
  return this.generateMap();
6380
6383
  {
6381
6384
  let e = "";
@@ -6458,7 +6461,7 @@ let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsume
6458
6461
  }
6459
6462
  });
6460
6463
  else {
6461
- let e = new Vp(this.originalCSS, this.opts);
6464
+ let e = new Cp(this.originalCSS, this.opts);
6462
6465
  e.map && this.previousMaps.push(e.map);
6463
6466
  }
6464
6467
  return this.previousMaps;
@@ -6506,9 +6509,9 @@ let { dirname: Ji, relative: ta, resolve: ia, sep: sa } = Ce, { SourceMapConsume
6506
6509
  return this.memoizedURLs.set(e, i), i;
6507
6510
  }
6508
6511
  };
6509
- var ra = Cp;
6510
- const Fs = 39, qr = 34, ci = 92, eo = 47, ui = 10, It = 32, di = 12, hi = 9, pi = 13, Rp = 91, kp = 93, wp = 40, vp = 41, xp = 123, Tp = 125, Np = 59, Jp = 42, Lp = 58, Yp = 64, mi = /[\t\n\f\r "#'()/;[\\\]{}]/g, bi = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g, Up = /.[\r\n"'(/\\]/, to = /[\da-f]/i;
6511
- var Fp = function(e, t = {}) {
6512
+ var ra = wp;
6513
+ const Fs = 39, qr = 34, ci = 92, eo = 47, ui = 10, It = 32, di = 12, hi = 9, pi = 13, vp = 91, xp = 93, Tp = 40, Np = 41, Jp = 123, Lp = 125, Yp = 59, Up = 42, Fp = 58, Kp = 64, mi = /[\t\n\f\r "#'()/;[\\\]{}]/g, bi = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g, Op = /.[\r\n"'(/\\]/, to = /[\da-f]/i;
6514
+ var Mp = function(e, t = {}) {
6512
6515
  let i = e.css.valueOf(), s = t.ignoreErrors, n, r, l, o, a, c, u, h, m, p, b = i.length, d = 0, I = [], Z = [];
6513
6516
  function X() {
6514
6517
  return d;
@@ -6536,18 +6539,18 @@ var Fp = function(e, t = {}) {
6536
6539
  c = ["space", i.slice(d, o)], d = o - 1;
6537
6540
  break;
6538
6541
  }
6539
- case Rp:
6540
- case kp:
6542
+ case vp:
6541
6543
  case xp:
6542
- case Tp:
6544
+ case Jp:
6543
6545
  case Lp:
6544
- case Np:
6545
- case vp: {
6546
+ case Fp:
6547
+ case Yp:
6548
+ case Np: {
6546
6549
  let V = String.fromCharCode(n);
6547
6550
  c = [V, V, d];
6548
6551
  break;
6549
6552
  }
6550
- case wp: {
6553
+ case Tp: {
6551
6554
  if (p = I.length ? I.pop()[1] : "", m = i.charCodeAt(d + 1), p === "url" && m !== Fs && m !== qr && m !== It && m !== ui && m !== hi && m !== di && m !== pi) {
6552
6555
  o = d;
6553
6556
  do {
@@ -6562,7 +6565,7 @@ var Fp = function(e, t = {}) {
6562
6565
  } while (u);
6563
6566
  c = ["brackets", i.slice(d, o + 1), d, o], d = o;
6564
6567
  } else
6565
- o = i.indexOf(")", d + 1), r = i.slice(d, o + 1), o === -1 || Up.test(r) ? c = ["(", "(", d] : (c = ["brackets", r, d, o], d = o);
6568
+ o = i.indexOf(")", d + 1), r = i.slice(d, o + 1), o === -1 || Op.test(r) ? c = ["(", "(", d] : (c = ["brackets", r, d, o], d = o);
6566
6569
  break;
6567
6570
  }
6568
6571
  case Fs:
@@ -6581,7 +6584,7 @@ var Fp = function(e, t = {}) {
6581
6584
  c = ["string", i.slice(d, o + 1), d, o], d = o;
6582
6585
  break;
6583
6586
  }
6584
- case Yp: {
6587
+ case Kp: {
6585
6588
  mi.lastIndex = d + 1, mi.test(i), mi.lastIndex === 0 ? o = i.length - 1 : o = mi.lastIndex - 2, c = ["at-word", i.slice(d, o + 1), d, o], d = o;
6586
6589
  break;
6587
6590
  }
@@ -6597,7 +6600,7 @@ var Fp = function(e, t = {}) {
6597
6600
  break;
6598
6601
  }
6599
6602
  default: {
6600
- n === eo && i.charCodeAt(d + 1) === Jp ? (o = i.indexOf("*/", d + 2) + 1, o === 0 && (s || K ? o = i.length : R("comment")), c = ["comment", i.slice(d, o + 1), d, o], d = o) : (bi.lastIndex = d + 1, bi.test(i), bi.lastIndex === 0 ? o = i.length - 1 : o = bi.lastIndex - 2, c = ["word", i.slice(d, o + 1), d, o], I.push(c), d = o);
6603
+ n === eo && i.charCodeAt(d + 1) === Up ? (o = i.indexOf("*/", d + 2) + 1, o === 0 && (s || K ? o = i.length : R("comment")), c = ["comment", i.slice(d, o + 1), d, o], d = o) : (bi.lastIndex = d + 1, bi.test(i), bi.lastIndex === 0 ? o = i.length - 1 : o = bi.lastIndex - 2, c = ["word", i.slice(d, o + 1), d, o], I.push(c), d = o);
6601
6604
  break;
6602
6605
  }
6603
6606
  }
@@ -6613,23 +6616,23 @@ var Fp = function(e, t = {}) {
6613
6616
  position: X
6614
6617
  };
6615
6618
  };
6616
- let Kp = qn, Op = ms, Mp = bs, Ep = At, io = tr, Hp = Fp;
6619
+ let Ep = qn, Hp = ms, zp = bs, Pp = At, io = tr, Bp = Mp;
6617
6620
  const so = {
6618
6621
  empty: !0,
6619
6622
  space: !0
6620
6623
  };
6621
- function zp(e) {
6624
+ function Dp(e) {
6622
6625
  for (let t = e.length - 1; t >= 0; t--) {
6623
6626
  let i = e[t], s = i[3] || i[2];
6624
6627
  if (s) return s;
6625
6628
  }
6626
6629
  }
6627
- let Pp = class {
6630
+ let jp = class {
6628
6631
  constructor(e) {
6629
- this.input = e, this.root = new Ep(), this.current = this.root, this.spaces = "", this.semicolon = !1, this.createTokenizer(), this.root.source = { input: e, start: { column: 1, line: 1, offset: 0 } };
6632
+ this.input = e, this.root = new Pp(), this.current = this.root, this.spaces = "", this.semicolon = !1, this.createTokenizer(), this.root.source = { input: e, start: { column: 1, line: 1, offset: 0 } };
6630
6633
  }
6631
6634
  atrule(e) {
6632
- let t = new Kp();
6635
+ let t = new Ep();
6633
6636
  t.name = e[1].slice(1), t.name === "" && this.unnamedAtrule(t, e), this.init(t, e[2]);
6634
6637
  let i, s, n, r = !1, l = !1, o = [], a = [];
6635
6638
  for (; !this.tokenizer.endOfFile(); ) {
@@ -6686,7 +6689,7 @@ let Pp = class {
6686
6689
  return !1;
6687
6690
  }
6688
6691
  comment(e) {
6689
- let t = new Op();
6692
+ let t = new Hp();
6690
6693
  this.init(t, e[2]), t.source.end = this.getPosition(e[3] || e[2]), t.source.end.offset++;
6691
6694
  let i = e[1].slice(2, -2);
6692
6695
  if (/^\s*$/.test(i))
@@ -6697,14 +6700,14 @@ let Pp = class {
6697
6700
  }
6698
6701
  }
6699
6702
  createTokenizer() {
6700
- this.tokenizer = Hp(this.input);
6703
+ this.tokenizer = Bp(this.input);
6701
6704
  }
6702
6705
  decl(e, t) {
6703
- let i = new Mp();
6706
+ let i = new zp();
6704
6707
  this.init(i, e[0][2]);
6705
6708
  let s = e[e.length - 1];
6706
6709
  for (s[0] === ";" && (this.semicolon = !0, e.pop()), i.source.end = this.getPosition(
6707
- s[3] || s[2] || zp(e)
6710
+ s[3] || s[2] || Dp(e)
6708
6711
  ), i.source.end.offset++; e[0][0] !== "word"; )
6709
6712
  e.length === 1 && this.unknownWord(e), i.raws.before += e.shift()[1];
6710
6713
  for (i.source.start = this.getPosition(e[0][2]), i.prop = ""; e.length; ) {
@@ -6920,10 +6923,10 @@ let Pp = class {
6920
6923
  );
6921
6924
  }
6922
6925
  };
6923
- var Bp = Pp;
6924
- let Dp = je, jp = fs, Qp = Bp;
6926
+ var Qp = jp;
6927
+ let Ap = je, _p = fs, $p = Qp;
6925
6928
  function ts(e, t) {
6926
- let i = new jp(e, t), s = new Qp(i);
6929
+ let i = new _p(e, t), s = new $p(i);
6927
6930
  try {
6928
6931
  s.parse();
6929
6932
  } catch (n) {
@@ -6936,7 +6939,7 @@ You tried to parse Less with the standard CSS parser; try again with the postcss
6936
6939
  }
6937
6940
  var ir = ts;
6938
6941
  ts.default = ts;
6939
- Dp.registerParse(ts);
6942
+ Ap.registerParse(ts);
6940
6943
  let In = class {
6941
6944
  constructor(e, t = {}) {
6942
6945
  if (this.type = "warning", this.text = e, t.node && t.node.source) {
@@ -6955,7 +6958,7 @@ let In = class {
6955
6958
  };
6956
6959
  var oa = In;
6957
6960
  In.default = In;
6958
- let Ap = oa, Sn = class {
6961
+ let qp = oa, Sn = class {
6959
6962
  get content() {
6960
6963
  return this.css;
6961
6964
  }
@@ -6967,7 +6970,7 @@ let Ap = oa, Sn = class {
6967
6970
  }
6968
6971
  warn(e, t = {}) {
6969
6972
  t.plugin || this.lastPlugin && this.lastPlugin.postcssPlugin && (t.plugin = this.lastPlugin.postcssPlugin);
6970
- let i = new Ap(e, t);
6973
+ let i = new qp(e, t);
6971
6974
  return this.messages.push(i), i;
6972
6975
  }
6973
6976
  warnings() {
@@ -6980,15 +6983,15 @@ let no = {};
6980
6983
  var la = function(e) {
6981
6984
  no[e] || (no[e] = !0, typeof console < "u" && console.warn && console.warn(e));
6982
6985
  };
6983
- let _p = je, $p = er, qp = ra, em = ir, ro = sr, tm = At, im = hs, { isClean: we, my: sm } = Qt, nm = la;
6984
- const rm = {
6986
+ let em = je, tm = er, im = ra, sm = ir, ro = sr, nm = At, rm = hs, { isClean: we, my: om } = Qt, lm = la;
6987
+ const am = {
6985
6988
  atrule: "AtRule",
6986
6989
  comment: "Comment",
6987
6990
  decl: "Declaration",
6988
6991
  document: "Document",
6989
6992
  root: "Root",
6990
6993
  rule: "Rule"
6991
- }, om = {
6994
+ }, cm = {
6992
6995
  AtRule: !0,
6993
6996
  AtRuleExit: !0,
6994
6997
  Comment: !0,
@@ -7005,7 +7008,7 @@ const rm = {
7005
7008
  RootExit: !0,
7006
7009
  Rule: !0,
7007
7010
  RuleExit: !0
7008
- }, lm = {
7011
+ }, um = {
7009
7012
  Once: !0,
7010
7013
  postcssPlugin: !0,
7011
7014
  prepare: !0
@@ -7014,7 +7017,7 @@ function St(e) {
7014
7017
  return typeof e == "object" && typeof e.then == "function";
7015
7018
  }
7016
7019
  function aa(e) {
7017
- let t = !1, i = rm[e.type];
7020
+ let t = !1, i = am[e.type];
7018
7021
  return e.type === "decl" ? t = e.prop.toLowerCase() : e.type === "atrule" && (t = e.name.toLowerCase()), t && e.append ? [
7019
7022
  i,
7020
7023
  i + "-" + t,
@@ -7070,14 +7073,14 @@ let Vn = {}, ut = class ca {
7070
7073
  else if (i instanceof ca || i instanceof ro)
7071
7074
  n = Gn(i.root), i.map && (typeof s.map > "u" && (s.map = {}), s.map.inline || (s.map.inline = !1), s.map.prev = i.map);
7072
7075
  else {
7073
- let r = em;
7076
+ let r = sm;
7074
7077
  s.syntax && (r = s.syntax.parse), s.parser && (r = s.parser), r.parse && (r = r.parse);
7075
7078
  try {
7076
7079
  n = r(i, s);
7077
7080
  } catch (l) {
7078
7081
  this.processed = !0, this.error = l;
7079
7082
  }
7080
- n && !n[sm] && _p.rebuild(n);
7083
+ n && !n[om] && em.rebuild(n);
7081
7084
  }
7082
7085
  this.result = new ro(t, n, s), this.helpers = ge(F({}, Vn), { postcss: Vn, result: this.result }), this.plugins = this.processor.plugins.map((r) => typeof r == "object" && r.prepare ? F(F({}, r), r.prepare(this.result)) : r);
7083
7086
  }
@@ -7117,11 +7120,11 @@ let Vn = {}, ut = class ca {
7117
7120
  for (let i of this.plugins)
7118
7121
  if (typeof i == "object")
7119
7122
  for (let s in i) {
7120
- if (!om[s] && /^[A-Z]/.test(s))
7123
+ if (!cm[s] && /^[A-Z]/.test(s))
7121
7124
  throw new Error(
7122
7125
  `Unknown event ${s} in ${i.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).`
7123
7126
  );
7124
- if (!lm[s])
7127
+ if (!um[s])
7125
7128
  if (typeof i[s] == "object")
7126
7129
  for (let n in i[s])
7127
7130
  n === "*" ? t(i, s, i[s][n]) : t(
@@ -7201,9 +7204,9 @@ let Vn = {}, ut = class ca {
7201
7204
  if (this.error) throw this.error;
7202
7205
  if (this.stringified) return this.result;
7203
7206
  this.stringified = !0, this.sync();
7204
- let t = this.result.opts, i = im;
7207
+ let t = this.result.opts, i = rm;
7205
7208
  t.syntax && (i = t.syntax.stringify), t.stringifier && (i = t.stringifier), i.stringify && (i = i.stringify);
7206
- let s = new qp(i, this.result.root, this.result.opts).generate();
7209
+ let s = new im(i, this.result.root, this.result.opts).generate();
7207
7210
  return this.result.css = s[0], this.result.map = s[1], this.result;
7208
7211
  }
7209
7212
  sync() {
@@ -7230,7 +7233,7 @@ let Vn = {}, ut = class ca {
7230
7233
  return this.result;
7231
7234
  }
7232
7235
  then(t, i) {
7233
- return process.env.NODE_ENV !== "production" && ("from" in this.opts || nm(
7236
+ return process.env.NODE_ENV !== "production" && ("from" in this.opts || lm(
7234
7237
  "Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning."
7235
7238
  )), this.async().then(t, i);
7236
7239
  }
@@ -7312,11 +7315,11 @@ ut.registerPostcss = (e) => {
7312
7315
  };
7313
7316
  var ua = ut;
7314
7317
  ut.default = ut;
7318
+ nm.registerLazyResult(ut);
7315
7319
  tm.registerLazyResult(ut);
7316
- $p.registerLazyResult(ut);
7317
- let am = ra, cm = ir;
7318
- const um = sr;
7319
- let dm = hs, hm = la, Xn = class {
7320
+ let dm = ra, hm = ir;
7321
+ const pm = sr;
7322
+ let mm = hs, bm = la, Xn = class {
7320
7323
  get content() {
7321
7324
  return this.result.css;
7322
7325
  }
@@ -7338,7 +7341,7 @@ let dm = hs, hm = la, Xn = class {
7338
7341
  get root() {
7339
7342
  if (this._root)
7340
7343
  return this._root;
7341
- let e, t = cm;
7344
+ let e, t = hm;
7342
7345
  try {
7343
7346
  e = t(this._css, this._opts);
7344
7347
  } catch (i) {
@@ -7353,15 +7356,15 @@ let dm = hs, hm = la, Xn = class {
7353
7356
  }
7354
7357
  constructor(e, t, i) {
7355
7358
  t = t.toString(), this.stringified = !1, this._processor = e, this._css = t, this._opts = i, this._map = void 0;
7356
- let s, n = dm;
7357
- this.result = new um(this._processor, s, this._opts), this.result.css = t;
7359
+ let s, n = mm;
7360
+ this.result = new pm(this._processor, s, this._opts), this.result.css = t;
7358
7361
  let r = this;
7359
7362
  Object.defineProperty(this.result, "root", {
7360
7363
  get() {
7361
7364
  return r.root;
7362
7365
  }
7363
7366
  });
7364
- let l = new am(n, s, this._opts, t);
7367
+ let l = new dm(n, s, this._opts, t);
7365
7368
  if (l.isMap()) {
7366
7369
  let [o, a] = l.generate();
7367
7370
  o && (this.result.css = o), a && (this.result.map = a);
@@ -7382,7 +7385,7 @@ let dm = hs, hm = la, Xn = class {
7382
7385
  return this.result;
7383
7386
  }
7384
7387
  then(e, t) {
7385
- return process.env.NODE_ENV !== "production" && ("from" in this._opts || hm(
7388
+ return process.env.NODE_ENV !== "production" && ("from" in this._opts || bm(
7386
7389
  "Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning."
7387
7390
  )), this.async().then(e, t);
7388
7391
  }
@@ -7393,9 +7396,9 @@ let dm = hs, hm = la, Xn = class {
7393
7396
  return [];
7394
7397
  }
7395
7398
  };
7396
- var pm = Xn;
7399
+ var fm = Xn;
7397
7400
  Xn.default = Xn;
7398
- let mm = er, bm = ua, fm = pm, ym = At, Et = class {
7401
+ let ym = er, gm = ua, Zm = fm, Im = At, Et = class {
7399
7402
  constructor(e = []) {
7400
7403
  this.version = "8.5.3", this.plugins = this.normalize(e);
7401
7404
  }
@@ -7418,17 +7421,17 @@ let mm = er, bm = ua, fm = pm, ym = At, Et = class {
7418
7421
  return t;
7419
7422
  }
7420
7423
  process(e, t = {}) {
7421
- return !this.plugins.length && !t.parser && !t.stringifier && !t.syntax ? new fm(this, e, t) : new bm(this, e, t);
7424
+ return !this.plugins.length && !t.parser && !t.stringifier && !t.syntax ? new Zm(this, e, t) : new gm(this, e, t);
7422
7425
  }
7423
7426
  use(e) {
7424
7427
  return this.plugins = this.plugins.concat(this.normalize([e])), this;
7425
7428
  }
7426
7429
  };
7427
- var gm = Et;
7430
+ var Sm = Et;
7428
7431
  Et.default = Et;
7432
+ Im.registerProcessor(Et);
7429
7433
  ym.registerProcessor(Et);
7430
- mm.registerProcessor(Et);
7431
- let da = qn, ha = ms, Zm = je, Im = An, pa = bs, ma = er, Sm = Gp, Gm = fs, Vm = ua, Xm = ql, Wm = ps, Cm = ir, nr = gm, Rm = sr, ba = At, fa = tr, km = hs, wm = oa;
7434
+ let da = qn, ha = ms, Gm = je, Vm = An, pa = bs, ma = er, Xm = Wp, Wm = fs, Cm = ua, Rm = ql, km = ps, wm = ir, nr = Sm, vm = sr, ba = At, fa = tr, xm = hs, Tm = oa;
7432
7435
  function j(...e) {
7433
7436
  return e.length === 1 && Array.isArray(e[0]) && (e = e[0]), new nr(e);
7434
7437
  }
@@ -7454,33 +7457,33 @@ https://www.w3ctech.com/topic/2226`
7454
7457
  return j([s(o)]).process(r, l);
7455
7458
  }, s;
7456
7459
  };
7457
- j.stringify = km;
7458
- j.parse = Cm;
7459
- j.fromJSON = Sm;
7460
- j.list = Xm;
7460
+ j.stringify = xm;
7461
+ j.parse = wm;
7462
+ j.fromJSON = Xm;
7463
+ j.list = Rm;
7461
7464
  j.comment = (e) => new ha(e);
7462
7465
  j.atRule = (e) => new da(e);
7463
7466
  j.decl = (e) => new pa(e);
7464
7467
  j.rule = (e) => new fa(e);
7465
7468
  j.root = (e) => new ba(e);
7466
7469
  j.document = (e) => new ma(e);
7467
- j.CssSyntaxError = Im;
7470
+ j.CssSyntaxError = Vm;
7468
7471
  j.Declaration = pa;
7469
- j.Container = Zm;
7472
+ j.Container = Gm;
7470
7473
  j.Processor = nr;
7471
7474
  j.Document = ma;
7472
7475
  j.Comment = ha;
7473
- j.Warning = wm;
7476
+ j.Warning = Tm;
7474
7477
  j.AtRule = da;
7475
- j.Result = Rm;
7476
- j.Input = Gm;
7478
+ j.Result = vm;
7479
+ j.Input = Wm;
7477
7480
  j.Rule = fa;
7478
7481
  j.Root = ba;
7479
- j.Node = Wm;
7480
- Vm.registerPostcss(j);
7482
+ j.Node = km;
7483
+ Cm.registerPostcss(j);
7481
7484
  j.default = j;
7482
- var vm = Object.defineProperty, xm = (e, t, i) => t in e ? vm(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, Ze = (e, t, i) => xm(e, typeof t != "symbol" ? t + "" : t, i);
7483
- function Tm(e) {
7485
+ var Nm = Object.defineProperty, Jm = (e, t, i) => t in e ? Nm(e, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : e[t] = i, Ie = (e, t, i) => Jm(e, typeof t != "symbol" ? t + "" : t, i);
7486
+ function Lm(e) {
7484
7487
  if (e.__esModule) return e;
7485
7488
  var t = e.default;
7486
7489
  if (typeof t == "function") {
@@ -7504,12 +7507,12 @@ var rr = { exports: {} }, L = String, ya = function() {
7504
7507
  };
7505
7508
  rr.exports = ya();
7506
7509
  rr.exports.createColors = ya;
7507
- var Nm = rr.exports;
7508
- const Jm = {}, Lm = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7510
+ var Ym = rr.exports;
7511
+ const Um = {}, Fm = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7509
7512
  __proto__: null,
7510
- default: Jm
7511
- }, Symbol.toStringTag, { value: "Module" })), Re = /* @__PURE__ */ Tm(Lm);
7512
- let lo = Nm, ao = Re, Wn = class ga extends Error {
7513
+ default: Um
7514
+ }, Symbol.toStringTag, { value: "Module" })), Re = /* @__PURE__ */ Lm(Fm);
7515
+ let lo = Ym, ao = Re, Wn = class ga extends Error {
7513
7516
  constructor(t, i, s, n, r, l) {
7514
7517
  super(t), this.name = "CssSyntaxError", this.reason = t, r && (this.file = r), n && (this.source = n), l && (this.plugin = l), typeof i < "u" && typeof s < "u" && (typeof i == "number" ? (this.line = i, this.column = s) : (this.line = i.line, this.column = i.column, this.endLine = s.line, this.endColumn = s.column)), this.setMessage(), Error.captureStackTrace && Error.captureStackTrace(this, ga);
7515
7518
  }
@@ -7574,7 +7577,7 @@ const co = {
7574
7577
  indent: " ",
7575
7578
  semicolon: !1
7576
7579
  };
7577
- function Ym(e) {
7580
+ function Km(e) {
7578
7581
  return e[0].toUpperCase() + e.slice(1);
7579
7582
  }
7580
7583
  let Cn = class {
@@ -7645,7 +7648,7 @@ let Cn = class {
7645
7648
  if (i === "before" || i === "after")
7646
7649
  return this.beforeAfter(e, i);
7647
7650
  {
7648
- let l = "raw" + Ym(i);
7651
+ let l = "raw" + Km(i);
7649
7652
  this[l] ? s = this[l](r, e) : r.walk((o) => {
7650
7653
  if (s = o.raws[t], typeof s < "u") return !1;
7651
7654
  });
@@ -7744,16 +7747,16 @@ let Cn = class {
7744
7747
  };
7745
7748
  var Za = Cn;
7746
7749
  Cn.default = Cn;
7747
- let Um = Za;
7750
+ let Om = Za;
7748
7751
  function Rn(e, t) {
7749
- new Um(t).stringify(e);
7752
+ new Om(t).stringify(e);
7750
7753
  }
7751
7754
  var ys = Rn;
7752
7755
  Rn.default = Rn;
7753
7756
  var _t = {};
7754
7757
  _t.isClean = Symbol("isClean");
7755
7758
  _t.my = Symbol("my");
7756
- let Fm = or, Km = Za, Om = ys, { isClean: Gt, my: Mm } = _t;
7759
+ let Mm = or, Em = Za, Hm = ys, { isClean: Gt, my: zm } = _t;
7757
7760
  function kn(e, t) {
7758
7761
  let i = new e.constructor();
7759
7762
  for (let s in e) {
@@ -7782,7 +7785,7 @@ let wn = class {
7782
7785
  return this;
7783
7786
  }
7784
7787
  constructor(e = {}) {
7785
- this.raws = {}, this[Gt] = !1, this[Mm] = !0;
7788
+ this.raws = {}, this[Gt] = !1, this[zm] = !0;
7786
7789
  for (let t in e)
7787
7790
  if (t === "nodes") {
7788
7791
  this.nodes = [];
@@ -7839,7 +7842,7 @@ let wn = class {
7839
7842
  t
7840
7843
  );
7841
7844
  }
7842
- return new Fm(e);
7845
+ return new Mm(e);
7843
7846
  }
7844
7847
  getProxyProcessor() {
7845
7848
  return {
@@ -7924,7 +7927,7 @@ let wn = class {
7924
7927
  return (i.line < t.line || i.line === t.line && i.column <= t.column) && (i = { column: t.column + 1, line: t.line }), { end: i, start: t };
7925
7928
  }
7926
7929
  raw(e, t) {
7927
- return new Km().raw(this, e, t);
7930
+ return new Em().raw(this, e, t);
7928
7931
  }
7929
7932
  remove() {
7930
7933
  return this.parent && this.parent.removeChild(this), this.parent = void 0, this;
@@ -7970,7 +7973,7 @@ let wn = class {
7970
7973
  toProxy() {
7971
7974
  return this.proxyCache || (this.proxyCache = new Proxy(this, this.getProxyProcessor())), this.proxyCache;
7972
7975
  }
7973
- toString(e = Om) {
7976
+ toString(e = Hm) {
7974
7977
  e.stringify && (e = e.stringify);
7975
7978
  let t = "";
7976
7979
  return e(this, (i) => {
@@ -7985,14 +7988,14 @@ let wn = class {
7985
7988
  };
7986
7989
  var gs = wn;
7987
7990
  wn.default = wn;
7988
- let Em = gs, vn = class extends Em {
7991
+ let Pm = gs, vn = class extends Pm {
7989
7992
  constructor(e) {
7990
7993
  super(e), this.type = "comment";
7991
7994
  }
7992
7995
  };
7993
7996
  var Zs = vn;
7994
7997
  vn.default = vn;
7995
- let Hm = gs, xn = class extends Hm {
7998
+ let Bm = gs, xn = class extends Bm {
7996
7999
  get variable() {
7997
8000
  return this.prop.startsWith("--") || this.prop[0] === "$";
7998
8001
  }
@@ -8002,7 +8005,7 @@ let Hm = gs, xn = class extends Hm {
8002
8005
  };
8003
8006
  var Is = xn;
8004
8007
  xn.default = xn;
8005
- let Ia = Zs, Sa = Is, zm = gs, { isClean: Ga, my: Va } = _t, lr, Xa, Wa, ar;
8008
+ let Ia = Zs, Sa = Is, Dm = gs, { isClean: Ga, my: Va } = _t, lr, Xa, Wa, ar;
8006
8009
  function Ca(e) {
8007
8010
  return e.map((t) => (t.nodes && (t.nodes = Ca(t.nodes)), delete t.source, t));
8008
8011
  }
@@ -8011,7 +8014,7 @@ function Ra(e) {
8011
8014
  for (let t of e.proxyOf.nodes)
8012
8015
  Ra(t);
8013
8016
  }
8014
- let Ue = class ka extends zm {
8017
+ let Ue = class ka extends Dm {
8015
8018
  get first() {
8016
8019
  if (this.proxyOf.nodes)
8017
8020
  return this.proxyOf.nodes[0];
@@ -8233,7 +8236,7 @@ let wa = Qe, is = class extends wa {
8233
8236
  var cr = is;
8234
8237
  is.default = is;
8235
8238
  wa.registerAtRule(is);
8236
- let Pm = Qe, va, xa, Ht = class extends Pm {
8239
+ let jm = Qe, va, xa, Ht = class extends jm {
8237
8240
  constructor(e) {
8238
8241
  super(F({ type: "document" }, e)), this.nodes || (this.nodes = []);
8239
8242
  }
@@ -8249,15 +8252,15 @@ Ht.registerProcessor = (e) => {
8249
8252
  };
8250
8253
  var ur = Ht;
8251
8254
  Ht.default = Ht;
8252
- let Bm = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", Dm = (e = 21) => {
8255
+ let Qm = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", Am = (e = 21) => {
8253
8256
  let t = "", i = e | 0;
8254
8257
  for (; i--; )
8255
- t += Bm[Math.random() * 64 | 0];
8258
+ t += Qm[Math.random() * 64 | 0];
8256
8259
  return t;
8257
8260
  };
8258
- var jm = { nanoid: Dm };
8259
- let { existsSync: Qm, readFileSync: Am } = Re, { dirname: Ks, join: _m } = Re, { SourceMapConsumer: uo, SourceMapGenerator: ho } = Re;
8260
- function $m(e) {
8261
+ var _m = { nanoid: Am };
8262
+ let { existsSync: $m, readFileSync: qm } = Re, { dirname: Ks, join: eb } = Re, { SourceMapConsumer: uo, SourceMapGenerator: ho } = Re;
8263
+ function tb(e) {
8261
8264
  return Buffer ? Buffer.from(e, "base64").toString() : window.atob(e);
8262
8265
  }
8263
8266
  let Tn = class {
@@ -8276,7 +8279,7 @@ let Tn = class {
8276
8279
  return decodeURIComponent(e.substr(r[0].length));
8277
8280
  let l = e.match(t) || e.match(i);
8278
8281
  if (l)
8279
- return $m(e.substr(l[0].length));
8282
+ return tb(e.substr(l[0].length));
8280
8283
  let o = e.match(/data:application\/json;([^,]+),/)[1];
8281
8284
  throw new Error("Unsupported source map encoding " + o);
8282
8285
  }
@@ -8293,8 +8296,8 @@ let Tn = class {
8293
8296
  i > -1 && s > -1 && (this.annotation = this.getAnnotationURL(e.substring(i, s)));
8294
8297
  }
8295
8298
  loadFile(e) {
8296
- if (this.root = Ks(e), Qm(e))
8297
- return this.mapFile = e, Am(e, "utf-8").toString().trim();
8299
+ if (this.root = Ks(e), $m(e))
8300
+ return this.mapFile = e, qm(e, "utf-8").toString().trim();
8298
8301
  }
8299
8302
  loadMap(e, t) {
8300
8303
  if (t === !1) return !1;
@@ -8327,7 +8330,7 @@ let Tn = class {
8327
8330
  return this.decodeInline(this.annotation);
8328
8331
  if (this.annotation) {
8329
8332
  let i = this.annotation;
8330
- return e && (i = _m(Ks(e), i)), this.loadFile(i);
8333
+ return e && (i = eb(Ks(e), i)), this.loadFile(i);
8331
8334
  }
8332
8335
  }
8333
8336
  }
@@ -8340,22 +8343,22 @@ let Tn = class {
8340
8343
  };
8341
8344
  var Ta = Tn;
8342
8345
  Tn.default = Tn;
8343
- let { nanoid: qm } = jm, { isAbsolute: Nn, resolve: Jn } = Re, { SourceMapConsumer: eb, SourceMapGenerator: tb } = Re, { fileURLToPath: po, pathToFileURL: fi } = Re, mo = or, ib = Ta, Os = Re, Ms = Symbol("fromOffsetCache"), sb = !!(eb && tb), bo = !!(Jn && Nn), ss = class {
8346
+ let { nanoid: ib } = _m, { isAbsolute: Nn, resolve: Jn } = Re, { SourceMapConsumer: sb, SourceMapGenerator: nb } = Re, { fileURLToPath: po, pathToFileURL: fi } = Re, mo = or, rb = Ta, Os = Re, Ms = Symbol("fromOffsetCache"), ob = !!(sb && nb), bo = !!(Jn && Nn), ss = class {
8344
8347
  get from() {
8345
8348
  return this.file || this.id;
8346
8349
  }
8347
8350
  constructor(e, t = {}) {
8348
8351
  if (e === null || typeof e > "u" || typeof e == "object" && !e.toString)
8349
8352
  throw new Error(`PostCSS received ${e} instead of CSS string`);
8350
- if (this.css = e.toString(), this.css[0] === "\uFEFF" || this.css[0] === "￾" ? (this.hasBOM = !0, this.css = this.css.slice(1)) : this.hasBOM = !1, this.document = this.css, t.document && (this.document = t.document.toString()), t.from && (!bo || /^\w+:\/\//.test(t.from) || Nn(t.from) ? this.file = t.from : this.file = Jn(t.from)), bo && sb) {
8351
- let i = new ib(this.css, t);
8353
+ if (this.css = e.toString(), this.css[0] === "\uFEFF" || this.css[0] === "￾" ? (this.hasBOM = !0, this.css = this.css.slice(1)) : this.hasBOM = !1, this.document = this.css, t.document && (this.document = t.document.toString()), t.from && (!bo || /^\w+:\/\//.test(t.from) || Nn(t.from) ? this.file = t.from : this.file = Jn(t.from)), bo && ob) {
8354
+ let i = new rb(this.css, t);
8352
8355
  if (i.text) {
8353
8356
  this.map = i;
8354
8357
  let s = i.consumer().file;
8355
8358
  !this.file && s && (this.file = this.mapResolve(s));
8356
8359
  }
8357
8360
  }
8358
- this.file || (this.id = "<input css " + qm(6) + ">"), this.map && (this.map.file = this.from);
8361
+ this.file || (this.id = "<input css " + ib(6) + ">"), this.map && (this.map.file = this.from);
8359
8362
  }
8360
8363
  error(e, t, i, s = {}) {
8361
8364
  let n, r, l;
@@ -8515,9 +8518,9 @@ let zt = {
8515
8518
  };
8516
8519
  var Ya = zt;
8517
8520
  zt.default = zt;
8518
- let Ua = Qe, nb = Ya, ns = class extends Ua {
8521
+ let Ua = Qe, lb = Ya, ns = class extends Ua {
8519
8522
  get selectors() {
8520
- return nb.comma(this.selector);
8523
+ return lb.comma(this.selector);
8521
8524
  }
8522
8525
  set selectors(e) {
8523
8526
  let t = this.selector ? this.selector.match(/,\s*/) : null, i = t ? t[0] : "," + this.raw("between", "beforeOpen");
@@ -8530,16 +8533,16 @@ let Ua = Qe, nb = Ya, ns = class extends Ua {
8530
8533
  var dr = ns;
8531
8534
  ns.default = ns;
8532
8535
  Ua.registerRule(ns);
8533
- let rb = cr, ob = Zs, lb = Is, ab = Ss, cb = Ta, ub = $t, db = dr;
8536
+ let ab = cr, cb = Zs, ub = Is, db = Ss, hb = Ta, pb = $t, mb = dr;
8534
8537
  function Pt(e, t) {
8535
8538
  if (Array.isArray(e)) return e.map((r) => Pt(r));
8536
8539
  let i = e, { inputs: s } = i, n = ot(i, ["inputs"]);
8537
8540
  if (s) {
8538
8541
  t = [];
8539
8542
  for (let r of s) {
8540
- let l = ge(F({}, r), { __proto__: ab.prototype });
8543
+ let l = ge(F({}, r), { __proto__: db.prototype });
8541
8544
  l.map && (l.map = ge(F({}, l.map), {
8542
- __proto__: cb.prototype
8545
+ __proto__: hb.prototype
8543
8546
  })), t.push(l);
8544
8547
  }
8545
8548
  }
@@ -8548,20 +8551,20 @@ function Pt(e, t) {
8548
8551
  n.source = o, l != null && (n.source.input = t[l]);
8549
8552
  }
8550
8553
  if (n.type === "root")
8551
- return new ub(n);
8554
+ return new pb(n);
8552
8555
  if (n.type === "decl")
8553
- return new lb(n);
8556
+ return new ub(n);
8554
8557
  if (n.type === "rule")
8555
- return new db(n);
8558
+ return new mb(n);
8556
8559
  if (n.type === "comment")
8557
- return new ob(n);
8560
+ return new cb(n);
8558
8561
  if (n.type === "atrule")
8559
- return new rb(n);
8562
+ return new ab(n);
8560
8563
  throw new Error("Unknown node type: " + e.type);
8561
8564
  }
8562
- var hb = Pt;
8565
+ var bb = Pt;
8563
8566
  Pt.default = Pt;
8564
- let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsumer: Ma, SourceMapGenerator: Ui } = Re, { pathToFileURL: fo } = Re, pb = Ss, mb = !!(Ma && Ui), bb = !!(Yi && Ka && Fa && Oa), fb = class {
8567
+ let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsumer: Ma, SourceMapGenerator: Ui } = Re, { pathToFileURL: fo } = Re, fb = Ss, yb = !!(Ma && Ui), gb = !!(Yi && Ka && Fa && Oa), Zb = class {
8565
8568
  constructor(e, t, i, s) {
8566
8569
  this.stringify = e, this.mapOpts = i.map || {}, this.root = t, this.opts = i, this.css = s, this.originalCSS = s, this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute, this.memoizedFileURLs = /* @__PURE__ */ new Map(), this.memoizedPaths = /* @__PURE__ */ new Map(), this.memoizedURLs = /* @__PURE__ */ new Map();
8567
8570
  }
@@ -8589,7 +8592,7 @@ let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsume
8589
8592
  } else this.css && (this.css = this.css.replace(/\n*\/\*#[\S\s]*?\*\/$/gm, ""));
8590
8593
  }
8591
8594
  generate() {
8592
- if (this.clearAnnotation(), bb && mb && this.isMap())
8595
+ if (this.clearAnnotation(), gb && yb && this.isMap())
8593
8596
  return this.generateMap();
8594
8597
  {
8595
8598
  let e = "";
@@ -8672,7 +8675,7 @@ let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsume
8672
8675
  }
8673
8676
  });
8674
8677
  else {
8675
- let e = new pb(this.originalCSS, this.opts);
8678
+ let e = new fb(this.originalCSS, this.opts);
8676
8679
  e.map && this.previousMaps.push(e.map);
8677
8680
  }
8678
8681
  return this.previousMaps;
@@ -8720,9 +8723,9 @@ let { dirname: Yi, relative: Fa, resolve: Ka, sep: Oa } = Re, { SourceMapConsume
8720
8723
  return this.memoizedURLs.set(e, i), i;
8721
8724
  }
8722
8725
  };
8723
- var Ea = fb;
8724
- const Es = 39, yo = 34, yi = 92, go = 47, gi = 10, Xt = 32, Zi = 12, Ii = 9, Si = 13, yb = 91, gb = 93, Zb = 40, Ib = 41, Sb = 123, Gb = 125, Vb = 59, Xb = 42, Wb = 58, Cb = 64, Gi = /[\t\n\f\r "#'()/;[\\\]{}]/g, Vi = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g, Rb = /.[\r\n"'(/\\]/, Zo = /[\da-f]/i;
8725
- var kb = function(e, t = {}) {
8726
+ var Ea = Zb;
8727
+ const Es = 39, yo = 34, yi = 92, go = 47, gi = 10, Xt = 32, Zi = 12, Ii = 9, Si = 13, Ib = 91, Sb = 93, Gb = 40, Vb = 41, Xb = 123, Wb = 125, Cb = 59, Rb = 42, kb = 58, wb = 64, Gi = /[\t\n\f\r "#'()/;[\\\]{}]/g, Vi = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g, vb = /.[\r\n"'(/\\]/, Zo = /[\da-f]/i;
8728
+ var xb = function(e, t = {}) {
8726
8729
  let i = e.css.valueOf(), s = t.ignoreErrors, n, r, l, o, a, c, u, h, m, p, b = i.length, d = 0, I = [], Z = [];
8727
8730
  function X() {
8728
8731
  return d;
@@ -8750,18 +8753,18 @@ var kb = function(e, t = {}) {
8750
8753
  c = ["space", i.slice(d, o)], d = o - 1;
8751
8754
  break;
8752
8755
  }
8753
- case yb:
8754
- case gb:
8756
+ case Ib:
8755
8757
  case Sb:
8756
- case Gb:
8758
+ case Xb:
8757
8759
  case Wb:
8758
- case Vb:
8759
- case Ib: {
8760
+ case kb:
8761
+ case Cb:
8762
+ case Vb: {
8760
8763
  let V = String.fromCharCode(n);
8761
8764
  c = [V, V, d];
8762
8765
  break;
8763
8766
  }
8764
- case Zb: {
8767
+ case Gb: {
8765
8768
  if (p = I.length ? I.pop()[1] : "", m = i.charCodeAt(d + 1), p === "url" && m !== Es && m !== yo && m !== Xt && m !== gi && m !== Ii && m !== Zi && m !== Si) {
8766
8769
  o = d;
8767
8770
  do {
@@ -8776,7 +8779,7 @@ var kb = function(e, t = {}) {
8776
8779
  } while (u);
8777
8780
  c = ["brackets", i.slice(d, o + 1), d, o], d = o;
8778
8781
  } else
8779
- o = i.indexOf(")", d + 1), r = i.slice(d, o + 1), o === -1 || Rb.test(r) ? c = ["(", "(", d] : (c = ["brackets", r, d, o], d = o);
8782
+ o = i.indexOf(")", d + 1), r = i.slice(d, o + 1), o === -1 || vb.test(r) ? c = ["(", "(", d] : (c = ["brackets", r, d, o], d = o);
8780
8783
  break;
8781
8784
  }
8782
8785
  case Es:
@@ -8795,7 +8798,7 @@ var kb = function(e, t = {}) {
8795
8798
  c = ["string", i.slice(d, o + 1), d, o], d = o;
8796
8799
  break;
8797
8800
  }
8798
- case Cb: {
8801
+ case wb: {
8799
8802
  Gi.lastIndex = d + 1, Gi.test(i), Gi.lastIndex === 0 ? o = i.length - 1 : o = Gi.lastIndex - 2, c = ["at-word", i.slice(d, o + 1), d, o], d = o;
8800
8803
  break;
8801
8804
  }
@@ -8811,7 +8814,7 @@ var kb = function(e, t = {}) {
8811
8814
  break;
8812
8815
  }
8813
8816
  default: {
8814
- n === go && i.charCodeAt(d + 1) === Xb ? (o = i.indexOf("*/", d + 2) + 1, o === 0 && (s || K ? o = i.length : R("comment")), c = ["comment", i.slice(d, o + 1), d, o], d = o) : (Vi.lastIndex = d + 1, Vi.test(i), Vi.lastIndex === 0 ? o = i.length - 1 : o = Vi.lastIndex - 2, c = ["word", i.slice(d, o + 1), d, o], I.push(c), d = o);
8817
+ n === go && i.charCodeAt(d + 1) === Rb ? (o = i.indexOf("*/", d + 2) + 1, o === 0 && (s || K ? o = i.length : R("comment")), c = ["comment", i.slice(d, o + 1), d, o], d = o) : (Vi.lastIndex = d + 1, Vi.test(i), Vi.lastIndex === 0 ? o = i.length - 1 : o = Vi.lastIndex - 2, c = ["word", i.slice(d, o + 1), d, o], I.push(c), d = o);
8815
8818
  break;
8816
8819
  }
8817
8820
  }
@@ -8827,23 +8830,23 @@ var kb = function(e, t = {}) {
8827
8830
  position: X
8828
8831
  };
8829
8832
  };
8830
- let wb = cr, vb = Zs, xb = Is, Tb = $t, Io = dr, Nb = kb;
8833
+ let Tb = cr, Nb = Zs, Jb = Is, Lb = $t, Io = dr, Yb = xb;
8831
8834
  const So = {
8832
8835
  empty: !0,
8833
8836
  space: !0
8834
8837
  };
8835
- function Jb(e) {
8838
+ function Ub(e) {
8836
8839
  for (let t = e.length - 1; t >= 0; t--) {
8837
8840
  let i = e[t], s = i[3] || i[2];
8838
8841
  if (s) return s;
8839
8842
  }
8840
8843
  }
8841
- let Lb = class {
8844
+ let Fb = class {
8842
8845
  constructor(e) {
8843
- this.input = e, this.root = new Tb(), this.current = this.root, this.spaces = "", this.semicolon = !1, this.createTokenizer(), this.root.source = { input: e, start: { column: 1, line: 1, offset: 0 } };
8846
+ this.input = e, this.root = new Lb(), this.current = this.root, this.spaces = "", this.semicolon = !1, this.createTokenizer(), this.root.source = { input: e, start: { column: 1, line: 1, offset: 0 } };
8844
8847
  }
8845
8848
  atrule(e) {
8846
- let t = new wb();
8849
+ let t = new Tb();
8847
8850
  t.name = e[1].slice(1), t.name === "" && this.unnamedAtrule(t, e), this.init(t, e[2]);
8848
8851
  let i, s, n, r = !1, l = !1, o = [], a = [];
8849
8852
  for (; !this.tokenizer.endOfFile(); ) {
@@ -8900,7 +8903,7 @@ let Lb = class {
8900
8903
  return !1;
8901
8904
  }
8902
8905
  comment(e) {
8903
- let t = new vb();
8906
+ let t = new Nb();
8904
8907
  this.init(t, e[2]), t.source.end = this.getPosition(e[3] || e[2]), t.source.end.offset++;
8905
8908
  let i = e[1].slice(2, -2);
8906
8909
  if (/^\s*$/.test(i))
@@ -8911,14 +8914,14 @@ let Lb = class {
8911
8914
  }
8912
8915
  }
8913
8916
  createTokenizer() {
8914
- this.tokenizer = Nb(this.input);
8917
+ this.tokenizer = Yb(this.input);
8915
8918
  }
8916
8919
  decl(e, t) {
8917
- let i = new xb();
8920
+ let i = new Jb();
8918
8921
  this.init(i, e[0][2]);
8919
8922
  let s = e[e.length - 1];
8920
8923
  for (s[0] === ";" && (this.semicolon = !0, e.pop()), i.source.end = this.getPosition(
8921
- s[3] || s[2] || Jb(e)
8924
+ s[3] || s[2] || Ub(e)
8922
8925
  ), i.source.end.offset++; e[0][0] !== "word"; )
8923
8926
  e.length === 1 && this.unknownWord(e), i.raws.before += e.shift()[1];
8924
8927
  for (i.source.start = this.getPosition(e[0][2]), i.prop = ""; e.length; ) {
@@ -9134,10 +9137,10 @@ let Lb = class {
9134
9137
  );
9135
9138
  }
9136
9139
  };
9137
- var Yb = Lb;
9138
- let Ub = Qe, Fb = Ss, Kb = Yb;
9140
+ var Kb = Fb;
9141
+ let Ob = Qe, Mb = Ss, Eb = Kb;
9139
9142
  function rs(e, t) {
9140
- let i = new Fb(e, t), s = new Kb(i);
9143
+ let i = new Mb(e, t), s = new Eb(i);
9141
9144
  try {
9142
9145
  s.parse();
9143
9146
  } catch (n) {
@@ -9150,7 +9153,7 @@ You tried to parse Less with the standard CSS parser; try again with the postcss
9150
9153
  }
9151
9154
  var hr = rs;
9152
9155
  rs.default = rs;
9153
- Ub.registerParse(rs);
9156
+ Ob.registerParse(rs);
9154
9157
  let Ln = class {
9155
9158
  constructor(e, t = {}) {
9156
9159
  if (this.type = "warning", this.text = e, t.node && t.node.source) {
@@ -9169,7 +9172,7 @@ let Ln = class {
9169
9172
  };
9170
9173
  var Ha = Ln;
9171
9174
  Ln.default = Ln;
9172
- let Ob = Ha, Yn = class {
9175
+ let Hb = Ha, Yn = class {
9173
9176
  get content() {
9174
9177
  return this.css;
9175
9178
  }
@@ -9181,7 +9184,7 @@ let Ob = Ha, Yn = class {
9181
9184
  }
9182
9185
  warn(e, t = {}) {
9183
9186
  t.plugin || this.lastPlugin && this.lastPlugin.postcssPlugin && (t.plugin = this.lastPlugin.postcssPlugin);
9184
- let i = new Ob(e, t);
9187
+ let i = new Hb(e, t);
9185
9188
  return this.messages.push(i), i;
9186
9189
  }
9187
9190
  warnings() {
@@ -9194,15 +9197,15 @@ let Go = {};
9194
9197
  var za = function(e) {
9195
9198
  Go[e] || (Go[e] = !0, typeof console < "u" && console.warn && console.warn(e));
9196
9199
  };
9197
- let Mb = Qe, Eb = ur, Hb = Ea, zb = hr, Vo = pr, Pb = $t, Bb = ys, { isClean: ve, my: Db } = _t, jb = za;
9198
- const Qb = {
9200
+ let zb = Qe, Pb = ur, Bb = Ea, Db = hr, Vo = pr, jb = $t, Qb = ys, { isClean: ve, my: Ab } = _t, _b = za;
9201
+ const $b = {
9199
9202
  atrule: "AtRule",
9200
9203
  comment: "Comment",
9201
9204
  decl: "Declaration",
9202
9205
  document: "Document",
9203
9206
  root: "Root",
9204
9207
  rule: "Rule"
9205
- }, Ab = {
9208
+ }, qb = {
9206
9209
  AtRule: !0,
9207
9210
  AtRuleExit: !0,
9208
9211
  Comment: !0,
@@ -9219,7 +9222,7 @@ const Qb = {
9219
9222
  RootExit: !0,
9220
9223
  Rule: !0,
9221
9224
  RuleExit: !0
9222
- }, _b = {
9225
+ }, ef = {
9223
9226
  Once: !0,
9224
9227
  postcssPlugin: !0,
9225
9228
  prepare: !0
@@ -9228,7 +9231,7 @@ function Wt(e) {
9228
9231
  return typeof e == "object" && typeof e.then == "function";
9229
9232
  }
9230
9233
  function Pa(e) {
9231
- let t = !1, i = Qb[e.type];
9234
+ let t = !1, i = $b[e.type];
9232
9235
  return e.type === "decl" ? t = e.prop.toLowerCase() : e.type === "atrule" && (t = e.name.toLowerCase()), t && e.append ? [
9233
9236
  i,
9234
9237
  i + "-" + t,
@@ -9284,14 +9287,14 @@ let Fn = {}, pt = class Ba {
9284
9287
  else if (i instanceof Ba || i instanceof Vo)
9285
9288
  n = Un(i.root), i.map && (typeof s.map > "u" && (s.map = {}), s.map.inline || (s.map.inline = !1), s.map.prev = i.map);
9286
9289
  else {
9287
- let r = zb;
9290
+ let r = Db;
9288
9291
  s.syntax && (r = s.syntax.parse), s.parser && (r = s.parser), r.parse && (r = r.parse);
9289
9292
  try {
9290
9293
  n = r(i, s);
9291
9294
  } catch (l) {
9292
9295
  this.processed = !0, this.error = l;
9293
9296
  }
9294
- n && !n[Db] && Mb.rebuild(n);
9297
+ n && !n[Ab] && zb.rebuild(n);
9295
9298
  }
9296
9299
  this.result = new Vo(t, n, s), this.helpers = ge(F({}, Fn), { postcss: Fn, result: this.result }), this.plugins = this.processor.plugins.map((r) => typeof r == "object" && r.prepare ? F(F({}, r), r.prepare(this.result)) : r);
9297
9300
  }
@@ -9331,11 +9334,11 @@ let Fn = {}, pt = class Ba {
9331
9334
  for (let i of this.plugins)
9332
9335
  if (typeof i == "object")
9333
9336
  for (let s in i) {
9334
- if (!Ab[s] && /^[A-Z]/.test(s))
9337
+ if (!qb[s] && /^[A-Z]/.test(s))
9335
9338
  throw new Error(
9336
9339
  `Unknown event ${s} in ${i.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).`
9337
9340
  );
9338
- if (!_b[s])
9341
+ if (!ef[s])
9339
9342
  if (typeof i[s] == "object")
9340
9343
  for (let n in i[s])
9341
9344
  n === "*" ? t(i, s, i[s][n]) : t(
@@ -9415,9 +9418,9 @@ let Fn = {}, pt = class Ba {
9415
9418
  if (this.error) throw this.error;
9416
9419
  if (this.stringified) return this.result;
9417
9420
  this.stringified = !0, this.sync();
9418
- let t = this.result.opts, i = Bb;
9421
+ let t = this.result.opts, i = Qb;
9419
9422
  t.syntax && (i = t.syntax.stringify), t.stringifier && (i = t.stringifier), i.stringify && (i = i.stringify);
9420
- let s = new Hb(i, this.result.root, this.result.opts).generate();
9423
+ let s = new Bb(i, this.result.root, this.result.opts).generate();
9421
9424
  return this.result.css = s[0], this.result.map = s[1], this.result;
9422
9425
  }
9423
9426
  sync() {
@@ -9444,7 +9447,7 @@ let Fn = {}, pt = class Ba {
9444
9447
  return this.result;
9445
9448
  }
9446
9449
  then(t, i) {
9447
- return process.env.NODE_ENV !== "production" && ("from" in this.opts || jb(
9450
+ return process.env.NODE_ENV !== "production" && ("from" in this.opts || _b(
9448
9451
  "Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning."
9449
9452
  )), this.async().then(t, i);
9450
9453
  }
@@ -9526,11 +9529,11 @@ pt.registerPostcss = (e) => {
9526
9529
  };
9527
9530
  var Da = pt;
9528
9531
  pt.default = pt;
9532
+ jb.registerLazyResult(pt);
9529
9533
  Pb.registerLazyResult(pt);
9530
- Eb.registerLazyResult(pt);
9531
- let $b = Ea, qb = hr;
9532
- const ef = pr;
9533
- let tf = ys, sf = za, Kn = class {
9534
+ let tf = Ea, sf = hr;
9535
+ const nf = pr;
9536
+ let rf = ys, of = za, Kn = class {
9534
9537
  get content() {
9535
9538
  return this.result.css;
9536
9539
  }
@@ -9552,7 +9555,7 @@ let tf = ys, sf = za, Kn = class {
9552
9555
  get root() {
9553
9556
  if (this._root)
9554
9557
  return this._root;
9555
- let e, t = qb;
9558
+ let e, t = sf;
9556
9559
  try {
9557
9560
  e = t(this._css, this._opts);
9558
9561
  } catch (i) {
@@ -9567,15 +9570,15 @@ let tf = ys, sf = za, Kn = class {
9567
9570
  }
9568
9571
  constructor(e, t, i) {
9569
9572
  t = t.toString(), this.stringified = !1, this._processor = e, this._css = t, this._opts = i, this._map = void 0;
9570
- let s, n = tf;
9571
- this.result = new ef(this._processor, s, this._opts), this.result.css = t;
9573
+ let s, n = rf;
9574
+ this.result = new nf(this._processor, s, this._opts), this.result.css = t;
9572
9575
  let r = this;
9573
9576
  Object.defineProperty(this.result, "root", {
9574
9577
  get() {
9575
9578
  return r.root;
9576
9579
  }
9577
9580
  });
9578
- let l = new $b(n, s, this._opts, t);
9581
+ let l = new tf(n, s, this._opts, t);
9579
9582
  if (l.isMap()) {
9580
9583
  let [o, a] = l.generate();
9581
9584
  o && (this.result.css = o), a && (this.result.map = a);
@@ -9596,7 +9599,7 @@ let tf = ys, sf = za, Kn = class {
9596
9599
  return this.result;
9597
9600
  }
9598
9601
  then(e, t) {
9599
- return process.env.NODE_ENV !== "production" && ("from" in this._opts || sf(
9602
+ return process.env.NODE_ENV !== "production" && ("from" in this._opts || of(
9600
9603
  "Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning."
9601
9604
  )), this.async().then(e, t);
9602
9605
  }
@@ -9607,9 +9610,9 @@ let tf = ys, sf = za, Kn = class {
9607
9610
  return [];
9608
9611
  }
9609
9612
  };
9610
- var nf = Kn;
9613
+ var lf = Kn;
9611
9614
  Kn.default = Kn;
9612
- let rf = ur, of = Da, lf = nf, af = $t, Bt = class {
9615
+ let af = ur, cf = Da, uf = lf, df = $t, Bt = class {
9613
9616
  constructor(e = []) {
9614
9617
  this.version = "8.5.3", this.plugins = this.normalize(e);
9615
9618
  }
@@ -9632,17 +9635,17 @@ let rf = ur, of = Da, lf = nf, af = $t, Bt = class {
9632
9635
  return t;
9633
9636
  }
9634
9637
  process(e, t = {}) {
9635
- return !this.plugins.length && !t.parser && !t.stringifier && !t.syntax ? new lf(this, e, t) : new of(this, e, t);
9638
+ return !this.plugins.length && !t.parser && !t.stringifier && !t.syntax ? new uf(this, e, t) : new cf(this, e, t);
9636
9639
  }
9637
9640
  use(e) {
9638
9641
  return this.plugins = this.plugins.concat(this.normalize([e])), this;
9639
9642
  }
9640
9643
  };
9641
- var cf = Bt;
9644
+ var hf = Bt;
9642
9645
  Bt.default = Bt;
9646
+ df.registerProcessor(Bt);
9643
9647
  af.registerProcessor(Bt);
9644
- rf.registerProcessor(Bt);
9645
- let ja = cr, Qa = Zs, uf = Qe, df = or, Aa = Is, _a = ur, hf = hb, pf = Ss, mf = Da, bf = Ya, ff = gs, yf = hr, mr = cf, gf = pr, $a = $t, qa = dr, Zf = ys, If = Ha;
9648
+ let ja = cr, Qa = Zs, pf = Qe, mf = or, Aa = Is, _a = ur, bf = bb, ff = Ss, yf = Da, gf = Ya, Zf = gs, If = hr, mr = hf, Sf = pr, $a = $t, qa = dr, Gf = ys, Vf = Ha;
9646
9649
  function Q(...e) {
9647
9650
  return e.length === 1 && Array.isArray(e[0]) && (e = e[0]), new mr(e);
9648
9651
  }
@@ -9668,35 +9671,35 @@ https://www.w3ctech.com/topic/2226`
9668
9671
  return Q([s(o)]).process(r, l);
9669
9672
  }, s;
9670
9673
  };
9671
- Q.stringify = Zf;
9672
- Q.parse = yf;
9673
- Q.fromJSON = hf;
9674
- Q.list = bf;
9674
+ Q.stringify = Gf;
9675
+ Q.parse = If;
9676
+ Q.fromJSON = bf;
9677
+ Q.list = gf;
9675
9678
  Q.comment = (e) => new Qa(e);
9676
9679
  Q.atRule = (e) => new ja(e);
9677
9680
  Q.decl = (e) => new Aa(e);
9678
9681
  Q.rule = (e) => new qa(e);
9679
9682
  Q.root = (e) => new $a(e);
9680
9683
  Q.document = (e) => new _a(e);
9681
- Q.CssSyntaxError = df;
9684
+ Q.CssSyntaxError = mf;
9682
9685
  Q.Declaration = Aa;
9683
- Q.Container = uf;
9686
+ Q.Container = pf;
9684
9687
  Q.Processor = mr;
9685
9688
  Q.Document = _a;
9686
9689
  Q.Comment = Qa;
9687
- Q.Warning = If;
9690
+ Q.Warning = Vf;
9688
9691
  Q.AtRule = ja;
9689
- Q.Result = gf;
9690
- Q.Input = pf;
9692
+ Q.Result = Sf;
9693
+ Q.Input = ff;
9691
9694
  Q.Rule = qa;
9692
9695
  Q.Root = $a;
9693
- Q.Node = ff;
9694
- mf.registerPostcss(Q);
9696
+ Q.Node = Zf;
9697
+ yf.registerPostcss(Q);
9695
9698
  Q.default = Q;
9696
9699
  class br {
9697
9700
  // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
9698
9701
  constructor(...t) {
9699
- Ze(this, "parentElement", null), Ze(this, "parentNode", null), Ze(this, "ownerDocument"), Ze(this, "firstChild", null), Ze(this, "lastChild", null), Ze(this, "previousSibling", null), Ze(this, "nextSibling", null), Ze(this, "ELEMENT_NODE", 1), Ze(this, "TEXT_NODE", 3), Ze(this, "nodeType"), Ze(this, "nodeName"), Ze(this, "RRNodeType");
9702
+ Ie(this, "parentElement", null), Ie(this, "parentNode", null), Ie(this, "ownerDocument"), Ie(this, "firstChild", null), Ie(this, "lastChild", null), Ie(this, "previousSibling", null), Ie(this, "nextSibling", null), Ie(this, "ELEMENT_NODE", 1), Ie(this, "TEXT_NODE", 3), Ie(this, "nodeType"), Ie(this, "nodeName"), Ie(this, "RRNodeType");
9700
9703
  }
9701
9704
  get childNodes() {
9702
9705
  const t = [];
@@ -9748,7 +9751,7 @@ const Wo = {
9748
9751
  ShadowRoot: ["getSelection"],
9749
9752
  Element: [],
9750
9753
  MutationObserver: ["constructor"]
9751
- }, Xi = {}, Sf = () => !!globalThis.Zone;
9754
+ }, Xi = {}, Xf = () => !!globalThis.Zone;
9752
9755
  function fr(e) {
9753
9756
  if (Xi[e])
9754
9757
  return Xi[e];
@@ -9765,7 +9768,7 @@ function fr(e) {
9765
9768
  return typeof i[o] == "function" && ((a = i[o]) == null ? void 0 : a.toString().includes("[native code]"));
9766
9769
  }
9767
9770
  ));
9768
- if (n && l && !Sf())
9771
+ if (n && l && !Xf())
9769
9772
  return Xi[e] = t.prototype, t.prototype;
9770
9773
  try {
9771
9774
  const o = document.createElement("iframe");
@@ -9802,37 +9805,37 @@ function ec(e, t, i) {
9802
9805
  const n = fr(e)[i];
9803
9806
  return typeof n != "function" ? t[i] : (zs[s] = n, n.bind(t));
9804
9807
  }
9805
- function Gf(e) {
9808
+ function Wf(e) {
9806
9809
  return Ee("Node", e, "childNodes");
9807
9810
  }
9808
- function Vf(e) {
9811
+ function Cf(e) {
9809
9812
  return Ee("Node", e, "parentNode");
9810
9813
  }
9811
- function Xf(e) {
9814
+ function Rf(e) {
9812
9815
  return Ee("Node", e, "parentElement");
9813
9816
  }
9814
- function Wf(e) {
9817
+ function kf(e) {
9815
9818
  return Ee("Node", e, "textContent");
9816
9819
  }
9817
- function Cf(e, t) {
9820
+ function wf(e, t) {
9818
9821
  return ec("Node", e, "contains")(t);
9819
9822
  }
9820
- function Rf(e) {
9823
+ function vf(e) {
9821
9824
  return ec("Node", e, "getRootNode")();
9822
9825
  }
9823
- function kf(e) {
9826
+ function xf(e) {
9824
9827
  return !e || !("host" in e) ? null : Ee("ShadowRoot", e, "host");
9825
9828
  }
9826
- function wf(e) {
9829
+ function Tf(e) {
9827
9830
  return e.styleSheets;
9828
9831
  }
9829
- function vf(e) {
9832
+ function Nf(e) {
9830
9833
  return !e || !("shadowRoot" in e) ? null : Ee("Element", e, "shadowRoot");
9831
9834
  }
9832
- function xf(e, t) {
9835
+ function Jf(e, t) {
9833
9836
  return Ee("Element", e, "querySelector")(t);
9834
9837
  }
9835
- function Tf(e, t) {
9838
+ function Lf(e, t) {
9836
9839
  return Ee("Element", e, "querySelectorAll")(t);
9837
9840
  }
9838
9841
  function tc() {
@@ -9858,17 +9861,17 @@ function Ae(e, t, i) {
9858
9861
  }
9859
9862
  }
9860
9863
  const E = {
9861
- childNodes: Gf,
9862
- parentNode: Vf,
9863
- parentElement: Xf,
9864
- textContent: Wf,
9865
- contains: Cf,
9866
- getRootNode: Rf,
9867
- host: kf,
9868
- styleSheets: wf,
9869
- shadowRoot: vf,
9870
- querySelector: xf,
9871
- querySelectorAll: Tf,
9864
+ childNodes: Wf,
9865
+ parentNode: Cf,
9866
+ parentElement: Rf,
9867
+ textContent: kf,
9868
+ contains: wf,
9869
+ getRootNode: vf,
9870
+ host: xf,
9871
+ styleSheets: Tf,
9872
+ shadowRoot: Nf,
9873
+ querySelector: Jf,
9874
+ querySelectorAll: Lf,
9872
9875
  mutationObserver: tc,
9873
9876
  patch: Ae
9874
9877
  };
@@ -9946,7 +9949,7 @@ function nc() {
9946
9949
  function rc(e) {
9947
9950
  return e ? e.nodeType === e.ELEMENT_NODE ? e : E.parentElement(e) : null;
9948
9951
  }
9949
- const Nf = (e) => {
9952
+ const Yf = (e) => {
9950
9953
  try {
9951
9954
  if (e instanceof HTMLElement)
9952
9955
  return e.tagName === "CANVAS";
@@ -9969,7 +9972,7 @@ function ue(e, t, i, s) {
9969
9972
  }
9970
9973
  return !!(i && (n.matches(i) || s && n.closest(i) !== null));
9971
9974
  }
9972
- function Jf(e, t) {
9975
+ function Uf(e, t) {
9973
9976
  return t.getId(e) !== -1;
9974
9977
  }
9975
9978
  function Ps(e, t, i) {
@@ -9987,7 +9990,7 @@ function oc(e, t) {
9987
9990
  function On(e) {
9988
9991
  return !!e.changedTouches;
9989
9992
  }
9990
- function Lf(e = window) {
9993
+ function Ff(e = window) {
9991
9994
  "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);
9992
9995
  }
9993
9996
  function lc(e, t) {
@@ -9999,7 +10002,7 @@ function ac(e, t) {
9999
10002
  function Mn(e) {
10000
10003
  return e ? e instanceof br && "shadowRoot" in e ? !!e.shadowRoot : !!E.shadowRoot(e) : !1;
10001
10004
  }
10002
- class Yf {
10005
+ class Kf {
10003
10006
  constructor() {
10004
10007
  S(this, "id", 1), S(this, "styleIDMap", /* @__PURE__ */ new WeakMap()), S(this, "idStyleMap", /* @__PURE__ */ new Map());
10005
10008
  }
@@ -10033,27 +10036,27 @@ function cc(e) {
10033
10036
  let i = null;
10034
10037
  return "getRootNode" in e && ((t = E.getRootNode(e)) == null ? void 0 : t.nodeType) === Node.DOCUMENT_FRAGMENT_NODE && E.host(E.getRootNode(e)) && (i = E.host(E.getRootNode(e))), i;
10035
10038
  }
10036
- function Uf(e) {
10039
+ function Of(e) {
10037
10040
  let t = e, i;
10038
10041
  for (; i = cc(t); )
10039
10042
  t = i;
10040
10043
  return t;
10041
10044
  }
10042
- function Ff(e) {
10045
+ function Mf(e) {
10043
10046
  const t = e.ownerDocument;
10044
10047
  if (!t) return !1;
10045
- const i = Uf(e);
10048
+ const i = Of(e);
10046
10049
  return E.contains(t, i);
10047
10050
  }
10048
10051
  function uc(e) {
10049
10052
  const t = e.ownerDocument;
10050
- return t ? E.contains(t, e) || Ff(e) : !1;
10053
+ return t ? E.contains(t, e) || Mf(e) : !1;
10051
10054
  }
10052
10055
  var P = /* @__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))(P || {}), H = /* @__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))(H || {}), be = /* @__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))(be || {}), Ke = /* @__PURE__ */ ((e) => (e[e.Mouse = 0] = "Mouse", e[e.Pen = 1] = "Pen", e[e.Touch = 2] = "Touch", e))(Ke || {}), mt = /* @__PURE__ */ ((e) => (e[e["2D"] = 0] = "2D", e[e.WebGL = 1] = "WebGL", e[e.WebGL2 = 2] = "WebGL2", e))(mt || {}), et = /* @__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))(et || {}), dc = /* @__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))(dc || {});
10053
10056
  function ko(e) {
10054
10057
  return "__ln" in e;
10055
10058
  }
10056
- class Kf {
10059
+ class Ef {
10057
10060
  constructor() {
10058
10061
  S(this, "length", 0), S(this, "head", null), S(this, "tail", null);
10059
10062
  }
@@ -10087,14 +10090,14 @@ class Kf {
10087
10090
  }
10088
10091
  }
10089
10092
  const wo = (e, t) => `${e}@${t}`;
10090
- class Of {
10093
+ class Hf {
10091
10094
  constructor() {
10092
10095
  S(this, "frozen", !1), S(this, "locked", !1), S(this, "texts", []), S(this, "attributes", []), S(this, "attributeMap", /* @__PURE__ */ new WeakMap()), S(this, "removes", []), S(this, "mapRemoves", []), S(this, "movedMap", {}), S(this, "addedSet", /* @__PURE__ */ new Set()), S(this, "movedSet", /* @__PURE__ */ new Set()), S(this, "droppedSet", /* @__PURE__ */ new Set()), S(this, "removesSubTreeCache", /* @__PURE__ */ new Set()), S(this, "mutationCb"), S(this, "blockClass"), S(this, "blockSelector"), S(this, "maskTextClass"), S(this, "maskTextSelector"), S(this, "inlineStylesheet"), S(this, "maskInputOptions"), S(this, "maskTextFn"), S(this, "maskInputFn"), S(this, "keepIframeSrcFn"), S(this, "recordCanvas"), S(this, "inlineImages"), S(this, "inlineVideos"), S(this, "privacySetting"), S(this, "slimDOMOptions"), S(this, "dataURLOptions"), S(this, "doc"), S(this, "mirror"), S(this, "iframeManager"), S(this, "stylesheetManager"), S(this, "shadowDomManager"), S(this, "canvasManager"), S(this, "processedNodeManager"), S(this, "unattachedDoc"), S(this, "processMutations", (t) => {
10093
10096
  t.forEach(this.processMutation), this.emit();
10094
10097
  }), S(this, "emit", () => {
10095
10098
  if (this.frozen || this.locked)
10096
10099
  return;
10097
- const t = [], i = /* @__PURE__ */ new Set(), s = new Kf(), n = (a) => {
10100
+ const t = [], i = /* @__PURE__ */ new Set(), s = new Ef(), n = (a) => {
10098
10101
  let c = a, u = Ft;
10099
10102
  for (; u === Ft; )
10100
10103
  c = c && c.nextSibling, u = c && this.mirror.getId(c);
@@ -10328,11 +10331,11 @@ class Of {
10328
10331
  }
10329
10332
  t.addedNodes.forEach((i) => this.genAdds(i, t.target)), t.removedNodes.forEach((i) => {
10330
10333
  const s = this.mirror.getId(i), n = vt(t.target) ? this.mirror.getId(E.host(t.target)) : this.mirror.getId(t.target);
10331
- ue(t.target, this.blockClass, this.blockSelector, !1) || Ps(i, this.mirror, this.slimDOMOptions) || !Jf(i, this.mirror) || (this.addedSet.has(i) ? (En(this.addedSet, i), this.droppedSet.add(i)) : this.addedSet.has(t.target) && s === -1 || oc(t.target, this.mirror) || (this.movedSet.has(i) && this.movedMap[wo(s, n)] ? En(this.movedSet, i) : (this.removes.push({
10334
+ ue(t.target, this.blockClass, this.blockSelector, !1) || Ps(i, this.mirror, this.slimDOMOptions) || !Uf(i, this.mirror) || (this.addedSet.has(i) ? (En(this.addedSet, i), this.droppedSet.add(i)) : this.addedSet.has(t.target) && s === -1 || oc(t.target, this.mirror) || (this.movedSet.has(i) && this.movedMap[wo(s, n)] ? En(this.movedSet, i) : (this.removes.push({
10332
10335
  parentId: n,
10333
10336
  id: s,
10334
10337
  isShadow: vt(t.target) && xt(t.target) ? !0 : void 0
10335
- }), Mf(i, this.removesSubTreeCache))), this.mapRemoves.push(i));
10338
+ }), zf(i, this.removesSubTreeCache))), this.mapRemoves.push(i));
10336
10339
  });
10337
10340
  break;
10338
10341
  }
@@ -10404,7 +10407,7 @@ class Of {
10404
10407
  function En(e, t) {
10405
10408
  e.delete(t), E.childNodes(t).forEach((i) => En(e, i));
10406
10409
  }
10407
- function Mf(e, t) {
10410
+ function zf(e, t) {
10408
10411
  const i = [e];
10409
10412
  for (; i.length; ) {
10410
10413
  const s = i.pop();
@@ -10412,9 +10415,9 @@ function Mf(e, t) {
10412
10415
  }
10413
10416
  }
10414
10417
  function vo(e, t, i) {
10415
- return e.size === 0 ? !1 : Ef(e, t);
10418
+ return e.size === 0 ? !1 : Pf(e, t);
10416
10419
  }
10417
- function Ef(e, t, i) {
10420
+ function Pf(e, t, i) {
10418
10421
  const s = E.parentNode(t);
10419
10422
  return s ? e.has(s) : !1;
10420
10423
  }
@@ -10426,10 +10429,10 @@ function hc(e, t) {
10426
10429
  return i ? e.has(i) ? !0 : hc(e, i) : !1;
10427
10430
  }
10428
10431
  let Tt;
10429
- function Hf(e) {
10432
+ function Bf(e) {
10430
10433
  Tt = e;
10431
10434
  }
10432
- function zf() {
10435
+ function Df() {
10433
10436
  Tt = void 0;
10434
10437
  }
10435
10438
  const z = (e) => Tt ? (...t) => {
@@ -10454,7 +10457,7 @@ function qt(e) {
10454
10457
  return e && e.target;
10455
10458
  }
10456
10459
  function pc(e, t) {
10457
- const i = new Of();
10460
+ const i = new Hf();
10458
10461
  Be.push(i), i.init(e);
10459
10462
  const s = new (tc())(
10460
10463
  z(i.processMutations.bind(i))
@@ -10468,7 +10471,7 @@ function pc(e, t) {
10468
10471
  subtree: !0
10469
10472
  }), s;
10470
10473
  }
10471
- function Pf({
10474
+ function jf({
10472
10475
  mousemoveCb: e,
10473
10476
  sampling: t,
10474
10477
  doc: i,
@@ -10517,7 +10520,7 @@ function Pf({
10517
10520
  u.forEach((h) => h());
10518
10521
  });
10519
10522
  }
10520
- function Bf({
10523
+ function Qf({
10521
10524
  mouseInteractionCb: e,
10522
10525
  doc: t,
10523
10526
  mirror: i,
@@ -10533,7 +10536,7 @@ function Bf({
10533
10536
  const c = (u) => (h) => {
10534
10537
  const m = qt(h);
10535
10538
  if (ue(m, s, n, !0) || // We ignore canvas elements for rage click detection because we cannot infer what inside the canvas is getting interacted with.
10536
- Nf(m))
10539
+ Yf(m))
10537
10540
  return;
10538
10541
  let p = null, b = u;
10539
10542
  if ("pointerType" in h) {
@@ -10619,7 +10622,7 @@ function mc({
10619
10622
  );
10620
10623
  return pe("scroll", l, t);
10621
10624
  }
10622
- function Df({ viewportResizeCb: e }, { win: t }) {
10625
+ function Af({ viewportResizeCb: e }, { win: t }) {
10623
10626
  let i = -1, s = -1;
10624
10627
  const n = z(
10625
10628
  Dt(
@@ -10635,8 +10638,8 @@ function Df({ viewportResizeCb: e }, { win: t }) {
10635
10638
  );
10636
10639
  return pe("resize", n, t);
10637
10640
  }
10638
- const jf = ["INPUT", "TEXTAREA", "SELECT"], To = /* @__PURE__ */ new WeakMap();
10639
- function Qf({
10641
+ const _f = ["INPUT", "TEXTAREA", "SELECT"], To = /* @__PURE__ */ new WeakMap();
10642
+ function $f({
10640
10643
  inputCb: e,
10641
10644
  doc: t,
10642
10645
  mirror: i,
@@ -10652,7 +10655,7 @@ function Qf({
10652
10655
  function h(Z) {
10653
10656
  let X = qt(Z);
10654
10657
  const R = Z.isTrusted, W = X && X.tagName;
10655
- if (X && W === "OPTION" && (X = E.parentElement(X)), !X || !W || jf.indexOf(W) < 0 || ue(X, s, n, !0) || X.classList.contains(r) || l && X.matches(l))
10658
+ if (X && W === "OPTION" && (X = E.parentElement(X)), !X || !W || _f.indexOf(W) < 0 || ue(X, s, n, !0) || X.classList.contains(r) || l && X.matches(l))
10656
10659
  return;
10657
10660
  let G = X.value, w = !1;
10658
10661
  const v = ji(X) || "", K = X.getAttribute("data-hl-record");
@@ -10758,7 +10761,7 @@ function Oe(e, t, i) {
10758
10761
  id: s
10759
10762
  }) : {};
10760
10763
  }
10761
- function Af({ styleSheetRuleCb: e, mirror: t, stylesheetManager: i }, { win: s }) {
10764
+ function qf({ styleSheetRuleCb: e, mirror: t, stylesheetManager: i }, { win: s }) {
10762
10765
  if (!s.CSSStyleSheet || !s.CSSStyleSheet.prototype)
10763
10766
  return () => {
10764
10767
  };
@@ -10938,7 +10941,7 @@ function bc({
10938
10941
  });
10939
10942
  }));
10940
10943
  }
10941
- function _f({
10944
+ function ey({
10942
10945
  styleDeclarationCb: e,
10943
10946
  mirror: t,
10944
10947
  ignoreCSSAttributes: i,
@@ -10999,7 +11002,7 @@ function _f({
10999
11002
  n.CSSStyleDeclaration.prototype.setProperty = r, n.CSSStyleDeclaration.prototype.removeProperty = l;
11000
11003
  });
11001
11004
  }
11002
- function $f({
11005
+ function ty({
11003
11006
  mediaInteractionCb: e,
11004
11007
  blockClass: t,
11005
11008
  blockSelector: i,
@@ -11037,7 +11040,7 @@ function $f({
11037
11040
  o.forEach((a) => a());
11038
11041
  });
11039
11042
  }
11040
- function qf({ fontCb: e, doc: t }) {
11043
+ function iy({ fontCb: e, doc: t }) {
11041
11044
  const i = t.defaultView;
11042
11045
  if (!i)
11043
11046
  return () => {
@@ -11073,7 +11076,7 @@ function qf({ fontCb: e, doc: t }) {
11073
11076
  s.forEach((o) => o());
11074
11077
  });
11075
11078
  }
11076
- function ey(e) {
11079
+ function sy(e) {
11077
11080
  const { doc: t, mirror: i, blockClass: s, blockSelector: n, selectionCb: r } = e;
11078
11081
  let l = !0;
11079
11082
  const o = z(() => {
@@ -11094,7 +11097,7 @@ function ey(e) {
11094
11097
  });
11095
11098
  return o(), pe("selectionchange", o);
11096
11099
  }
11097
- function ty({
11100
+ function ny({
11098
11101
  doc: e,
11099
11102
  customElementCb: t
11100
11103
  }) {
@@ -11119,7 +11122,7 @@ function ty({
11119
11122
  }
11120
11123
  );
11121
11124
  }
11122
- function iy(e, t) {
11125
+ function ry(e, t) {
11123
11126
  const {
11124
11127
  mutationCb: i,
11125
11128
  mousemoveCb: s,
@@ -11163,26 +11166,26 @@ function iy(e, t) {
11163
11166
  t.customElement && t.customElement(...d), b(...d);
11164
11167
  };
11165
11168
  }
11166
- function sy(e, t = {}) {
11169
+ function oy(e, t = {}) {
11167
11170
  const i = e.doc.defaultView;
11168
11171
  if (!i)
11169
11172
  return () => {
11170
11173
  };
11171
- iy(e, t);
11174
+ ry(e, t);
11172
11175
  let s;
11173
11176
  e.recordDOM && (s = pc(e, e.doc));
11174
- const n = Pf(e), r = Bf(e), l = mc(e), o = Df(e, {
11177
+ const n = jf(e), r = Qf(e), l = mc(e), o = Af(e, {
11175
11178
  win: i
11176
- }), a = Qf(e), c = $f(e);
11179
+ }), a = $f(e), c = ty(e);
11177
11180
  let u = () => {
11178
11181
  }, h = () => {
11179
11182
  }, m = () => {
11180
11183
  }, p = () => {
11181
11184
  };
11182
- e.recordDOM && (u = Af(e, { win: i }), h = bc(e, e.doc), m = _f(e, {
11185
+ e.recordDOM && (u = qf(e, { win: i }), h = bc(e, e.doc), m = ey(e, {
11183
11186
  win: i
11184
- }), e.collectFonts && (p = qf(e)));
11185
- const b = ey(e), d = ty(e), I = [];
11187
+ }), e.collectFonts && (p = iy(e)));
11188
+ const b = sy(e), d = ny(e), I = [];
11186
11189
  for (const Z of e.plugins)
11187
11190
  I.push(
11188
11191
  Z.observer(Z.callback, i, Z.options)
@@ -11238,7 +11241,7 @@ class No {
11238
11241
  return i || (i = /* @__PURE__ */ new Map(), this.iframeRemoteIdToIdMap.set(t, i)), i;
11239
11242
  }
11240
11243
  }
11241
- class ny {
11244
+ class ly {
11242
11245
  constructor(t) {
11243
11246
  S(this, "iframes", /* @__PURE__ */ new WeakMap()), S(this, "crossOriginIframeMap", /* @__PURE__ */ new WeakMap()), S(this, "crossOriginIframeMirror", new No(vl)), S(this, "crossOriginIframeStyleMirror"), S(this, "crossOriginIframeRootIdMap", /* @__PURE__ */ new WeakMap()), S(this, "mirror"), S(this, "mutationCb"), S(this, "wrappedEmit"), S(this, "loadListener"), S(this, "stylesheetManager"), S(this, "recordCrossOriginIframes"), this.mutationCb = t.mutationCb, this.wrappedEmit = t.wrappedEmit, this.stylesheetManager = t.stylesheetManager, this.recordCrossOriginIframes = t.recordCrossOriginIframes, this.crossOriginIframeStyleMirror = new No(
11244
11247
  this.stylesheetManager.styleMirror.generateId.bind(
@@ -11403,7 +11406,7 @@ class ny {
11403
11406
  });
11404
11407
  }
11405
11408
  }
11406
- class ry {
11409
+ class ay {
11407
11410
  constructor(t) {
11408
11411
  S(this, "shadowDoms", /* @__PURE__ */ new WeakSet()), S(this, "mutationCb"), S(this, "scrollCb"), S(this, "bypassOptions"), S(this, "mirror"), S(this, "restoreHandlers", []), this.mutationCb = t.mutationCb, this.scrollCb = t.scrollCb, this.bypassOptions = t.bypassOptions, this.mirror = t.mirror, this.init();
11409
11412
  }
@@ -11481,24 +11484,24 @@ class ry {
11481
11484
  }), this.restoreHandlers = [], this.shadowDoms = /* @__PURE__ */ new WeakSet();
11482
11485
  }
11483
11486
  }
11484
- var st = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", oy = typeof Uint8Array > "u" ? [] : new Uint8Array(256);
11487
+ var st = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", cy = typeof Uint8Array > "u" ? [] : new Uint8Array(256);
11485
11488
  for (var Ri = 0; Ri < st.length; Ri++)
11486
- oy[st.charCodeAt(Ri)] = Ri;
11487
- var ly = function(e) {
11489
+ cy[st.charCodeAt(Ri)] = Ri;
11490
+ var uy = function(e) {
11488
11491
  var t = new Uint8Array(e), i, s = t.length, n = "";
11489
11492
  for (i = 0; i < s; i += 3)
11490
11493
  n += st[t[i] >> 2], n += st[(t[i] & 3) << 4 | t[i + 1] >> 4], n += st[(t[i + 1] & 15) << 2 | t[i + 2] >> 6], n += st[t[i + 2] & 63];
11491
11494
  return s % 3 === 2 ? n = n.substring(0, n.length - 1) + "=" : s % 3 === 1 && (n = n.substring(0, n.length - 2) + "=="), n;
11492
11495
  };
11493
11496
  const Jo = /* @__PURE__ */ new Map();
11494
- function ay(e, t) {
11497
+ function dy(e, t) {
11495
11498
  let i = Jo.get(e);
11496
11499
  return i || (i = /* @__PURE__ */ new Map(), Jo.set(e, i)), i.has(t) || i.set(t, []), i.get(t);
11497
11500
  }
11498
11501
  const fc = (e, t, i) => {
11499
11502
  if (!e || !(gc(e, t) || typeof e == "object"))
11500
11503
  return;
11501
- const s = e.constructor.name, n = ay(i, s);
11504
+ const s = e.constructor.name, n = dy(i, s);
11502
11505
  let r = n.indexOf(e);
11503
11506
  return r === -1 && (r = n.length, n.push(e)), r;
11504
11507
  };
@@ -11518,7 +11521,7 @@ function Fi(e, t, i) {
11518
11521
  // value instanceof SharedArrayBuffer ||
11519
11522
  e instanceof ArrayBuffer
11520
11523
  ) {
11521
- const s = e.constructor.name, n = ly(e);
11524
+ const s = e.constructor.name, n = uy(e);
11522
11525
  return {
11523
11526
  rr_type: s,
11524
11527
  base64: n
@@ -11580,7 +11583,7 @@ const yc = (e, t, i) => e.map((s) => Fi(s, t, i)), gc = (e, t) => !![
11580
11583
  ).find(
11581
11584
  (i) => e instanceof t[i]
11582
11585
  );
11583
- function cy(e, t, i, s) {
11586
+ function hy(e, t, i, s) {
11584
11587
  const n = [], r = Object.getOwnPropertyNames(
11585
11588
  t.CanvasRenderingContext2D.prototype
11586
11589
  );
@@ -11626,7 +11629,7 @@ function cy(e, t, i, s) {
11626
11629
  n.forEach((l) => l());
11627
11630
  };
11628
11631
  }
11629
- function uy(e) {
11632
+ function py(e) {
11630
11633
  return e === "experimental-webgl" ? "webgl" : e;
11631
11634
  }
11632
11635
  function Lo(e, t, i, s) {
@@ -11638,7 +11641,7 @@ function Lo(e, t, i, s) {
11638
11641
  function(l) {
11639
11642
  return function(o, ...a) {
11640
11643
  if (!ue(this, t, i, !0)) {
11641
- const c = uy(o);
11644
+ const c = py(o);
11642
11645
  if ("__context" in this || (this.__context = c), s && ["webgl", "webgl2"].includes(c))
11643
11646
  if (a[0] && typeof a[0] == "object") {
11644
11647
  const u = a[0];
@@ -11714,7 +11717,7 @@ function Yo(e, t, i, s, n, r) {
11714
11717
  }
11715
11718
  return l;
11716
11719
  }
11717
- function dy(e, t, i, s) {
11720
+ function my(e, t, i, s) {
11718
11721
  const n = [];
11719
11722
  return n.push(
11720
11723
  ...Yo(
@@ -11738,8 +11741,8 @@ function dy(e, t, i, s) {
11738
11741
  n.forEach((r) => r());
11739
11742
  };
11740
11743
  }
11741
- const Zc = "KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgY2hhcnMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAgdmFyIGxvb2t1cCA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAidW5kZWZpbmVkIiA/IFtdIDogbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpOwogIH0KICB2YXIgZW5jb2RlID0gZnVuY3Rpb24oYXJyYXlidWZmZXIpIHsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKSwgaTIsIGxlbiA9IGJ5dGVzLmxlbmd0aCwgYmFzZTY0ID0gIiI7CiAgICBmb3IgKGkyID0gMDsgaTIgPCBsZW47IGkyICs9IDMpIHsKICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kyXSA+PiAyXTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMl0gJiAzKSA8PCA0IHwgYnl0ZXNbaTIgKyAxXSA+PiA0XTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMiArIDFdICYgMTUpIDw8IDIgfCBieXRlc1tpMiArIDJdID4+IDZdOwogICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaTIgKyAyXSAmIDYzXTsKICAgIH0KICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgIj0iOwogICAgfSBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgIj09IjsKICAgIH0KICAgIHJldHVybiBiYXNlNjQ7CiAgfTsKICBjb25zdCBsYXN0QmxvYk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBhc3luYyBmdW5jdGlvbiBnZXRUcmFuc3BhcmVudEJsb2JGb3Iod2lkdGgsIGhlaWdodCwgZGF0YVVSTE9wdGlvbnMpIHsKICAgIGNvbnN0IGlkID0gYCR7d2lkdGh9LSR7aGVpZ2h0fWA7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBpZiAodHJhbnNwYXJlbnRCbG9iTWFwLmhhcyhpZCkpIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICB0cmFuc3BhcmVudEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICByZXR1cm4gYmFzZTY0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIH0KICBjb25zdCB3b3JrZXIgPSBzZWxmOwogIGxldCBsb2dEZWJ1ZyA9IGZhbHNlOwogIGNvbnN0IGRlYnVnID0gKC4uLmFyZ3MpID0+IHsKICAgIGlmIChsb2dEZWJ1ZykgewogICAgICBjb25zb2xlLmRlYnVnKC4uLmFyZ3MpOwogICAgfQogIH07CiAgd29ya2VyLm9ubWVzc2FnZSA9IGFzeW5jIGZ1bmN0aW9uKGUpIHsKICAgIGxvZ0RlYnVnID0gISFlLmRhdGEubG9nRGVidWc7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGR4LCBkeSwgZHcsIGRoLCBkYXRhVVJMT3B0aW9ucyB9ID0gZS5kYXRhOwogICAgICBjb25zdCB0cmFuc3BhcmVudEJhc2U2NCA9IGdldFRyYW5zcGFyZW50QmxvYkZvcigKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgZGF0YVVSTE9wdGlvbnMKICAgICAgKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29uc3QgY3R4ID0gb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgYml0bWFwLmNsb3NlKCk7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgYXdhaXQgdHJhbnNwYXJlbnRCYXNlNjQgPT09IGJhc2U2NCkgewogICAgICAgIGRlYnVnKCJbaGlnaGxpZ2h0LXdvcmtlcl0gY2FudmFzIGJpdG1hcCBpcyB0cmFuc3BhcmVudCIsIHsKICAgICAgICAgIGlkLAogICAgICAgICAgYmFzZTY0CiAgICAgICAgfSk7CiAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCwgc3RhdHVzOiAidHJhbnNwYXJlbnQiIH0pOwogICAgICB9CiAgICAgIGlmIChsYXN0QmxvYk1hcC5nZXQoaWQpID09PSBiYXNlNjQpIHsKICAgICAgICBkZWJ1ZygiW2hpZ2hsaWdodC13b3JrZXJdIGNhbnZhcyBiaXRtYXAgaXMgdW5jaGFuZ2VkIiwgewogICAgICAgICAgaWQsCiAgICAgICAgICBiYXNlNjQKICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCBtc2cgPSB7CiAgICAgICAgaWQsCiAgICAgICAgdHlwZSwKICAgICAgICBiYXNlNjQsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIGR4LAogICAgICAgIGR5LAogICAgICAgIGR3LAogICAgICAgIGRoCiAgICAgIH07CiAgICAgIGRlYnVnKCJbaGlnaGxpZ2h0LXdvcmtlcl0gY2FudmFzIGJpdG1hcCBwcm9jZXNzZWQiLCBtc2cpOwogICAgICB3b3JrZXIucG9zdE1lc3NhZ2UobXNnKTsKICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgfSBlbHNlIHsKICAgICAgZGVidWcoIltoaWdobGlnaHQtd29ya2VyXSBubyBvZmZzY3JlZW5jYW52YXMgc3VwcG9ydCIsIHsKICAgICAgICBpZDogZS5kYXRhLmlkCiAgICAgIH0pOwogICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCwgc3RhdHVzOiAidW5zdXBwb3J0ZWQiIH0pOwogICAgfQogIH07Cn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWltYWdlLWJpdG1hcC1kYXRhLXVybC13b3JrZXItRHd0SzhBMHouanMubWFwCg==", hy = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), Uo = typeof self < "u" && self.Blob && new Blob([hy(Zc)], { type: "text/javascript;charset=utf-8" });
11742
- function py(e) {
11744
+ const Zc = "KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgY2hhcnMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CiAgdmFyIGxvb2t1cCA9IHR5cGVvZiBVaW50OEFycmF5ID09PSAidW5kZWZpbmVkIiA/IFtdIDogbmV3IFVpbnQ4QXJyYXkoMjU2KTsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7CiAgICBsb29rdXBbY2hhcnMuY2hhckNvZGVBdChpKV0gPSBpOwogIH0KICB2YXIgZW5jb2RlID0gZnVuY3Rpb24oYXJyYXlidWZmZXIpIHsKICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKSwgaTIsIGxlbiA9IGJ5dGVzLmxlbmd0aCwgYmFzZTY0ID0gIiI7CiAgICBmb3IgKGkyID0gMDsgaTIgPCBsZW47IGkyICs9IDMpIHsKICAgICAgYmFzZTY0ICs9IGNoYXJzW2J5dGVzW2kyXSA+PiAyXTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMl0gJiAzKSA8PCA0IHwgYnl0ZXNbaTIgKyAxXSA+PiA0XTsKICAgICAgYmFzZTY0ICs9IGNoYXJzWyhieXRlc1tpMiArIDFdICYgMTUpIDw8IDIgfCBieXRlc1tpMiArIDJdID4+IDZdOwogICAgICBiYXNlNjQgKz0gY2hhcnNbYnl0ZXNbaTIgKyAyXSAmIDYzXTsKICAgIH0KICAgIGlmIChsZW4gJSAzID09PSAyKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDEpICsgIj0iOwogICAgfSBlbHNlIGlmIChsZW4gJSAzID09PSAxKSB7CiAgICAgIGJhc2U2NCA9IGJhc2U2NC5zdWJzdHJpbmcoMCwgYmFzZTY0Lmxlbmd0aCAtIDIpICsgIj09IjsKICAgIH0KICAgIHJldHVybiBiYXNlNjQ7CiAgfTsKICBjb25zdCBsYXN0QmxvYk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgY29uc3QgdHJhbnNwYXJlbnRCbG9iTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICBhc3luYyBmdW5jdGlvbiBnZXRUcmFuc3BhcmVudEJsb2JGb3Iod2lkdGgsIGhlaWdodCwgZGF0YVVSTE9wdGlvbnMpIHsKICAgIGNvbnN0IGlkID0gYCR7d2lkdGh9LSR7aGVpZ2h0fWA7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBpZiAodHJhbnNwYXJlbnRCbG9iTWFwLmhhcyhpZCkpIHJldHVybiB0cmFuc3BhcmVudEJsb2JNYXAuZ2V0KGlkKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICB0cmFuc3BhcmVudEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICByZXR1cm4gYmFzZTY0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIH0KICBjb25zdCB3b3JrZXIgPSBzZWxmOwogIGxldCBsb2dEZWJ1ZyA9IGZhbHNlOwogIGNvbnN0IGRlYnVnID0gKC4uLmFyZ3MpID0+IHsKICAgIGlmIChsb2dEZWJ1ZykgewogICAgICBjb25zb2xlLmRlYnVnKC4uLmFyZ3MpOwogICAgfQogIH07CiAgd29ya2VyLm9ubWVzc2FnZSA9IGFzeW5jIGZ1bmN0aW9uKGUpIHsKICAgIGxvZ0RlYnVnID0gISFlLmRhdGEubG9nRGVidWc7CiAgICBpZiAoIk9mZnNjcmVlbkNhbnZhcyIgaW4gZ2xvYmFsVGhpcykgewogICAgICBjb25zdCB7IGlkLCBiaXRtYXAsIHdpZHRoLCBoZWlnaHQsIGR4LCBkeSwgZHcsIGRoLCBkYXRhVVJMT3B0aW9ucyB9ID0gZS5kYXRhOwogICAgICBjb25zdCB0cmFuc3BhcmVudEJhc2U2NCA9IGdldFRyYW5zcGFyZW50QmxvYkZvcigKICAgICAgICB3aWR0aCwKICAgICAgICBoZWlnaHQsCiAgICAgICAgZGF0YVVSTE9wdGlvbnMKICAgICAgKTsKICAgICAgY29uc3Qgb2Zmc2NyZWVuID0gbmV3IE9mZnNjcmVlbkNhbnZhcyh3aWR0aCwgaGVpZ2h0KTsKICAgICAgY29uc3QgY3R4ID0gb2Zmc2NyZWVuLmdldENvbnRleHQoIjJkIik7CiAgICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgYml0bWFwLmNsb3NlKCk7CiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBvZmZzY3JlZW4uY29udmVydFRvQmxvYihkYXRhVVJMT3B0aW9ucyk7CiAgICAgIGNvbnN0IHR5cGUgPSBibG9iLnR5cGU7CiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgYmxvYi5hcnJheUJ1ZmZlcigpOwogICAgICBjb25zdCBiYXNlNjQgPSBlbmNvZGUoYXJyYXlCdWZmZXIpOwogICAgICBpZiAoIWxhc3RCbG9iTWFwLmhhcyhpZCkgJiYgYXdhaXQgdHJhbnNwYXJlbnRCYXNlNjQgPT09IGJhc2U2NCkgewogICAgICAgIGRlYnVnKCJbaGlnaGxpZ2h0LXdvcmtlcl0gY2FudmFzIGJpdG1hcCBpcyB0cmFuc3BhcmVudCIsIHsKICAgICAgICAgIGlkLAogICAgICAgICAgYmFzZTY0CiAgICAgICAgfSk7CiAgICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgICAgIHJldHVybiB3b3JrZXIucG9zdE1lc3NhZ2UoeyBpZCwgc3RhdHVzOiAidHJhbnNwYXJlbnQiIH0pOwogICAgICB9CiAgICAgIGlmIChsYXN0QmxvYk1hcC5nZXQoaWQpID09PSBiYXNlNjQpIHsKICAgICAgICBkZWJ1ZygiW2hpZ2hsaWdodC13b3JrZXJdIGNhbnZhcyBiaXRtYXAgaXMgdW5jaGFuZ2VkIiwgewogICAgICAgICAgaWQsCiAgICAgICAgICBiYXNlNjQKICAgICAgICB9KTsKICAgICAgfQogICAgICBjb25zdCBtc2cgPSB7CiAgICAgICAgaWQsCiAgICAgICAgdHlwZSwKICAgICAgICBiYXNlNjQsCiAgICAgICAgd2lkdGgsCiAgICAgICAgaGVpZ2h0LAogICAgICAgIGR4LAogICAgICAgIGR5LAogICAgICAgIGR3LAogICAgICAgIGRoCiAgICAgIH07CiAgICAgIGRlYnVnKCJbaGlnaGxpZ2h0LXdvcmtlcl0gY2FudmFzIGJpdG1hcCBwcm9jZXNzZWQiLCBtc2cpOwogICAgICB3b3JrZXIucG9zdE1lc3NhZ2UobXNnKTsKICAgICAgbGFzdEJsb2JNYXAuc2V0KGlkLCBiYXNlNjQpOwogICAgfSBlbHNlIHsKICAgICAgZGVidWcoIltoaWdobGlnaHQtd29ya2VyXSBubyBvZmZzY3JlZW5jYW52YXMgc3VwcG9ydCIsIHsKICAgICAgICBpZDogZS5kYXRhLmlkCiAgICAgIH0pOwogICAgICByZXR1cm4gd29ya2VyLnBvc3RNZXNzYWdlKHsgaWQ6IGUuZGF0YS5pZCwgc3RhdHVzOiAidW5zdXBwb3J0ZWQiIH0pOwogICAgfQogIH07Cn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWltYWdlLWJpdG1hcC1kYXRhLXVybC13b3JrZXItRHd0SzhBMHouanMubWFwCg==", by = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), Uo = typeof self < "u" && self.Blob && new Blob([by(Zc)], { type: "text/javascript;charset=utf-8" });
11745
+ function fy(e) {
11743
11746
  let t;
11744
11747
  try {
11745
11748
  if (t = Uo && (self.URL || self.webkitURL).createObjectURL(Uo), !t) throw "";
@@ -11760,7 +11763,7 @@ function py(e) {
11760
11763
  t && (self.URL || self.webkitURL).revokeObjectURL(t);
11761
11764
  }
11762
11765
  }
11763
- class my {
11766
+ class yy {
11764
11767
  constructor(t) {
11765
11768
  S(this, "pendingCanvasMutations", /* @__PURE__ */ new Map()), S(this, "rafStamps", { latestId: 0, invokeId: null }), S(this, "mirror"), S(this, "logger"), S(this, "worker"), S(this, "snapshotInProgressMap", /* @__PURE__ */ new Map()), S(this, "lastSnapshotTime", /* @__PURE__ */ new Map()), S(this, "options"), S(this, "mutationCb"), S(this, "resetObservers"), S(this, "frozen", !1), S(this, "locked", !1), S(this, "processMutation", (h, m) => {
11766
11769
  (this.rafStamps.invokeId && this.rafStamps.latestId !== this.rafStamps.invokeId || !this.rafStamps.invokeId) && (this.rafStamps.invokeId = this.rafStamps.latestId), this.pendingCanvasMutations.has(h) || this.pendingCanvasMutations.set(h, []), this.pendingCanvasMutations.get(h).push(m);
@@ -11776,7 +11779,7 @@ class my {
11776
11779
  initialSnapshotDelay: c,
11777
11780
  dataURLOptions: u
11778
11781
  } = t;
11779
- this.mutationCb = t.mutationCb, this.mirror = t.mirror, this.logger = t.logger, this.worker = new py(), this.worker.onmessage = (h) => {
11782
+ this.mutationCb = t.mutationCb, this.mirror = t.mirror, this.logger = t.logger, this.worker = new fy(), this.worker.onmessage = (h) => {
11780
11783
  const { id: m } = h.data;
11781
11784
  if (this.snapshotInProgressMap.set(m, !1), !("base64" in h.data)) {
11782
11785
  this.debug(null, "canvas worker received empty message", {
@@ -12053,12 +12056,12 @@ class my {
12053
12056
  i,
12054
12057
  s,
12055
12058
  !1
12056
- ), r = cy(
12059
+ ), r = hy(
12057
12060
  this.processMutation.bind(this),
12058
12061
  t,
12059
12062
  i,
12060
12063
  s
12061
- ), l = dy(
12064
+ ), l = my(
12062
12065
  this.processMutation.bind(this),
12063
12066
  t,
12064
12067
  i,
@@ -12094,9 +12097,9 @@ class my {
12094
12097
  this.mutationCb({ id: i, type: r, commands: n }), this.pendingCanvasMutations.delete(t);
12095
12098
  }
12096
12099
  }
12097
- class by {
12100
+ class gy {
12098
12101
  constructor(t) {
12099
- S(this, "trackedLinkElements", /* @__PURE__ */ new WeakSet()), S(this, "mutationCb"), S(this, "adoptedStyleSheetCb"), S(this, "styleMirror", new Yf()), this.mutationCb = t.mutationCb, this.adoptedStyleSheetCb = t.adoptedStyleSheetCb;
12102
+ S(this, "trackedLinkElements", /* @__PURE__ */ new WeakSet()), S(this, "mutationCb"), S(this, "adoptedStyleSheetCb"), S(this, "styleMirror", new Kf()), this.mutationCb = t.mutationCb, this.adoptedStyleSheetCb = t.adoptedStyleSheetCb;
12100
12103
  }
12101
12104
  attachLinkElement(t, i) {
12102
12105
  "_cssText" in i.attributes && this.mutationCb({
@@ -12139,7 +12142,7 @@ class by {
12139
12142
  trackStylesheetInLinkElement(t) {
12140
12143
  }
12141
12144
  }
12142
- class fy {
12145
+ class Zy {
12143
12146
  constructor() {
12144
12147
  S(this, "nodeMap", /* @__PURE__ */ new WeakMap()), S(this, "active", !1);
12145
12148
  }
@@ -12164,7 +12167,7 @@ try {
12164
12167
  } catch (e) {
12165
12168
  console.debug("Unable to override Array.from", e);
12166
12169
  }
12167
- const Xe = uh();
12170
+ const We = ph();
12168
12171
  function Le(e = {}) {
12169
12172
  var t, i, s, n, r, l, o, a;
12170
12173
  const {
@@ -12197,12 +12200,12 @@ function Le(e = {}) {
12197
12200
  inlineVideos: U = !1,
12198
12201
  plugins: $,
12199
12202
  keepIframeSrcFn: ie = () => !1,
12200
- privacySetting: Se = "default",
12203
+ privacySetting: Ge = "default",
12201
12204
  ignoreCSSAttributes: Fe = /* @__PURE__ */ new Set([]),
12202
12205
  errorHandler: Gc,
12203
12206
  logger: Vc
12204
12207
  } = e, ei = F(F({}, e.dataURLOptions), (i = (t = e.sampling) == null ? void 0 : t.canvas) == null ? void 0 : i.dataURLOptions);
12205
- Hf(Gc);
12208
+ Bf(Gc);
12206
12209
  const ti = f ? window.parent === window : !0;
12207
12210
  let ft = !1;
12208
12211
  if (!ti)
@@ -12216,7 +12219,7 @@ function Le(e = {}) {
12216
12219
  if (!ti && !ft)
12217
12220
  return () => {
12218
12221
  };
12219
- Y !== void 0 && k.mousemove === void 0 && (k.mousemove = Y), Xe.reset();
12222
+ Y !== void 0 && k.mousemove === void 0 && (k.mousemove = Y), We.reset();
12220
12223
  const Vs = R === !0 ? {
12221
12224
  color: !0,
12222
12225
  date: !0,
@@ -12249,25 +12252,25 @@ function Le(e = {}) {
12249
12252
  headMetaDescKeywords: G === "all",
12250
12253
  headTitleMutations: G === "all"
12251
12254
  } : G || {};
12252
- Lf();
12255
+ Ff();
12253
12256
  let yr, Ws = 0;
12254
12257
  const gr = (D) => {
12255
- for (const Ge of $ || [])
12256
- Ge.eventProcessor && (D = Ge.eventProcessor(D));
12258
+ for (const Ve of $ || [])
12259
+ Ve.eventProcessor && (D = Ve.eventProcessor(D));
12257
12260
  return V && // Disable packing events which will be emitted to parent frames.
12258
12261
  !ft && (D = V(D)), D;
12259
12262
  };
12260
- re = (D, Ge) => {
12263
+ re = (D, Ve) => {
12261
12264
  var se;
12262
12265
  const ne = D;
12263
12266
  if (ne.timestamp = os(), (se = Be[0]) != null && se.isFrozen() && ne.type !== P.FullSnapshot && !(ne.type === P.IncrementalSnapshot && ne.data.source === H.Mutation) && Be.forEach((ke) => ke.unfreeze()), ti)
12264
- c?.(gr(ne), Ge);
12267
+ c?.(gr(ne), Ve);
12265
12268
  else if (ft) {
12266
12269
  const ke = {
12267
12270
  type: "rrweb",
12268
12271
  event: gr(ne),
12269
12272
  origin: window.location.origin,
12270
- isCheckout: Ge
12273
+ isCheckout: Ve
12271
12274
  };
12272
12275
  window.parent.postMessage(ke, "*");
12273
12276
  }
@@ -12303,11 +12306,11 @@ function Le(e = {}) {
12303
12306
  data: F({
12304
12307
  source: H.AdoptedStyleSheet
12305
12308
  }, D)
12306
- }), He = new by({
12309
+ }), He = new gy({
12307
12310
  mutationCb: ii,
12308
12311
  adoptedStyleSheetCb: Xc
12309
- }), ze = new ny({
12310
- mirror: Xe,
12312
+ }), ze = new ly({
12313
+ mirror: We,
12311
12314
  mutationCb: ii,
12312
12315
  stylesheetManager: He,
12313
12316
  recordCrossOriginIframes: f,
@@ -12315,12 +12318,12 @@ function Le(e = {}) {
12315
12318
  });
12316
12319
  for (const D of $ || [])
12317
12320
  D.getMirror && D.getMirror({
12318
- nodeMirror: Xe,
12321
+ nodeMirror: We,
12319
12322
  crossOriginIframeMirror: ze.crossOriginIframeMirror,
12320
12323
  crossOriginIframeStyleMirror: ze.crossOriginIframeStyleMirror
12321
12324
  });
12322
- const Cs = new fy();
12323
- Nt = new my({
12325
+ const Cs = new Zy();
12326
+ Nt = new yy({
12324
12327
  recordCanvas: te,
12325
12328
  recordLocalVideos: B,
12326
12329
  recordRemoteVideos: U,
@@ -12328,7 +12331,7 @@ function Le(e = {}) {
12328
12331
  win: window,
12329
12332
  blockClass: m,
12330
12333
  blockSelector: p,
12331
- mirror: Xe,
12334
+ mirror: We,
12332
12335
  sampling: (s = k?.canvas) == null ? void 0 : s.fps,
12333
12336
  samplingManual: (n = k?.canvas) == null ? void 0 : n.fpsManual,
12334
12337
  clearWebGLBuffer: (r = k?.canvas) == null ? void 0 : r.clearWebGLBuffer,
@@ -12338,7 +12341,7 @@ function Le(e = {}) {
12338
12341
  maxSnapshotDimension: (a = k?.canvas) == null ? void 0 : a.maxSnapshotDimension,
12339
12342
  logger: Vc
12340
12343
  });
12341
- const si = new ry({
12344
+ const si = new ay({
12342
12345
  mutationCb: ii,
12343
12346
  scrollCb: Zr,
12344
12347
  bypassOptions: {
@@ -12354,7 +12357,7 @@ function Le(e = {}) {
12354
12357
  recordCanvas: te,
12355
12358
  inlineImages: B,
12356
12359
  inlineVideos: U,
12357
- privacySetting: Se,
12360
+ privacySetting: Ge,
12358
12361
  sampling: k,
12359
12362
  slimDOMOptions: Xs,
12360
12363
  iframeManager: ze,
@@ -12363,7 +12366,7 @@ function Le(e = {}) {
12363
12366
  keepIframeSrcFn: ie,
12364
12367
  processedNodeManager: Cs
12365
12368
  },
12366
- mirror: Xe
12369
+ mirror: We
12367
12370
  });
12368
12371
  Ki = (D = !1) => {
12369
12372
  if (!ee)
@@ -12379,8 +12382,8 @@ function Le(e = {}) {
12379
12382
  },
12380
12383
  D
12381
12384
  ), He.reset(), si.init(), Be.forEach((se) => se.lock());
12382
- const Ge = Mh(document, {
12383
- mirror: Xe,
12385
+ const Ve = zh(document, {
12386
+ mirror: We,
12384
12387
  blockClass: m,
12385
12388
  blockSelector: p,
12386
12389
  maskTextClass: I,
@@ -12394,9 +12397,9 @@ function Le(e = {}) {
12394
12397
  recordCanvas: te,
12395
12398
  inlineImages: B,
12396
12399
  inlineVideos: U,
12397
- privacySetting: Se,
12400
+ privacySetting: Ge,
12398
12401
  onSerialize: (se) => {
12399
- lc(se, Xe) && ze.addIframe(se), ac(se, Xe) && He.trackLinkElement(se), Mn(se) && si.addShadowRoot(E.shadowRoot(se), document);
12402
+ lc(se, We) && ze.addIframe(se), ac(se, We) && He.trackLinkElement(se), Mn(se) && si.addShadowRoot(E.shadowRoot(se), document);
12400
12403
  },
12401
12404
  onIframeLoad: (se, ne) => {
12402
12405
  ze.attachIframe(se, ne), si.observeAttachShadow(se);
@@ -12406,26 +12409,26 @@ function Le(e = {}) {
12406
12409
  },
12407
12410
  keepIframeSrcFn: ie
12408
12411
  });
12409
- if (!Ge)
12412
+ if (!Ve)
12410
12413
  return console.warn("Failed to snapshot the document");
12411
12414
  re(
12412
12415
  {
12413
12416
  type: P.FullSnapshot,
12414
12417
  data: {
12415
- node: Ge,
12418
+ node: Ve,
12416
12419
  initialOffset: ic(window)
12417
12420
  }
12418
12421
  },
12419
12422
  D
12420
12423
  ), Be.forEach((se) => se.unlock()), document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0 && He.adoptStyleSheets(
12421
12424
  document.adoptedStyleSheets,
12422
- Xe.getId(document)
12425
+ We.getId(document)
12423
12426
  );
12424
12427
  };
12425
12428
  try {
12426
- const D = [], Ge = (ne) => {
12429
+ const D = [], Ve = (ne) => {
12427
12430
  var ke;
12428
- return z(sy)(
12431
+ return z(oy)(
12429
12432
  {
12430
12433
  mutationCb: ii,
12431
12434
  mousemoveCb: (A, Rs) => re({
@@ -12516,14 +12519,14 @@ function Le(e = {}) {
12516
12519
  blockSelector: p,
12517
12520
  slimDOMOptions: Xs,
12518
12521
  dataURLOptions: ei,
12519
- mirror: Xe,
12522
+ mirror: We,
12520
12523
  iframeManager: ze,
12521
12524
  stylesheetManager: He,
12522
12525
  shadowDomManager: si,
12523
12526
  processedNodeManager: Cs,
12524
12527
  canvasManager: Nt,
12525
12528
  ignoreCSSAttributes: Fe,
12526
- privacySetting: Se,
12529
+ privacySetting: Ge,
12527
12530
  plugins: ((ke = $?.filter((A) => A.observer)) == null ? void 0 : ke.map((A) => ({
12528
12531
  observer: A.observer,
12529
12532
  options: A.options,
@@ -12541,13 +12544,13 @@ function Le(e = {}) {
12541
12544
  };
12542
12545
  ze.addLoadListener((ne) => {
12543
12546
  try {
12544
- D.push(Ge(ne.contentDocument));
12547
+ D.push(Ve(ne.contentDocument));
12545
12548
  } catch (ke) {
12546
12549
  console.warn(ke);
12547
12550
  }
12548
12551
  });
12549
12552
  const se = () => {
12550
- Ki(), D.push(Ge(document)), as = !0;
12553
+ Ki(), D.push(Ve(document)), as = !0;
12551
12554
  };
12552
12555
  return document.readyState === "interactive" || document.readyState === "complete" ? se() : (D.push(
12553
12556
  pe("DOMContentLoaded", () => {
@@ -12568,7 +12571,7 @@ function Le(e = {}) {
12568
12571
  window
12569
12572
  )
12570
12573
  )), () => {
12571
- D.forEach((ne) => ne()), Cs.destroy(), as = !1, zf();
12574
+ D.forEach((ne) => ne()), Cs.destroy(), as = !1, Df();
12572
12575
  };
12573
12576
  } catch (D) {
12574
12577
  console.warn(D);
@@ -12596,12 +12599,12 @@ Le.snapshotCanvas = (e) => fe(void 0, null, function* () {
12596
12599
  throw new Error("canvas manager is not initialized");
12597
12600
  yield Nt.snapshot(e);
12598
12601
  });
12599
- Le.mirror = Xe;
12602
+ Le.mirror = We;
12600
12603
  var Fo;
12601
12604
  (function(e) {
12602
12605
  e[e.NotStarted = 0] = "NotStarted", e[e.Running = 1] = "Running", e[e.Stopped = 2] = "Stopped";
12603
12606
  })(Fo || (Fo = {}));
12604
- const { addCustomEvent: Ko } = Le, yy = (e) => {
12607
+ const { addCustomEvent: Ko } = Le, Iy = (e) => {
12605
12608
  e(window.location.href);
12606
12609
  const t = history.pushState;
12607
12610
  history.pushState = /* @__PURE__ */ ((r) => function() {
@@ -12623,7 +12626,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
12623
12626
  return window.addEventListener("locationchange", n), () => {
12624
12627
  window.removeEventListener("popstate", s), window.removeEventListener("locationchange", n), history.pushState = t, history.replaceState = i;
12625
12628
  };
12626
- }, gy = (e) => {
12629
+ }, Sy = (e) => {
12627
12630
  switch (e) {
12628
12631
  case "strict":
12629
12632
  return [!0, void 0];
@@ -12632,7 +12635,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
12632
12635
  case "none":
12633
12636
  return [!1, { password: !0 }];
12634
12637
  }
12635
- }, Zy = (e) => {
12638
+ }, Gy = (e) => {
12636
12639
  const t = (i) => {
12637
12640
  if (i.target) {
12638
12641
  const s = i.target, n = Il(s);
@@ -12640,7 +12643,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
12640
12643
  }
12641
12644
  };
12642
12645
  return window.addEventListener("click", t), () => window.removeEventListener("click", t);
12643
- }, Iy = (e) => {
12646
+ }, Vy = (e) => {
12644
12647
  const t = (i) => {
12645
12648
  if (i.target) {
12646
12649
  const s = Il(i.target);
@@ -12648,7 +12651,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
12648
12651
  }
12649
12652
  };
12650
12653
  return window.addEventListener("focusin", t), () => window.removeEventListener("focusin", t);
12651
- }, Sy = (e) => {
12654
+ }, Xy = (e) => {
12652
12655
  let t, i;
12653
12656
  if (typeof document.hidden < "u" ? (t = "hidden", i = "visibilitychange") : typeof document.msHidden < "u" ? (t = "msHidden", i = "msvisibilitychange") : typeof document.webkitHidden < "u" && (t = "webkitHidden", i = "webkitvisibilitychange"), i === void 0)
12654
12657
  return () => {
@@ -12663,7 +12666,7 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
12663
12666
  document.addEventListener(i, n);
12664
12667
  const r = i;
12665
12668
  return () => document.removeEventListener(r, n);
12666
- }, Gy = (e) => {
12669
+ }, Wy = (e) => {
12667
12670
  e(window.location.href);
12668
12671
  var t = XMLHttpRequest.prototype.send;
12669
12672
  XMLHttpRequest.prototype.send = function(r) {
@@ -12710,13 +12713,13 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
12710
12713
  window.removeEventListener("storage", i), XMLHttpRequest.prototype.send = t;
12711
12714
  };
12712
12715
  }, Oo = () => {
12713
- const e = Ie(
12716
+ const e = Se(
12714
12717
  "ajs_user_id"
12715
12718
  /* USER_ID */
12716
- ), t = Ie(
12719
+ ), t = Se(
12717
12720
  "ajs_user_traits"
12718
12721
  /* USER_TRAITS */
12719
- ), i = Ie(
12722
+ ), i = Se(
12720
12723
  "ajs_anonymous_id"
12721
12724
  /* ANONYMOUS_ID */
12722
12725
  );
@@ -12734,21 +12737,21 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
12734
12737
  } catch {
12735
12738
  return !1;
12736
12739
  }
12737
- const i = Vy(t), s = Ie(
12740
+ const i = Cy(t), s = Se(
12738
12741
  ye.SEGMENT_LAST_SENT_HASH_KEY
12739
12742
  );
12740
12743
  return s === void 0 || i !== s ? (Je(ye.SEGMENT_LAST_SENT_HASH_KEY, i), !0) : !1;
12741
- }, Vy = (e) => {
12744
+ }, Cy = (e) => {
12742
12745
  var t = 0, i = e.length, s = 0;
12743
12746
  if (i > 0) for (; s < i; ) t = (t << 5) - t + e.charCodeAt(s++) | 0;
12744
12747
  return t.toString();
12745
- }, Xy = (e, t) => {
12746
- const i = Wy(e);
12748
+ }, Ry = (e, t) => {
12749
+ const i = ky(e);
12747
12750
  let s = [];
12748
12751
  const n = !1, r = !0;
12749
12752
  for (let l = 0; l < i.length; l++) {
12750
12753
  let o = i[l].split("+");
12751
- s = [], o.length > 1 && (s = ky(Ic, o)), o = o[o.length - 1], o = o === "*" ? "*" : Ry(o), o in xe || (xe[o] = []), xe[o].push({
12754
+ s = [], o.length > 1 && (s = xy(Ic, o)), o = o[o.length - 1], o = o === "*" ? "*" : vy(o), o in xe || (xe[o] = []), xe[o].push({
12752
12755
  mods: s,
12753
12756
  shortcut: i[l],
12754
12757
  key: i[l],
@@ -12759,12 +12762,12 @@ const { addCustomEvent: Ko } = Le, yy = (e) => {
12759
12762
  splitKey: "+"
12760
12763
  });
12761
12764
  }
12762
- wy(document, "keydown", (l) => {
12763
- xy(l);
12765
+ Ty(document, "keydown", (l) => {
12766
+ Jy(l);
12764
12767
  });
12765
12768
  };
12766
12769
  let de = [];
12767
- function Wy(e) {
12770
+ function ky(e) {
12768
12771
  typeof e != "string" && (e = ""), e = e.replace(/\s/g, "");
12769
12772
  const t = e.split(",");
12770
12773
  let i = t.lastIndexOf("");
@@ -12772,7 +12775,7 @@ function Wy(e) {
12772
12775
  t[i - 1] += ",", t.splice(i, 1), i = t.lastIndexOf("");
12773
12776
  return t;
12774
12777
  }
12775
- const xe = {}, Ds = typeof navigator < "u" ? navigator.userAgent.toLowerCase().indexOf("firefox") > 0 : !1, Cy = {
12778
+ const xe = {}, Ds = typeof navigator < "u" ? navigator.userAgent.toLowerCase().indexOf("firefox") > 0 : !1, wy = {
12776
12779
  backspace: 8,
12777
12780
  tab: 9,
12778
12781
  clear: 12,
@@ -12852,23 +12855,23 @@ const xe = {}, Ds = typeof navigator < "u" ? navigator.userAgent.toLowerCase().i
12852
12855
  "⌘": 91,
12853
12856
  cmd: 91,
12854
12857
  command: 91
12855
- }, Ry = (e) => (
12858
+ }, vy = (e) => (
12856
12859
  // @ts-expect-error
12857
- Cy[e.toLowerCase()] || // @ts-expect-error
12860
+ wy[e.toLowerCase()] || // @ts-expect-error
12858
12861
  Ic[e.toLowerCase()] || e.toUpperCase().charCodeAt(0)
12859
12862
  );
12860
- function ky(e, t) {
12863
+ function xy(e, t) {
12861
12864
  const i = t.slice(0, t.length - 1);
12862
12865
  for (let s = 0; s < i.length; s++)
12863
12866
  i[s] = e[i[s].toLowerCase()];
12864
12867
  return i;
12865
12868
  }
12866
- function wy(e, t, i) {
12869
+ function Ty(e, t, i) {
12867
12870
  e.addEventListener ? e.addEventListener(t, i, !1) : e.attachEvent && e.attachEvent(`on${t}`, () => {
12868
12871
  i(window.event);
12869
12872
  });
12870
12873
  }
12871
- function vy(e, t, i) {
12874
+ function Ny(e, t, i) {
12872
12875
  let s;
12873
12876
  if (t.scope === i || t.scope === "all") {
12874
12877
  s = t.mods.length > 0;
@@ -12879,7 +12882,7 @@ function vy(e, t, i) {
12879
12882
  (t.mods.length === 0 && !he[16] && !he[18] && !he[17] && !he[91] || s || t.shortcut === "*") && t.method(e, t) === !1 && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, e.stopPropagation && e.stopPropagation(), e.cancelBubble && (e.cancelBubble = !0));
12880
12883
  }
12881
12884
  }
12882
- function xy(e) {
12885
+ function Jy(e) {
12883
12886
  const t = xe["*"];
12884
12887
  let i = e.keyCode || e.which || e.charCode;
12885
12888
  if ((i === 93 || i === 224) && (i = 91), de.indexOf(i) === -1 && i !== 229 && de.push(i), ["ctrlKey", "altKey", "shiftKey", "metaKey"].forEach((s) => {
@@ -12896,26 +12899,26 @@ function xy(e) {
12896
12899
  e.type === "keyup" && xe[i][s].keyup) && xe[i][s].key
12897
12900
  ) {
12898
12901
  const n = xe[i][s];
12899
- vy(e, n, "all");
12902
+ Ny(e, n, "all");
12900
12903
  }
12901
12904
  }
12902
12905
  }
12903
12906
  }
12904
- const Eo = "iframe parent ready", Ho = "iframe ok", jt = "highlightLogs", Ty = (e) => {
12905
- let t = Ie(jt) || "";
12907
+ const Eo = "iframe parent ready", Ho = "iframe ok", jt = "highlightLogs", Ly = (e) => {
12908
+ let t = Se(jt) || "";
12906
12909
  t = t + "[" + (/* @__PURE__ */ new Date()).getTime() + "] " + e + `
12907
12910
  `, Je(jt, t);
12908
- }, Ny = () => Ie(jt) || "", Jy = (e) => {
12911
+ }, Yy = () => Se(jt) || "", Uy = (e) => {
12909
12912
  if (!e)
12910
12913
  return;
12911
- let t = Ie(jt) || "";
12912
- t && (t.startsWith(e) ? (t = t.slice(e.length), Je(jt, t)) : Ty(
12914
+ let t = Se(jt) || "";
12915
+ t && (t.startsWith(e) ? (t = t.slice(e.length), Je(jt, t)) : Ly(
12913
12916
  "Unable to clear logs " + e.replace(`
12914
12917
  `, " ") + " from " + t.replace(`
12915
12918
  `, " ")
12916
12919
  ));
12917
- }, Sc = "dmFyIFZyPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxqcj1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgcXI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIEJlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIFF0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksWHQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgY3Q9KE0sRCxDKT0+RCBpbiBNP1ZyKE0sRCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Q30pOk1bRF09QyxQPShNLEQpPT57Zm9yKHZhciBDIGluIER8fChEPXt9KSlRdC5jYWxsKEQsQykmJmN0KE0sQyxEW0NdKTtpZihCZSlmb3IodmFyIEMgb2YgQmUoRCkpWHQuY2FsbChELEMpJiZjdChNLEMsRFtDXSk7cmV0dXJuIE19LFVlPShNLEQpPT5qcihNLHFyKEQpKTt2YXIgZ2U9KE0sRCk9Pnt2YXIgQz17fTtmb3IodmFyIEogaW4gTSlRdC5jYWxsKE0sSikmJkQuaW5kZXhPZihKKTwwJiYoQ1tKXT1NW0pdKTtpZihNIT1udWxsJiZCZSlmb3IodmFyIEogb2YgQmUoTSkpRC5pbmRleE9mKEopPDAmJlh0LmNhbGwoTSxKKSYmKENbSl09TVtKXSk7cmV0dXJuIEN9O3ZhciB1dD0oTSxELEMpPT5jdChNLHR5cGVvZiBEIT0ic3ltYm9sIj9EKyIiOkQsQyk7dmFyIFc9KE0sRCxDKT0+bmV3IFByb21pc2UoKEosY2UpPT57dmFyIHZlPWVlPT57dHJ5e3VlKEMubmV4dChlZSkpfWNhdGNoKEVlKXtjZShFZSl9fSxJZT1lZT0+e3RyeXt1ZShDLnRocm93KGVlKSl9Y2F0Y2goRWUpe2NlKEVlKX19LHVlPWVlPT5lZS5kb25lP0ooZWUudmFsdWUpOlByb21pc2UucmVzb2x2ZShlZS52YWx1ZSkudGhlbih2ZSxJZSk7dWUoKEM9Qy5hcHBseShNLEQpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIE0oZSx0KXtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKG4pe24mJnR5cGVvZiBuIT0ic3RyaW5nIiYmIUFycmF5LmlzQXJyYXkobikmJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oaSl7aWYoaSE9PSJkZWZhdWx0IiYmIShpIGluIGUpKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4saSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaSxyLmdldD9yOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuW2ldfX0pfX0pfSksT2JqZWN0LmZyZWV6ZShlKX12YXIgRD1VaW50OEFycmF5LEM9VWludDE2QXJyYXksSj1JbnQzMkFycmF5LGNlPW5ldyBEKFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsMCwwLDBdKSx2ZT1uZXcgRChbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywwLDBdKSxJZT1uZXcgRChbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pLHVlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPW5ldyBDKDMxKSxpPTA7aTwzMTsrK2kpbltpXT10Kz0xPDxlW2ktMV07Zm9yKHZhciByPW5ldyBKKG5bMzBdKSxpPTE7aTwzMDsrK2kpZm9yKHZhciBzPW5baV07czxuW2krMV07KytzKXJbc109cy1uW2ldPDw1fGk7cmV0dXJue2I6bixyfX0sZWU9dWUoY2UsMiksRWU9ZWUuYixWZT1lZS5yO0VlWzI4XT0yNTgsVmVbMjU4XT0yODtmb3IodmFyIFd0PXVlKHZlLDApLGx0PVd0LnIsamU9bmV3IEMoMzI3NjgpLEY9MDtGPDMyNzY4OysrRil7dmFyIGllPShGJjQzNjkwKT4+MXwoRiYyMTg0NSk8PDE7aWU9KGllJjUyNDI4KT4+MnwoaWUmMTMxMDcpPDwyLGllPShpZSY2MTY4MCk+PjR8KGllJjM4NTUpPDw0LGplW0ZdPSgoaWUmNjUyODApPj44fChpZSYyNTUpPDw4KT4+MX1mb3IodmFyIF9lPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9ZS5sZW5ndGgscj0wLHM9bmV3IEModCk7cjxpOysrcillW3JdJiYrK3NbZVtyXS0xXTt2YXIgYT1uZXcgQyh0KTtmb3Iocj0xO3I8dDsrK3IpYVtyXT1hW3ItMV0rc1tyLTFdPDwxO3ZhciBjO2lmKG4pe2M9bmV3IEMoMTw8dCk7dmFyIGY9MTUtdDtmb3Iocj0wO3I8aTsrK3IpaWYoZVtyXSlmb3IodmFyIGQ9cjw8NHxlW3JdLHU9dC1lW3JdLHk9YVtlW3JdLTFdKys8PHUsdj15fCgxPDx1KS0xO3k8PXY7Kyt5KWNbamVbeV0+PmZdPWR9ZWxzZSBmb3IoYz1uZXcgQyhpKSxyPTA7cjxpOysrcillW3JdJiYoY1tyXT1qZVthW2Vbcl0tMV0rK10+PjE1LWVbcl0pO3JldHVybiBjfSxhZT1uZXcgRCgyODgpLEY9MDtGPDE0NDsrK0YpYWVbRl09ODtmb3IodmFyIEY9MTQ0O0Y8MjU2OysrRilhZVtGXT05O2Zvcih2YXIgRj0yNTY7RjwyODA7KytGKWFlW0ZdPTc7Zm9yKHZhciBGPTI4MDtGPDI4ODsrK0YpYWVbRl09ODtmb3IodmFyIE9lPW5ldyBEKDMyKSxGPTA7RjwzMjsrK0YpT2VbRl09NTt2YXIgWnQ9X2UoYWUsOSwwKSxLdD1fZShPZSw1LDApLGZ0PWZ1bmN0aW9uKGUpe3JldHVybihlKzcpLzh8MH0saHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybihuPT1udWxsfHxuPmUubGVuZ3RoKSYmKG49ZS5sZW5ndGgpLG5ldyBEKGUuc3ViYXJyYXkodCxuKSl9LG5lPWZ1bmN0aW9uKGUsdCxuKXtuPDw9dCY3O3ZhciBpPXQvOHwwO2VbaV18PW4sZVtpKzFdfD1uPj44fSxUZT1mdW5jdGlvbihlLHQsbil7bjw8PXQmNzt2YXIgaT10Lzh8MDtlW2ldfD1uLGVbaSsxXXw9bj4+OCxlW2krMl18PW4+PjE2fSxxZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxpPTA7aTxlLmxlbmd0aDsrK2kpZVtpXSYmbi5wdXNoKHtzOmksZjplW2ldfSk7dmFyIHI9bi5sZW5ndGgscz1uLnNsaWNlKCk7aWYoIXIpcmV0dXJue3Q6eXQsbDowfTtpZihyPT0xKXt2YXIgYT1uZXcgRChuWzBdLnMrMSk7cmV0dXJuIGFbblswXS5zXT0xLHt0OmEsbDoxfX1uLnNvcnQoZnVuY3Rpb24oJCxxKXtyZXR1cm4gJC5mLXEuZn0pLG4ucHVzaCh7czotMSxmOjI1MDAxfSk7dmFyIGM9blswXSxmPW5bMV0sZD0wLHU9MSx5PTI7Zm9yKG5bMF09e3M6LTEsZjpjLmYrZi5mLGw6YyxyOmZ9O3UhPXItMTspYz1uW25bZF0uZjxuW3ldLmY/ZCsrOnkrK10sZj1uW2QhPXUmJm5bZF0uZjxuW3ldLmY/ZCsrOnkrK10sblt1KytdPXtzOi0xLGY6Yy5mK2YuZixsOmMscjpmfTtmb3IodmFyIHY9c1swXS5zLGk9MTtpPHI7KytpKXNbaV0ucz52JiYodj1zW2ldLnMpO3ZhciBiPW5ldyBDKHYrMSksbT1HZShuW3UtMV0sYiwwKTtpZihtPnQpe3ZhciBpPTAsTj0wLGc9bS10LEU9MTw8Zztmb3Iocy5zb3J0KGZ1bmN0aW9uKHEsQil7cmV0dXJuIGJbQi5zXS1iW3Euc118fHEuZi1CLmZ9KTtpPHI7KytpKXt2YXIgaz1zW2ldLnM7aWYoYltrXT50KU4rPUUtKDE8PG0tYltrXSksYltrXT10O2Vsc2UgYnJlYWt9Zm9yKE4+Pj1nO04+MDspe3ZhciB3PXNbaV0ucztiW3ddPHQ/Ti09MTw8dC1iW3ddKystMTorK2l9Zm9yKDtpPj0wJiZOOy0taSl7dmFyIEw9c1tpXS5zO2JbTF09PXQmJigtLWJbTF0sKytOKX1tPXR9cmV0dXJue3Q6bmV3IEQoYiksbDptfX0sR2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnM9PS0xP01hdGgubWF4KEdlKGUubCx0LG4rMSksR2UoZS5yLHQsbisxKSk6dFtlLnNdPW59LGR0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDt0JiYhZVstLXRdOyk7Zm9yKHZhciBuPW5ldyBDKCsrdCksaT0wLHI9ZVswXSxzPTEsYT1mdW5jdGlvbihmKXtuW2krK109Zn0sYz0xO2M8PXQ7KytjKWlmKGVbY109PXImJmMhPXQpKytzO2Vsc2V7aWYoIXImJnM+Mil7Zm9yKDtzPjEzODtzLT0xMzgpYSgzMjc1NCk7cz4yJiYoYShzPjEwP3MtMTE8PDV8Mjg2OTA6cy0zPDw1fDEyMzA1KSxzPTApfWVsc2UgaWYocz4zKXtmb3IoYShyKSwtLXM7cz42O3MtPTYpYSg4MzA0KTtzPjImJihhKHMtMzw8NXw4MjA4KSxzPTApfWZvcig7cy0tOylhKHIpO3M9MSxyPWVbY119cmV0dXJue2M6bi5zdWJhcnJheSgwLGkpLG46dH19LGJlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAsaT0wO2k8dC5sZW5ndGg7KytpKW4rPWVbaV0qdFtpXTtyZXR1cm4gbn0scHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW4ubGVuZ3RoLHI9ZnQodCsyKTtlW3JdPWkmMjU1LGVbcisxXT1pPj44LGVbcisyXT1lW3JdXjI1NSxlW3IrM109ZVtyKzFdXjI1NTtmb3IodmFyIHM9MDtzPGk7KytzKWVbcitzKzRdPW5bc107cmV0dXJuKHIrNCtpKSo4fSxtdD1mdW5jdGlvbihlLHQsbixpLHIscyxhLGMsZixkLHUpe25lKHQsdSsrLG4pLCsrclsyNTZdO2Zvcih2YXIgeT1xZShyLDE1KSx2PXkudCxiPXkubCxtPXFlKHMsMTUpLE49bS50LGc9bS5sLEU9ZHQodiksaz1FLmMsdz1FLm4sTD1kdChOKSwkPUwuYyxxPUwubixCPW5ldyBDKDE5KSxJPTA7STxrLmxlbmd0aDsrK0kpKytCW2tbSV0mMzFdO2Zvcih2YXIgST0wO0k8JC5sZW5ndGg7KytJKSsrQlskW0ldJjMxXTtmb3IodmFyIE89cWUoQiw3KSxqPU8udCxVPU8ubCx6PTE5O3o+NCYmIWpbSWVbei0xXV07LS16KTt2YXIgWD1kKzU8PDMsbz1iZShyLGFlKStiZShzLE9lKSthLGg9YmUocix2KStiZShzLE4pK2ErMTQrMyp6K2JlKEIsaikrMipCWzE2XSszKkJbMTddKzcqQlsxOF07aWYoZj49MCYmWDw9byYmWDw9aClyZXR1cm4gcHQodCx1LGUuc3ViYXJyYXkoZixmK2QpKTt2YXIgXyxBLFIseDtpZihuZSh0LHUsMSsoaDxvKSksdSs9MixoPG8pe189X2UodixiLDApLEE9dixSPV9lKE4sZywwKSx4PU47dmFyIHNlPV9lKGosVSwwKTtuZSh0LHUsdy0yNTcpLG5lKHQsdSs1LHEtMSksbmUodCx1KzEwLHotNCksdSs9MTQ7Zm9yKHZhciBJPTA7STx6OysrSSluZSh0LHUrMypJLGpbSWVbSV1dKTt1Kz0zKno7Zm9yKHZhciBIPVtrLCRdLHJlPTA7cmU8MjsrK3JlKWZvcih2YXIgbWU9SFtyZV0sST0wO0k8bWUubGVuZ3RoOysrSSl7dmFyIHRlPW1lW0ldJjMxO25lKHQsdSxzZVt0ZV0pLHUrPWpbdGVdLHRlPjE1JiYobmUodCx1LG1lW0ldPj41JjEyNyksdSs9bWVbSV0+PjEyKX19ZWxzZSBfPVp0LEE9YWUsUj1LdCx4PU9lO2Zvcih2YXIgST0wO0k8YzsrK0kpe3ZhciBZPWlbSV07aWYoWT4yNTUpe3ZhciB0ZT1ZPj4xOCYzMTtUZSh0LHUsX1t0ZSsyNTddKSx1Kz1BW3RlKzI1N10sdGU+NyYmKG5lKHQsdSxZPj4yMyYzMSksdSs9Y2VbdGVdKTt2YXIgeWU9WSYzMTtUZSh0LHUsUlt5ZV0pLHUrPXhbeWVdLHllPjMmJihUZSh0LHUsWT4+NSY4MTkxKSx1Kz12ZVt5ZV0pfWVsc2UgVGUodCx1LF9bWV0pLHUrPUFbWV19cmV0dXJuIFRlKHQsdSxfWzI1Nl0pLHUrQVsyNTZdfSxlbj1uZXcgSihbNjU1NDAsMTMxMDgwLDEzMTA4OCwxMzExMDQsMjYyMTc2LDEwNDg3MDQsMTA0ODgzMiwyMTE0NTYwLDIxMTc2MzJdKSx5dD1uZXcgRCgwKSx0bj1mdW5jdGlvbihlLHQsbixpLHIscyl7dmFyIGE9cy56fHxlLmxlbmd0aCxjPW5ldyBEKGkrYSs1KigxK01hdGguY2VpbChhLzdlMykpK3IpLGY9Yy5zdWJhcnJheShpLGMubGVuZ3RoLXIpLGQ9cy5sLHU9KHMucnx8MCkmNztpZih0KXt1JiYoZlswXT1zLnI+PjMpO2Zvcih2YXIgeT1lblt0LTFdLHY9eT4+MTMsYj15JjgxOTEsbT0oMTw8biktMSxOPXMucHx8bmV3IEMoMzI3NjgpLGc9cy5ofHxuZXcgQyhtKzEpLEU9TWF0aC5jZWlsKG4vMyksaz0yKkUsdz1mdW5jdGlvbihvdCl7cmV0dXJuKGVbb3RdXmVbb3QrMV08PEVeZVtvdCsyXTw8aykmbX0sTD1uZXcgSigyNWUzKSwkPW5ldyBDKDI4OCkscT1uZXcgQygzMiksQj0wLEk9MCxPPXMuaXx8MCxqPTAsVT1zLnd8fDAsej0wO08rMjxhOysrTyl7dmFyIFg9dyhPKSxvPU8mMzI3NjcsaD1nW1hdO2lmKE5bb109aCxnW1hdPW8sVTw9Tyl7dmFyIF89YS1PO2lmKChCPjdlM3x8aj4yNDU3NikmJihfPjQyM3x8IWQpKXt1PW10KGUsZiwwLEwsJCxxLEksaix6LE8teix1KSxqPUI9ST0wLHo9Tztmb3IodmFyIEE9MDtBPDI4NjsrK0EpJFtBXT0wO2Zvcih2YXIgQT0wO0E8MzA7KytBKXFbQV09MH12YXIgUj0yLHg9MCxzZT1iLEg9by1oJjMyNzY3O2lmKF8+MiYmWD09dyhPLUgpKWZvcih2YXIgcmU9TWF0aC5taW4odixfKS0xLG1lPU1hdGgubWluKDMyNzY3LE8pLHRlPU1hdGgubWluKDI1OCxfKTtIPD1tZSYmLS1zZSYmbyE9aDspe2lmKGVbTytSXT09ZVtPK1ItSF0pe2Zvcih2YXIgWT0wO1k8dGUmJmVbTytZXT09ZVtPK1ktSF07KytZKTtpZihZPlIpe2lmKFI9WSx4PUgsWT5yZSlicmVhaztmb3IodmFyIHllPU1hdGgubWluKEgsWS0yKSx6dD0wLEE9MDtBPHllOysrQSl7dmFyIHN0PU8tSCtBJjMyNzY3LFVyPU5bc3RdLEh0PXN0LVVyJjMyNzY3O0h0Pnp0JiYoenQ9SHQsaD1zdCl9fX1vPWgsaD1OW29dLEgrPW8taCYzMjc2N31pZih4KXtMW2orK109MjY4NDM1NDU2fFZlW1JdPDwxOHxsdFt4XTt2YXIgWXQ9VmVbUl0mMzEsSnQ9bHRbeF0mMzE7SSs9Y2VbWXRdK3ZlW0p0XSwrKyRbMjU3K1l0XSwrK3FbSnRdLFU9TytSLCsrQn1lbHNlIExbaisrXT1lW09dLCsrJFtlW09dXX19Zm9yKE89TWF0aC5tYXgoTyxVKTtPPGE7KytPKUxbaisrXT1lW09dLCsrJFtlW09dXTt1PW10KGUsZixkLEwsJCxxLEksaix6LE8teix1KSxkfHwocy5yPXUmN3xmW3UvOHwwXTw8Myx1LT03LHMuaD1nLHMucD1OLHMuaT1PLHMudz1VKX1lbHNle2Zvcih2YXIgTz1zLnd8fDA7TzxhK2Q7Tys9NjU1MzUpe3ZhciBhdD1PKzY1NTM1O2F0Pj1hJiYoZlt1Lzh8MF09ZCxhdD1hKSx1PXB0KGYsdSsxLGUuc3ViYXJyYXkoTyxhdCkpfXMuaT1hfXJldHVybiBodChjLDAsaStmdCh1KStyKX0sbm49ZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IEludDMyQXJyYXkoMjU2KSx0PTA7dDwyNTY7Kyt0KXtmb3IodmFyIG49dCxpPTk7LS1pOyluPShuJjEmJi0zMDY2NzQ5MTIpXm4+Pj4xO2VbdF09bn1yZXR1cm4gZX0oKSxybj1mdW5jdGlvbigpe3ZhciBlPS0xO3JldHVybntwOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1lLGk9MDtpPHQubGVuZ3RoOysraSluPW5uW24mMjU1XnRbaV1dXm4+Pj44O2U9bn0sZDpmdW5jdGlvbigpe3JldHVybn5lfX19LHNuPWZ1bmN0aW9uKGUsdCxuLGkscil7aWYoIXImJihyPXtsOjF9LHQuZGljdGlvbmFyeSkpe3ZhciBzPXQuZGljdGlvbmFyeS5zdWJhcnJheSgtMzI3NjgpLGE9bmV3IEQocy5sZW5ndGgrZS5sZW5ndGgpO2Euc2V0KHMpLGEuc2V0KGUscy5sZW5ndGgpLGU9YSxyLnc9cy5sZW5ndGh9cmV0dXJuIHRuKGUsdC5sZXZlbD09bnVsbD82OnQubGV2ZWwsdC5tZW09PW51bGw/ci5sP01hdGguY2VpbChNYXRoLm1heCg4LE1hdGgubWluKDEzLE1hdGgubG9nKGUubGVuZ3RoKSkpKjEuNSk6MjA6MTIrdC5tZW0sbixpLHIpfSx6ZT1mdW5jdGlvbihlLHQsbil7Zm9yKDtuOysrdCllW3RdPW4sbj4+Pj04fSxhbj1mdW5jdGlvbihlLHQpe3ZhciBuPXQuZmlsZW5hbWU7aWYoZVswXT0zMSxlWzFdPTEzOSxlWzJdPTgsZVs4XT10LmxldmVsPDI/NDp0LmxldmVsPT05PzI6MCxlWzldPTMsdC5tdGltZSE9MCYmemUoZSw0LE1hdGguZmxvb3IobmV3IERhdGUodC5tdGltZXx8RGF0ZS5ub3coKSkvMWUzKSksbil7ZVszXT04O2Zvcih2YXIgaT0wO2k8PW4ubGVuZ3RoOysraSllW2krMTBdPW4uY2hhckNvZGVBdChpKX19LG9uPWZ1bmN0aW9uKGUpe3JldHVybiAxMCsoZS5maWxlbmFtZT9lLmZpbGVuYW1lLmxlbmd0aCsxOjApfTtmdW5jdGlvbiBjbihlLHQpe3R8fCh0PXt9KTt2YXIgbj1ybigpLGk9ZS5sZW5ndGg7bi5wKGUpO3ZhciByPXNuKGUsdCxvbih0KSw4KSxzPXIubGVuZ3RoO3JldHVybiBhbihyLHQpLHplKHIscy04LG4uZCgpKSx6ZShyLHMtNCxpKSxyfXZhciBndD10eXBlb2YgVGV4dEVuY29kZXIhPSJ1bmRlZmluZWQiJiZuZXcgVGV4dEVuY29kZXIsdW49dHlwZW9mIFRleHREZWNvZGVyIT0idW5kZWZpbmVkIiYmbmV3IFRleHREZWNvZGVyLGxuPTA7dHJ5e3VuLmRlY29kZSh5dCx7c3RyZWFtOiEwfSksbG49MX1jYXRjaChlKXt9ZnVuY3Rpb24gZm4oZSx0KXt2YXIgbjtpZihndClyZXR1cm4gZ3QuZW5jb2RlKGUpO2Zvcih2YXIgaT1lLmxlbmd0aCxyPW5ldyBEKGUubGVuZ3RoKyhlLmxlbmd0aD4+MSkpLHM9MCxhPWZ1bmN0aW9uKGQpe3JbcysrXT1kfSxuPTA7bjxpOysrbil7aWYocys1PnIubGVuZ3RoKXt2YXIgYz1uZXcgRChzKzgrKGktbjw8MSkpO2Muc2V0KHIpLHI9Y312YXIgZj1lLmNoYXJDb2RlQXQobik7ZjwxMjh8fHQ/YShmKTpmPDIwNDg/KGEoMTkyfGY+PjYpLGEoMTI4fGYmNjMpKTpmPjU1Mjk1JiZmPDU3MzQ0PyhmPTY1NTM2KyhmJjEwNDc1NTIpfGUuY2hhckNvZGVBdCgrK24pJjEwMjMsYSgyNDB8Zj4+MTgpLGEoMTI4fGY+PjEyJjYzKSxhKDEyOHxmPj42JjYzKSxhKDEyOHxmJjYzKSk6KGEoMjI0fGY+PjEyKSxhKDEyOHxmPj42JjYzKSxhKDEyOHxmJjYzKSl9cmV0dXJuIGh0KHIsMCxzKX1jb25zdCBIZT1KU09OLGhuPWU9PmUudG9VcHBlckNhc2UoKSxkbj1lPT57Y29uc3QgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChuLGkpPT57dFtpXT1ufSksdH0scG49KGUsdCxuKT0+ZS5kb2N1bWVudD9lOntkb2N1bWVudDplLHZhcmlhYmxlczp0LHJlcXVlc3RIZWFkZXJzOm4sc2lnbmFsOnZvaWQgMH0sbW49KGUsdCxuKT0+ZS5xdWVyeT9lOntxdWVyeTplLHZhcmlhYmxlczp0LHJlcXVlc3RIZWFkZXJzOm4sc2lnbmFsOnZvaWQgMH0seW49KGUsdCk9PmUuZG9jdW1lbnRzP2U6e2RvY3VtZW50czplLHJlcXVlc3RIZWFkZXJzOnQsc2lnbmFsOnZvaWQgMH07ZnVuY3Rpb24gU2UoZSx0KXtpZighISFlKXRocm93IG5ldyBFcnJvcih0KX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbH1mdW5jdGlvbiB2bihlLHQpe2lmKCEhIWUpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGludmFyaWFudCB0cmlnZ2VyZWQuIil9Y29uc3QgRW49L1xyXG58W1xuXHJdL2c7ZnVuY3Rpb24gWWUoZSx0KXtsZXQgbj0wLGk9MTtmb3IoY29uc3QgciBvZiBlLmJvZHkubWF0Y2hBbGwoRW4pKXtpZih0eXBlb2Ygci5pbmRleD09Im51bWJlciJ8fHZuKCExKSxyLmluZGV4Pj10KWJyZWFrO249ci5pbmRleCtyWzBdLmxlbmd0aCxpKz0xfXJldHVybntsaW5lOmksY29sdW1uOnQrMS1ufX1mdW5jdGlvbiBfbihlKXtyZXR1cm4gdnQoZS5zb3VyY2UsWWUoZS5zb3VyY2UsZS5zdGFydCkpfWZ1bmN0aW9uIHZ0KGUsdCl7Y29uc3Qgbj1lLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbi0xLGk9IiIucGFkU3RhcnQobikrZS5ib2R5LHI9dC5saW5lLTEscz1lLmxvY2F0aW9uT2Zmc2V0LmxpbmUtMSxhPXQubGluZStzLGM9dC5saW5lPT09MT9uOjAsZj10LmNvbHVtbitjLGQ9YCR7ZS5uYW1lfToke2F9OiR7Zn0KYCx1PWkuc3BsaXQoL1xyXG58W1xuXHJdL2cpLHk9dVtyXTtpZih5Lmxlbmd0aD4xMjApe2NvbnN0IHY9TWF0aC5mbG9vcihmLzgwKSxiPWYlODAsbT1bXTtmb3IobGV0IE49MDtOPHkubGVuZ3RoO04rPTgwKW0ucHVzaCh5LnNsaWNlKE4sTis4MCkpO3JldHVybiBkK0V0KFtbYCR7YX0gfGAsbVswXV0sLi4ubS5zbGljZSgxLHYrMSkubWFwKE49PlsifCIsTl0pLFsifCIsIl4iLnBhZFN0YXJ0KGIpXSxbInwiLG1bdisxXV1dKX1yZXR1cm4gZCtFdChbW2Ake2EtMX0gfGAsdVtyLTFdXSxbYCR7YX0gfGAseV0sWyJ8IiwiXiIucGFkU3RhcnQoZildLFtgJHthKzF9IHxgLHVbcisxXV1dKX1mdW5jdGlvbiBFdChlKXtjb25zdCB0PWUuZmlsdGVyKChbaSxyXSk9PnIhPT12b2lkIDApLG49TWF0aC5tYXgoLi4udC5tYXAoKFtpXSk9PmkubGVuZ3RoKSk7cmV0dXJuIHQubWFwKChbaSxyXSk9PmkucGFkU3RhcnQobikrKHI/IiAiK3I6IiIpKS5qb2luKGAKYCl9ZnVuY3Rpb24gVG4oZSl7Y29uc3QgdD1lWzBdO3JldHVybiB0PT1udWxsfHwia2luZCJpbiB0fHwibGVuZ3RoImluIHQ/e25vZGVzOnQsc291cmNlOmVbMV0scG9zaXRpb25zOmVbMl0scGF0aDplWzNdLG9yaWdpbmFsRXJyb3I6ZVs0XSxleHRlbnNpb25zOmVbNV19OnR9Y2xhc3MgSmUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LC4uLm4pe3ZhciBpLHIscztjb25zdHtub2RlczphLHNvdXJjZTpjLHBvc2l0aW9uczpmLHBhdGg6ZCxvcmlnaW5hbEVycm9yOnUsZXh0ZW5zaW9uczp5fT1UbihuKTtzdXBlcih0KSx0aGlzLm5hbWU9IkdyYXBoUUxFcnJvciIsdGhpcy5wYXRoPWQhPW51bGw/ZDp2b2lkIDAsdGhpcy5vcmlnaW5hbEVycm9yPXUhPW51bGw/dTp2b2lkIDAsdGhpcy5ub2Rlcz1fdChBcnJheS5pc0FycmF5KGEpP2E6YT9bYV06dm9pZCAwKTtjb25zdCB2PV90KChpPXRoaXMubm9kZXMpPT09bnVsbHx8aT09PXZvaWQgMD92b2lkIDA6aS5tYXAobT0+bS5sb2MpLmZpbHRlcihtPT5tIT1udWxsKSk7dGhpcy5zb3VyY2U9YyE9bnVsbD9jOnY9PW51bGx8fChyPXZbMF0pPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zb3VyY2UsdGhpcy5wb3NpdGlvbnM9ZiE9bnVsbD9mOnY9PW51bGw/dm9pZCAwOnYubWFwKG09Pm0uc3RhcnQpLHRoaXMubG9jYXRpb25zPWYmJmM/Zi5tYXAobT0+WWUoYyxtKSk6dj09bnVsbD92b2lkIDA6di5tYXAobT0+WWUobS5zb3VyY2UsbS5zdGFydCkpO2NvbnN0IGI9Z24odT09bnVsbD92b2lkIDA6dS5leHRlbnNpb25zKT91PT1udWxsP3ZvaWQgMDp1LmV4dGVuc2lvbnM6dm9pZCAwO3RoaXMuZXh0ZW5zaW9ucz0ocz15IT1udWxsP3k6YikhPT1udWxsJiZzIT09dm9pZCAwP3M6T2JqZWN0LmNyZWF0ZShudWxsKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHttZXNzYWdlOnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwfSxuYW1lOntlbnVtZXJhYmxlOiExfSxub2Rlczp7ZW51bWVyYWJsZTohMX0sc291cmNlOntlbnVtZXJhYmxlOiExfSxwb3NpdGlvbnM6e2VudW1lcmFibGU6ITF9LG9yaWdpbmFsRXJyb3I6e2VudW1lcmFibGU6ITF9fSksdSE9bnVsbCYmdS5zdGFjaz9PYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RhY2siLHt2YWx1ZTp1LnN0YWNrLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOkVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsSmUpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOkVycm9yKCkuc3RhY2ssd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iR3JhcGhRTEVycm9yIn10b1N0cmluZygpe2xldCB0PXRoaXMubWVzc2FnZTtpZih0aGlzLm5vZGVzKWZvcihjb25zdCBuIG9mIHRoaXMubm9kZXMpbi5sb2MmJih0Kz1gCgpgK19uKG4ubG9jKSk7ZWxzZSBpZih0aGlzLnNvdXJjZSYmdGhpcy5sb2NhdGlvbnMpZm9yKGNvbnN0IG4gb2YgdGhpcy5sb2NhdGlvbnMpdCs9YAoKYCt2dCh0aGlzLnNvdXJjZSxuKTtyZXR1cm4gdH10b0pTT04oKXtjb25zdCB0PXttZXNzYWdlOnRoaXMubWVzc2FnZX07cmV0dXJuIHRoaXMubG9jYXRpb25zIT1udWxsJiYodC5sb2NhdGlvbnM9dGhpcy5sb2NhdGlvbnMpLHRoaXMucGF0aCE9bnVsbCYmKHQucGF0aD10aGlzLnBhdGgpLHRoaXMuZXh0ZW5zaW9ucyE9bnVsbCYmT2JqZWN0LmtleXModGhpcy5leHRlbnNpb25zKS5sZW5ndGg+MCYmKHQuZXh0ZW5zaW9ucz10aGlzLmV4dGVuc2lvbnMpLHR9fWZ1bmN0aW9uIF90KGUpe3JldHVybiBlPT09dm9pZCAwfHxlLmxlbmd0aD09PTA/dm9pZCAwOmV9ZnVuY3Rpb24gRyhlLHQsbil7cmV0dXJuIG5ldyBKZShgU3ludGF4IEVycm9yOiAke259YCx7c291cmNlOmUscG9zaXRpb25zOlt0XX0pfWNsYXNzIGJue2NvbnN0cnVjdG9yKHQsbixpKXt0aGlzLnN0YXJ0PXQuc3RhcnQsdGhpcy5lbmQ9bi5lbmQsdGhpcy5zdGFydFRva2VuPXQsdGhpcy5lbmRUb2tlbj1uLHRoaXMuc291cmNlPWl9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iTG9jYXRpb24ifXRvSlNPTigpe3JldHVybntzdGFydDp0aGlzLnN0YXJ0LGVuZDp0aGlzLmVuZH19fWNsYXNzIFR0e2NvbnN0cnVjdG9yKHQsbixpLHIscyxhKXt0aGlzLmtpbmQ9dCx0aGlzLnN0YXJ0PW4sdGhpcy5lbmQ9aSx0aGlzLmxpbmU9cix0aGlzLmNvbHVtbj1zLHRoaXMudmFsdWU9YSx0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbH1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJUb2tlbiJ9dG9KU09OKCl7cmV0dXJue2tpbmQ6dGhpcy5raW5kLHZhbHVlOnRoaXMudmFsdWUsbGluZTp0aGlzLmxpbmUsY29sdW1uOnRoaXMuY29sdW1ufX19Y29uc3QgYnQ9e05hbWU6W10sRG9jdW1lbnQ6WyJkZWZpbml0aW9ucyJdLE9wZXJhdGlvbkRlZmluaXRpb246WyJuYW1lIiwidmFyaWFibGVEZWZpbml0aW9ucyIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxWYXJpYWJsZURlZmluaXRpb246WyJ2YXJpYWJsZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJkaXJlY3RpdmVzIl0sVmFyaWFibGU6WyJuYW1lIl0sU2VsZWN0aW9uU2V0Olsic2VsZWN0aW9ucyJdLEZpZWxkOlsiYWxpYXMiLCJuYW1lIiwiYXJndW1lbnRzIiwiZGlyZWN0aXZlcyIsInNlbGVjdGlvblNldCJdLEFyZ3VtZW50OlsibmFtZSIsInZhbHVlIl0sRnJhZ21lbnRTcHJlYWQ6WyJuYW1lIiwiZGlyZWN0aXZlcyJdLElubGluZUZyYWdtZW50OlsidHlwZUNvbmRpdGlvbiIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxGcmFnbWVudERlZmluaXRpb246WyJuYW1lIiwidmFyaWFibGVEZWZpbml0aW9ucyIsInR5cGVDb25kaXRpb24iLCJkaXJlY3RpdmVzIiwic2VsZWN0aW9uU2V0Il0sSW50VmFsdWU6W10sRmxvYXRWYWx1ZTpbXSxTdHJpbmdWYWx1ZTpbXSxCb29sZWFuVmFsdWU6W10sTnVsbFZhbHVlOltdLEVudW1WYWx1ZTpbXSxMaXN0VmFsdWU6WyJ2YWx1ZXMiXSxPYmplY3RWYWx1ZTpbImZpZWxkcyJdLE9iamVjdEZpZWxkOlsibmFtZSIsInZhbHVlIl0sRGlyZWN0aXZlOlsibmFtZSIsImFyZ3VtZW50cyJdLE5hbWVkVHlwZTpbIm5hbWUiXSxMaXN0VHlwZTpbInR5cGUiXSxOb25OdWxsVHlwZTpbInR5cGUiXSxTY2hlbWFEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJkaXJlY3RpdmVzIiwib3BlcmF0aW9uVHlwZXMiXSxPcGVyYXRpb25UeXBlRGVmaW5pdGlvbjpbInR5cGUiXSxTY2FsYXJUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiXSxPYmplY3RUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sRmllbGREZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiYXJndW1lbnRzIiwidHlwZSIsImRpcmVjdGl2ZXMiXSxJbnB1dFZhbHVlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJkaXJlY3RpdmVzIl0sSW50ZXJmYWNlVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJpbnRlcmZhY2VzIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLFVuaW9uVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwidHlwZXMiXSxFbnVtVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwidmFsdWVzIl0sRW51bVZhbHVlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiXSxJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLERpcmVjdGl2ZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJhcmd1bWVudHMiLCJsb2NhdGlvbnMiXSxTY2hlbWFFeHRlbnNpb246WyJkaXJlY3RpdmVzIiwib3BlcmF0aW9uVHlwZXMiXSxTY2FsYXJUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiXSxPYmplY3RUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sSW50ZXJmYWNlVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJpbnRlcmZhY2VzIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLFVuaW9uVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJkaXJlY3RpdmVzIiwidHlwZXMiXSxFbnVtVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJkaXJlY3RpdmVzIiwidmFsdWVzIl0sSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiLCJmaWVsZHMiXX0sTm49bmV3IFNldChPYmplY3Qua2V5cyhidCkpO2Z1bmN0aW9uIE50KGUpe2NvbnN0IHQ9ZT09bnVsbD92b2lkIDA6ZS5raW5kO3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJk5uLmhhcyh0KX12YXIgbGU7KGZ1bmN0aW9uKGUpe2UuUVVFUlk9InF1ZXJ5IixlLk1VVEFUSU9OPSJtdXRhdGlvbiIsZS5TVUJTQ1JJUFRJT049InN1YnNjcmlwdGlvbiJ9KShsZXx8KGxlPXt9KSk7dmFyIFFlOyhmdW5jdGlvbihlKXtlLlFVRVJZPSJRVUVSWSIsZS5NVVRBVElPTj0iTVVUQVRJT04iLGUuU1VCU0NSSVBUSU9OPSJTVUJTQ1JJUFRJT04iLGUuRklFTEQ9IkZJRUxEIixlLkZSQUdNRU5UX0RFRklOSVRJT049IkZSQUdNRU5UX0RFRklOSVRJT04iLGUuRlJBR01FTlRfU1BSRUFEPSJGUkFHTUVOVF9TUFJFQUQiLGUuSU5MSU5FX0ZSQUdNRU5UPSJJTkxJTkVfRlJBR01FTlQiLGUuVkFSSUFCTEVfREVGSU5JVElPTj0iVkFSSUFCTEVfREVGSU5JVElPTiIsZS5TQ0hFTUE9IlNDSEVNQSIsZS5TQ0FMQVI9IlNDQUxBUiIsZS5PQkpFQ1Q9Ik9CSkVDVCIsZS5GSUVMRF9ERUZJTklUSU9OPSJGSUVMRF9ERUZJTklUSU9OIixlLkFSR1VNRU5UX0RFRklOSVRJT049IkFSR1VNRU5UX0RFRklOSVRJT04iLGUuSU5URVJGQUNFPSJJTlRFUkZBQ0UiLGUuVU5JT049IlVOSU9OIixlLkVOVU09IkVOVU0iLGUuRU5VTV9WQUxVRT0iRU5VTV9WQUxVRSIsZS5JTlBVVF9PQkpFQ1Q9IklOUFVUX09CSkVDVCIsZS5JTlBVVF9GSUVMRF9ERUZJTklUSU9OPSJJTlBVVF9GSUVMRF9ERUZJTklUSU9OIn0pKFFlfHwoUWU9e30pKTt2YXIgVDsoZnVuY3Rpb24oZSl7ZS5OQU1FPSJOYW1lIixlLkRPQ1VNRU5UPSJEb2N1bWVudCIsZS5PUEVSQVRJT05fREVGSU5JVElPTj0iT3BlcmF0aW9uRGVmaW5pdGlvbiIsZS5WQVJJQUJMRV9ERUZJTklUSU9OPSJWYXJpYWJsZURlZmluaXRpb24iLGUuU0VMRUNUSU9OX1NFVD0iU2VsZWN0aW9uU2V0IixlLkZJRUxEPSJGaWVsZCIsZS5BUkdVTUVOVD0iQXJndW1lbnQiLGUuRlJBR01FTlRfU1BSRUFEPSJGcmFnbWVudFNwcmVhZCIsZS5JTkxJTkVfRlJBR01FTlQ9IklubGluZUZyYWdtZW50IixlLkZSQUdNRU5UX0RFRklOSVRJT049IkZyYWdtZW50RGVmaW5pdGlvbiIsZS5WQVJJQUJMRT0iVmFyaWFibGUiLGUuSU5UPSJJbnRWYWx1ZSIsZS5GTE9BVD0iRmxvYXRWYWx1ZSIsZS5TVFJJTkc9IlN0cmluZ1ZhbHVlIixlLkJPT0xFQU49IkJvb2xlYW5WYWx1ZSIsZS5OVUxMPSJOdWxsVmFsdWUiLGUuRU5VTT0iRW51bVZhbHVlIixlLkxJU1Q9Ikxpc3RWYWx1ZSIsZS5PQkpFQ1Q9Ik9iamVjdFZhbHVlIixlLk9CSkVDVF9GSUVMRD0iT2JqZWN0RmllbGQiLGUuRElSRUNUSVZFPSJEaXJlY3RpdmUiLGUuTkFNRURfVFlQRT0iTmFtZWRUeXBlIixlLkxJU1RfVFlQRT0iTGlzdFR5cGUiLGUuTk9OX05VTExfVFlQRT0iTm9uTnVsbFR5cGUiLGUuU0NIRU1BX0RFRklOSVRJT049IlNjaGVtYURlZmluaXRpb24iLGUuT1BFUkFUSU9OX1RZUEVfREVGSU5JVElPTj0iT3BlcmF0aW9uVHlwZURlZmluaXRpb24iLGUuU0NBTEFSX1RZUEVfREVGSU5JVElPTj0iU2NhbGFyVHlwZURlZmluaXRpb24iLGUuT0JKRUNUX1RZUEVfREVGSU5JVElPTj0iT2JqZWN0VHlwZURlZmluaXRpb24iLGUuRklFTERfREVGSU5JVElPTj0iRmllbGREZWZpbml0aW9uIixlLklOUFVUX1ZBTFVFX0RFRklOSVRJT049IklucHV0VmFsdWVEZWZpbml0aW9uIixlLklOVEVSRkFDRV9UWVBFX0RFRklOSVRJT049IkludGVyZmFjZVR5cGVEZWZpbml0aW9uIixlLlVOSU9OX1RZUEVfREVGSU5JVElPTj0iVW5pb25UeXBlRGVmaW5pdGlvbiIsZS5FTlVNX1RZUEVfREVGSU5JVElPTj0iRW51bVR5cGVEZWZpbml0aW9uIixlLkVOVU1fVkFMVUVfREVGSU5JVElPTj0iRW51bVZhbHVlRGVmaW5pdGlvbiIsZS5JTlBVVF9PQkpFQ1RfVFlQRV9ERUZJTklUSU9OPSJJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uIixlLkRJUkVDVElWRV9ERUZJTklUSU9OPSJEaXJlY3RpdmVEZWZpbml0aW9uIixlLlNDSEVNQV9FWFRFTlNJT049IlNjaGVtYUV4dGVuc2lvbiIsZS5TQ0FMQVJfVFlQRV9FWFRFTlNJT049IlNjYWxhclR5cGVFeHRlbnNpb24iLGUuT0JKRUNUX1RZUEVfRVhURU5TSU9OPSJPYmplY3RUeXBlRXh0ZW5zaW9uIixlLklOVEVSRkFDRV9UWVBFX0VYVEVOU0lPTj0iSW50ZXJmYWNlVHlwZUV4dGVuc2lvbiIsZS5VTklPTl9UWVBFX0VYVEVOU0lPTj0iVW5pb25UeXBlRXh0ZW5zaW9uIixlLkVOVU1fVFlQRV9FWFRFTlNJT049IkVudW1UeXBlRXh0ZW5zaW9uIixlLklOUFVUX09CSkVDVF9UWVBFX0VYVEVOU0lPTj0iSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uIn0pKFR8fChUPXt9KSk7ZnVuY3Rpb24gWGUoZSl7cmV0dXJuIGU9PT05fHxlPT09MzJ9ZnVuY3Rpb24gTmUoZSl7cmV0dXJuIGU+PTQ4JiZlPD01N31mdW5jdGlvbiB4dChlKXtyZXR1cm4gZT49OTcmJmU8PTEyMnx8ZT49NjUmJmU8PTkwfWZ1bmN0aW9uIEF0KGUpe3JldHVybiB4dChlKXx8ZT09PTk1fWZ1bmN0aW9uIHhuKGUpe3JldHVybiB4dChlKXx8TmUoZSl8fGU9PT05NX1mdW5jdGlvbiBBbihlKXt2YXIgdDtsZXQgbj1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUixpPW51bGwscj0tMTtmb3IobGV0IGE9MDthPGUubGVuZ3RoOysrYSl7dmFyIHM7Y29uc3QgYz1lW2FdLGY9SW4oYyk7ZiE9PWMubGVuZ3RoJiYoaT0ocz1pKSE9PW51bGwmJnMhPT12b2lkIDA/czphLHI9YSxhIT09MCYmZjxuJiYobj1mKSl9cmV0dXJuIGUubWFwKChhLGMpPT5jPT09MD9hOmEuc2xpY2UobikpLnNsaWNlKCh0PWkpIT09bnVsbCYmdCE9PXZvaWQgMD90OjAscisxKX1mdW5jdGlvbiBJbihlKXtsZXQgdD0wO2Zvcig7dDxlLmxlbmd0aCYmWGUoZS5jaGFyQ29kZUF0KHQpKTspKyt0O3JldHVybiB0fWZ1bmN0aW9uIE9uKGUsdCl7Y29uc3Qgbj1lLnJlcGxhY2UoLyIiIi9nLCdcXCIiIicpLGk9bi5zcGxpdCgvXHJcbnxbXG5ccl0vZykscj1pLmxlbmd0aD09PTEscz1pLmxlbmd0aD4xJiZpLnNsaWNlKDEpLmV2ZXJ5KGI9PmIubGVuZ3RoPT09MHx8WGUoYi5jaGFyQ29kZUF0KDApKSksYT1uLmVuZHNXaXRoKCdcXCIiIicpLGM9ZS5lbmRzV2l0aCgnIicpJiYhYSxmPWUuZW5kc1dpdGgoIlxcIiksZD1jfHxmLHU9IXJ8fGUubGVuZ3RoPjcwfHxkfHxzfHxhO2xldCB5PSIiO2NvbnN0IHY9ciYmWGUoZS5jaGFyQ29kZUF0KDApKTtyZXR1cm4odSYmIXZ8fHMpJiYoeSs9YApgKSx5Kz1uLCh1fHxkKSYmKHkrPWAKYCksJyIiIicreSsnIiIiJ312YXIgbDsoZnVuY3Rpb24oZSl7ZS5TT0Y9IjxTT0Y+IixlLkVPRj0iPEVPRj4iLGUuQkFORz0iISIsZS5ET0xMQVI9IiQiLGUuQU1QPSImIixlLlBBUkVOX0w9IigiLGUuUEFSRU5fUj0iKSIsZS5TUFJFQUQ9Ii4uLiIsZS5DT0xPTj0iOiIsZS5FUVVBTFM9Ij0iLGUuQVQ9IkAiLGUuQlJBQ0tFVF9MPSJbIixlLkJSQUNLRVRfUj0iXSIsZS5CUkFDRV9MPSJ7IixlLlBJUEU9InwiLGUuQlJBQ0VfUj0ifSIsZS5OQU1FPSJOYW1lIixlLklOVD0iSW50IixlLkZMT0FUPSJGbG9hdCIsZS5TVFJJTkc9IlN0cmluZyIsZS5CTE9DS19TVFJJTkc9IkJsb2NrU3RyaW5nIixlLkNPTU1FTlQ9IkNvbW1lbnQifSkobHx8KGw9e30pKTtjbGFzcyBTbntjb25zdHJ1Y3Rvcih0KXtjb25zdCBuPW5ldyBUdChsLlNPRiwwLDAsMCwwKTt0aGlzLnNvdXJjZT10LHRoaXMubGFzdFRva2VuPW4sdGhpcy50b2tlbj1uLHRoaXMubGluZT0xLHRoaXMubGluZVN0YXJ0PTB9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iTGV4ZXIifWFkdmFuY2UoKXtyZXR1cm4gdGhpcy5sYXN0VG9rZW49dGhpcy50b2tlbix0aGlzLnRva2VuPXRoaXMubG9va2FoZWFkKCl9bG9va2FoZWFkKCl7bGV0IHQ9dGhpcy50b2tlbjtpZih0LmtpbmQhPT1sLkVPRilkbyBpZih0Lm5leHQpdD10Lm5leHQ7ZWxzZXtjb25zdCBuPURuKHRoaXMsdC5lbmQpO3QubmV4dD1uLG4ucHJldj10LHQ9bn13aGlsZSh0LmtpbmQ9PT1sLkNPTU1FTlQpO3JldHVybiB0fX1mdW5jdGlvbiB3bihlKXtyZXR1cm4gZT09PWwuQkFOR3x8ZT09PWwuRE9MTEFSfHxlPT09bC5BTVB8fGU9PT1sLlBBUkVOX0x8fGU9PT1sLlBBUkVOX1J8fGU9PT1sLlNQUkVBRHx8ZT09PWwuQ09MT058fGU9PT1sLkVRVUFMU3x8ZT09PWwuQVR8fGU9PT1sLkJSQUNLRVRfTHx8ZT09PWwuQlJBQ0tFVF9SfHxlPT09bC5CUkFDRV9MfHxlPT09bC5QSVBFfHxlPT09bC5CUkFDRV9SfWZ1bmN0aW9uIGZlKGUpe3JldHVybiBlPj0wJiZlPD01NTI5NXx8ZT49NTczNDQmJmU8PTExMTQxMTF9ZnVuY3Rpb24gd2UoZSx0KXtyZXR1cm4gSXQoZS5jaGFyQ29kZUF0KHQpKSYmT3QoZS5jaGFyQ29kZUF0KHQrMSkpfWZ1bmN0aW9uIEl0KGUpe3JldHVybiBlPj01NTI5NiYmZTw9NTYzMTl9ZnVuY3Rpb24gT3QoZSl7cmV0dXJuIGU+PTU2MzIwJiZlPD01NzM0M31mdW5jdGlvbiBvZShlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keS5jb2RlUG9pbnRBdCh0KTtpZihuPT09dm9pZCAwKXJldHVybiBsLkVPRjtpZihuPj0zMiYmbjw9MTI2KXtjb25zdCBpPVN0cmluZy5mcm9tQ29kZVBvaW50KG4pO3JldHVybiBpPT09JyInP2AnIidgOmAiJHtpfSJgfXJldHVybiJVKyIrbi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKS5wYWRTdGFydCg0LCIwIil9ZnVuY3Rpb24gVihlLHQsbixpLHIpe2NvbnN0IHM9ZS5saW5lLGE9MStuLWUubGluZVN0YXJ0O3JldHVybiBuZXcgVHQodCxuLGkscyxhLHIpfWZ1bmN0aW9uIERuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dDtmb3IoO3I8aTspe2NvbnN0IHM9bi5jaGFyQ29kZUF0KHIpO3N3aXRjaChzKXtjYXNlIDY1Mjc5OmNhc2UgOTpjYXNlIDMyOmNhc2UgNDQ6KytyO2NvbnRpbnVlO2Nhc2UgMTA6KytyLCsrZS5saW5lLGUubGluZVN0YXJ0PXI7Y29udGludWU7Y2FzZSAxMzpuLmNoYXJDb2RlQXQocisxKT09PTEwP3IrPTI6KytyLCsrZS5saW5lLGUubGluZVN0YXJ0PXI7Y29udGludWU7Y2FzZSAzNTpyZXR1cm4gQ24oZSxyKTtjYXNlIDMzOnJldHVybiBWKGUsbC5CQU5HLHIscisxKTtjYXNlIDM2OnJldHVybiBWKGUsbC5ET0xMQVIscixyKzEpO2Nhc2UgMzg6cmV0dXJuIFYoZSxsLkFNUCxyLHIrMSk7Y2FzZSA0MDpyZXR1cm4gVihlLGwuUEFSRU5fTCxyLHIrMSk7Y2FzZSA0MTpyZXR1cm4gVihlLGwuUEFSRU5fUixyLHIrMSk7Y2FzZSA0NjppZihuLmNoYXJDb2RlQXQocisxKT09PTQ2JiZuLmNoYXJDb2RlQXQocisyKT09PTQ2KXJldHVybiBWKGUsbC5TUFJFQUQscixyKzMpO2JyZWFrO2Nhc2UgNTg6cmV0dXJuIFYoZSxsLkNPTE9OLHIscisxKTtjYXNlIDYxOnJldHVybiBWKGUsbC5FUVVBTFMscixyKzEpO2Nhc2UgNjQ6cmV0dXJuIFYoZSxsLkFULHIscisxKTtjYXNlIDkxOnJldHVybiBWKGUsbC5CUkFDS0VUX0wscixyKzEpO2Nhc2UgOTM6cmV0dXJuIFYoZSxsLkJSQUNLRVRfUixyLHIrMSk7Y2FzZSAxMjM6cmV0dXJuIFYoZSxsLkJSQUNFX0wscixyKzEpO2Nhc2UgMTI0OnJldHVybiBWKGUsbC5QSVBFLHIscisxKTtjYXNlIDEyNTpyZXR1cm4gVihlLGwuQlJBQ0VfUixyLHIrMSk7Y2FzZSAzNDpyZXR1cm4gbi5jaGFyQ29kZUF0KHIrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHIrMik9PT0zND9NbihlLHIpOlJuKGUscil9aWYoTmUocyl8fHM9PT00NSlyZXR1cm4ga24oZSxyLHMpO2lmKEF0KHMpKXJldHVybiAkbihlLHIpO3Rocm93IEcoZS5zb3VyY2UscixzPT09Mzk/YFVuZXhwZWN0ZWQgc2luZ2xlIHF1b3RlIGNoYXJhY3RlciAoJyksIGRpZCB5b3UgbWVhbiB0byB1c2UgYSBkb3VibGUgcXVvdGUgKCIpP2A6ZmUocyl8fHdlKG4scik/YFVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAke29lKGUscil9LmA6YEludmFsaWQgY2hhcmFjdGVyOiAke29lKGUscil9LmApfXJldHVybiBWKGUsbC5FT0YsaSxpKX1mdW5jdGlvbiBDbihlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keSxpPW4ubGVuZ3RoO2xldCByPXQrMTtmb3IoO3I8aTspe2NvbnN0IHM9bi5jaGFyQ29kZUF0KHIpO2lmKHM9PT0xMHx8cz09PTEzKWJyZWFrO2lmKGZlKHMpKSsrcjtlbHNlIGlmKHdlKG4scikpcis9MjtlbHNlIGJyZWFrfXJldHVybiBWKGUsbC5DT01NRU5ULHQscixuLnNsaWNlKHQrMSxyKSl9ZnVuY3Rpb24ga24oZSx0LG4pe2NvbnN0IGk9ZS5zb3VyY2UuYm9keTtsZXQgcj10LHM9bixhPSExO2lmKHM9PT00NSYmKHM9aS5jaGFyQ29kZUF0KCsrcikpLHM9PT00OCl7aWYocz1pLmNoYXJDb2RlQXQoKytyKSxOZShzKSl0aHJvdyBHKGUuc291cmNlLHIsYEludmFsaWQgbnVtYmVyLCB1bmV4cGVjdGVkIGRpZ2l0IGFmdGVyIDA6ICR7b2UoZSxyKX0uYCl9ZWxzZSByPVdlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKTtpZihzPT09NDYmJihhPSEwLHM9aS5jaGFyQ29kZUF0KCsrcikscj1XZShlLHIscykscz1pLmNoYXJDb2RlQXQocikpLChzPT09Njl8fHM9PT0xMDEpJiYoYT0hMCxzPWkuY2hhckNvZGVBdCgrK3IpLChzPT09NDN8fHM9PT00NSkmJihzPWkuY2hhckNvZGVBdCgrK3IpKSxyPVdlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKSkscz09PTQ2fHxBdChzKSl0aHJvdyBHKGUuc291cmNlLHIsYEludmFsaWQgbnVtYmVyLCBleHBlY3RlZCBkaWdpdCBidXQgZ290OiAke29lKGUscil9LmApO3JldHVybiBWKGUsYT9sLkZMT0FUOmwuSU5ULHQscixpLnNsaWNlKHQscikpfWZ1bmN0aW9uIFdlKGUsdCxuKXtpZighTmUobikpdGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIG51bWJlciwgZXhwZWN0ZWQgZGlnaXQgYnV0IGdvdDogJHtvZShlLHQpfS5gKTtjb25zdCBpPWUuc291cmNlLmJvZHk7bGV0IHI9dCsxO2Zvcig7TmUoaS5jaGFyQ29kZUF0KHIpKTspKytyO3JldHVybiByfWZ1bmN0aW9uIFJuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxLHM9cixhPSIiO2Zvcig7cjxpOyl7Y29uc3QgYz1uLmNoYXJDb2RlQXQocik7aWYoYz09PTM0KXJldHVybiBhKz1uLnNsaWNlKHMsciksVihlLGwuU1RSSU5HLHQscisxLGEpO2lmKGM9PT05Mil7YSs9bi5zbGljZShzLHIpO2NvbnN0IGY9bi5jaGFyQ29kZUF0KHIrMSk9PT0xMTc/bi5jaGFyQ29kZUF0KHIrMik9PT0xMjM/UG4oZSxyKTpMbihlLHIpOkZuKGUscik7YSs9Zi52YWx1ZSxyKz1mLnNpemUscz1yO2NvbnRpbnVlfWlmKGM9PT0xMHx8Yz09PTEzKWJyZWFrO2lmKGZlKGMpKSsrcjtlbHNlIGlmKHdlKG4scikpcis9MjtlbHNlIHRocm93IEcoZS5zb3VyY2UscixgSW52YWxpZCBjaGFyYWN0ZXIgd2l0aGluIFN0cmluZzogJHtvZShlLHIpfS5gKX10aHJvdyBHKGUuc291cmNlLHIsIlVudGVybWluYXRlZCBzdHJpbmcuIil9ZnVuY3Rpb24gUG4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHk7bGV0IGk9MCxyPTM7Zm9yKDtyPDEyOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQodCtyKyspO2lmKHM9PT0xMjUpe2lmKHI8NXx8IWZlKGkpKWJyZWFrO3JldHVybnt2YWx1ZTpTdHJpbmcuZnJvbUNvZGVQb2ludChpKSxzaXplOnJ9fWlmKGk9aTw8NHx4ZShzKSxpPDApYnJlYWt9dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCtyKX0iLmApfWZ1bmN0aW9uIExuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9U3Qobix0KzIpO2lmKGZlKGkpKXJldHVybnt2YWx1ZTpTdHJpbmcuZnJvbUNvZGVQb2ludChpKSxzaXplOjZ9O2lmKEl0KGkpJiZuLmNoYXJDb2RlQXQodCs2KT09PTkyJiZuLmNoYXJDb2RlQXQodCs3KT09PTExNyl7Y29uc3Qgcj1TdChuLHQrOCk7aWYoT3QocikpcmV0dXJue3ZhbHVlOlN0cmluZy5mcm9tQ29kZVBvaW50KGksciksc2l6ZToxMn19dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCs2KX0iLmApfWZ1bmN0aW9uIFN0KGUsdCl7cmV0dXJuIHhlKGUuY2hhckNvZGVBdCh0KSk8PDEyfHhlKGUuY2hhckNvZGVBdCh0KzEpKTw8OHx4ZShlLmNoYXJDb2RlQXQodCsyKSk8PDR8eGUoZS5jaGFyQ29kZUF0KHQrMykpfWZ1bmN0aW9uIHhlKGUpe3JldHVybiBlPj00OCYmZTw9NTc/ZS00ODplPj02NSYmZTw9NzA/ZS01NTplPj05NyYmZTw9MTAyP2UtODc6LTF9ZnVuY3Rpb24gRm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHk7c3dpdGNoKG4uY2hhckNvZGVBdCh0KzEpKXtjYXNlIDM0OnJldHVybnt2YWx1ZTonIicsc2l6ZToyfTtjYXNlIDkyOnJldHVybnt2YWx1ZToiXFwiLHNpemU6Mn07Y2FzZSA0NzpyZXR1cm57dmFsdWU6Ii8iLHNpemU6Mn07Y2FzZSA5ODpyZXR1cm57dmFsdWU6IlxiIixzaXplOjJ9O2Nhc2UgMTAyOnJldHVybnt2YWx1ZToiXGYiLHNpemU6Mn07Y2FzZSAxMTA6cmV0dXJue3ZhbHVlOmAKYCxzaXplOjJ9O2Nhc2UgMTE0OnJldHVybnt2YWx1ZToiXHIiLHNpemU6Mn07Y2FzZSAxMTY6cmV0dXJue3ZhbHVlOiIJIixzaXplOjJ9fXRocm93IEcoZS5zb3VyY2UsdCxgSW52YWxpZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCsyKX0iLmApfWZ1bmN0aW9uIE1uKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9ZS5saW5lU3RhcnQscz10KzMsYT1zLGM9IiI7Y29uc3QgZj1bXTtmb3IoO3M8aTspe2NvbnN0IGQ9bi5jaGFyQ29kZUF0KHMpO2lmKGQ9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMik9PT0zNCl7Yys9bi5zbGljZShhLHMpLGYucHVzaChjKTtjb25zdCB1PVYoZSxsLkJMT0NLX1NUUklORyx0LHMrMyxBbihmKS5qb2luKGAKYCkpO3JldHVybiBlLmxpbmUrPWYubGVuZ3RoLTEsZS5saW5lU3RhcnQ9cix1fWlmKGQ9PT05MiYmbi5jaGFyQ29kZUF0KHMrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMik9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMyk9PT0zNCl7Yys9bi5zbGljZShhLHMpLGE9cysxLHMrPTQ7Y29udGludWV9aWYoZD09PTEwfHxkPT09MTMpe2MrPW4uc2xpY2UoYSxzKSxmLnB1c2goYyksZD09PTEzJiZuLmNoYXJDb2RlQXQocysxKT09PTEwP3MrPTI6KytzLGM9IiIsYT1zLHI9cztjb250aW51ZX1pZihmZShkKSkrK3M7ZWxzZSBpZih3ZShuLHMpKXMrPTI7ZWxzZSB0aHJvdyBHKGUuc291cmNlLHMsYEludmFsaWQgY2hhcmFjdGVyIHdpdGhpbiBTdHJpbmc6ICR7b2UoZSxzKX0uYCl9dGhyb3cgRyhlLnNvdXJjZSxzLCJVbnRlcm1pbmF0ZWQgc3RyaW5nLiIpfWZ1bmN0aW9uICRuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxO2Zvcig7cjxpOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQocik7aWYoeG4ocykpKytyO2Vsc2UgYnJlYWt9cmV0dXJuIFYoZSxsLk5BTUUsdCxyLG4uc2xpY2UodCxyKSl9Y29uc3QgQm49MTAsd3Q9MjtmdW5jdGlvbiBaZShlKXtyZXR1cm4gRGUoZSxbXSl9ZnVuY3Rpb24gRGUoZSx0KXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk7Y2FzZSJmdW5jdGlvbiI6cmV0dXJuIGUubmFtZT9gW2Z1bmN0aW9uICR7ZS5uYW1lfV1gOiJbZnVuY3Rpb25dIjtjYXNlIm9iamVjdCI6cmV0dXJuIFVuKGUsdCk7ZGVmYXVsdDpyZXR1cm4gU3RyaW5nKGUpfX1mdW5jdGlvbiBVbihlLHQpe2lmKGU9PT1udWxsKXJldHVybiJudWxsIjtpZih0LmluY2x1ZGVzKGUpKXJldHVybiJbQ2lyY3VsYXJdIjtjb25zdCBuPVsuLi50LGVdO2lmKFZuKGUpKXtjb25zdCBpPWUudG9KU09OKCk7aWYoaSE9PWUpcmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj9pOkRlKGksbil9ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBxbihlLG4pO3JldHVybiBqbihlLG4pfWZ1bmN0aW9uIFZuKGUpe3JldHVybiB0eXBlb2YgZS50b0pTT049PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gam4oZSx0KXtjb25zdCBuPU9iamVjdC5lbnRyaWVzKGUpO3JldHVybiBuLmxlbmd0aD09PTA/Int9Ijp0Lmxlbmd0aD53dD8iWyIrR24oZSkrIl0iOiJ7ICIrbi5tYXAoKFtyLHNdKT0+cisiOiAiK0RlKHMsdCkpLmpvaW4oIiwgIikrIiB9In1mdW5jdGlvbiBxbihlLHQpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4iW10iO2lmKHQubGVuZ3RoPnd0KXJldHVybiJbQXJyYXldIjtjb25zdCBuPU1hdGgubWluKEJuLGUubGVuZ3RoKSxpPWUubGVuZ3RoLW4scj1bXTtmb3IobGV0IHM9MDtzPG47KytzKXIucHVzaChEZShlW3NdLHQpKTtyZXR1cm4gaT09PTE/ci5wdXNoKCIuLi4gMSBtb3JlIGl0ZW0iKTppPjEmJnIucHVzaChgLi4uICR7aX0gbW9yZSBpdGVtc2ApLCJbIityLmpvaW4oIiwgIikrIl0ifWZ1bmN0aW9uIEduKGUpe2NvbnN0IHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnJlcGxhY2UoL15cW29iamVjdCAvLCIiKS5yZXBsYWNlKC9dJC8sIiIpO2lmKHQ9PT0iT2JqZWN0IiYmdHlwZW9mIGUuY29uc3RydWN0b3I9PSJmdW5jdGlvbiIpe2NvbnN0IG49ZS5jb25zdHJ1Y3Rvci5uYW1lO2lmKHR5cGVvZiBuPT0ic3RyaW5nIiYmbiE9PSIiKXJldHVybiBufXJldHVybiB0fWNvbnN0IHpuPWdsb2JhbFRoaXMucHJvY2VzcyYmZ2xvYmFsVGhpcy5wcm9jZXNzLmVudi5OT0RFX0VOVj09PSJwcm9kdWN0aW9uIj9mdW5jdGlvbih0LG4pe3JldHVybiB0IGluc3RhbmNlb2Ygbn06ZnVuY3Rpb24odCxuKXtpZih0IGluc3RhbmNlb2YgbilyZXR1cm4hMDtpZih0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsKXt2YXIgaTtjb25zdCByPW4ucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10scz1TeW1ib2wudG9TdHJpbmdUYWcgaW4gdD90W1N5bWJvbC50b1N0cmluZ1RhZ106KGk9dC5jb25zdHJ1Y3Rvcik9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLm5hbWU7aWYocj09PXMpe2NvbnN0IGE9WmUodCk7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlICR7cn0gIiR7YX0iIGZyb20gYW5vdGhlciBtb2R1bGUgb3IgcmVhbG0uCgpFbnN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiAiZ3JhcGhxbCIgaW4gdGhlIG5vZGVfbW9kdWxlcwpkaXJlY3RvcnkuIElmIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiAiZ3JhcGhxbCIgYXJlIHRoZSBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIKcmVsaWVkIG9uIG1vZHVsZXMsIHVzZSAicmVzb2x1dGlvbnMiIHRvIGVuc3VyZSBvbmx5IG9uZSB2ZXJzaW9uIGlzIGluc3RhbGxlZC4KCmh0dHBzOi8veWFybnBrZy5jb20vZW4vZG9jcy9zZWxlY3RpdmUtdmVyc2lvbi1yZXNvbHV0aW9ucwoKRHVwbGljYXRlICJncmFwaHFsIiBtb2R1bGVzIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZGlmZmVyZW50CnZlcnNpb25zIG1heSBoYXZlIGRpZmZlcmVudCBjYXBhYmlsaXRpZXMgYW5kIGJlaGF2aW9yLiBUaGUgZGF0YSBmcm9tIG9uZQp2ZXJzaW9uIHVzZWQgaW4gdGhlIGZ1bmN0aW9uIGZyb20gYW5vdGhlciBjb3VsZCBwcm9kdWNlIGNvbmZ1c2luZyBhbmQKc3B1cmlvdXMgcmVzdWx0cy5gKX19cmV0dXJuITF9O2NsYXNzIER0e2NvbnN0cnVjdG9yKHQsbj0iR3JhcGhRTCByZXF1ZXN0IixpPXtsaW5lOjEsY29sdW1uOjF9KXt0eXBlb2YgdD09InN0cmluZyJ8fFNlKCExLGBCb2R5IG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkOiAke1plKHQpfS5gKSx0aGlzLmJvZHk9dCx0aGlzLm5hbWU9bix0aGlzLmxvY2F0aW9uT2Zmc2V0PWksdGhpcy5sb2NhdGlvbk9mZnNldC5saW5lPjB8fFNlKCExLCJsaW5lIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKSx0aGlzLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbj4wfHxTZSghMSwiY29sdW1uIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJTb3VyY2UifX1mdW5jdGlvbiBIbihlKXtyZXR1cm4gem4oZSxEdCl9ZnVuY3Rpb24gQ3QoZSx0KXtyZXR1cm4gbmV3IFluKGUsdCkucGFyc2VEb2N1bWVudCgpfWNsYXNzIFlue2NvbnN0cnVjdG9yKHQsbj17fSl7Y29uc3QgaT1Ibih0KT90Om5ldyBEdCh0KTt0aGlzLl9sZXhlcj1uZXcgU24oaSksdGhpcy5fb3B0aW9ucz1uLHRoaXMuX3Rva2VuQ291bnRlcj0wfXBhcnNlTmFtZSgpe2NvbnN0IHQ9dGhpcy5leHBlY3RUb2tlbihsLk5BTUUpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk5BTUUsdmFsdWU6dC52YWx1ZX0pfXBhcnNlRG9jdW1lbnQoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuRE9DVU1FTlQsZGVmaW5pdGlvbnM6dGhpcy5tYW55KGwuU09GLHRoaXMucGFyc2VEZWZpbml0aW9uLGwuRU9GKX0pfXBhcnNlRGVmaW5pdGlvbigpe2lmKHRoaXMucGVlayhsLkJSQUNFX0wpKXJldHVybiB0aGlzLnBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpO2NvbnN0IHQ9dGhpcy5wZWVrRGVzY3JpcHRpb24oKSxuPXQ/dGhpcy5fbGV4ZXIubG9va2FoZWFkKCk6dGhpcy5fbGV4ZXIudG9rZW47aWYobi5raW5kPT09bC5OQU1FKXtzd2l0Y2gobi52YWx1ZSl7Y2FzZSJzY2hlbWEiOnJldHVybiB0aGlzLnBhcnNlU2NoZW1hRGVmaW5pdGlvbigpO2Nhc2Uic2NhbGFyIjpyZXR1cm4gdGhpcy5wYXJzZVNjYWxhclR5cGVEZWZpbml0aW9uKCk7Y2FzZSJ0eXBlIjpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdFR5cGVEZWZpbml0aW9uKCk7Y2FzZSJpbnRlcmZhY2UiOnJldHVybiB0aGlzLnBhcnNlSW50ZXJmYWNlVHlwZURlZmluaXRpb24oKTtjYXNlInVuaW9uIjpyZXR1cm4gdGhpcy5wYXJzZVVuaW9uVHlwZURlZmluaXRpb24oKTtjYXNlImVudW0iOnJldHVybiB0aGlzLnBhcnNlRW51bVR5cGVEZWZpbml0aW9uKCk7Y2FzZSJpbnB1dCI6cmV0dXJuIHRoaXMucGFyc2VJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uKCk7Y2FzZSJkaXJlY3RpdmUiOnJldHVybiB0aGlzLnBhcnNlRGlyZWN0aXZlRGVmaW5pdGlvbigpfWlmKHQpdGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2UsdGhpcy5fbGV4ZXIudG9rZW4uc3RhcnQsIlVuZXhwZWN0ZWQgZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9ucyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gdHlwZSBkZWZpbml0aW9ucy4iKTtzd2l0Y2gobi52YWx1ZSl7Y2FzZSJxdWVyeSI6Y2FzZSJtdXRhdGlvbiI6Y2FzZSJzdWJzY3JpcHRpb24iOnJldHVybiB0aGlzLnBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpO2Nhc2UiZnJhZ21lbnQiOnJldHVybiB0aGlzLnBhcnNlRnJhZ21lbnREZWZpbml0aW9uKCk7Y2FzZSJleHRlbmQiOnJldHVybiB0aGlzLnBhcnNlVHlwZVN5c3RlbUV4dGVuc2lvbigpfX10aHJvdyB0aGlzLnVuZXhwZWN0ZWQobil9cGFyc2VPcGVyYXRpb25EZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtpZih0aGlzLnBlZWsobC5CUkFDRV9MKSlyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5PUEVSQVRJT05fREVGSU5JVElPTixvcGVyYXRpb246bGUuUVVFUlksbmFtZTp2b2lkIDAsdmFyaWFibGVEZWZpbml0aW9uczpbXSxkaXJlY3RpdmVzOltdLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KTtjb25zdCBuPXRoaXMucGFyc2VPcGVyYXRpb25UeXBlKCk7bGV0IGk7cmV0dXJuIHRoaXMucGVlayhsLk5BTUUpJiYoaT10aGlzLnBhcnNlTmFtZSgpKSx0aGlzLm5vZGUodCx7a2luZDpULk9QRVJBVElPTl9ERUZJTklUSU9OLG9wZXJhdGlvbjpuLG5hbWU6aSx2YXJpYWJsZURlZmluaXRpb25zOnRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlT3BlcmF0aW9uVHlwZSgpe2NvbnN0IHQ9dGhpcy5leHBlY3RUb2tlbihsLk5BTUUpO3N3aXRjaCh0LnZhbHVlKXtjYXNlInF1ZXJ5IjpyZXR1cm4gbGUuUVVFUlk7Y2FzZSJtdXRhdGlvbiI6cmV0dXJuIGxlLk1VVEFUSU9OO2Nhc2Uic3Vic2NyaXB0aW9uIjpyZXR1cm4gbGUuU1VCU0NSSVBUSU9OfXRocm93IHRoaXMudW5leHBlY3RlZCh0KX1wYXJzZVZhcmlhYmxlRGVmaW5pdGlvbnMoKXtyZXR1cm4gdGhpcy5vcHRpb25hbE1hbnkobC5QQVJFTl9MLHRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb24sbC5QQVJFTl9SKX1wYXJzZVZhcmlhYmxlRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm5vZGUodGhpcy5fbGV4ZXIudG9rZW4se2tpbmQ6VC5WQVJJQUJMRV9ERUZJTklUSU9OLHZhcmlhYmxlOnRoaXMucGFyc2VWYXJpYWJsZSgpLHR5cGU6KHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5wYXJzZVR5cGVSZWZlcmVuY2UoKSksZGVmYXVsdFZhbHVlOnRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkVRVUFMUyk/dGhpcy5wYXJzZUNvbnN0VmFsdWVMaXRlcmFsKCk6dm9pZCAwLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpfSl9cGFyc2VWYXJpYWJsZSgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5ET0xMQVIpLHRoaXMubm9kZSh0LHtraW5kOlQuVkFSSUFCTEUsbmFtZTp0aGlzLnBhcnNlTmFtZSgpfSl9cGFyc2VTZWxlY3Rpb25TZXQoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuU0VMRUNUSU9OX1NFVCxzZWxlY3Rpb25zOnRoaXMubWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZVNlbGVjdGlvbixsLkJSQUNFX1IpfSl9cGFyc2VTZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy5wZWVrKGwuU1BSRUFEKT90aGlzLnBhcnNlRnJhZ21lbnQoKTp0aGlzLnBhcnNlRmllbGQoKX1wYXJzZUZpZWxkKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VOYW1lKCk7bGV0IGkscjtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQ09MT04pPyhpPW4scj10aGlzLnBhcnNlTmFtZSgpKTpyPW4sdGhpcy5ub2RlKHQse2tpbmQ6VC5GSUVMRCxhbGlhczppLG5hbWU6cixhcmd1bWVudHM6dGhpcy5wYXJzZUFyZ3VtZW50cyghMSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGVlayhsLkJSQUNFX0wpP3RoaXMucGFyc2VTZWxlY3Rpb25TZXQoKTp2b2lkIDB9KX1wYXJzZUFyZ3VtZW50cyh0KXtjb25zdCBuPXQ/dGhpcy5wYXJzZUNvbnN0QXJndW1lbnQ6dGhpcy5wYXJzZUFyZ3VtZW50O3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLlBBUkVOX0wsbixsLlBBUkVOX1IpfXBhcnNlQXJndW1lbnQodD0hMSl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbixpPXRoaXMucGFyc2VOYW1lKCk7cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5ub2RlKG4se2tpbmQ6VC5BUkdVTUVOVCxuYW1lOmksdmFsdWU6dGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCh0KX0pfXBhcnNlQ29uc3RBcmd1bWVudCgpe3JldHVybiB0aGlzLnBhcnNlQXJndW1lbnQoITApfXBhcnNlRnJhZ21lbnQoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0VG9rZW4obC5TUFJFQUQpO2NvbnN0IG49dGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoIm9uIik7cmV0dXJuIW4mJnRoaXMucGVlayhsLk5BTUUpP3RoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfU1BSRUFELG5hbWU6dGhpcy5wYXJzZUZyYWdtZW50TmFtZSgpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpfSk6dGhpcy5ub2RlKHQse2tpbmQ6VC5JTkxJTkVfRlJBR01FTlQsdHlwZUNvbmRpdGlvbjpuP3RoaXMucGFyc2VOYW1lZFR5cGUoKTp2b2lkIDAsZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlRnJhZ21lbnREZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gdGhpcy5leHBlY3RLZXl3b3JkKCJmcmFnbWVudCIpLHRoaXMuX29wdGlvbnMuYWxsb3dMZWdhY3lGcmFnbWVudFZhcmlhYmxlcz09PSEwP3RoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfREVGSU5JVElPTixuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSx2YXJpYWJsZURlZmluaXRpb25zOnRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCksdHlwZUNvbmRpdGlvbjoodGhpcy5leHBlY3RLZXl3b3JkKCJvbiIpLHRoaXMucGFyc2VOYW1lZFR5cGUoKSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pOnRoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfREVGSU5JVElPTixuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSx0eXBlQ29uZGl0aW9uOih0aGlzLmV4cGVjdEtleXdvcmQoIm9uIiksdGhpcy5wYXJzZU5hbWVkVHlwZSgpKSxkaXJlY3RpdmVzOnRoaXMucGFyc2VEaXJlY3RpdmVzKCExKSxzZWxlY3Rpb25TZXQ6dGhpcy5wYXJzZVNlbGVjdGlvblNldCgpfSl9cGFyc2VGcmFnbWVudE5hbWUoKXtpZih0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJvbiIpdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMucGFyc2VOYW1lKCl9cGFyc2VWYWx1ZUxpdGVyYWwodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtzd2l0Y2gobi5raW5kKXtjYXNlIGwuQlJBQ0tFVF9MOnJldHVybiB0aGlzLnBhcnNlTGlzdCh0KTtjYXNlIGwuQlJBQ0VfTDpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdCh0KTtjYXNlIGwuSU5UOnJldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZShuLHtraW5kOlQuSU5ULHZhbHVlOm4udmFsdWV9KTtjYXNlIGwuRkxPQVQ6cmV0dXJuIHRoaXMuYWR2YW5jZUxleGVyKCksdGhpcy5ub2RlKG4se2tpbmQ6VC5GTE9BVCx2YWx1ZTpuLnZhbHVlfSk7Y2FzZSBsLlNUUklORzpjYXNlIGwuQkxPQ0tfU1RSSU5HOnJldHVybiB0aGlzLnBhcnNlU3RyaW5nTGl0ZXJhbCgpO2Nhc2UgbC5OQU1FOnN3aXRjaCh0aGlzLmFkdmFuY2VMZXhlcigpLG4udmFsdWUpe2Nhc2UidHJ1ZSI6cmV0dXJuIHRoaXMubm9kZShuLHtraW5kOlQuQk9PTEVBTix2YWx1ZTohMH0pO2Nhc2UiZmFsc2UiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULkJPT0xFQU4sdmFsdWU6ITF9KTtjYXNlIm51bGwiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULk5VTEx9KTtkZWZhdWx0OnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULkVOVU0sdmFsdWU6bi52YWx1ZX0pfWNhc2UgbC5ET0xMQVI6aWYodClpZih0aGlzLmV4cGVjdFRva2VuKGwuRE9MTEFSKSx0aGlzLl9sZXhlci50b2tlbi5raW5kPT09bC5OQU1FKXtjb25zdCBpPXRoaXMuX2xleGVyLnRva2VuLnZhbHVlO3Rocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLG4uc3RhcnQsYFVuZXhwZWN0ZWQgdmFyaWFibGUgIiQke2l9IiBpbiBjb25zdGFudCB2YWx1ZS5gKX1lbHNlIHRocm93IHRoaXMudW5leHBlY3RlZChuKTtyZXR1cm4gdGhpcy5wYXJzZVZhcmlhYmxlKCk7ZGVmYXVsdDp0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKX19cGFyc2VDb25zdFZhbHVlTGl0ZXJhbCgpe3JldHVybiB0aGlzLnBhcnNlVmFsdWVMaXRlcmFsKCEwKX1wYXJzZVN0cmluZ0xpdGVyYWwoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZSh0LHtraW5kOlQuU1RSSU5HLHZhbHVlOnQudmFsdWUsYmxvY2s6dC5raW5kPT09bC5CTE9DS19TVFJJTkd9KX1wYXJzZUxpc3QodCl7Y29uc3Qgbj0oKT0+dGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCh0KTtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuTElTVCx2YWx1ZXM6dGhpcy5hbnkobC5CUkFDS0VUX0wsbixsLkJSQUNLRVRfUil9KX1wYXJzZU9iamVjdCh0KXtjb25zdCBuPSgpPT50aGlzLnBhcnNlT2JqZWN0RmllbGQodCk7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpULk9CSkVDVCxmaWVsZHM6dGhpcy5hbnkobC5CUkFDRV9MLG4sbC5CUkFDRV9SKX0pfXBhcnNlT2JqZWN0RmllbGQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbixpPXRoaXMucGFyc2VOYW1lKCk7cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5ub2RlKG4se2tpbmQ6VC5PQkpFQ1RfRklFTEQsbmFtZTppLHZhbHVlOnRoaXMucGFyc2VWYWx1ZUxpdGVyYWwodCl9KX1wYXJzZURpcmVjdGl2ZXModCl7Y29uc3Qgbj1bXTtmb3IoO3RoaXMucGVlayhsLkFUKTspbi5wdXNoKHRoaXMucGFyc2VEaXJlY3RpdmUodCkpO3JldHVybiBufXBhcnNlQ29uc3REaXJlY3RpdmVzKCl7cmV0dXJuIHRoaXMucGFyc2VEaXJlY3RpdmVzKCEwKX1wYXJzZURpcmVjdGl2ZSh0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuQVQpLHRoaXMubm9kZShuLHtraW5kOlQuRElSRUNUSVZFLG5hbWU6dGhpcy5wYXJzZU5hbWUoKSxhcmd1bWVudHM6dGhpcy5wYXJzZUFyZ3VtZW50cyh0KX0pfXBhcnNlVHlwZVJlZmVyZW5jZSgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47bGV0IG47aWYodGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQlJBQ0tFVF9MKSl7Y29uc3QgaT10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpO3RoaXMuZXhwZWN0VG9rZW4obC5CUkFDS0VUX1IpLG49dGhpcy5ub2RlKHQse2tpbmQ6VC5MSVNUX1RZUEUsdHlwZTppfSl9ZWxzZSBuPXRoaXMucGFyc2VOYW1lZFR5cGUoKTtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQkFORyk/dGhpcy5ub2RlKHQse2tpbmQ6VC5OT05fTlVMTF9UWVBFLHR5cGU6bn0pOm59cGFyc2VOYW1lZFR5cGUoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuTkFNRURfVFlQRSxuYW1lOnRoaXMucGFyc2VOYW1lKCl9KX1wZWVrRGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5wZWVrKGwuU1RSSU5HKXx8dGhpcy5wZWVrKGwuQkxPQ0tfU1RSSU5HKX1wYXJzZURlc2NyaXB0aW9uKCl7aWYodGhpcy5wZWVrRGVzY3JpcHRpb24oKSlyZXR1cm4gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwoKX1wYXJzZVNjaGVtYURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJzY2hlbWEiKTtjb25zdCBpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMubWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZU9wZXJhdGlvblR5cGVEZWZpbml0aW9uLGwuQlJBQ0VfUik7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuU0NIRU1BX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixkaXJlY3RpdmVzOmksb3BlcmF0aW9uVHlwZXM6cn0pfXBhcnNlT3BlcmF0aW9uVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZU9wZXJhdGlvblR5cGUoKTt0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWVkVHlwZSgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9QRVJBVElPTl9UWVBFX0RFRklOSVRJT04sb3BlcmF0aW9uOm4sdHlwZTppfSl9cGFyc2VTY2FsYXJUeXBlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoInNjYWxhciIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5TQ0FMQVJfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cn0pfXBhcnNlT2JqZWN0VHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJ0eXBlIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUltcGxlbWVudHNJbnRlcmZhY2VzKCkscz10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCksYT10aGlzLnBhcnNlRmllbGRzRGVmaW5pdGlvbigpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9CSkVDVF9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksaW50ZXJmYWNlczpyLGRpcmVjdGl2ZXM6cyxmaWVsZHM6YX0pfXBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKXtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoImltcGxlbWVudHMiKT90aGlzLmRlbGltaXRlZE1hbnkobC5BTVAsdGhpcy5wYXJzZU5hbWVkVHlwZSk6W119cGFyc2VGaWVsZHNEZWZpbml0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlRmllbGREZWZpbml0aW9uLGwuQlJBQ0VfUil9cGFyc2VGaWVsZERlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUFyZ3VtZW50RGVmcygpO3RoaXMuZXhwZWN0VG9rZW4obC5DT0xPTik7Y29uc3Qgcz10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpLGE9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULkZJRUxEX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksYXJndW1lbnRzOnIsdHlwZTpzLGRpcmVjdGl2ZXM6YX0pfXBhcnNlQXJndW1lbnREZWZzKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuUEFSRU5fTCx0aGlzLnBhcnNlSW5wdXRWYWx1ZURlZixsLlBBUkVOX1IpfXBhcnNlSW5wdXRWYWx1ZURlZigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKSxpPXRoaXMucGFyc2VOYW1lKCk7dGhpcy5leHBlY3RUb2tlbihsLkNPTE9OKTtjb25zdCByPXRoaXMucGFyc2VUeXBlUmVmZXJlbmNlKCk7bGV0IHM7dGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuRVFVQUxTKSYmKHM9dGhpcy5wYXJzZUNvbnN0VmFsdWVMaXRlcmFsKCkpO2NvbnN0IGE9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULklOUFVUX1ZBTFVFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksdHlwZTpyLGRlZmF1bHRWYWx1ZTpzLGRpcmVjdGl2ZXM6YX0pfXBhcnNlSW50ZXJmYWNlVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJpbnRlcmZhY2UiKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKSxzPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxhPXRoaXMucGFyc2VGaWVsZHNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuSU5URVJGQUNFX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxpbnRlcmZhY2VzOnIsZGlyZWN0aXZlczpzLGZpZWxkczphfSl9cGFyc2VVbmlvblR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgidW5pb24iKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscz10aGlzLnBhcnNlVW5pb25NZW1iZXJUeXBlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlVOSU9OX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnIsdHlwZXM6c30pfXBhcnNlVW5pb25NZW1iZXJUeXBlcygpe3JldHVybiB0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4obC5FUVVBTFMpP3RoaXMuZGVsaW1pdGVkTWFueShsLlBJUEUsdGhpcy5wYXJzZU5hbWVkVHlwZSk6W119cGFyc2VFbnVtVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJlbnVtIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUVudW1WYWx1ZXNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRU5VTV9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksZGlyZWN0aXZlczpyLHZhbHVlczpzfSl9cGFyc2VFbnVtVmFsdWVzRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZUVudW1WYWx1ZURlZmluaXRpb24sbC5CUkFDRV9SKX1wYXJzZUVudW1WYWx1ZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlRW51bVZhbHVlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULkVOVU1fVkFMVUVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnJ9KX1wYXJzZUVudW1WYWx1ZU5hbWUoKXtpZih0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJ0cnVlInx8dGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0iZmFsc2UifHx0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJudWxsIil0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSx0aGlzLl9sZXhlci50b2tlbi5zdGFydCxgJHtDZSh0aGlzLl9sZXhlci50b2tlbil9IGlzIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZCBmb3IgYW4gZW51bSB2YWx1ZS5gKTtyZXR1cm4gdGhpcy5wYXJzZU5hbWUoKX1wYXJzZUlucHV0T2JqZWN0VHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJpbnB1dCIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VJbnB1dEZpZWxkc0RlZmluaXRpb24oKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5JTlBVVF9PQkpFQ1RfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlSW5wdXRGaWVsZHNEZWZpbml0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlSW5wdXRWYWx1ZURlZixsLkJSQUNFX1IpfXBhcnNlVHlwZVN5c3RlbUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIubG9va2FoZWFkKCk7aWYodC5raW5kPT09bC5OQU1FKXN3aXRjaCh0LnZhbHVlKXtjYXNlInNjaGVtYSI6cmV0dXJuIHRoaXMucGFyc2VTY2hlbWFFeHRlbnNpb24oKTtjYXNlInNjYWxhciI6cmV0dXJuIHRoaXMucGFyc2VTY2FsYXJUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJ0eXBlIjpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdFR5cGVFeHRlbnNpb24oKTtjYXNlImludGVyZmFjZSI6cmV0dXJuIHRoaXMucGFyc2VJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJ1bmlvbiI6cmV0dXJuIHRoaXMucGFyc2VVbmlvblR5cGVFeHRlbnNpb24oKTtjYXNlImVudW0iOnJldHVybiB0aGlzLnBhcnNlRW51bVR5cGVFeHRlbnNpb24oKTtjYXNlImlucHV0IjpyZXR1cm4gdGhpcy5wYXJzZUlucHV0T2JqZWN0VHlwZUV4dGVuc2lvbigpfXRocm93IHRoaXMudW5leHBlY3RlZCh0KX1wYXJzZVNjaGVtYUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoInNjaGVtYSIpO2NvbnN0IG49dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLGk9dGhpcy5vcHRpb25hbE1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VPcGVyYXRpb25UeXBlRGVmaW5pdGlvbixsLkJSQUNFX1IpO2lmKG4ubGVuZ3RoPT09MCYmaS5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlNDSEVNQV9FWFRFTlNJT04sZGlyZWN0aXZlczpuLG9wZXJhdGlvblR5cGVzOml9KX1wYXJzZVNjYWxhclR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJzY2FsYXIiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCk7aWYoaS5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlNDQUxBUl9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppfSl9cGFyc2VPYmplY3RUeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgidHlwZSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCYmcy5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9CSkVDVF9UWVBFX0VYVEVOU0lPTixuYW1lOm4saW50ZXJmYWNlczppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlSW50ZXJmYWNlVHlwZUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoImludGVyZmFjZSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCYmcy5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULklOVEVSRkFDRV9UWVBFX0VYVEVOU0lPTixuYW1lOm4saW50ZXJmYWNlczppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlVW5pb25UeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgidW5pb24iKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscj10aGlzLnBhcnNlVW5pb25NZW1iZXJUeXBlcygpO2lmKGkubGVuZ3RoPT09MCYmci5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlVOSU9OX1RZUEVfRVhURU5TSU9OLG5hbWU6bixkaXJlY3RpdmVzOmksdHlwZXM6cn0pfXBhcnNlRW51bVR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJlbnVtIik7Y29uc3Qgbj10aGlzLnBhcnNlTmFtZSgpLGk9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHI9dGhpcy5wYXJzZUVudW1WYWx1ZXNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTApdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRU5VTV9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppLHZhbHVlczpyfSl9cGFyc2VJbnB1dE9iamVjdFR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJpbnB1dCIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMucGFyc2VJbnB1dEZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5JTlBVVF9PQkpFQ1RfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pfXBhcnNlRGlyZWN0aXZlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoImRpcmVjdGl2ZSIpLHRoaXMuZXhwZWN0VG9rZW4obC5BVCk7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUFyZ3VtZW50RGVmcygpLHM9dGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoInJlcGVhdGFibGUiKTt0aGlzLmV4cGVjdEtleXdvcmQoIm9uIik7Y29uc3QgYT10aGlzLnBhcnNlRGlyZWN0aXZlTG9jYXRpb25zKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRElSRUNUSVZFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksYXJndW1lbnRzOnIscmVwZWF0YWJsZTpzLGxvY2F0aW9uczphfSl9cGFyc2VEaXJlY3RpdmVMb2NhdGlvbnMoKXtyZXR1cm4gdGhpcy5kZWxpbWl0ZWRNYW55KGwuUElQRSx0aGlzLnBhcnNlRGlyZWN0aXZlTG9jYXRpb24pfXBhcnNlRGlyZWN0aXZlTG9jYXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZU5hbWUoKTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUWUsbi52YWx1ZSkpcmV0dXJuIG47dGhyb3cgdGhpcy51bmV4cGVjdGVkKHQpfW5vZGUodCxuKXtyZXR1cm4gdGhpcy5fb3B0aW9ucy5ub0xvY2F0aW9uIT09ITAmJihuLmxvYz1uZXcgYm4odCx0aGlzLl9sZXhlci5sYXN0VG9rZW4sdGhpcy5fbGV4ZXIuc291cmNlKSksbn1wZWVrKHQpe3JldHVybiB0aGlzLl9sZXhlci50b2tlbi5raW5kPT09dH1leHBlY3RUb2tlbih0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO2lmKG4ua2luZD09PXQpcmV0dXJuIHRoaXMuYWR2YW5jZUxleGVyKCksbjt0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBFeHBlY3RlZCAke2t0KHQpfSwgZm91bmQgJHtDZShuKX0uYCl9ZXhwZWN0T3B0aW9uYWxUb2tlbih0KXtyZXR1cm4gdGhpcy5fbGV4ZXIudG9rZW4ua2luZD09PXQ/KHRoaXMuYWR2YW5jZUxleGVyKCksITApOiExfWV4cGVjdEtleXdvcmQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtpZihuLmtpbmQ9PT1sLk5BTUUmJm4udmFsdWU9PT10KXRoaXMuYWR2YW5jZUxleGVyKCk7ZWxzZSB0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBFeHBlY3RlZCAiJHt0fSIsIGZvdW5kICR7Q2Uobil9LmApfWV4cGVjdE9wdGlvbmFsS2V5d29yZCh0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO3JldHVybiBuLmtpbmQ9PT1sLk5BTUUmJm4udmFsdWU9PT10Pyh0aGlzLmFkdmFuY2VMZXhlcigpLCEwKTohMX11bmV4cGVjdGVkKHQpe2NvbnN0IG49dCE9bnVsbD90OnRoaXMuX2xleGVyLnRva2VuO3JldHVybiBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBVbmV4cGVjdGVkICR7Q2Uobil9LmApfWFueSh0LG4saSl7dGhpcy5leHBlY3RUb2tlbih0KTtjb25zdCByPVtdO2Zvcig7IXRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihpKTspci5wdXNoKG4uY2FsbCh0aGlzKSk7cmV0dXJuIHJ9b3B0aW9uYWxNYW55KHQsbixpKXtpZih0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCkpe2NvbnN0IHI9W107ZG8gci5wdXNoKG4uY2FsbCh0aGlzKSk7d2hpbGUoIXRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihpKSk7cmV0dXJuIHJ9cmV0dXJuW119bWFueSh0LG4saSl7dGhpcy5leHBlY3RUb2tlbih0KTtjb25zdCByPVtdO2RvIHIucHVzaChuLmNhbGwodGhpcykpO3doaWxlKCF0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4oaSkpO3JldHVybiByfWRlbGltaXRlZE1hbnkodCxuKXt0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCk7Y29uc3QgaT1bXTtkbyBpLnB1c2gobi5jYWxsKHRoaXMpKTt3aGlsZSh0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCkpO3JldHVybiBpfWFkdmFuY2VMZXhlcigpe2NvbnN0e21heFRva2Vuczp0fT10aGlzLl9vcHRpb25zLG49dGhpcy5fbGV4ZXIuYWR2YW5jZSgpO2lmKHQhPT12b2lkIDAmJm4ua2luZCE9PWwuRU9GJiYoKyt0aGlzLl90b2tlbkNvdW50ZXIsdGhpcy5fdG9rZW5Db3VudGVyPnQpKXRocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLG4uc3RhcnQsYERvY3VtZW50IGNvbnRhaW5zIG1vcmUgdGhhdCAke3R9IHRva2Vucy4gUGFyc2luZyBhYm9ydGVkLmApfX1mdW5jdGlvbiBDZShlKXtjb25zdCB0PWUudmFsdWU7cmV0dXJuIGt0KGUua2luZCkrKHQhPW51bGw/YCAiJHt0fSJgOiIiKX1mdW5jdGlvbiBrdChlKXtyZXR1cm4gd24oZSk/YCIke2V9ImA6ZX1mdW5jdGlvbiBKbihlKXtyZXR1cm5gIiR7ZS5yZXBsYWNlKFFuLFhuKX0iYH1jb25zdCBRbj0vW1x4MDAtXHgxZlx4MjJceDVjXHg3Zi1ceDlmXS9nO2Z1bmN0aW9uIFhuKGUpe3JldHVybiBXbltlLmNoYXJDb2RlQXQoMCldfWNvbnN0IFduPVsiXFx1MDAwMCIsIlxcdTAwMDEiLCJcXHUwMDAyIiwiXFx1MDAwMyIsIlxcdTAwMDQiLCJcXHUwMDA1IiwiXFx1MDAwNiIsIlxcdTAwMDciLCJcXGIiLCJcXHQiLCJcXG4iLCJcXHUwMDBCIiwiXFxmIiwiXFxyIiwiXFx1MDAwRSIsIlxcdTAwMEYiLCJcXHUwMDEwIiwiXFx1MDAxMSIsIlxcdTAwMTIiLCJcXHUwMDEzIiwiXFx1MDAxNCIsIlxcdTAwMTUiLCJcXHUwMDE2IiwiXFx1MDAxNyIsIlxcdTAwMTgiLCJcXHUwMDE5IiwiXFx1MDAxQSIsIlxcdTAwMUIiLCJcXHUwMDFDIiwiXFx1MDAxRCIsIlxcdTAwMUUiLCJcXHUwMDFGIiwiIiwiIiwnXFwiJywiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiXFxcXCIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIlxcdTAwN0YiLCJcXHUwMDgwIiwiXFx1MDA4MSIsIlxcdTAwODIiLCJcXHUwMDgzIiwiXFx1MDA4NCIsIlxcdTAwODUiLCJcXHUwMDg2IiwiXFx1MDA4NyIsIlxcdTAwODgiLCJcXHUwMDg5IiwiXFx1MDA4QSIsIlxcdTAwOEIiLCJcXHUwMDhDIiwiXFx1MDA4RCIsIlxcdTAwOEUiLCJcXHUwMDhGIiwiXFx1MDA5MCIsIlxcdTAwOTEiLCJcXHUwMDkyIiwiXFx1MDA5MyIsIlxcdTAwOTQiLCJcXHUwMDk1IiwiXFx1MDA5NiIsIlxcdTAwOTciLCJcXHUwMDk4IiwiXFx1MDA5OSIsIlxcdTAwOUEiLCJcXHUwMDlCIiwiXFx1MDA5QyIsIlxcdTAwOUQiLCJcXHUwMDlFIiwiXFx1MDA5RiJdLFpuPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEtuKGUsdCxuPWJ0KXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IEUgb2YgT2JqZWN0LnZhbHVlcyhUKSlpLnNldChFLGVyKHQsRSkpO2xldCByLHM9QXJyYXkuaXNBcnJheShlKSxhPVtlXSxjPS0xLGY9W10sZD1lLHUseTtjb25zdCB2PVtdLGI9W107ZG97YysrO2NvbnN0IEU9Yz09PWEubGVuZ3RoLGs9RSYmZi5sZW5ndGghPT0wO2lmKEUpe2lmKHU9Yi5sZW5ndGg9PT0wP3ZvaWQgMDp2W3YubGVuZ3RoLTFdLGQ9eSx5PWIucG9wKCksaylpZihzKXtkPWQuc2xpY2UoKTtsZXQgTD0wO2Zvcihjb25zdFskLHFdb2YgZil7Y29uc3QgQj0kLUw7cT09PW51bGw/KGQuc3BsaWNlKEIsMSksTCsrKTpkW0JdPXF9fWVsc2V7ZD1PYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhkKSk7Zm9yKGNvbnN0W0wsJF1vZiBmKWRbTF09JH1jPXIuaW5kZXgsYT1yLmtleXMsZj1yLmVkaXRzLHM9ci5pbkFycmF5LHI9ci5wcmV2fWVsc2UgaWYoeSl7aWYodT1zP2M6YVtjXSxkPXlbdV0sZD09bnVsbCljb250aW51ZTt2LnB1c2godSl9bGV0IHc7aWYoIUFycmF5LmlzQXJyYXkoZCkpe3ZhciBtLE47TnQoZCl8fFNlKCExLGBJbnZhbGlkIEFTVCBOb2RlOiAke1plKGQpfS5gKTtjb25zdCBMPUU/KG09aS5nZXQoZC5raW5kKSk9PT1udWxsfHxtPT09dm9pZCAwP3ZvaWQgMDptLmxlYXZlOihOPWkuZ2V0KGQua2luZCkpPT09bnVsbHx8Tj09PXZvaWQgMD92b2lkIDA6Ti5lbnRlcjtpZih3PUw9PW51bGw/dm9pZCAwOkwuY2FsbCh0LGQsdSx5LHYsYiksdz09PVpuKWJyZWFrO2lmKHc9PT0hMSl7aWYoIUUpe3YucG9wKCk7Y29udGludWV9fWVsc2UgaWYodyE9PXZvaWQgMCYmKGYucHVzaChbdSx3XSksIUUpKWlmKE50KHcpKWQ9dztlbHNle3YucG9wKCk7Y29udGludWV9fWlmKHc9PT12b2lkIDAmJmsmJmYucHVzaChbdSxkXSksRSl2LnBvcCgpO2Vsc2V7dmFyIGc7cj17aW5BcnJheTpzLGluZGV4OmMsa2V5czphLGVkaXRzOmYscHJldjpyfSxzPUFycmF5LmlzQXJyYXkoZCksYT1zP2Q6KGc9bltkLmtpbmRdKSE9PW51bGwmJmchPT12b2lkIDA/ZzpbXSxjPS0xLGY9W10seSYmYi5wdXNoKHkpLHk9ZH19d2hpbGUociE9PXZvaWQgMCk7cmV0dXJuIGYubGVuZ3RoIT09MD9mW2YubGVuZ3RoLTFdWzFdOmV9ZnVuY3Rpb24gZXIoZSx0KXtjb25zdCBuPWVbdF07cmV0dXJuIHR5cGVvZiBuPT0ib2JqZWN0Ij9uOnR5cGVvZiBuPT0iZnVuY3Rpb24iP3tlbnRlcjpuLGxlYXZlOnZvaWQgMH06e2VudGVyOmUuZW50ZXIsbGVhdmU6ZS5sZWF2ZX19ZnVuY3Rpb24gdHIoZSl7cmV0dXJuIEtuKGUscnIpfWNvbnN0IG5yPTgwLHJyPXtOYW1lOntsZWF2ZTplPT5lLnZhbHVlfSxWYXJpYWJsZTp7bGVhdmU6ZT0+IiQiK2UubmFtZX0sRG9jdW1lbnQ6e2xlYXZlOmU9PnAoZS5kZWZpbml0aW9ucyxgCgpgKX0sT3BlcmF0aW9uRGVmaW5pdGlvbjp7bGVhdmUoZSl7Y29uc3QgdD1TKCIoIixwKGUudmFyaWFibGVEZWZpbml0aW9ucywiLCAiKSwiKSIpLG49cChbZS5vcGVyYXRpb24scChbZS5uYW1lLHRdKSxwKGUuZGlyZWN0aXZlcywiICIpXSwiICIpO3JldHVybihuPT09InF1ZXJ5Ij8iIjpuKyIgIikrZS5zZWxlY3Rpb25TZXR9fSxWYXJpYWJsZURlZmluaXRpb246e2xlYXZlOih7dmFyaWFibGU6ZSx0eXBlOnQsZGVmYXVsdFZhbHVlOm4sZGlyZWN0aXZlczppfSk9PmUrIjogIit0K1MoIiA9ICIsbikrUygiICIscChpLCIgIikpfSxTZWxlY3Rpb25TZXQ6e2xlYXZlOih7c2VsZWN0aW9uczplfSk9PlooZSl9LEZpZWxkOntsZWF2ZSh7YWxpYXM6ZSxuYW1lOnQsYXJndW1lbnRzOm4sZGlyZWN0aXZlczppLHNlbGVjdGlvblNldDpyfSl7Y29uc3Qgcz1TKCIiLGUsIjogIikrdDtsZXQgYT1zK1MoIigiLHAobiwiLCAiKSwiKSIpO3JldHVybiBhLmxlbmd0aD5uciYmKGE9cytTKGAoCmAsa2UocChuLGAKYCkpLGAKKWApKSxwKFthLHAoaSwiICIpLHJdLCIgIil9fSxBcmd1bWVudDp7bGVhdmU6KHtuYW1lOmUsdmFsdWU6dH0pPT5lKyI6ICIrdH0sRnJhZ21lbnRTcHJlYWQ6e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT4iLi4uIitlK1MoIiAiLHAodCwiICIpKX0sSW5saW5lRnJhZ21lbnQ6e2xlYXZlOih7dHlwZUNvbmRpdGlvbjplLGRpcmVjdGl2ZXM6dCxzZWxlY3Rpb25TZXQ6bn0pPT5wKFsiLi4uIixTKCJvbiAiLGUpLHAodCwiICIpLG5dLCIgIil9LEZyYWdtZW50RGVmaW5pdGlvbjp7bGVhdmU6KHtuYW1lOmUsdHlwZUNvbmRpdGlvbjp0LHZhcmlhYmxlRGVmaW5pdGlvbnM6bixkaXJlY3RpdmVzOmksc2VsZWN0aW9uU2V0OnJ9KT0+YGZyYWdtZW50ICR7ZX0ke1MoIigiLHAobiwiLCAiKSwiKSIpfSBvbiAke3R9ICR7UygiIixwKGksIiAiKSwiICIpfWArcn0sSW50VmFsdWU6e2xlYXZlOih7dmFsdWU6ZX0pPT5lfSxGbG9hdFZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sU3RyaW5nVmFsdWU6e2xlYXZlOih7dmFsdWU6ZSxibG9jazp0fSk9PnQ/T24oZSk6Sm4oZSl9LEJvb2xlYW5WYWx1ZTp7bGVhdmU6KHt2YWx1ZTplfSk9PmU/InRydWUiOiJmYWxzZSJ9LE51bGxWYWx1ZTp7bGVhdmU6KCk9PiJudWxsIn0sRW51bVZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sTGlzdFZhbHVlOntsZWF2ZTooe3ZhbHVlczplfSk9PiJbIitwKGUsIiwgIikrIl0ifSxPYmplY3RWYWx1ZTp7bGVhdmU6KHtmaWVsZHM6ZX0pPT4ieyIrcChlLCIsICIpKyJ9In0sT2JqZWN0RmllbGQ6e2xlYXZlOih7bmFtZTplLHZhbHVlOnR9KT0+ZSsiOiAiK3R9LERpcmVjdGl2ZTp7bGVhdmU6KHtuYW1lOmUsYXJndW1lbnRzOnR9KT0+IkAiK2UrUygiKCIscCh0LCIsICIpLCIpIil9LE5hbWVkVHlwZTp7bGVhdmU6KHtuYW1lOmV9KT0+ZX0sTGlzdFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PiJbIitlKyJdIn0sTm9uTnVsbFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PmUrIiEifSxTY2hlbWFEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsZGlyZWN0aXZlczp0LG9wZXJhdGlvblR5cGVzOm59KT0+UygiIixlLGAKYCkrcChbInNjaGVtYSIscCh0LCIgIiksWihuKV0sIiAiKX0sT3BlcmF0aW9uVHlwZURlZmluaXRpb246e2xlYXZlOih7b3BlcmF0aW9uOmUsdHlwZTp0fSk9PmUrIjogIit0fSxTY2FsYXJUeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm59KT0+UygiIixlLGAKYCkrcChbInNjYWxhciIsdCxwKG4sIiAiKV0sIiAiKX0sT2JqZWN0VHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsaW50ZXJmYWNlczpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pPT5TKCIiLGUsYApgKStwKFsidHlwZSIsdCxTKCJpbXBsZW1lbnRzICIscChuLCIgJiAiKSkscChpLCIgIiksWihyKV0sIiAiKX0sRmllbGREZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGFyZ3VtZW50czpuLHR5cGU6aSxkaXJlY3RpdmVzOnJ9KT0+UygiIixlLGAKYCkrdCsoUnQobik/UyhgKApgLGtlKHAobixgCmApKSxgCilgKTpTKCIoIixwKG4sIiwgIiksIikiKSkrIjogIitpK1MoIiAiLHAociwiICIpKX0sSW5wdXRWYWx1ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsdHlwZTpuLGRlZmF1bHRWYWx1ZTppLGRpcmVjdGl2ZXM6cn0pPT5TKCIiLGUsYApgKStwKFt0KyI6ICIrbixTKCI9ICIsaSkscChyLCIgIildLCIgIil9LEludGVyZmFjZVR5cGVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGludGVyZmFjZXM6bixkaXJlY3RpdmVzOmksZmllbGRzOnJ9KT0+UygiIixlLGAKYCkrcChbImludGVyZmFjZSIsdCxTKCJpbXBsZW1lbnRzICIscChuLCIgJiAiKSkscChpLCIgIiksWihyKV0sIiAiKX0sVW5pb25UeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm4sdHlwZXM6aX0pPT5TKCIiLGUsYApgKStwKFsidW5pb24iLHQscChuLCIgIiksUygiPSAiLHAoaSwiIHwgIikpXSwiICIpfSxFbnVtVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLHZhbHVlczppfSk9PlMoIiIsZSxgCmApK3AoWyJlbnVtIix0LHAobiwiICIpLFooaSldLCIgIil9LEVudW1WYWx1ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpufSk9PlMoIiIsZSxgCmApK3AoW3QscChuLCIgIildLCIgIil9LElucHV0T2JqZWN0VHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLGZpZWxkczppfSk9PlMoIiIsZSxgCmApK3AoWyJpbnB1dCIsdCxwKG4sIiAiKSxaKGkpXSwiICIpfSxEaXJlY3RpdmVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGFyZ3VtZW50czpuLHJlcGVhdGFibGU6aSxsb2NhdGlvbnM6cn0pPT5TKCIiLGUsYApgKSsiZGlyZWN0aXZlIEAiK3QrKFJ0KG4pP1MoYCgKYCxrZShwKG4sYApgKSksYAopYCk6UygiKCIscChuLCIsICIpLCIpIikpKyhpPyIgcmVwZWF0YWJsZSI6IiIpKyIgb24gIitwKHIsIiB8ICIpfSxTY2hlbWFFeHRlbnNpb246e2xlYXZlOih7ZGlyZWN0aXZlczplLG9wZXJhdGlvblR5cGVzOnR9KT0+cChbImV4dGVuZCBzY2hlbWEiLHAoZSwiICIpLFoodCldLCIgIil9LFNjYWxhclR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT5wKFsiZXh0ZW5kIHNjYWxhciIsZSxwKHQsIiAiKV0sIiAiKX0sT2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsaW50ZXJmYWNlczp0LGRpcmVjdGl2ZXM6bixmaWVsZHM6aX0pPT5wKFsiZXh0ZW5kIHR5cGUiLGUsUygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLFooaSldLCIgIil9LEludGVyZmFjZVR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGludGVyZmFjZXM6dCxkaXJlY3RpdmVzOm4sZmllbGRzOml9KT0+cChbImV4dGVuZCBpbnRlcmZhY2UiLGUsUygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLFooaSldLCIgIil9LFVuaW9uVHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LHR5cGVzOm59KT0+cChbImV4dGVuZCB1bmlvbiIsZSxwKHQsIiAiKSxTKCI9ICIscChuLCIgfCAiKSldLCIgIil9LEVudW1UeXBlRXh0ZW5zaW9uOntsZWF2ZTooe25hbWU6ZSxkaXJlY3RpdmVzOnQsdmFsdWVzOm59KT0+cChbImV4dGVuZCBlbnVtIixlLHAodCwiICIpLFoobildLCIgIil9LElucHV0T2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LGZpZWxkczpufSk9PnAoWyJleHRlbmQgaW5wdXQiLGUscCh0LCIgIiksWihuKV0sIiAiKX19O2Z1bmN0aW9uIHAoZSx0PSIiKXt2YXIgbjtyZXR1cm4obj1lPT1udWxsP3ZvaWQgMDplLmZpbHRlcihpPT5pKS5qb2luKHQpKSE9PW51bGwmJm4hPT12b2lkIDA/bjoiIn1mdW5jdGlvbiBaKGUpe3JldHVybiBTKGB7CmAsa2UocChlLGAKYCkpLGAKfWApfWZ1bmN0aW9uIFMoZSx0LG49IiIpe3JldHVybiB0IT1udWxsJiZ0IT09IiI/ZSt0K246IiJ9ZnVuY3Rpb24ga2UoZSl7cmV0dXJuIFMoIiAgIixlLnJlcGxhY2UoL1xuL2csYAogIGApKX1mdW5jdGlvbiBSdChlKXt2YXIgdDtyZXR1cm4odD1lPT1udWxsP3ZvaWQgMDplLnNvbWUobj0+bi5pbmNsdWRlcyhgCmApKSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6ITF9Y29uc3QgUHQ9ZT0+e3ZhciBpLHI7bGV0IHQ7Y29uc3Qgbj1lLmRlZmluaXRpb25zLmZpbHRlcihzPT5zLmtpbmQ9PT0iT3BlcmF0aW9uRGVmaW5pdGlvbiIpO3JldHVybiBuLmxlbmd0aD09PTEmJih0PShyPShpPW5bMF0pPT1udWxsP3ZvaWQgMDppLm5hbWUpPT1udWxsP3ZvaWQgMDpyLnZhbHVlKSx0fSxLZT1lPT57aWYodHlwZW9mIGU9PSJzdHJpbmciKXtsZXQgbjt0cnl7Y29uc3QgaT1DdChlKTtuPVB0KGkpfWNhdGNoKGkpe31yZXR1cm57cXVlcnk6ZSxvcGVyYXRpb25OYW1lOm59fWNvbnN0IHQ9UHQoZSk7cmV0dXJue3F1ZXJ5OnRyKGUpLG9wZXJhdGlvbk5hbWU6dH19O2NsYXNzIGhlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtjb25zdCBpPWAke2hlLmV4dHJhY3RNZXNzYWdlKHQpfTogJHtKU09OLnN0cmluZ2lmeSh7cmVzcG9uc2U6dCxyZXF1ZXN0Om59KX1gO3N1cGVyKGkpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLGhlLnByb3RvdHlwZSksdGhpcy5yZXNwb25zZT10LHRoaXMucmVxdWVzdD1uLHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT09ImZ1bmN0aW9uIiYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxoZSl9c3RhdGljIGV4dHJhY3RNZXNzYWdlKHQpe3ZhciBuLGkscjtyZXR1cm4ocj0oaT0obj10LmVycm9ycyk9PW51bGw/dm9pZCAwOm5bMF0pPT1udWxsP3ZvaWQgMDppLm1lc3NhZ2UpIT1udWxsP3I6YEdyYXBoUUwgRXJyb3IgKENvZGU6ICR7dC5zdGF0dXN9KWB9fXZhciBpcj10eXBlb2YgZ2xvYmFsVGhpcyE9InVuZGVmaW5lZCI/Z2xvYmFsVGhpczp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9InVuZGVmaW5lZCI/Z2xvYmFsOnR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIj9zZWxmOnt9O2Z1bmN0aW9uIEx0KGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIGV0PXtleHBvcnRzOnt9fTsoZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2Ygc2VsZiE9InVuZGVmaW5lZCI/c2VsZjppcixpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcygpe3RoaXMuZmV0Y2g9ITEsdGhpcy5ET01FeGNlcHRpb249bi5ET01FeGNlcHRpb259cmV0dXJuIHMucHJvdG90eXBlPW4sbmV3IHN9KCk7KGZ1bmN0aW9uKHMpeyhmdW5jdGlvbihhKXt2YXIgYz17c2VhcmNoUGFyYW1zOiJVUkxTZWFyY2hQYXJhbXMiaW4gcyxpdGVyYWJsZToiU3ltYm9sImluIHMmJiJpdGVyYXRvciJpbiBTeW1ib2wsYmxvYjoiRmlsZVJlYWRlciJpbiBzJiYiQmxvYiJpbiBzJiZmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEJsb2IsITB9Y2F0Y2gobyl7cmV0dXJuITF9fSgpLGZvcm1EYXRhOiJGb3JtRGF0YSJpbiBzLGFycmF5QnVmZmVyOiJBcnJheUJ1ZmZlciJpbiBzfTtmdW5jdGlvbiBmKG8pe3JldHVybiBvJiZEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKX1pZihjLmFycmF5QnVmZmVyKXZhciBkPVsiW29iamVjdCBJbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OEFycmF5XSIsIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwiW29iamVjdCBJbnQxNkFycmF5XSIsIltvYmplY3QgVWludDE2QXJyYXldIiwiW29iamVjdCBJbnQzMkFycmF5XSIsIltvYmplY3QgVWludDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDY0QXJyYXldIl0sdT1BcnJheUJ1ZmZlci5pc1ZpZXd8fGZ1bmN0aW9uKG8pe3JldHVybiBvJiZkLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKT4tMX07ZnVuY3Rpb24geShvKXtpZih0eXBlb2YgbyE9InN0cmluZyImJihvPVN0cmluZyhvKSksL1teYS16MC05XC0jJCUmJyorLl5fYHx+XS9pLnRlc3QobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUiKTtyZXR1cm4gby50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHYobyl7cmV0dXJuIHR5cGVvZiBvIT0ic3RyaW5nIiYmKG89U3RyaW5nKG8pKSxvfWZ1bmN0aW9uIGIobyl7dmFyIGg9e25leHQ6ZnVuY3Rpb24oKXt2YXIgXz1vLnNoaWZ0KCk7cmV0dXJue2RvbmU6Xz09PXZvaWQgMCx2YWx1ZTpffX19O3JldHVybiBjLml0ZXJhYmxlJiYoaFtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIGh9KSxofWZ1bmN0aW9uIG0obyl7dGhpcy5tYXA9e30sbyBpbnN0YW5jZW9mIG0/by5mb3JFYWNoKGZ1bmN0aW9uKGgsXyl7dGhpcy5hcHBlbmQoXyxoKX0sdGhpcyk6QXJyYXkuaXNBcnJheShvKT9vLmZvckVhY2goZnVuY3Rpb24oaCl7dGhpcy5hcHBlbmQoaFswXSxoWzFdKX0sdGhpcyk6byYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZm9yRWFjaChmdW5jdGlvbihoKXt0aGlzLmFwcGVuZChoLG9baF0pfSx0aGlzKX1tLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obyxoKXtvPXkobyksaD12KGgpO3ZhciBfPXRoaXMubWFwW29dO3RoaXMubWFwW29dPV8/XysiLCAiK2g6aH0sbS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKG8pe2RlbGV0ZSB0aGlzLm1hcFt5KG8pXX0sbS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKG8pe3JldHVybiBvPXkobyksdGhpcy5oYXMobyk/dGhpcy5tYXBbb106bnVsbH0sbS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG8pe3JldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eSh5KG8pKX0sbS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKG8saCl7dGhpcy5tYXBbeShvKV09dihoKX0sbS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihvLGgpe2Zvcih2YXIgXyBpbiB0aGlzLm1hcCl0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShfKSYmby5jYWxsKGgsdGhpcy5tYXBbX10sXyx0aGlzKX0sbS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciBvPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oaCxfKXtvLnB1c2goXyl9KSxiKG8pfSxtLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgbz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGgpe28ucHVzaChoKX0pLGIobyl9LG0ucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgbz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGgsXyl7by5wdXNoKFtfLGhdKX0pLGIobyl9LGMuaXRlcmFibGUmJihtLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPW0ucHJvdG90eXBlLmVudHJpZXMpO2Z1bmN0aW9uIE4obyl7aWYoby5ib2R5VXNlZClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcigiQWxyZWFkeSByZWFkIikpO28uYm9keVVzZWQ9ITB9ZnVuY3Rpb24gZyhvKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oaCxfKXtvLm9ubG9hZD1mdW5jdGlvbigpe2goby5yZXN1bHQpfSxvLm9uZXJyb3I9ZnVuY3Rpb24oKXtfKG8uZXJyb3IpfX0pfWZ1bmN0aW9uIEUobyl7dmFyIGg9bmV3IEZpbGVSZWFkZXIsXz1nKGgpO3JldHVybiBoLnJlYWRBc0FycmF5QnVmZmVyKG8pLF99ZnVuY3Rpb24gayhvKXt2YXIgaD1uZXcgRmlsZVJlYWRlcixfPWcoaCk7cmV0dXJuIGgucmVhZEFzVGV4dChvKSxffWZ1bmN0aW9uIHcobyl7Zm9yKHZhciBoPW5ldyBVaW50OEFycmF5KG8pLF89bmV3IEFycmF5KGgubGVuZ3RoKSxBPTA7QTxoLmxlbmd0aDtBKyspX1tBXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGhbQV0pO3JldHVybiBfLmpvaW4oIiIpfWZ1bmN0aW9uIEwobyl7aWYoby5zbGljZSlyZXR1cm4gby5zbGljZSgwKTt2YXIgaD1uZXcgVWludDhBcnJheShvLmJ5dGVMZW5ndGgpO3JldHVybiBoLnNldChuZXcgVWludDhBcnJheShvKSksaC5idWZmZXJ9ZnVuY3Rpb24gJCgpe3JldHVybiB0aGlzLmJvZHlVc2VkPSExLHRoaXMuX2luaXRCb2R5PWZ1bmN0aW9uKG8pe3RoaXMuX2JvZHlJbml0PW8sbz90eXBlb2Ygbz09InN0cmluZyI/dGhpcy5fYm9keVRleHQ9bzpjLmJsb2ImJkJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yobyk/dGhpcy5fYm9keUJsb2I9bzpjLmZvcm1EYXRhJiZGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKT90aGlzLl9ib2R5Rm9ybURhdGE9bzpjLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG8pP3RoaXMuX2JvZHlUZXh0PW8udG9TdHJpbmcoKTpjLmFycmF5QnVmZmVyJiZjLmJsb2ImJmYobyk/KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcj1MKG8uYnVmZmVyKSx0aGlzLl9ib2R5SW5pdD1uZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpOmMuYXJyYXlCdWZmZXImJihBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKXx8dShvKSk/dGhpcy5fYm9keUFycmF5QnVmZmVyPUwobyk6dGhpcy5fYm9keVRleHQ9bz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk6dGhpcy5fYm9keVRleHQ9IiIsdGhpcy5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIil8fCh0eXBlb2Ygbz09InN0cmluZyI/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIiwidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Iik6dGhpcy5fYm9keUJsb2ImJnRoaXMuX2JvZHlCbG9iLnR5cGU/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIix0aGlzLl9ib2R5QmxvYi50eXBlKTpjLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG8pJiZ0aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpKX0sYy5ibG9iJiYodGhpcy5ibG9iPWZ1bmN0aW9uKCl7dmFyIG89Tih0aGlzKTtpZihvKXJldHVybiBvO2lmKHRoaXMuX2JvZHlCbG9iKXJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iIik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSl9LHRoaXMuYXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm9keUFycmF5QnVmZmVyP04odGhpcyl8fFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpOnRoaXMuYmxvYigpLnRoZW4oRSl9KSx0aGlzLnRleHQ9ZnVuY3Rpb24oKXt2YXIgbz1OKHRoaXMpO2lmKG8pcmV0dXJuIG87aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIGsodGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHcodGhpcy5fYm9keUFycmF5QnVmZmVyKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0Iik7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dCl9LGMuZm9ybURhdGEmJih0aGlzLmZvcm1EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oTyl9KSx0aGlzLmpzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKX0sdGhpc312YXIgcT1bIkRFTEVURSIsIkdFVCIsIkhFQUQiLCJPUFRJT05TIiwiUE9TVCIsIlBVVCJdO2Z1bmN0aW9uIEIobyl7dmFyIGg9by50b1VwcGVyQ2FzZSgpO3JldHVybiBxLmluZGV4T2YoaCk+LTE/aDpvfWZ1bmN0aW9uIEkobyxoKXtoPWh8fHt9O3ZhciBfPWguYm9keTtpZihvIGluc3RhbmNlb2YgSSl7aWYoby5ib2R5VXNlZCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBbHJlYWR5IHJlYWQiKTt0aGlzLnVybD1vLnVybCx0aGlzLmNyZWRlbnRpYWxzPW8uY3JlZGVudGlhbHMsaC5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBtKG8uaGVhZGVycykpLHRoaXMubWV0aG9kPW8ubWV0aG9kLHRoaXMubW9kZT1vLm1vZGUsdGhpcy5zaWduYWw9by5zaWduYWwsIV8mJm8uX2JvZHlJbml0IT1udWxsJiYoXz1vLl9ib2R5SW5pdCxvLmJvZHlVc2VkPSEwKX1lbHNlIHRoaXMudXJsPVN0cmluZyhvKTtpZih0aGlzLmNyZWRlbnRpYWxzPWguY3JlZGVudGlhbHN8fHRoaXMuY3JlZGVudGlhbHN8fCJzYW1lLW9yaWdpbiIsKGguaGVhZGVyc3x8IXRoaXMuaGVhZGVycykmJih0aGlzLmhlYWRlcnM9bmV3IG0oaC5oZWFkZXJzKSksdGhpcy5tZXRob2Q9QihoLm1ldGhvZHx8dGhpcy5tZXRob2R8fCJHRVQiKSx0aGlzLm1vZGU9aC5tb2RlfHx0aGlzLm1vZGV8fG51bGwsdGhpcy5zaWduYWw9aC5zaWduYWx8fHRoaXMuc2lnbmFsLHRoaXMucmVmZXJyZXI9bnVsbCwodGhpcy5tZXRob2Q9PT0iR0VUInx8dGhpcy5tZXRob2Q9PT0iSEVBRCIpJiZfKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzIik7dGhpcy5faW5pdEJvZHkoXyl9SS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEkodGhpcyx7Ym9keTp0aGlzLl9ib2R5SW5pdH0pfTtmdW5jdGlvbiBPKG8pe3ZhciBoPW5ldyBGb3JtRGF0YTtyZXR1cm4gby50cmltKCkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKF8pe2lmKF8pe3ZhciBBPV8uc3BsaXQoIj0iKSxSPUEuc2hpZnQoKS5yZXBsYWNlKC9cKy9nLCIgIikseD1BLmpvaW4oIj0iKS5yZXBsYWNlKC9cKy9nLCIgIik7aC5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KFIpLGRlY29kZVVSSUNvbXBvbmVudCh4KSl9fSksaH1mdW5jdGlvbiBqKG8pe3ZhciBoPW5ldyBtLF89by5yZXBsYWNlKC9ccj9cbltcdCBdKy9nLCIgIik7cmV0dXJuIF8uc3BsaXQoL1xyP1xuLykuZm9yRWFjaChmdW5jdGlvbihBKXt2YXIgUj1BLnNwbGl0KCI6IikseD1SLnNoaWZ0KCkudHJpbSgpO2lmKHgpe3ZhciBzZT1SLmpvaW4oIjoiKS50cmltKCk7aC5hcHBlbmQoeCxzZSl9fSksaH0kLmNhbGwoSS5wcm90b3R5cGUpO2Z1bmN0aW9uIFUobyxoKXtofHwoaD17fSksdGhpcy50eXBlPSJkZWZhdWx0Iix0aGlzLnN0YXR1cz1oLnN0YXR1cz09PXZvaWQgMD8yMDA6aC5zdGF0dXMsdGhpcy5vaz10aGlzLnN0YXR1cz49MjAwJiZ0aGlzLnN0YXR1czwzMDAsdGhpcy5zdGF0dXNUZXh0PSJzdGF0dXNUZXh0ImluIGg/aC5zdGF0dXNUZXh0OiJPSyIsdGhpcy5oZWFkZXJzPW5ldyBtKGguaGVhZGVycyksdGhpcy51cmw9aC51cmx8fCIiLHRoaXMuX2luaXRCb2R5KG8pfSQuY2FsbChVLnByb3RvdHlwZSksVS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFUodGhpcy5fYm9keUluaXQse3N0YXR1czp0aGlzLnN0YXR1cyxzdGF0dXNUZXh0OnRoaXMuc3RhdHVzVGV4dCxoZWFkZXJzOm5ldyBtKHRoaXMuaGVhZGVycyksdXJsOnRoaXMudXJsfSl9LFUuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgbz1uZXcgVShudWxsLHtzdGF0dXM6MCxzdGF0dXNUZXh0OiIifSk7cmV0dXJuIG8udHlwZT0iZXJyb3IiLG99O3ZhciB6PVszMDEsMzAyLDMwMywzMDcsMzA4XTtVLnJlZGlyZWN0PWZ1bmN0aW9uKG8saCl7aWYoei5pbmRleE9mKGgpPT09LTEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgc3RhdHVzIGNvZGUiKTtyZXR1cm4gbmV3IFUobnVsbCx7c3RhdHVzOmgsaGVhZGVyczp7bG9jYXRpb246b319KX0sYS5ET01FeGNlcHRpb249cy5ET01FeGNlcHRpb247dHJ5e25ldyBhLkRPTUV4Y2VwdGlvbn1jYXRjaChvKXthLkRPTUV4Y2VwdGlvbj1mdW5jdGlvbihoLF8pe3RoaXMubWVzc2FnZT1oLHRoaXMubmFtZT1fO3ZhciBBPUVycm9yKGgpO3RoaXMuc3RhY2s9QS5zdGFja30sYS5ET01FeGNlcHRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxhLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5ET01FeGNlcHRpb259ZnVuY3Rpb24gWChvLGgpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihfLEEpe3ZhciBSPW5ldyBJKG8saCk7aWYoUi5zaWduYWwmJlIuc2lnbmFsLmFib3J0ZWQpcmV0dXJuIEEobmV3IGEuRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpKTt2YXIgeD1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24gc2UoKXt4LmFib3J0KCl9eC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgSD17c3RhdHVzOnguc3RhdHVzLHN0YXR1c1RleHQ6eC5zdGF0dXNUZXh0LGhlYWRlcnM6aih4LmdldEFsbFJlc3BvbnNlSGVhZGVycygpfHwiIil9O0gudXJsPSJyZXNwb25zZVVSTCJpbiB4P3gucmVzcG9uc2VVUkw6SC5oZWFkZXJzLmdldCgiWC1SZXF1ZXN0LVVSTCIpO3ZhciByZT0icmVzcG9uc2UiaW4geD94LnJlc3BvbnNlOngucmVzcG9uc2VUZXh0O18obmV3IFUocmUsSCkpfSx4Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9LHgub250aW1lb3V0PWZ1bmN0aW9uKCl7QShuZXcgVHlwZUVycm9yKCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkIikpfSx4Lm9uYWJvcnQ9ZnVuY3Rpb24oKXtBKG5ldyBhLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9LHgub3BlbihSLm1ldGhvZCxSLnVybCwhMCksUi5jcmVkZW50aWFscz09PSJpbmNsdWRlIj94LndpdGhDcmVkZW50aWFscz0hMDpSLmNyZWRlbnRpYWxzPT09Im9taXQiJiYoeC53aXRoQ3JlZGVudGlhbHM9ITEpLCJyZXNwb25zZVR5cGUiaW4geCYmYy5ibG9iJiYoeC5yZXNwb25zZVR5cGU9ImJsb2IiKSxSLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihILHJlKXt4LnNldFJlcXVlc3RIZWFkZXIocmUsSCl9KSxSLnNpZ25hbCYmKFIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixzZSkseC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXt4LnJlYWR5U3RhdGU9PT00JiZSLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsc2UpfSkseC5zZW5kKHR5cGVvZiBSLl9ib2R5SW5pdD09InVuZGVmaW5lZCI/bnVsbDpSLl9ib2R5SW5pdCl9KX1yZXR1cm4gWC5wb2x5ZmlsbD0hMCxzLmZldGNofHwocy5mZXRjaD1YLHMuSGVhZGVycz1tLHMuUmVxdWVzdD1JLHMuUmVzcG9uc2U9VSksYS5IZWFkZXJzPW0sYS5SZXF1ZXN0PUksYS5SZXNwb25zZT1VLGEuZmV0Y2g9WCxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksYX0pKHt9KX0pKGkpLGkuZmV0Y2gucG9ueWZpbGw9ITAsZGVsZXRlIGkuZmV0Y2gucG9seWZpbGw7dmFyIHI9aTt0PXIuZmV0Y2gsdC5kZWZhdWx0PXIuZmV0Y2gsdC5mZXRjaD1yLmZldGNoLHQuSGVhZGVycz1yLkhlYWRlcnMsdC5SZXF1ZXN0PXIuUmVxdWVzdCx0LlJlc3BvbnNlPXIuUmVzcG9uc2UsZS5leHBvcnRzPXR9KShldCxldC5leHBvcnRzKTt2YXIgUmU9ZXQuZXhwb3J0cyxQZT1MdChSZSksc3I9TSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpQZX0sW1JlXSk7Y29uc3QgZGU9ZT0+e2xldCB0PXt9O3JldHVybiBlJiYodHlwZW9mIEhlYWRlcnMhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgSGVhZGVyc3x8c3ImJlJlLkhlYWRlcnMmJmUgaW5zdGFuY2VvZiBSZS5IZWFkZXJzP3Q9ZG4oZSk6QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2goKFtuLGldKT0+e24mJmkhPT12b2lkIDAmJih0W25dPWkpfSk6dD1lKSx0fSxGdD1lPT5lLnJlcGxhY2UoLyhbXHMsXXwjW15cblxyXSspKy9nLCIgIikudHJpbSgpLGFyPWU9PntpZighQXJyYXkuaXNBcnJheShlLnF1ZXJ5KSl7Y29uc3QgaT1lLHI9W2BxdWVyeT0ke2VuY29kZVVSSUNvbXBvbmVudChGdChpLnF1ZXJ5KSl9YF07cmV0dXJuIGUudmFyaWFibGVzJiZyLnB1c2goYHZhcmlhYmxlcz0ke2VuY29kZVVSSUNvbXBvbmVudChpLmpzb25TZXJpYWxpemVyLnN0cmluZ2lmeShpLnZhcmlhYmxlcykpfWApLGkub3BlcmF0aW9uTmFtZSYmci5wdXNoKGBvcGVyYXRpb25OYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGkub3BlcmF0aW9uTmFtZSl9YCksci5qb2luKCImIil9aWYodHlwZW9mIGUudmFyaWFibGVzIT0idW5kZWZpbmVkIiYmIUFycmF5LmlzQXJyYXkoZS52YXJpYWJsZXMpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNyZWF0ZSBxdWVyeSB3aXRoIGdpdmVuIHZhcmlhYmxlIHR5cGUsIGFycmF5IGV4cGVjdGVkIik7Y29uc3QgdD1lLG49ZS5xdWVyeS5yZWR1Y2UoKGkscixzKT0+KGkucHVzaCh7cXVlcnk6RnQociksdmFyaWFibGVzOnQudmFyaWFibGVzP3QuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KHQudmFyaWFibGVzW3NdKTp2b2lkIDB9KSxpKSxbXSk7cmV0dXJuYHF1ZXJ5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KG4pKX1gfSxvcj1lPT50PT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgTjtjb25zdHt1cmw6bixxdWVyeTppLHZhcmlhYmxlczpyLG9wZXJhdGlvbk5hbWU6cyxmZXRjaDphLGZldGNoT3B0aW9uczpjLG1pZGRsZXdhcmU6Zn09dCxkPVAoe30sdC5oZWFkZXJzKTtsZXQgdT0iIix5O2U9PT0iUE9TVCI/KHk9dXIoaSxyLHMsYy5qc29uU2VyaWFsaXplciksdHlwZW9mIHk9PSJzdHJpbmciJiYoZFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL2pzb24iKSk6dT1hcih7cXVlcnk6aSx2YXJpYWJsZXM6cixvcGVyYXRpb25OYW1lOnMsanNvblNlcmlhbGl6ZXI6KE49Yy5qc29uU2VyaWFsaXplcikhPW51bGw/TjpIZX0pO2NvbnN0IHY9UCh7bWV0aG9kOmUsaGVhZGVyczpkLGJvZHk6eX0sYyk7bGV0IGI9bixtPXY7aWYoZil7Y29uc3QgZz15aWVsZCBQcm9taXNlLnJlc29sdmUoZihVZShQKHt9LHYpLHt1cmw6bixvcGVyYXRpb25OYW1lOnMsdmFyaWFibGVzOnJ9KSkpLHt1cmw6a309Zyx3PWdlKGcsWyJ1cmwiXSk7Yj1rLG09d31yZXR1cm4gdSYmKGI9YCR7Yn0/JHt1fWApLHlpZWxkIGEoYixtKX0pO2NsYXNzIGNye2NvbnN0cnVjdG9yKHQsbj17fSl7dGhpcy51cmw9dCx0aGlzLnJlcXVlc3RDb25maWc9bix0aGlzLnJhd1JlcXVlc3Q9KC4uLmkpPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtyLHMsYV09aSxjPW1uKHIscyxhKSxnPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczpmLGZldGNoOmQ9UGUsbWV0aG9kOnU9IlBPU1QiLHJlcXVlc3RNaWRkbGV3YXJlOnkscmVzcG9uc2VNaWRkbGV3YXJlOnZ9PWcsYj1nZShnLFsiaGVhZGVycyIsImZldGNoIiwibWV0aG9kIiwicmVxdWVzdE1pZGRsZXdhcmUiLCJyZXNwb25zZU1pZGRsZXdhcmUiXSkse3VybDptfT10aGlzO2Muc2lnbmFsIT09dm9pZCAwJiYoYi5zaWduYWw9Yy5zaWduYWwpO2NvbnN0e29wZXJhdGlvbk5hbWU6Tn09S2UoYy5xdWVyeSk7cmV0dXJuIHR0KHt1cmw6bSxxdWVyeTpjLnF1ZXJ5LHZhcmlhYmxlczpjLnZhcmlhYmxlcyxoZWFkZXJzOlAoUCh7fSxkZShudChmKSkpLGRlKGMucmVxdWVzdEhlYWRlcnMpKSxvcGVyYXRpb25OYW1lOk4sZmV0Y2g6ZCxtZXRob2Q6dSxmZXRjaE9wdGlvbnM6YixtaWRkbGV3YXJlOnl9KS50aGVuKEU9Pih2JiZ2KEUpLEUpKS5jYXRjaChFPT57dGhyb3cgdiYmdihFKSxFfSl9KX1yZXF1ZXN0KHQsLi4ubil7cmV0dXJuIFcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W2kscl09bixzPXBuKHQsaSxyKSxOPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczphLGZldGNoOmM9UGUsbWV0aG9kOmY9IlBPU1QiLHJlcXVlc3RNaWRkbGV3YXJlOmQscmVzcG9uc2VNaWRkbGV3YXJlOnV9PU4seT1nZShOLFsiaGVhZGVycyIsImZldGNoIiwibWV0aG9kIiwicmVxdWVzdE1pZGRsZXdhcmUiLCJyZXNwb25zZU1pZGRsZXdhcmUiXSkse3VybDp2fT10aGlzO3Muc2lnbmFsIT09dm9pZCAwJiYoeS5zaWduYWw9cy5zaWduYWwpO2NvbnN0e3F1ZXJ5OmIsb3BlcmF0aW9uTmFtZTptfT1LZShzLmRvY3VtZW50KTtyZXR1cm4gdHQoe3VybDp2LHF1ZXJ5OmIsdmFyaWFibGVzOnMudmFyaWFibGVzLGhlYWRlcnM6UChQKHt9LGRlKG50KGEpKSksZGUocy5yZXF1ZXN0SGVhZGVycykpLG9wZXJhdGlvbk5hbWU6bSxmZXRjaDpjLG1ldGhvZDpmLGZldGNoT3B0aW9uczp5LG1pZGRsZXdhcmU6ZH0pLnRoZW4oZz0+KHUmJnUoZyksZy5kYXRhKSkuY2F0Y2goZz0+e3Rocm93IHUmJnUoZyksZ30pfSl9YmF0Y2hSZXF1ZXN0cyh0LG4pe3ZhciBkO2NvbnN0IGk9eW4odCxuKSxmPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczpyfT1mLHM9Z2UoZixbImhlYWRlcnMiXSk7aS5zaWduYWwhPT12b2lkIDAmJihzLnNpZ25hbD1pLnNpZ25hbCk7Y29uc3QgYT1pLmRvY3VtZW50cy5tYXAoKHtkb2N1bWVudDp1fSk9PktlKHUpLnF1ZXJ5KSxjPWkuZG9jdW1lbnRzLm1hcCgoe3ZhcmlhYmxlczp1fSk9PnUpO3JldHVybiB0dCh7dXJsOnRoaXMudXJsLHF1ZXJ5OmEsdmFyaWFibGVzOmMsaGVhZGVyczpQKFAoe30sZGUobnQocikpKSxkZShpLnJlcXVlc3RIZWFkZXJzKSksb3BlcmF0aW9uTmFtZTp2b2lkIDAsZmV0Y2g6KGQ9dGhpcy5yZXF1ZXN0Q29uZmlnLmZldGNoKSE9bnVsbD9kOlBlLG1ldGhvZDp0aGlzLnJlcXVlc3RDb25maWcubWV0aG9kfHwiUE9TVCIsZmV0Y2hPcHRpb25zOnMsbWlkZGxld2FyZTp0aGlzLnJlcXVlc3RDb25maWcucmVxdWVzdE1pZGRsZXdhcmV9KS50aGVuKHU9Pih0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlJiZ0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlKHUpLHUuZGF0YSkpLmNhdGNoKHU9Pnt0aHJvdyB0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlJiZ0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlKHUpLHV9KX1zZXRIZWFkZXJzKHQpe3JldHVybiB0aGlzLnJlcXVlc3RDb25maWcuaGVhZGVycz10LHRoaXN9c2V0SGVhZGVyKHQsbil7Y29uc3R7aGVhZGVyczppfT10aGlzLnJlcXVlc3RDb25maWc7cmV0dXJuIGk/aVt0XT1uOnRoaXMucmVxdWVzdENvbmZpZy5oZWFkZXJzPXtbdF06bn0sdGhpc31zZXRFbmRwb2ludCh0KXtyZXR1cm4gdGhpcy51cmw9dCx0aGlzfX1jb25zdCB0dD1lPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgdSx5O2NvbnN0e3F1ZXJ5OnQsdmFyaWFibGVzOm4sZmV0Y2hPcHRpb25zOml9PWUscj1vcihobigodT1lLm1ldGhvZCkhPW51bGw/dToicG9zdCIpKSxzPUFycmF5LmlzQXJyYXkoZS5xdWVyeSksYT15aWVsZCByKGUpLGM9eWllbGQgbHIoYSwoeT1pLmpzb25TZXJpYWxpemVyKSE9bnVsbD95OkhlKSxmPUFycmF5LmlzQXJyYXkoYyk/IWMuc29tZSgoe2RhdGE6Yn0pPT4hYik6ISFjLmRhdGEsZD1BcnJheS5pc0FycmF5KGMpfHwhYy5lcnJvcnN8fEFycmF5LmlzQXJyYXkoYy5lcnJvcnMpJiYhYy5lcnJvcnMubGVuZ3RofHxpLmVycm9yUG9saWN5PT09ImFsbCJ8fGkuZXJyb3JQb2xpY3k9PT0iaWdub3JlIjtpZihhLm9rJiZkJiZmKXtjb25zdCB2PShBcnJheS5pc0FycmF5KGMpLGMpLHtlcnJvcnM6Yn09dixtPWdlKHYsWyJlcnJvcnMiXSksTj1pLmVycm9yUG9saWN5PT09Imlnbm9yZSI/bTpjO3JldHVybiBVZShQKHt9LHM/e2RhdGE6Tn06Tikse2hlYWRlcnM6YS5oZWFkZXJzLHN0YXR1czphLnN0YXR1c30pfWVsc2V7Y29uc3QgYj10eXBlb2YgYz09InN0cmluZyI/e2Vycm9yOmN9OmM7dGhyb3cgbmV3IGhlKFVlKFAoe30sYikse3N0YXR1czphLnN0YXR1cyxoZWFkZXJzOmEuaGVhZGVyc30pLHtxdWVyeTp0LHZhcmlhYmxlczpufSl9fSksdXI9KGUsdCxuLGkpPT57Y29uc3Qgcj1pIT1udWxsP2k6SGU7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHIuc3RyaW5naWZ5KHtxdWVyeTplLHZhcmlhYmxlczp0LG9wZXJhdGlvbk5hbWU6bn0pO2lmKHR5cGVvZiB0IT0idW5kZWZpbmVkIiYmIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIHJlcXVlc3QgYm9keSB3aXRoIGdpdmVuIHZhcmlhYmxlIHR5cGUsIGFycmF5IGV4cGVjdGVkIik7Y29uc3Qgcz1lLnJlZHVjZSgoYSxjLGYpPT4oYS5wdXNoKHtxdWVyeTpjLHZhcmlhYmxlczp0P3RbZl06dm9pZCAwfSksYSksW10pO3JldHVybiByLnN0cmluZ2lmeShzKX0sbHI9KGUsdCk9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2xldCBuO3JldHVybiBlLmhlYWRlcnMuZm9yRWFjaCgoaSxyKT0+e3IudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiJiYobj1pKX0pLG4mJihuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vanNvbiIpfHxuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vZ3JhcGhxbCtqc29uIil8fG4udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJhcHBsaWNhdGlvbi9ncmFwaHFsLXJlc3BvbnNlK2pzb24iKSk/dC5wYXJzZSh5aWVsZCBlLnRleHQoKSk6ZS50ZXh0KCl9KSxudD1lPT50eXBlb2YgZT09ImZ1bmN0aW9uIj9lKCk6ZTt2YXIgcnQ9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlLHQpe3Q9ZS5leHBvcnRzPW4sdC5nZXRTZXJpYWxpemU9aTtmdW5jdGlvbiBuKHIscyxhLGMpe3JldHVybiBKU09OLnN0cmluZ2lmeShyLGkocyxjKSxhKX1mdW5jdGlvbiBpKHIscyl7dmFyIGE9W10sYz1bXTtyZXR1cm4gcz09bnVsbCYmKHM9ZnVuY3Rpb24oZixkKXtyZXR1cm4gYVswXT09PWQ/IltDaXJjdWxhciB+XSI6IltDaXJjdWxhciB+LiIrYy5zbGljZSgwLGEuaW5kZXhPZihkKSkuam9pbigiLiIpKyJdIn0pLGZ1bmN0aW9uKGYsZCl7aWYoYS5sZW5ndGg+MCl7dmFyIHU9YS5pbmRleE9mKHRoaXMpO351P2Euc3BsaWNlKHUrMSk6YS5wdXNoKHRoaXMpLH51P2Muc3BsaWNlKHUsMS8wLGYpOmMucHVzaChmKSx+YS5pbmRleE9mKGQpJiYoZD1zLmNhbGwodGhpcyxmLGQpKX1lbHNlIGEucHVzaChkKTtyZXR1cm4gcj09bnVsbD9kOnIuY2FsbCh0aGlzLGYsZCl9fX0pKHJ0LHJ0LmV4cG9ydHMpO3ZhciBmcj1ydC5leHBvcnRzLHBlPUx0KGZyKTtjb25zdCBNdD0xZTMqMTU7dmFyIExlPWZ1bmN0aW9uKCl7cmV0dXJuIExlPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPTEscj1hcmd1bWVudHMubGVuZ3RoO2k8cjtpKyspe249YXJndW1lbnRzW2ldO2Zvcih2YXIgcyBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHMpJiYodFtzXT1uW3NdKX1yZXR1cm4gdH0sTGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0eXBlb2YgU3VwcHJlc3NlZEVycm9yPT0iZnVuY3Rpb24iJiZTdXBwcmVzc2VkRXJyb3I7dmFyIEZlPW5ldyBNYXAsaXQ9bmV3IE1hcCwkdD0hMCxNZT0hMTtmdW5jdGlvbiBCdChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXHMsXSsvZywiICIpLnRyaW0oKX1mdW5jdGlvbiBocihlKXtyZXR1cm4gQnQoZS5zb3VyY2UuYm9keS5zdWJzdHJpbmcoZS5zdGFydCxlLmVuZCkpfWZ1bmN0aW9uIGRyKGUpe3ZhciB0PW5ldyBTZXQsbj1bXTtyZXR1cm4gZS5kZWZpbml0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGkpe2lmKGkua2luZD09PSJGcmFnbWVudERlZmluaXRpb24iKXt2YXIgcj1pLm5hbWUudmFsdWUscz1ocihpLmxvYyksYT1pdC5nZXQocik7YSYmIWEuaGFzKHMpPyR0JiZjb25zb2xlLndhcm4oIldhcm5pbmc6IGZyYWdtZW50IHdpdGggbmFtZSAiK3IrYCBhbHJlYWR5IGV4aXN0cy4KZ3JhcGhxbC10YWcgZW5mb3JjZXMgYWxsIGZyYWdtZW50IG5hbWVzIGFjcm9zcyB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlIHVuaXF1ZTsgcmVhZCBtb3JlIGFib3V0CnRoaXMgaW4gdGhlIGRvY3M6IGh0dHA6Ly9kZXYuYXBvbGxvZGF0YS5jb20vY29yZS9mcmFnbWVudHMuaHRtbCN1bmlxdWUtbmFtZXNgKTphfHxpdC5zZXQocixhPW5ldyBTZXQpLGEuYWRkKHMpLHQuaGFzKHMpfHwodC5hZGQocyksbi5wdXNoKGkpKX1lbHNlIG4ucHVzaChpKX0pLExlKExlKHt9LGUpLHtkZWZpbml0aW9uczpufSl9ZnVuY3Rpb24gcHIoZSl7dmFyIHQ9bmV3IFNldChlLmRlZmluaXRpb25zKTt0LmZvckVhY2goZnVuY3Rpb24oaSl7aS5sb2MmJmRlbGV0ZSBpLmxvYyxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBzPWlbcl07cyYmdHlwZW9mIHM9PSJvYmplY3QiJiZ0LmFkZChzKX0pfSk7dmFyIG49ZS5sb2M7cmV0dXJuIG4mJihkZWxldGUgbi5zdGFydFRva2VuLGRlbGV0ZSBuLmVuZFRva2VuKSxlfWZ1bmN0aW9uIG1yKGUpe3ZhciB0PUJ0KGUpO2lmKCFGZS5oYXModCkpe3ZhciBuPUN0KGUse2V4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzOk1lLGFsbG93TGVnYWN5RnJhZ21lbnRWYXJpYWJsZXM6TWV9KTtpZighbnx8bi5raW5kIT09IkRvY3VtZW50Iil0aHJvdyBuZXcgRXJyb3IoIk5vdCBhIHZhbGlkIEdyYXBoUUwgZG9jdW1lbnQuIik7RmUuc2V0KHQscHIoZHIobikpKX1yZXR1cm4gRmUuZ2V0KHQpfWZ1bmN0aW9uIFEoZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07dHlwZW9mIGU9PSJzdHJpbmciJiYoZT1bZV0pO3ZhciBpPWVbMF07cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihyLHMpe3ImJnIua2luZD09PSJEb2N1bWVudCI/aSs9ci5sb2Muc291cmNlLmJvZHk6aSs9cixpKz1lW3MrMV19KSxtcihpKX1mdW5jdGlvbiB5cigpe0ZlLmNsZWFyKCksaXQuY2xlYXIoKX1mdW5jdGlvbiBncigpeyR0PSExfWZ1bmN0aW9uIHZyKCl7TWU9ITB9ZnVuY3Rpb24gRXIoKXtNZT0hMX12YXIgQWU9e2dxbDpRLHJlc2V0Q2FjaGVzOnlyLGRpc2FibGVGcmFnbWVudFdhcm5pbmdzOmdyLGVuYWJsZUV4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzOnZyLGRpc2FibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlczpFcn07KGZ1bmN0aW9uKGUpe2UuZ3FsPUFlLmdxbCxlLnJlc2V0Q2FjaGVzPUFlLnJlc2V0Q2FjaGVzLGUuZGlzYWJsZUZyYWdtZW50V2FybmluZ3M9QWUuZGlzYWJsZUZyYWdtZW50V2FybmluZ3MsZS5lbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcz1BZS5lbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcyxlLmRpc2FibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcz1BZS5kaXNhYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXN9KShRfHwoUT17fSkpLFEuZGVmYXVsdD1RO2NvbnN0IFV0PVFgCglmcmFnbWVudCBNYXRjaFBhcnRzIG9uIE1hdGNoQ29uZmlnIHsKCQlyZWdleFZhbHVlCgkJbWF0Y2hWYWx1ZQoJfQpgLF9yPVFgCgltdXRhdGlvbiBQdXNoUGF5bG9hZCgKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkcGF5bG9hZF9pZDogSUQhCgkJJGV2ZW50czogUmVwbGF5RXZlbnRzSW5wdXQhCgkJJG1lc3NhZ2VzOiBTdHJpbmchCgkJJHJlc291cmNlczogU3RyaW5nIQoJCSR3ZWJfc29ja2V0X2V2ZW50czogU3RyaW5nIQoJCSRlcnJvcnM6IFtFcnJvck9iamVjdElucHV0XSEKCQkkaXNfYmVhY29uOiBCb29sZWFuCgkJJGhhc19zZXNzaW9uX3VubG9hZGVkOiBCb29sZWFuCgkJJGhpZ2hsaWdodF9sb2dzOiBTdHJpbmcKCSkgewoJCXB1c2hQYXlsb2FkKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXBheWxvYWRfaWQ6ICRwYXlsb2FkX2lkCgkJCWV2ZW50czogJGV2ZW50cwoJCQltZXNzYWdlczogJG1lc3NhZ2VzCgkJCXJlc291cmNlczogJHJlc291cmNlcwoJCQl3ZWJfc29ja2V0X2V2ZW50czogJHdlYl9zb2NrZXRfZXZlbnRzCgkJCWVycm9yczogJGVycm9ycwoJCQlpc19iZWFjb246ICRpc19iZWFjb24KCQkJaGFzX3Nlc3Npb25fdW5sb2FkZWQ6ICRoYXNfc2Vzc2lvbl91bmxvYWRlZAoJCQloaWdobGlnaHRfbG9nczogJGhpZ2hsaWdodF9sb2dzCgkJKQoJfQpgLFRyPVFgCgltdXRhdGlvbiBQdXNoUGF5bG9hZENvbXByZXNzZWQoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHBheWxvYWRfaWQ6IElEIQoJCSRkYXRhOiBTdHJpbmchCgkpIHsKCQlwdXNoUGF5bG9hZENvbXByZXNzZWQoCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJcGF5bG9hZF9pZDogJHBheWxvYWRfaWQKCQkJZGF0YTogJGRhdGEKCQkpCgl9CmAsYnI9UWAKCW11dGF0aW9uIGlkZW50aWZ5U2Vzc2lvbigKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkdXNlcl9pZGVudGlmaWVyOiBTdHJpbmchCgkJJHVzZXJfb2JqZWN0OiBBbnkKCSkgewoJCWlkZW50aWZ5U2Vzc2lvbigKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQl1c2VyX2lkZW50aWZpZXI6ICR1c2VyX2lkZW50aWZpZXIKCQkJdXNlcl9vYmplY3Q6ICR1c2VyX29iamVjdAoJCSkKCX0KYCxOcj1RYAoJbXV0YXRpb24gYWRkU2Vzc2lvblByb3BlcnRpZXMoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHByb3BlcnRpZXNfb2JqZWN0OiBBbnkKCSkgewoJCWFkZFNlc3Npb25Qcm9wZXJ0aWVzKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXByb3BlcnRpZXNfb2JqZWN0OiAkcHJvcGVydGllc19vYmplY3QKCQkpCgl9CmAseHI9UWAKCW11dGF0aW9uIHB1c2hNZXRyaWNzKCRtZXRyaWNzOiBbTWV0cmljSW5wdXRdISkgewoJCXB1c2hNZXRyaWNzKG1ldHJpY3M6ICRtZXRyaWNzKQoJfQpgLEFyPVFgCgltdXRhdGlvbiBhZGRTZXNzaW9uRmVlZGJhY2soCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHVzZXJfbmFtZTogU3RyaW5nCgkJJHVzZXJfZW1haWw6IFN0cmluZwoJCSR2ZXJiYXRpbTogU3RyaW5nIQoJCSR0aW1lc3RhbXA6IFRpbWVzdGFtcCEKCSkgewoJCWFkZFNlc3Npb25GZWVkYmFjaygKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQl1c2VyX25hbWU6ICR1c2VyX25hbWUKCQkJdXNlcl9lbWFpbDogJHVzZXJfZW1haWwKCQkJdmVyYmF0aW06ICR2ZXJiYXRpbQoJCQl0aW1lc3RhbXA6ICR0aW1lc3RhbXAKCQkpCgl9CmAsSXI9UWAKCW11dGF0aW9uIGluaXRpYWxpemVTZXNzaW9uKAoJCSRzZXNzaW9uX3NlY3VyZV9pZDogU3RyaW5nIQoJCSRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nIQoJCSRlbmFibGVfc3RyaWN0X3ByaXZhY3k6IEJvb2xlYW4hCgkJJHByaXZhY3lfc2V0dGluZzogU3RyaW5nIQoJCSRlbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHM6IEJvb2xlYW4hCgkJJGNsaWVudFZlcnNpb246IFN0cmluZyEKCQkkZmlyc3Rsb2FkVmVyc2lvbjogU3RyaW5nIQoJCSRjbGllbnRDb25maWc6IFN0cmluZyEKCQkkZW52aXJvbm1lbnQ6IFN0cmluZyEKCQkkaWQ6IFN0cmluZyEKCQkkYXBwVmVyc2lvbjogU3RyaW5nCgkJJHNlcnZpY2VOYW1lOiBTdHJpbmchCgkJJGNsaWVudF9pZDogU3RyaW5nIQoJCSRuZXR3b3JrX3JlY29yZGluZ19kb21haW5zOiBbU3RyaW5nIV0KCQkkZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogQm9vbGVhbgoJKSB7CgkJaW5pdGlhbGl6ZVNlc3Npb24oCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJb3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQ6ICRvcmdhbml6YXRpb25fdmVyYm9zZV9pZAoJCQllbmFibGVfc3RyaWN0X3ByaXZhY3k6ICRlbmFibGVfc3RyaWN0X3ByaXZhY3kKCQkJZW5hYmxlX3JlY29yZGluZ19uZXR3b3JrX2NvbnRlbnRzOiAkZW5hYmxlX3JlY29yZGluZ19uZXR3b3JrX2NvbnRlbnRzCgkJCWNsaWVudFZlcnNpb246ICRjbGllbnRWZXJzaW9uCgkJCWZpcnN0bG9hZFZlcnNpb246ICRmaXJzdGxvYWRWZXJzaW9uCgkJCWNsaWVudENvbmZpZzogJGNsaWVudENvbmZpZwoJCQllbnZpcm9ubWVudDogJGVudmlyb25tZW50CgkJCWFwcFZlcnNpb246ICRhcHBWZXJzaW9uCgkJCXNlcnZpY2VOYW1lOiAkc2VydmljZU5hbWUKCQkJZmluZ2VycHJpbnQ6ICRpZAoJCQljbGllbnRfaWQ6ICRjbGllbnRfaWQKCQkJbmV0d29ya19yZWNvcmRpbmdfZG9tYWluczogJG5ldHdvcmtfcmVjb3JkaW5nX2RvbWFpbnMKCQkJZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogJGRpc2FibGVfc2Vzc2lvbl9yZWNvcmRpbmcKCQkJcHJpdmFjeV9zZXR0aW5nOiAkcHJpdmFjeV9zZXR0aW5nCgkJKSB7CgkJCXNlY3VyZV9pZAoJCQlwcm9qZWN0X2lkCgkJCXNhbXBsaW5nIHsKCQkJCXNwYW5zIHsKCQkJCQluYW1lIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGVzIHsKCQkJCQkJa2V5IHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJfQoJCQkJCWV2ZW50cyB7CgkJCQkJCW5hbWUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQkJa2V5IHsKCQkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCQl9CgkJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlzYW1wbGluZ1JhdGlvCgkJCQl9CgkJCQlsb2dzIHsKCQkJCQltZXNzYWdlIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlzZXZlcml0eVRleHQgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQlrZXkgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQl9CgkJCQkJc2FtcGxpbmdSYXRpbwoJCQkJfQoJCQl9CgkJfQoJfQoJJHtVdH0KYCxPcj1RYAoJcXVlcnkgSWdub3JlKCRpZDogSUQhKSB7CgkJaWdub3JlKGlkOiAkaWQpCgl9CmAsU3I9UWAKCXF1ZXJ5IEdldFNhbXBsaW5nQ29uZmlnKCRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nISkgewoJCXNhbXBsaW5nKG9yZ2FuaXphdGlvbl92ZXJib3NlX2lkOiAkb3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQpIHsKCQkJc3BhbnMgewoJCQkJbmFtZSB7CgkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJfQoJCQkJYXR0cmlidXRlcyB7CgkJCQkJa2V5IHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJfQoJCQkJZXZlbnRzIHsKCQkJCQluYW1lIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGVzIHsKCQkJCQkJa2V5IHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJc2FtcGxpbmdSYXRpbwoJCQl9CgkJCWxvZ3MgewoJCQkJbWVzc2FnZSB7CgkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJfQoJCQkJc2V2ZXJpdHlUZXh0IHsKCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQl9CgkJCQlhdHRyaWJ1dGVzIHsKCQkJCQlrZXkgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQl9CgkJCQlzYW1wbGluZ1JhdGlvCgkJCX0KCQl9Cgl9Cgkke1V0fQpgLHdyPShlLHQsbixpKT0+ZSgpO2Z1bmN0aW9uIERyKGUsdD13cil7cmV0dXJue1B1c2hQYXlsb2FkKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KF9yLG4sUChQKHt9LGkpLHIpKSwiUHVzaFBheWxvYWQiLCJtdXRhdGlvbiIsbil9LFB1c2hQYXlsb2FkQ29tcHJlc3NlZChuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChUcixuLFAoUCh7fSxpKSxyKSksIlB1c2hQYXlsb2FkQ29tcHJlc3NlZCIsIm11dGF0aW9uIixuKX0saWRlbnRpZnlTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KGJyLG4sUChQKHt9LGkpLHIpKSwiaWRlbnRpZnlTZXNzaW9uIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uUHJvcGVydGllcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChOcixuLFAoUCh7fSxpKSxyKSksImFkZFNlc3Npb25Qcm9wZXJ0aWVzIiwibXV0YXRpb24iLG4pfSxwdXNoTWV0cmljcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdCh4cixuLFAoUCh7fSxpKSxyKSksInB1c2hNZXRyaWNzIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uRmVlZGJhY2sobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoQXIsbixQKFAoe30saSkscikpLCJhZGRTZXNzaW9uRmVlZGJhY2siLCJtdXRhdGlvbiIsbil9LGluaXRpYWxpemVTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KElyLG4sUChQKHt9LGkpLHIpKSwiaW5pdGlhbGl6ZVNlc3Npb24iLCJtdXRhdGlvbiIsbil9LElnbm9yZShuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChPcixuLFAoUCh7fSxpKSxyKSksIklnbm9yZSIsInF1ZXJ5IixuKX0sR2V0U2FtcGxpbmdDb25maWcobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoU3IsbixQKFAoe30saSkscikpLCJHZXRTYW1wbGluZ0NvbmZpZyIsInF1ZXJ5IixuKX19fWNsYXNzIENye2NvbnN0cnVjdG9yKHQsbil7dXQodGhpcywiZGVidWciKTt1dCh0aGlzLCJuYW1lIik7dGhpcy5kZWJ1Zz10LHRoaXMubmFtZT1ufWxvZyguLi50KXtpZih0aGlzLmRlYnVnKXtsZXQgbj1gWyR7RGF0ZS5ub3coKX1dYDt0aGlzLm5hbWUmJihuKz1gIC0gJHt0aGlzLm5hbWV9YCksY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSxbbiwuLi50XSl9fXdhcm4oLi4udCl7bGV0IG49YFske0RhdGUubm93KCl9XWA7dGhpcy5uYW1lJiYobis9YCAtICR7dGhpcy5uYW1lfWApLGNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLFtuLC4uLnRdKX19dmFyIFZ0PShlPT4oZS5CaWxsaW5nUXVvdGFFeGNlZWRlZD0iQmlsbGluZ1F1b3RhRXhjZWVkZWQiLGUpKShWdHx8e30pO2NvbnN0IGtyPTEwLFJyPTFlMyxQcj01MDAsTHI9W1Z0LkJpbGxpbmdRdW90YUV4Y2VlZGVkLnRvU3RyaW5nKCldLEZyPWU9Pnt2YXIgbjtyZXR1cm4oKG49ZS5yZXNwb25zZS5lcnJvcnMpPT1udWxsP3ZvaWQgMDpuLmZpbmQoaT0+THIuaW5jbHVkZXMoaS5tZXNzYWdlKSkpPT09dm9pZCAwfSxNcj0oKT0+e2NvbnN0IGU9KHQsbixpLHIscz0wKT0+Vyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e3JldHVybiB5aWVsZCB0KCl9Y2F0Y2goYSl7aWYoYSBpbnN0YW5jZW9mIGhlJiYhRnIoYSkpdGhyb3cgYTtpZihzPGtyKXJldHVybiB5aWVsZCBuZXcgUHJvbWlzZShjPT5zZXRUaW1lb3V0KGMsUnIrUHIqTWF0aC5wb3coMixzKSkpLHlpZWxkIGUodCxuLGkscixzKzEpO3Rocm93IGNvbnNvbGUuZXJyb3IoYGhpZ2hsaWdodC5pbzogZGF0YSByZXF1ZXN0IGZhaWxlZCBhZnRlciAke3N9IHJldHJpZXNgKSxhfX0pO3JldHVybiBlfSxqdD01LHF0PTJlMywkcj1bIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXTt2YXIgSz0oZT0+KGVbZS5Jbml0aWFsaXplPTBdPSJJbml0aWFsaXplIixlW2UuQXN5bmNFdmVudHM9MV09IkFzeW5jRXZlbnRzIixlW2UuSWRlbnRpZnk9Ml09IklkZW50aWZ5IixlW2UuUHJvcGVydGllcz0zXT0iUHJvcGVydGllcyIsZVtlLk1ldHJpY3M9NF09Ik1ldHJpY3MiLGVbZS5GZWVkYmFjaz01XT0iRmVlZGJhY2siLGVbZS5DdXN0b21FdmVudD02XT0iQ3VzdG9tRXZlbnQiLGVbZS5TdG9wPTddPSJTdG9wIixlKSkoS3x8e30pO2Z1bmN0aW9uIEJyKGUpe3JldHVybiBXKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIG5ldyBQcm9taXNlKG49Pntjb25zdCBpPW5ldyBGaWxlUmVhZGVyO2kub25sb2FkPSgpPT5uKGkucmVzdWx0KSxpLnJlYWRBc0RhdGFVUkwobmV3IEJsb2IoW2VdKSl9KTtyZXR1cm4gdC5zbGljZSh0LmluZGV4T2YoIiwiKSsxKX0pfWNvbnN0ICRlPXNlbGY7ZnVuY3Rpb24gR3QoZSx0KXtjb25zdCBuPXt9LGk9W10scj1bXTtmb3IoY29uc3RbcyxhXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtpZihhPT1udWxsKWNvbnRpbnVlOyRyLmluY2x1ZGVzKHR5cGVvZiBhKXx8aS5wdXNoKHtbc106YX0pO2xldCBjO3R5cGVvZiBhPT0ic3RyaW5nIj9jPWE6Yz1wZShhKSxjLmxlbmd0aD5xdCYmKHIucHVzaCh7W3NdOmF9KSxjPWMuc3Vic3RyaW5nKDAscXQpKSxuW3NdPWN9cmV0dXJuIHQhPT0ic2Vzc2lvbiImJihpLmxlbmd0aD4wJiZjb25zb2xlLndhcm4oYEhpZ2hsaWdodCB3YXMgcGFzc2VkIG9uZSBvciBtb3JlICR7dH0gcHJvcGVydGllcyBub3Qgb2YgdHlwZSBzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbi5gLGkpLHIubGVuZ3RoPjAmJmNvbnNvbGUud2FybihgSGlnaGxpZ2h0IHdhcyBwYXNzZWQgb25lIG9yIG1vcmUgJHt0fSBwcm9wZXJ0aWVzIGV4Y2VlZGluZyAyMDAwIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgdHJ1bmNhdGVkLmAscikpLG59e2xldCBlLHQsbixpPTAscj0wLHM9ITEsYT0wLGM9bmV3IENyKCExLCJbd29ya2VyXSIpO2NvbnN0IGY9W10sZD0oKT0+YSE9PTAmJmk8anQmJiEhKG4hPW51bGwmJm4ubGVuZ3RoKSx1PShnLEUpPT57JGUucG9zdE1lc3NhZ2Uoe3Jlc3BvbnNlOnt0eXBlOksuQ3VzdG9tRXZlbnQsdGFnOmcscGF5bG9hZDpFfX0pfSx5PWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e2lkOkUsZXZlbnRzOmssbWVzc2FnZXM6dyxlcnJvcnM6TCxyZXNvdXJjZXNTdHJpbmc6JCx3ZWJTb2NrZXRFdmVudHNTdHJpbmc6cSxoYXNTZXNzaW9uVW5sb2FkZWQ6QixoaWdobGlnaHRMb2dzOkl9PWcsTz1wZSh7bWVzc2FnZXM6d30pO2xldCBqPXtzZXNzaW9uX3NlY3VyZV9pZDpuLHBheWxvYWRfaWQ6RS50b1N0cmluZygpLGV2ZW50czp7ZXZlbnRzOmt9LG1lc3NhZ2VzOk8scmVzb3VyY2VzOiQsd2ViX3NvY2tldF9ldmVudHM6cSxlcnJvcnM6TCxpc19iZWFjb246ITEsaGFzX3Nlc3Npb25fdW5sb2FkZWQ6Qn07SSYmKGouaGlnaGxpZ2h0X2xvZ3M9SSk7Y29uc3QgVT1mbihKU09OLnN0cmluZ2lmeShqKSksej1jbihVKSxYPXlpZWxkIEJyKHopLG89e3R5cGU6Sy5Bc3luY0V2ZW50cyxpZDpFLGV2ZW50c1NpemU6VS5sZW5ndGgsY29tcHJlc3NlZFNpemU6WC5sZW5ndGh9O2MubG9nKGBQdXNoaW5nIHBheWxvYWQ6ICR7SlNPTi5zdHJpbmdpZnkoe3Nlc3Npb25TZWN1cmVJRDpuLGlkOkUsZmlyc3RTSUQ6TWF0aC5taW4oLi4uai5ldmVudHMuZXZlbnRzLm1hcCh4PT54PT1udWxsP3ZvaWQgMDp4Ll9zaWQpLmZpbHRlcih4PT4hIXgpKSxldmVudHNMZW5ndGg6ai5ldmVudHMuZXZlbnRzLmxlbmd0aCxtZXNzYWdlc0xlbmd0aDp3Lmxlbmd0aCxyZXNvdXJjZXNMZW5ndGg6JC5sZW5ndGgsd2ViU29ja2V0TGVuZ3RoOnEubGVuZ3RoLGVycm9yc0xlbmd0aDpMLmxlbmd0aCxidWZMZW5ndGg6VS5sZW5ndGgsY29tcHJlc3NlZExlbmd0aDp6Lmxlbmd0aCxjb21wcmVzc2VkQmFzZTY0TGVuZ3RoOlgubGVuZ3RofSx2b2lkIDAsMil9YCk7Y29uc3QgaD1lLlB1c2hQYXlsb2FkQ29tcHJlc3NlZCh7c2Vzc2lvbl9zZWN1cmVfaWQ6bixwYXlsb2FkX2lkOkUudG9TdHJpbmcoKSxkYXRhOlh9KTtsZXQgXz1Qcm9taXNlLnJlc29sdmUoKTtmLmxlbmd0aCYmKF89ZS5wdXNoTWV0cmljcyh7bWV0cmljczpmfSksZi5zcGxpY2UoMCkpO2xldCBBPXBlcmZvcm1hbmNlLm5vdygpO2NvbnN0IFI9c2V0SW50ZXJ2YWwoKCk9PntBJiZwZXJmb3JtYW5jZS5ub3coKS1BPk10JiYoY29uc29sZS53YXJuKGBVcGxvYWRpbmcgcHVzaFBheWxvYWQgdG9vayB0b28gbG9uZywgZmFpbHVyZSBudW1iZXIgIyR7cn0uYCkscis9MSxjbGVhckludGVydmFsKFIpLHI+PWp0JiYoY29uc29sZS53YXJuKCJVcGxvYWRpbmcgcHVzaFBheWxvYWQgdG9vayB0b28gbG9uZywgc3RvcHBpbmcgcmVjb3JkaW5nIHRvIGF2b2lkIE9PTS4iKSwkZS5wb3N0TWVzc2FnZSh7cmVzcG9uc2U6e3R5cGU6Sy5TdG9wLHJlcXVlc3RTdGFydDpBLGFzeW5jRXZlbnRzUmVzcG9uc2U6b319KSxiKHt0eXBlOksuUHJvcGVydGllcyxwcm9wZXJ0aWVzT2JqZWN0OntzdG9wUmVhc29uOiJQdXNoIFBheWxvYWQgVGltZW91dCJ9LHByb3BlcnR5VHlwZTp7dHlwZToidHJhY2sifX0pKSl9LDEwMCk7dHJ5e3lpZWxkIFByb21pc2UuYWxsKFtoLF9dKSxyJiZwZXJmb3JtYW5jZS5ub3coKS1BPD1NdCYmKGNvbnNvbGUud2FybihgcHVzaFBheWxvYWQgc3VjY2VlZGVkIGFmdGVyICMke3J9IGZhaWx1cmVzLCByZXNldHRpbmcgc3RvcCBzd2l0Y2guYCkscj0wKX1maW5hbGx5e0E9MCxjbGVhckludGVydmFsKFIpfSRlLnBvc3RNZXNzYWdlKHtyZXNwb25zZTpvfSl9KSx2PWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3VzZXJPYmplY3Q6RSx1c2VySWRlbnRpZmllcjprLHNvdXJjZTp3fT1nO3c9PT0ic2VnbWVudCI/dSgiU2VnbWVudCBJZGVudGlmeSIscGUoUCh7dXNlcklkZW50aWZpZXI6a30sRSkpKTp1KCJJZGVudGlmeSIscGUoUCh7dXNlcklkZW50aWZpZXI6a30sRSkpKSx5aWVsZCBlLmlkZW50aWZ5U2Vzc2lvbih7c2Vzc2lvbl9zZWN1cmVfaWQ6bix1c2VyX2lkZW50aWZpZXI6ayx1c2VyX29iamVjdDpHdChFLCJ1c2VyIil9KTtjb25zdCBMPXc9PT0ic2VnbWVudCI/dzoiZGVmYXVsdCI7Yy5sb2coYElkZW50aWZ5ICgke2t9LCBzb3VyY2U6ICR7TH0pIHcvIG9iajogJHtwZShFKX0gQCAke3R9YCl9KSxiPWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3Byb3BlcnRpZXNPYmplY3Q6RSxwcm9wZXJ0eVR5cGU6a309ZztsZXQgdzsoaz09bnVsbD92b2lkIDA6ay50eXBlKT09PSJzZXNzaW9uIj8odz0iU2Vzc2lvbiIseWllbGQgZS5hZGRTZXNzaW9uUHJvcGVydGllcyh7c2Vzc2lvbl9zZWN1cmVfaWQ6bixwcm9wZXJ0aWVzX29iamVjdDpHdChFLCJzZXNzaW9uIil9KSk6KGs9PW51bGw/dm9pZCAwOmsuc291cmNlKT09PSJzZWdtZW50Ij93PSJTZWdtZW50Ijp3PSJUcmFjayIsdyE9PSJTZXNzaW9uIiYmdSh3LHBlKEUpKSxjLmxvZyhgQWRkaW5nICR7d30gUHJvcGVydGllcyB0byBzZXNzaW9uICgke259KSB3LyBvYmo6ICR7SlNPTi5zdHJpbmdpZnkoRSl9IEAgJHt0fWApfSksbT1nPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmLnB1c2goLi4uZy5tZXRyaWNzLm1hcChFPT4oe25hbWU6RS5uYW1lLHZhbHVlOkUudmFsdWUsc2Vzc2lvbl9zZWN1cmVfaWQ6bixjYXRlZ29yeTpFLmNhdGVnb3J5LGdyb3VwOkUuZ3JvdXAsdGltZXN0YW1wOkUudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksdGFnczpFLnRhZ3N9KSkpfSksTj1nPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdHt0aW1lc3RhbXA6RSx2ZXJiYXRpbTprLHVzZXJFbWFpbDp3LHVzZXJOYW1lOkx9PWc7eWllbGQgZS5hZGRTZXNzaW9uRmVlZGJhY2soe3Nlc3Npb25fc2VjdXJlX2lkOm4sdGltZXN0YW1wOkUsdmVyYmF0aW06ayx1c2VyX2VtYWlsOncsdXNlcl9uYW1lOkx9KX0pOyRlLm9ubWVzc2FnZT1mdW5jdGlvbihnKXtyZXR1cm4gVyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoZy5kYXRhLm1lc3NhZ2UudHlwZT09PUsuSW5pdGlhbGl6ZSl7dD1nLmRhdGEubWVzc2FnZS5iYWNrZW5kLG49Zy5kYXRhLm1lc3NhZ2Uuc2Vzc2lvblNlY3VyZUlELHM9Zy5kYXRhLm1lc3NhZ2UuZGVidWcsYT1nLmRhdGEubWVzc2FnZS5yZWNvcmRpbmdTdGFydFRpbWUsYy5kZWJ1Zz1zLGU9RHIobmV3IGNyKHQse2hlYWRlcnM6e319KSxNcigpKTtyZXR1cm59aWYoZCgpKXRyeXtnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5Bc3luY0V2ZW50cz95aWVsZCB5KGcuZGF0YS5tZXNzYWdlKTpnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5JZGVudGlmeT95aWVsZCB2KGcuZGF0YS5tZXNzYWdlKTpnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5Qcm9wZXJ0aWVzP3lpZWxkIGIoZy5kYXRhLm1lc3NhZ2UpOmcuZGF0YS5tZXNzYWdlLnR5cGU9PT1LLk1ldHJpY3M/eWllbGQgbShnLmRhdGEubWVzc2FnZSk6Zy5kYXRhLm1lc3NhZ2UudHlwZT09PUsuRmVlZGJhY2smJih5aWVsZCBOKGcuZGF0YS5tZXNzYWdlKSksaT0wfWNhdGNoKEUpe3MmJmNvbnNvbGUuZXJyb3IoRSksaSs9MX19KX19fSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGlnaGxpZ2h0LWNsaWVudC13b3JrZXItQ3BtbDJKMXQuanMubWFwCg==", Ly = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), zo = typeof self < "u" && self.Blob && new Blob([Ly(Sc)], { type: "text/javascript;charset=utf-8" });
12918
- function Yy(e) {
12920
+ }, Sc = "dmFyIFZyPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxqcj1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgcXI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIEJlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIFF0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksWHQ9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgY3Q9KE0sRCxDKT0+RCBpbiBNP1ZyKE0sRCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Q30pOk1bRF09QyxQPShNLEQpPT57Zm9yKHZhciBDIGluIER8fChEPXt9KSlRdC5jYWxsKEQsQykmJmN0KE0sQyxEW0NdKTtpZihCZSlmb3IodmFyIEMgb2YgQmUoRCkpWHQuY2FsbChELEMpJiZjdChNLEMsRFtDXSk7cmV0dXJuIE19LFVlPShNLEQpPT5qcihNLHFyKEQpKTt2YXIgZ2U9KE0sRCk9Pnt2YXIgQz17fTtmb3IodmFyIEogaW4gTSlRdC5jYWxsKE0sSikmJkQuaW5kZXhPZihKKTwwJiYoQ1tKXT1NW0pdKTtpZihNIT1udWxsJiZCZSlmb3IodmFyIEogb2YgQmUoTSkpRC5pbmRleE9mKEopPDAmJlh0LmNhbGwoTSxKKSYmKENbSl09TVtKXSk7cmV0dXJuIEN9O3ZhciB1dD0oTSxELEMpPT5jdChNLHR5cGVvZiBEIT0ic3ltYm9sIj9EKyIiOkQsQyk7dmFyIFc9KE0sRCxDKT0+bmV3IFByb21pc2UoKEosY2UpPT57dmFyIHZlPWVlPT57dHJ5e3VlKEMubmV4dChlZSkpfWNhdGNoKEVlKXtjZShFZSl9fSxJZT1lZT0+e3RyeXt1ZShDLnRocm93KGVlKSl9Y2F0Y2goRWUpe2NlKEVlKX19LHVlPWVlPT5lZS5kb25lP0ooZWUudmFsdWUpOlByb21pc2UucmVzb2x2ZShlZS52YWx1ZSkudGhlbih2ZSxJZSk7dWUoKEM9Qy5hcHBseShNLEQpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIE0oZSx0KXtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKG4pe24mJnR5cGVvZiBuIT0ic3RyaW5nIiYmIUFycmF5LmlzQXJyYXkobikmJk9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oaSl7aWYoaSE9PSJkZWZhdWx0IiYmIShpIGluIGUpKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4saSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaSxyLmdldD9yOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuW2ldfX0pfX0pfSksT2JqZWN0LmZyZWV6ZShlKX12YXIgRD1VaW50OEFycmF5LEM9VWludDE2QXJyYXksSj1JbnQzMkFycmF5LGNlPW5ldyBEKFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsMCwwLDBdKSx2ZT1uZXcgRChbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxMywwLDBdKSxJZT1uZXcgRChbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0pLHVlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPW5ldyBDKDMxKSxpPTA7aTwzMTsrK2kpbltpXT10Kz0xPDxlW2ktMV07Zm9yKHZhciByPW5ldyBKKG5bMzBdKSxpPTE7aTwzMDsrK2kpZm9yKHZhciBzPW5baV07czxuW2krMV07KytzKXJbc109cy1uW2ldPDw1fGk7cmV0dXJue2I6bixyfX0sZWU9dWUoY2UsMiksRWU9ZWUuYixWZT1lZS5yO0VlWzI4XT0yNTgsVmVbMjU4XT0yODtmb3IodmFyIFd0PXVlKHZlLDApLGx0PVd0LnIsamU9bmV3IEMoMzI3NjgpLEY9MDtGPDMyNzY4OysrRil7dmFyIGllPShGJjQzNjkwKT4+MXwoRiYyMTg0NSk8PDE7aWU9KGllJjUyNDI4KT4+MnwoaWUmMTMxMDcpPDwyLGllPShpZSY2MTY4MCk+PjR8KGllJjM4NTUpPDw0LGplW0ZdPSgoaWUmNjUyODApPj44fChpZSYyNTUpPDw4KT4+MX1mb3IodmFyIF9lPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9ZS5sZW5ndGgscj0wLHM9bmV3IEModCk7cjxpOysrcillW3JdJiYrK3NbZVtyXS0xXTt2YXIgYT1uZXcgQyh0KTtmb3Iocj0xO3I8dDsrK3IpYVtyXT1hW3ItMV0rc1tyLTFdPDwxO3ZhciBjO2lmKG4pe2M9bmV3IEMoMTw8dCk7dmFyIGY9MTUtdDtmb3Iocj0wO3I8aTsrK3IpaWYoZVtyXSlmb3IodmFyIGQ9cjw8NHxlW3JdLHU9dC1lW3JdLHk9YVtlW3JdLTFdKys8PHUsdj15fCgxPDx1KS0xO3k8PXY7Kyt5KWNbamVbeV0+PmZdPWR9ZWxzZSBmb3IoYz1uZXcgQyhpKSxyPTA7cjxpOysrcillW3JdJiYoY1tyXT1qZVthW2Vbcl0tMV0rK10+PjE1LWVbcl0pO3JldHVybiBjfSxhZT1uZXcgRCgyODgpLEY9MDtGPDE0NDsrK0YpYWVbRl09ODtmb3IodmFyIEY9MTQ0O0Y8MjU2OysrRilhZVtGXT05O2Zvcih2YXIgRj0yNTY7RjwyODA7KytGKWFlW0ZdPTc7Zm9yKHZhciBGPTI4MDtGPDI4ODsrK0YpYWVbRl09ODtmb3IodmFyIE9lPW5ldyBEKDMyKSxGPTA7RjwzMjsrK0YpT2VbRl09NTt2YXIgWnQ9X2UoYWUsOSwwKSxLdD1fZShPZSw1LDApLGZ0PWZ1bmN0aW9uKGUpe3JldHVybihlKzcpLzh8MH0saHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybihuPT1udWxsfHxuPmUubGVuZ3RoKSYmKG49ZS5sZW5ndGgpLG5ldyBEKGUuc3ViYXJyYXkodCxuKSl9LG5lPWZ1bmN0aW9uKGUsdCxuKXtuPDw9dCY3O3ZhciBpPXQvOHwwO2VbaV18PW4sZVtpKzFdfD1uPj44fSxUZT1mdW5jdGlvbihlLHQsbil7bjw8PXQmNzt2YXIgaT10Lzh8MDtlW2ldfD1uLGVbaSsxXXw9bj4+OCxlW2krMl18PW4+PjE2fSxxZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxpPTA7aTxlLmxlbmd0aDsrK2kpZVtpXSYmbi5wdXNoKHtzOmksZjplW2ldfSk7dmFyIHI9bi5sZW5ndGgscz1uLnNsaWNlKCk7aWYoIXIpcmV0dXJue3Q6eXQsbDowfTtpZihyPT0xKXt2YXIgYT1uZXcgRChuWzBdLnMrMSk7cmV0dXJuIGFbblswXS5zXT0xLHt0OmEsbDoxfX1uLnNvcnQoZnVuY3Rpb24oJCxxKXtyZXR1cm4gJC5mLXEuZn0pLG4ucHVzaCh7czotMSxmOjI1MDAxfSk7dmFyIGM9blswXSxmPW5bMV0sZD0wLHU9MSx5PTI7Zm9yKG5bMF09e3M6LTEsZjpjLmYrZi5mLGw6YyxyOmZ9O3UhPXItMTspYz1uW25bZF0uZjxuW3ldLmY/ZCsrOnkrK10sZj1uW2QhPXUmJm5bZF0uZjxuW3ldLmY/ZCsrOnkrK10sblt1KytdPXtzOi0xLGY6Yy5mK2YuZixsOmMscjpmfTtmb3IodmFyIHY9c1swXS5zLGk9MTtpPHI7KytpKXNbaV0ucz52JiYodj1zW2ldLnMpO3ZhciBiPW5ldyBDKHYrMSksbT1HZShuW3UtMV0sYiwwKTtpZihtPnQpe3ZhciBpPTAsTj0wLGc9bS10LEU9MTw8Zztmb3Iocy5zb3J0KGZ1bmN0aW9uKHEsQil7cmV0dXJuIGJbQi5zXS1iW3Euc118fHEuZi1CLmZ9KTtpPHI7KytpKXt2YXIgaz1zW2ldLnM7aWYoYltrXT50KU4rPUUtKDE8PG0tYltrXSksYltrXT10O2Vsc2UgYnJlYWt9Zm9yKE4+Pj1nO04+MDspe3ZhciB3PXNbaV0ucztiW3ddPHQ/Ti09MTw8dC1iW3ddKystMTorK2l9Zm9yKDtpPj0wJiZOOy0taSl7dmFyIEw9c1tpXS5zO2JbTF09PXQmJigtLWJbTF0sKytOKX1tPXR9cmV0dXJue3Q6bmV3IEQoYiksbDptfX0sR2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnM9PS0xP01hdGgubWF4KEdlKGUubCx0LG4rMSksR2UoZS5yLHQsbisxKSk6dFtlLnNdPW59LGR0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDt0JiYhZVstLXRdOyk7Zm9yKHZhciBuPW5ldyBDKCsrdCksaT0wLHI9ZVswXSxzPTEsYT1mdW5jdGlvbihmKXtuW2krK109Zn0sYz0xO2M8PXQ7KytjKWlmKGVbY109PXImJmMhPXQpKytzO2Vsc2V7aWYoIXImJnM+Mil7Zm9yKDtzPjEzODtzLT0xMzgpYSgzMjc1NCk7cz4yJiYoYShzPjEwP3MtMTE8PDV8Mjg2OTA6cy0zPDw1fDEyMzA1KSxzPTApfWVsc2UgaWYocz4zKXtmb3IoYShyKSwtLXM7cz42O3MtPTYpYSg4MzA0KTtzPjImJihhKHMtMzw8NXw4MjA4KSxzPTApfWZvcig7cy0tOylhKHIpO3M9MSxyPWVbY119cmV0dXJue2M6bi5zdWJhcnJheSgwLGkpLG46dH19LGJlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAsaT0wO2k8dC5sZW5ndGg7KytpKW4rPWVbaV0qdFtpXTtyZXR1cm4gbn0scHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW4ubGVuZ3RoLHI9ZnQodCsyKTtlW3JdPWkmMjU1LGVbcisxXT1pPj44LGVbcisyXT1lW3JdXjI1NSxlW3IrM109ZVtyKzFdXjI1NTtmb3IodmFyIHM9MDtzPGk7KytzKWVbcitzKzRdPW5bc107cmV0dXJuKHIrNCtpKSo4fSxtdD1mdW5jdGlvbihlLHQsbixpLHIscyxhLGMsZixkLHUpe25lKHQsdSsrLG4pLCsrclsyNTZdO2Zvcih2YXIgeT1xZShyLDE1KSx2PXkudCxiPXkubCxtPXFlKHMsMTUpLE49bS50LGc9bS5sLEU9ZHQodiksaz1FLmMsdz1FLm4sTD1kdChOKSwkPUwuYyxxPUwubixCPW5ldyBDKDE5KSxJPTA7STxrLmxlbmd0aDsrK0kpKytCW2tbSV0mMzFdO2Zvcih2YXIgST0wO0k8JC5sZW5ndGg7KytJKSsrQlskW0ldJjMxXTtmb3IodmFyIE89cWUoQiw3KSxqPU8udCxVPU8ubCx6PTE5O3o+NCYmIWpbSWVbei0xXV07LS16KTt2YXIgWD1kKzU8PDMsbz1iZShyLGFlKStiZShzLE9lKSthLGg9YmUocix2KStiZShzLE4pK2ErMTQrMyp6K2JlKEIsaikrMipCWzE2XSszKkJbMTddKzcqQlsxOF07aWYoZj49MCYmWDw9byYmWDw9aClyZXR1cm4gcHQodCx1LGUuc3ViYXJyYXkoZixmK2QpKTt2YXIgXyxBLFIseDtpZihuZSh0LHUsMSsoaDxvKSksdSs9MixoPG8pe189X2UodixiLDApLEE9dixSPV9lKE4sZywwKSx4PU47dmFyIHNlPV9lKGosVSwwKTtuZSh0LHUsdy0yNTcpLG5lKHQsdSs1LHEtMSksbmUodCx1KzEwLHotNCksdSs9MTQ7Zm9yKHZhciBJPTA7STx6OysrSSluZSh0LHUrMypJLGpbSWVbSV1dKTt1Kz0zKno7Zm9yKHZhciBIPVtrLCRdLHJlPTA7cmU8MjsrK3JlKWZvcih2YXIgbWU9SFtyZV0sST0wO0k8bWUubGVuZ3RoOysrSSl7dmFyIHRlPW1lW0ldJjMxO25lKHQsdSxzZVt0ZV0pLHUrPWpbdGVdLHRlPjE1JiYobmUodCx1LG1lW0ldPj41JjEyNyksdSs9bWVbSV0+PjEyKX19ZWxzZSBfPVp0LEE9YWUsUj1LdCx4PU9lO2Zvcih2YXIgST0wO0k8YzsrK0kpe3ZhciBZPWlbSV07aWYoWT4yNTUpe3ZhciB0ZT1ZPj4xOCYzMTtUZSh0LHUsX1t0ZSsyNTddKSx1Kz1BW3RlKzI1N10sdGU+NyYmKG5lKHQsdSxZPj4yMyYzMSksdSs9Y2VbdGVdKTt2YXIgeWU9WSYzMTtUZSh0LHUsUlt5ZV0pLHUrPXhbeWVdLHllPjMmJihUZSh0LHUsWT4+NSY4MTkxKSx1Kz12ZVt5ZV0pfWVsc2UgVGUodCx1LF9bWV0pLHUrPUFbWV19cmV0dXJuIFRlKHQsdSxfWzI1Nl0pLHUrQVsyNTZdfSxlbj1uZXcgSihbNjU1NDAsMTMxMDgwLDEzMTA4OCwxMzExMDQsMjYyMTc2LDEwNDg3MDQsMTA0ODgzMiwyMTE0NTYwLDIxMTc2MzJdKSx5dD1uZXcgRCgwKSx0bj1mdW5jdGlvbihlLHQsbixpLHIscyl7dmFyIGE9cy56fHxlLmxlbmd0aCxjPW5ldyBEKGkrYSs1KigxK01hdGguY2VpbChhLzdlMykpK3IpLGY9Yy5zdWJhcnJheShpLGMubGVuZ3RoLXIpLGQ9cy5sLHU9KHMucnx8MCkmNztpZih0KXt1JiYoZlswXT1zLnI+PjMpO2Zvcih2YXIgeT1lblt0LTFdLHY9eT4+MTMsYj15JjgxOTEsbT0oMTw8biktMSxOPXMucHx8bmV3IEMoMzI3NjgpLGc9cy5ofHxuZXcgQyhtKzEpLEU9TWF0aC5jZWlsKG4vMyksaz0yKkUsdz1mdW5jdGlvbihvdCl7cmV0dXJuKGVbb3RdXmVbb3QrMV08PEVeZVtvdCsyXTw8aykmbX0sTD1uZXcgSigyNWUzKSwkPW5ldyBDKDI4OCkscT1uZXcgQygzMiksQj0wLEk9MCxPPXMuaXx8MCxqPTAsVT1zLnd8fDAsej0wO08rMjxhOysrTyl7dmFyIFg9dyhPKSxvPU8mMzI3NjcsaD1nW1hdO2lmKE5bb109aCxnW1hdPW8sVTw9Tyl7dmFyIF89YS1PO2lmKChCPjdlM3x8aj4yNDU3NikmJihfPjQyM3x8IWQpKXt1PW10KGUsZiwwLEwsJCxxLEksaix6LE8teix1KSxqPUI9ST0wLHo9Tztmb3IodmFyIEE9MDtBPDI4NjsrK0EpJFtBXT0wO2Zvcih2YXIgQT0wO0E8MzA7KytBKXFbQV09MH12YXIgUj0yLHg9MCxzZT1iLEg9by1oJjMyNzY3O2lmKF8+MiYmWD09dyhPLUgpKWZvcih2YXIgcmU9TWF0aC5taW4odixfKS0xLG1lPU1hdGgubWluKDMyNzY3LE8pLHRlPU1hdGgubWluKDI1OCxfKTtIPD1tZSYmLS1zZSYmbyE9aDspe2lmKGVbTytSXT09ZVtPK1ItSF0pe2Zvcih2YXIgWT0wO1k8dGUmJmVbTytZXT09ZVtPK1ktSF07KytZKTtpZihZPlIpe2lmKFI9WSx4PUgsWT5yZSlicmVhaztmb3IodmFyIHllPU1hdGgubWluKEgsWS0yKSx6dD0wLEE9MDtBPHllOysrQSl7dmFyIHN0PU8tSCtBJjMyNzY3LFVyPU5bc3RdLEh0PXN0LVVyJjMyNzY3O0h0Pnp0JiYoenQ9SHQsaD1zdCl9fX1vPWgsaD1OW29dLEgrPW8taCYzMjc2N31pZih4KXtMW2orK109MjY4NDM1NDU2fFZlW1JdPDwxOHxsdFt4XTt2YXIgWXQ9VmVbUl0mMzEsSnQ9bHRbeF0mMzE7SSs9Y2VbWXRdK3ZlW0p0XSwrKyRbMjU3K1l0XSwrK3FbSnRdLFU9TytSLCsrQn1lbHNlIExbaisrXT1lW09dLCsrJFtlW09dXX19Zm9yKE89TWF0aC5tYXgoTyxVKTtPPGE7KytPKUxbaisrXT1lW09dLCsrJFtlW09dXTt1PW10KGUsZixkLEwsJCxxLEksaix6LE8teix1KSxkfHwocy5yPXUmN3xmW3UvOHwwXTw8Myx1LT03LHMuaD1nLHMucD1OLHMuaT1PLHMudz1VKX1lbHNle2Zvcih2YXIgTz1zLnd8fDA7TzxhK2Q7Tys9NjU1MzUpe3ZhciBhdD1PKzY1NTM1O2F0Pj1hJiYoZlt1Lzh8MF09ZCxhdD1hKSx1PXB0KGYsdSsxLGUuc3ViYXJyYXkoTyxhdCkpfXMuaT1hfXJldHVybiBodChjLDAsaStmdCh1KStyKX0sbm49ZnVuY3Rpb24oKXtmb3IodmFyIGU9bmV3IEludDMyQXJyYXkoMjU2KSx0PTA7dDwyNTY7Kyt0KXtmb3IodmFyIG49dCxpPTk7LS1pOyluPShuJjEmJi0zMDY2NzQ5MTIpXm4+Pj4xO2VbdF09bn1yZXR1cm4gZX0oKSxybj1mdW5jdGlvbigpe3ZhciBlPS0xO3JldHVybntwOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1lLGk9MDtpPHQubGVuZ3RoOysraSluPW5uW24mMjU1XnRbaV1dXm4+Pj44O2U9bn0sZDpmdW5jdGlvbigpe3JldHVybn5lfX19LHNuPWZ1bmN0aW9uKGUsdCxuLGkscil7aWYoIXImJihyPXtsOjF9LHQuZGljdGlvbmFyeSkpe3ZhciBzPXQuZGljdGlvbmFyeS5zdWJhcnJheSgtMzI3NjgpLGE9bmV3IEQocy5sZW5ndGgrZS5sZW5ndGgpO2Euc2V0KHMpLGEuc2V0KGUscy5sZW5ndGgpLGU9YSxyLnc9cy5sZW5ndGh9cmV0dXJuIHRuKGUsdC5sZXZlbD09bnVsbD82OnQubGV2ZWwsdC5tZW09PW51bGw/ci5sP01hdGguY2VpbChNYXRoLm1heCg4LE1hdGgubWluKDEzLE1hdGgubG9nKGUubGVuZ3RoKSkpKjEuNSk6MjA6MTIrdC5tZW0sbixpLHIpfSx6ZT1mdW5jdGlvbihlLHQsbil7Zm9yKDtuOysrdCllW3RdPW4sbj4+Pj04fSxhbj1mdW5jdGlvbihlLHQpe3ZhciBuPXQuZmlsZW5hbWU7aWYoZVswXT0zMSxlWzFdPTEzOSxlWzJdPTgsZVs4XT10LmxldmVsPDI/NDp0LmxldmVsPT05PzI6MCxlWzldPTMsdC5tdGltZSE9MCYmemUoZSw0LE1hdGguZmxvb3IobmV3IERhdGUodC5tdGltZXx8RGF0ZS5ub3coKSkvMWUzKSksbil7ZVszXT04O2Zvcih2YXIgaT0wO2k8PW4ubGVuZ3RoOysraSllW2krMTBdPW4uY2hhckNvZGVBdChpKX19LG9uPWZ1bmN0aW9uKGUpe3JldHVybiAxMCsoZS5maWxlbmFtZT9lLmZpbGVuYW1lLmxlbmd0aCsxOjApfTtmdW5jdGlvbiBjbihlLHQpe3R8fCh0PXt9KTt2YXIgbj1ybigpLGk9ZS5sZW5ndGg7bi5wKGUpO3ZhciByPXNuKGUsdCxvbih0KSw4KSxzPXIubGVuZ3RoO3JldHVybiBhbihyLHQpLHplKHIscy04LG4uZCgpKSx6ZShyLHMtNCxpKSxyfXZhciBndD10eXBlb2YgVGV4dEVuY29kZXIhPSJ1bmRlZmluZWQiJiZuZXcgVGV4dEVuY29kZXIsdW49dHlwZW9mIFRleHREZWNvZGVyIT0idW5kZWZpbmVkIiYmbmV3IFRleHREZWNvZGVyLGxuPTA7dHJ5e3VuLmRlY29kZSh5dCx7c3RyZWFtOiEwfSksbG49MX1jYXRjaChlKXt9ZnVuY3Rpb24gZm4oZSx0KXt2YXIgbjtpZihndClyZXR1cm4gZ3QuZW5jb2RlKGUpO2Zvcih2YXIgaT1lLmxlbmd0aCxyPW5ldyBEKGUubGVuZ3RoKyhlLmxlbmd0aD4+MSkpLHM9MCxhPWZ1bmN0aW9uKGQpe3JbcysrXT1kfSxuPTA7bjxpOysrbil7aWYocys1PnIubGVuZ3RoKXt2YXIgYz1uZXcgRChzKzgrKGktbjw8MSkpO2Muc2V0KHIpLHI9Y312YXIgZj1lLmNoYXJDb2RlQXQobik7ZjwxMjh8fHQ/YShmKTpmPDIwNDg/KGEoMTkyfGY+PjYpLGEoMTI4fGYmNjMpKTpmPjU1Mjk1JiZmPDU3MzQ0PyhmPTY1NTM2KyhmJjEwNDc1NTIpfGUuY2hhckNvZGVBdCgrK24pJjEwMjMsYSgyNDB8Zj4+MTgpLGEoMTI4fGY+PjEyJjYzKSxhKDEyOHxmPj42JjYzKSxhKDEyOHxmJjYzKSk6KGEoMjI0fGY+PjEyKSxhKDEyOHxmPj42JjYzKSxhKDEyOHxmJjYzKSl9cmV0dXJuIGh0KHIsMCxzKX1jb25zdCBIZT1KU09OLGhuPWU9PmUudG9VcHBlckNhc2UoKSxkbj1lPT57Y29uc3QgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChuLGkpPT57dFtpXT1ufSksdH0scG49KGUsdCxuKT0+ZS5kb2N1bWVudD9lOntkb2N1bWVudDplLHZhcmlhYmxlczp0LHJlcXVlc3RIZWFkZXJzOm4sc2lnbmFsOnZvaWQgMH0sbW49KGUsdCxuKT0+ZS5xdWVyeT9lOntxdWVyeTplLHZhcmlhYmxlczp0LHJlcXVlc3RIZWFkZXJzOm4sc2lnbmFsOnZvaWQgMH0seW49KGUsdCk9PmUuZG9jdW1lbnRzP2U6e2RvY3VtZW50czplLHJlcXVlc3RIZWFkZXJzOnQsc2lnbmFsOnZvaWQgMH07ZnVuY3Rpb24gU2UoZSx0KXtpZighISFlKXRocm93IG5ldyBFcnJvcih0KX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbH1mdW5jdGlvbiB2bihlLHQpe2lmKCEhIWUpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGludmFyaWFudCB0cmlnZ2VyZWQuIil9Y29uc3QgRW49L1xyXG58W1xuXHJdL2c7ZnVuY3Rpb24gWWUoZSx0KXtsZXQgbj0wLGk9MTtmb3IoY29uc3QgciBvZiBlLmJvZHkubWF0Y2hBbGwoRW4pKXtpZih0eXBlb2Ygci5pbmRleD09Im51bWJlciJ8fHZuKCExKSxyLmluZGV4Pj10KWJyZWFrO249ci5pbmRleCtyWzBdLmxlbmd0aCxpKz0xfXJldHVybntsaW5lOmksY29sdW1uOnQrMS1ufX1mdW5jdGlvbiBfbihlKXtyZXR1cm4gdnQoZS5zb3VyY2UsWWUoZS5zb3VyY2UsZS5zdGFydCkpfWZ1bmN0aW9uIHZ0KGUsdCl7Y29uc3Qgbj1lLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbi0xLGk9IiIucGFkU3RhcnQobikrZS5ib2R5LHI9dC5saW5lLTEscz1lLmxvY2F0aW9uT2Zmc2V0LmxpbmUtMSxhPXQubGluZStzLGM9dC5saW5lPT09MT9uOjAsZj10LmNvbHVtbitjLGQ9YCR7ZS5uYW1lfToke2F9OiR7Zn0KYCx1PWkuc3BsaXQoL1xyXG58W1xuXHJdL2cpLHk9dVtyXTtpZih5Lmxlbmd0aD4xMjApe2NvbnN0IHY9TWF0aC5mbG9vcihmLzgwKSxiPWYlODAsbT1bXTtmb3IobGV0IE49MDtOPHkubGVuZ3RoO04rPTgwKW0ucHVzaCh5LnNsaWNlKE4sTis4MCkpO3JldHVybiBkK0V0KFtbYCR7YX0gfGAsbVswXV0sLi4ubS5zbGljZSgxLHYrMSkubWFwKE49PlsifCIsTl0pLFsifCIsIl4iLnBhZFN0YXJ0KGIpXSxbInwiLG1bdisxXV1dKX1yZXR1cm4gZCtFdChbW2Ake2EtMX0gfGAsdVtyLTFdXSxbYCR7YX0gfGAseV0sWyJ8IiwiXiIucGFkU3RhcnQoZildLFtgJHthKzF9IHxgLHVbcisxXV1dKX1mdW5jdGlvbiBFdChlKXtjb25zdCB0PWUuZmlsdGVyKChbaSxyXSk9PnIhPT12b2lkIDApLG49TWF0aC5tYXgoLi4udC5tYXAoKFtpXSk9PmkubGVuZ3RoKSk7cmV0dXJuIHQubWFwKChbaSxyXSk9PmkucGFkU3RhcnQobikrKHI/IiAiK3I6IiIpKS5qb2luKGAKYCl9ZnVuY3Rpb24gVG4oZSl7Y29uc3QgdD1lWzBdO3JldHVybiB0PT1udWxsfHwia2luZCJpbiB0fHwibGVuZ3RoImluIHQ/e25vZGVzOnQsc291cmNlOmVbMV0scG9zaXRpb25zOmVbMl0scGF0aDplWzNdLG9yaWdpbmFsRXJyb3I6ZVs0XSxleHRlbnNpb25zOmVbNV19OnR9Y2xhc3MgSmUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LC4uLm4pe3ZhciBpLHIscztjb25zdHtub2RlczphLHNvdXJjZTpjLHBvc2l0aW9uczpmLHBhdGg6ZCxvcmlnaW5hbEVycm9yOnUsZXh0ZW5zaW9uczp5fT1UbihuKTtzdXBlcih0KSx0aGlzLm5hbWU9IkdyYXBoUUxFcnJvciIsdGhpcy5wYXRoPWQhPW51bGw/ZDp2b2lkIDAsdGhpcy5vcmlnaW5hbEVycm9yPXUhPW51bGw/dTp2b2lkIDAsdGhpcy5ub2Rlcz1fdChBcnJheS5pc0FycmF5KGEpP2E6YT9bYV06dm9pZCAwKTtjb25zdCB2PV90KChpPXRoaXMubm9kZXMpPT09bnVsbHx8aT09PXZvaWQgMD92b2lkIDA6aS5tYXAobT0+bS5sb2MpLmZpbHRlcihtPT5tIT1udWxsKSk7dGhpcy5zb3VyY2U9YyE9bnVsbD9jOnY9PW51bGx8fChyPXZbMF0pPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zb3VyY2UsdGhpcy5wb3NpdGlvbnM9ZiE9bnVsbD9mOnY9PW51bGw/dm9pZCAwOnYubWFwKG09Pm0uc3RhcnQpLHRoaXMubG9jYXRpb25zPWYmJmM/Zi5tYXAobT0+WWUoYyxtKSk6dj09bnVsbD92b2lkIDA6di5tYXAobT0+WWUobS5zb3VyY2UsbS5zdGFydCkpO2NvbnN0IGI9Z24odT09bnVsbD92b2lkIDA6dS5leHRlbnNpb25zKT91PT1udWxsP3ZvaWQgMDp1LmV4dGVuc2lvbnM6dm9pZCAwO3RoaXMuZXh0ZW5zaW9ucz0ocz15IT1udWxsP3k6YikhPT1udWxsJiZzIT09dm9pZCAwP3M6T2JqZWN0LmNyZWF0ZShudWxsKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHttZXNzYWdlOnt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwfSxuYW1lOntlbnVtZXJhYmxlOiExfSxub2Rlczp7ZW51bWVyYWJsZTohMX0sc291cmNlOntlbnVtZXJhYmxlOiExfSxwb3NpdGlvbnM6e2VudW1lcmFibGU6ITF9LG9yaWdpbmFsRXJyb3I6e2VudW1lcmFibGU6ITF9fSksdSE9bnVsbCYmdS5zdGFjaz9PYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RhY2siLHt2YWx1ZTp1LnN0YWNrLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOkVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsSmUpOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzdGFjayIse3ZhbHVlOkVycm9yKCkuc3RhY2ssd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iR3JhcGhRTEVycm9yIn10b1N0cmluZygpe2xldCB0PXRoaXMubWVzc2FnZTtpZih0aGlzLm5vZGVzKWZvcihjb25zdCBuIG9mIHRoaXMubm9kZXMpbi5sb2MmJih0Kz1gCgpgK19uKG4ubG9jKSk7ZWxzZSBpZih0aGlzLnNvdXJjZSYmdGhpcy5sb2NhdGlvbnMpZm9yKGNvbnN0IG4gb2YgdGhpcy5sb2NhdGlvbnMpdCs9YAoKYCt2dCh0aGlzLnNvdXJjZSxuKTtyZXR1cm4gdH10b0pTT04oKXtjb25zdCB0PXttZXNzYWdlOnRoaXMubWVzc2FnZX07cmV0dXJuIHRoaXMubG9jYXRpb25zIT1udWxsJiYodC5sb2NhdGlvbnM9dGhpcy5sb2NhdGlvbnMpLHRoaXMucGF0aCE9bnVsbCYmKHQucGF0aD10aGlzLnBhdGgpLHRoaXMuZXh0ZW5zaW9ucyE9bnVsbCYmT2JqZWN0LmtleXModGhpcy5leHRlbnNpb25zKS5sZW5ndGg+MCYmKHQuZXh0ZW5zaW9ucz10aGlzLmV4dGVuc2lvbnMpLHR9fWZ1bmN0aW9uIF90KGUpe3JldHVybiBlPT09dm9pZCAwfHxlLmxlbmd0aD09PTA/dm9pZCAwOmV9ZnVuY3Rpb24gRyhlLHQsbil7cmV0dXJuIG5ldyBKZShgU3ludGF4IEVycm9yOiAke259YCx7c291cmNlOmUscG9zaXRpb25zOlt0XX0pfWNsYXNzIGJue2NvbnN0cnVjdG9yKHQsbixpKXt0aGlzLnN0YXJ0PXQuc3RhcnQsdGhpcy5lbmQ9bi5lbmQsdGhpcy5zdGFydFRva2VuPXQsdGhpcy5lbmRUb2tlbj1uLHRoaXMuc291cmNlPWl9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iTG9jYXRpb24ifXRvSlNPTigpe3JldHVybntzdGFydDp0aGlzLnN0YXJ0LGVuZDp0aGlzLmVuZH19fWNsYXNzIFR0e2NvbnN0cnVjdG9yKHQsbixpLHIscyxhKXt0aGlzLmtpbmQ9dCx0aGlzLnN0YXJ0PW4sdGhpcy5lbmQ9aSx0aGlzLmxpbmU9cix0aGlzLmNvbHVtbj1zLHRoaXMudmFsdWU9YSx0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbH1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJUb2tlbiJ9dG9KU09OKCl7cmV0dXJue2tpbmQ6dGhpcy5raW5kLHZhbHVlOnRoaXMudmFsdWUsbGluZTp0aGlzLmxpbmUsY29sdW1uOnRoaXMuY29sdW1ufX19Y29uc3QgYnQ9e05hbWU6W10sRG9jdW1lbnQ6WyJkZWZpbml0aW9ucyJdLE9wZXJhdGlvbkRlZmluaXRpb246WyJuYW1lIiwidmFyaWFibGVEZWZpbml0aW9ucyIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxWYXJpYWJsZURlZmluaXRpb246WyJ2YXJpYWJsZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJkaXJlY3RpdmVzIl0sVmFyaWFibGU6WyJuYW1lIl0sU2VsZWN0aW9uU2V0Olsic2VsZWN0aW9ucyJdLEZpZWxkOlsiYWxpYXMiLCJuYW1lIiwiYXJndW1lbnRzIiwiZGlyZWN0aXZlcyIsInNlbGVjdGlvblNldCJdLEFyZ3VtZW50OlsibmFtZSIsInZhbHVlIl0sRnJhZ21lbnRTcHJlYWQ6WyJuYW1lIiwiZGlyZWN0aXZlcyJdLElubGluZUZyYWdtZW50OlsidHlwZUNvbmRpdGlvbiIsImRpcmVjdGl2ZXMiLCJzZWxlY3Rpb25TZXQiXSxGcmFnbWVudERlZmluaXRpb246WyJuYW1lIiwidmFyaWFibGVEZWZpbml0aW9ucyIsInR5cGVDb25kaXRpb24iLCJkaXJlY3RpdmVzIiwic2VsZWN0aW9uU2V0Il0sSW50VmFsdWU6W10sRmxvYXRWYWx1ZTpbXSxTdHJpbmdWYWx1ZTpbXSxCb29sZWFuVmFsdWU6W10sTnVsbFZhbHVlOltdLEVudW1WYWx1ZTpbXSxMaXN0VmFsdWU6WyJ2YWx1ZXMiXSxPYmplY3RWYWx1ZTpbImZpZWxkcyJdLE9iamVjdEZpZWxkOlsibmFtZSIsInZhbHVlIl0sRGlyZWN0aXZlOlsibmFtZSIsImFyZ3VtZW50cyJdLE5hbWVkVHlwZTpbIm5hbWUiXSxMaXN0VHlwZTpbInR5cGUiXSxOb25OdWxsVHlwZTpbInR5cGUiXSxTY2hlbWFEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJkaXJlY3RpdmVzIiwib3BlcmF0aW9uVHlwZXMiXSxPcGVyYXRpb25UeXBlRGVmaW5pdGlvbjpbInR5cGUiXSxTY2FsYXJUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiXSxPYmplY3RUeXBlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sRmllbGREZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiYXJndW1lbnRzIiwidHlwZSIsImRpcmVjdGl2ZXMiXSxJbnB1dFZhbHVlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJkaXJlY3RpdmVzIl0sSW50ZXJmYWNlVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJpbnRlcmZhY2VzIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLFVuaW9uVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwidHlwZXMiXSxFbnVtVHlwZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJkaXJlY3RpdmVzIiwidmFsdWVzIl0sRW51bVZhbHVlRGVmaW5pdGlvbjpbImRlc2NyaXB0aW9uIiwibmFtZSIsImRpcmVjdGl2ZXMiXSxJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uOlsiZGVzY3JpcHRpb24iLCJuYW1lIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLERpcmVjdGl2ZURlZmluaXRpb246WyJkZXNjcmlwdGlvbiIsIm5hbWUiLCJhcmd1bWVudHMiLCJsb2NhdGlvbnMiXSxTY2hlbWFFeHRlbnNpb246WyJkaXJlY3RpdmVzIiwib3BlcmF0aW9uVHlwZXMiXSxTY2FsYXJUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiXSxPYmplY3RUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImludGVyZmFjZXMiLCJkaXJlY3RpdmVzIiwiZmllbGRzIl0sSW50ZXJmYWNlVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJpbnRlcmZhY2VzIiwiZGlyZWN0aXZlcyIsImZpZWxkcyJdLFVuaW9uVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJkaXJlY3RpdmVzIiwidHlwZXMiXSxFbnVtVHlwZUV4dGVuc2lvbjpbIm5hbWUiLCJkaXJlY3RpdmVzIiwidmFsdWVzIl0sSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uOlsibmFtZSIsImRpcmVjdGl2ZXMiLCJmaWVsZHMiXX0sTm49bmV3IFNldChPYmplY3Qua2V5cyhidCkpO2Z1bmN0aW9uIE50KGUpe2NvbnN0IHQ9ZT09bnVsbD92b2lkIDA6ZS5raW5kO3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJk5uLmhhcyh0KX12YXIgbGU7KGZ1bmN0aW9uKGUpe2UuUVVFUlk9InF1ZXJ5IixlLk1VVEFUSU9OPSJtdXRhdGlvbiIsZS5TVUJTQ1JJUFRJT049InN1YnNjcmlwdGlvbiJ9KShsZXx8KGxlPXt9KSk7dmFyIFFlOyhmdW5jdGlvbihlKXtlLlFVRVJZPSJRVUVSWSIsZS5NVVRBVElPTj0iTVVUQVRJT04iLGUuU1VCU0NSSVBUSU9OPSJTVUJTQ1JJUFRJT04iLGUuRklFTEQ9IkZJRUxEIixlLkZSQUdNRU5UX0RFRklOSVRJT049IkZSQUdNRU5UX0RFRklOSVRJT04iLGUuRlJBR01FTlRfU1BSRUFEPSJGUkFHTUVOVF9TUFJFQUQiLGUuSU5MSU5FX0ZSQUdNRU5UPSJJTkxJTkVfRlJBR01FTlQiLGUuVkFSSUFCTEVfREVGSU5JVElPTj0iVkFSSUFCTEVfREVGSU5JVElPTiIsZS5TQ0hFTUE9IlNDSEVNQSIsZS5TQ0FMQVI9IlNDQUxBUiIsZS5PQkpFQ1Q9Ik9CSkVDVCIsZS5GSUVMRF9ERUZJTklUSU9OPSJGSUVMRF9ERUZJTklUSU9OIixlLkFSR1VNRU5UX0RFRklOSVRJT049IkFSR1VNRU5UX0RFRklOSVRJT04iLGUuSU5URVJGQUNFPSJJTlRFUkZBQ0UiLGUuVU5JT049IlVOSU9OIixlLkVOVU09IkVOVU0iLGUuRU5VTV9WQUxVRT0iRU5VTV9WQUxVRSIsZS5JTlBVVF9PQkpFQ1Q9IklOUFVUX09CSkVDVCIsZS5JTlBVVF9GSUVMRF9ERUZJTklUSU9OPSJJTlBVVF9GSUVMRF9ERUZJTklUSU9OIn0pKFFlfHwoUWU9e30pKTt2YXIgVDsoZnVuY3Rpb24oZSl7ZS5OQU1FPSJOYW1lIixlLkRPQ1VNRU5UPSJEb2N1bWVudCIsZS5PUEVSQVRJT05fREVGSU5JVElPTj0iT3BlcmF0aW9uRGVmaW5pdGlvbiIsZS5WQVJJQUJMRV9ERUZJTklUSU9OPSJWYXJpYWJsZURlZmluaXRpb24iLGUuU0VMRUNUSU9OX1NFVD0iU2VsZWN0aW9uU2V0IixlLkZJRUxEPSJGaWVsZCIsZS5BUkdVTUVOVD0iQXJndW1lbnQiLGUuRlJBR01FTlRfU1BSRUFEPSJGcmFnbWVudFNwcmVhZCIsZS5JTkxJTkVfRlJBR01FTlQ9IklubGluZUZyYWdtZW50IixlLkZSQUdNRU5UX0RFRklOSVRJT049IkZyYWdtZW50RGVmaW5pdGlvbiIsZS5WQVJJQUJMRT0iVmFyaWFibGUiLGUuSU5UPSJJbnRWYWx1ZSIsZS5GTE9BVD0iRmxvYXRWYWx1ZSIsZS5TVFJJTkc9IlN0cmluZ1ZhbHVlIixlLkJPT0xFQU49IkJvb2xlYW5WYWx1ZSIsZS5OVUxMPSJOdWxsVmFsdWUiLGUuRU5VTT0iRW51bVZhbHVlIixlLkxJU1Q9Ikxpc3RWYWx1ZSIsZS5PQkpFQ1Q9Ik9iamVjdFZhbHVlIixlLk9CSkVDVF9GSUVMRD0iT2JqZWN0RmllbGQiLGUuRElSRUNUSVZFPSJEaXJlY3RpdmUiLGUuTkFNRURfVFlQRT0iTmFtZWRUeXBlIixlLkxJU1RfVFlQRT0iTGlzdFR5cGUiLGUuTk9OX05VTExfVFlQRT0iTm9uTnVsbFR5cGUiLGUuU0NIRU1BX0RFRklOSVRJT049IlNjaGVtYURlZmluaXRpb24iLGUuT1BFUkFUSU9OX1RZUEVfREVGSU5JVElPTj0iT3BlcmF0aW9uVHlwZURlZmluaXRpb24iLGUuU0NBTEFSX1RZUEVfREVGSU5JVElPTj0iU2NhbGFyVHlwZURlZmluaXRpb24iLGUuT0JKRUNUX1RZUEVfREVGSU5JVElPTj0iT2JqZWN0VHlwZURlZmluaXRpb24iLGUuRklFTERfREVGSU5JVElPTj0iRmllbGREZWZpbml0aW9uIixlLklOUFVUX1ZBTFVFX0RFRklOSVRJT049IklucHV0VmFsdWVEZWZpbml0aW9uIixlLklOVEVSRkFDRV9UWVBFX0RFRklOSVRJT049IkludGVyZmFjZVR5cGVEZWZpbml0aW9uIixlLlVOSU9OX1RZUEVfREVGSU5JVElPTj0iVW5pb25UeXBlRGVmaW5pdGlvbiIsZS5FTlVNX1RZUEVfREVGSU5JVElPTj0iRW51bVR5cGVEZWZpbml0aW9uIixlLkVOVU1fVkFMVUVfREVGSU5JVElPTj0iRW51bVZhbHVlRGVmaW5pdGlvbiIsZS5JTlBVVF9PQkpFQ1RfVFlQRV9ERUZJTklUSU9OPSJJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uIixlLkRJUkVDVElWRV9ERUZJTklUSU9OPSJEaXJlY3RpdmVEZWZpbml0aW9uIixlLlNDSEVNQV9FWFRFTlNJT049IlNjaGVtYUV4dGVuc2lvbiIsZS5TQ0FMQVJfVFlQRV9FWFRFTlNJT049IlNjYWxhclR5cGVFeHRlbnNpb24iLGUuT0JKRUNUX1RZUEVfRVhURU5TSU9OPSJPYmplY3RUeXBlRXh0ZW5zaW9uIixlLklOVEVSRkFDRV9UWVBFX0VYVEVOU0lPTj0iSW50ZXJmYWNlVHlwZUV4dGVuc2lvbiIsZS5VTklPTl9UWVBFX0VYVEVOU0lPTj0iVW5pb25UeXBlRXh0ZW5zaW9uIixlLkVOVU1fVFlQRV9FWFRFTlNJT049IkVudW1UeXBlRXh0ZW5zaW9uIixlLklOUFVUX09CSkVDVF9UWVBFX0VYVEVOU0lPTj0iSW5wdXRPYmplY3RUeXBlRXh0ZW5zaW9uIn0pKFR8fChUPXt9KSk7ZnVuY3Rpb24gWGUoZSl7cmV0dXJuIGU9PT05fHxlPT09MzJ9ZnVuY3Rpb24gTmUoZSl7cmV0dXJuIGU+PTQ4JiZlPD01N31mdW5jdGlvbiB4dChlKXtyZXR1cm4gZT49OTcmJmU8PTEyMnx8ZT49NjUmJmU8PTkwfWZ1bmN0aW9uIEF0KGUpe3JldHVybiB4dChlKXx8ZT09PTk1fWZ1bmN0aW9uIHhuKGUpe3JldHVybiB4dChlKXx8TmUoZSl8fGU9PT05NX1mdW5jdGlvbiBBbihlKXt2YXIgdDtsZXQgbj1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUixpPW51bGwscj0tMTtmb3IobGV0IGE9MDthPGUubGVuZ3RoOysrYSl7dmFyIHM7Y29uc3QgYz1lW2FdLGY9SW4oYyk7ZiE9PWMubGVuZ3RoJiYoaT0ocz1pKSE9PW51bGwmJnMhPT12b2lkIDA/czphLHI9YSxhIT09MCYmZjxuJiYobj1mKSl9cmV0dXJuIGUubWFwKChhLGMpPT5jPT09MD9hOmEuc2xpY2UobikpLnNsaWNlKCh0PWkpIT09bnVsbCYmdCE9PXZvaWQgMD90OjAscisxKX1mdW5jdGlvbiBJbihlKXtsZXQgdD0wO2Zvcig7dDxlLmxlbmd0aCYmWGUoZS5jaGFyQ29kZUF0KHQpKTspKyt0O3JldHVybiB0fWZ1bmN0aW9uIE9uKGUsdCl7Y29uc3Qgbj1lLnJlcGxhY2UoLyIiIi9nLCdcXCIiIicpLGk9bi5zcGxpdCgvXHJcbnxbXG5ccl0vZykscj1pLmxlbmd0aD09PTEscz1pLmxlbmd0aD4xJiZpLnNsaWNlKDEpLmV2ZXJ5KGI9PmIubGVuZ3RoPT09MHx8WGUoYi5jaGFyQ29kZUF0KDApKSksYT1uLmVuZHNXaXRoKCdcXCIiIicpLGM9ZS5lbmRzV2l0aCgnIicpJiYhYSxmPWUuZW5kc1dpdGgoIlxcIiksZD1jfHxmLHU9IXJ8fGUubGVuZ3RoPjcwfHxkfHxzfHxhO2xldCB5PSIiO2NvbnN0IHY9ciYmWGUoZS5jaGFyQ29kZUF0KDApKTtyZXR1cm4odSYmIXZ8fHMpJiYoeSs9YApgKSx5Kz1uLCh1fHxkKSYmKHkrPWAKYCksJyIiIicreSsnIiIiJ312YXIgbDsoZnVuY3Rpb24oZSl7ZS5TT0Y9IjxTT0Y+IixlLkVPRj0iPEVPRj4iLGUuQkFORz0iISIsZS5ET0xMQVI9IiQiLGUuQU1QPSImIixlLlBBUkVOX0w9IigiLGUuUEFSRU5fUj0iKSIsZS5TUFJFQUQ9Ii4uLiIsZS5DT0xPTj0iOiIsZS5FUVVBTFM9Ij0iLGUuQVQ9IkAiLGUuQlJBQ0tFVF9MPSJbIixlLkJSQUNLRVRfUj0iXSIsZS5CUkFDRV9MPSJ7IixlLlBJUEU9InwiLGUuQlJBQ0VfUj0ifSIsZS5OQU1FPSJOYW1lIixlLklOVD0iSW50IixlLkZMT0FUPSJGbG9hdCIsZS5TVFJJTkc9IlN0cmluZyIsZS5CTE9DS19TVFJJTkc9IkJsb2NrU3RyaW5nIixlLkNPTU1FTlQ9IkNvbW1lbnQifSkobHx8KGw9e30pKTtjbGFzcyBTbntjb25zdHJ1Y3Rvcih0KXtjb25zdCBuPW5ldyBUdChsLlNPRiwwLDAsMCwwKTt0aGlzLnNvdXJjZT10LHRoaXMubGFzdFRva2VuPW4sdGhpcy50b2tlbj1uLHRoaXMubGluZT0xLHRoaXMubGluZVN0YXJ0PTB9Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iTGV4ZXIifWFkdmFuY2UoKXtyZXR1cm4gdGhpcy5sYXN0VG9rZW49dGhpcy50b2tlbix0aGlzLnRva2VuPXRoaXMubG9va2FoZWFkKCl9bG9va2FoZWFkKCl7bGV0IHQ9dGhpcy50b2tlbjtpZih0LmtpbmQhPT1sLkVPRilkbyBpZih0Lm5leHQpdD10Lm5leHQ7ZWxzZXtjb25zdCBuPURuKHRoaXMsdC5lbmQpO3QubmV4dD1uLG4ucHJldj10LHQ9bn13aGlsZSh0LmtpbmQ9PT1sLkNPTU1FTlQpO3JldHVybiB0fX1mdW5jdGlvbiB3bihlKXtyZXR1cm4gZT09PWwuQkFOR3x8ZT09PWwuRE9MTEFSfHxlPT09bC5BTVB8fGU9PT1sLlBBUkVOX0x8fGU9PT1sLlBBUkVOX1J8fGU9PT1sLlNQUkVBRHx8ZT09PWwuQ09MT058fGU9PT1sLkVRVUFMU3x8ZT09PWwuQVR8fGU9PT1sLkJSQUNLRVRfTHx8ZT09PWwuQlJBQ0tFVF9SfHxlPT09bC5CUkFDRV9MfHxlPT09bC5QSVBFfHxlPT09bC5CUkFDRV9SfWZ1bmN0aW9uIGZlKGUpe3JldHVybiBlPj0wJiZlPD01NTI5NXx8ZT49NTczNDQmJmU8PTExMTQxMTF9ZnVuY3Rpb24gd2UoZSx0KXtyZXR1cm4gSXQoZS5jaGFyQ29kZUF0KHQpKSYmT3QoZS5jaGFyQ29kZUF0KHQrMSkpfWZ1bmN0aW9uIEl0KGUpe3JldHVybiBlPj01NTI5NiYmZTw9NTYzMTl9ZnVuY3Rpb24gT3QoZSl7cmV0dXJuIGU+PTU2MzIwJiZlPD01NzM0M31mdW5jdGlvbiBvZShlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keS5jb2RlUG9pbnRBdCh0KTtpZihuPT09dm9pZCAwKXJldHVybiBsLkVPRjtpZihuPj0zMiYmbjw9MTI2KXtjb25zdCBpPVN0cmluZy5mcm9tQ29kZVBvaW50KG4pO3JldHVybiBpPT09JyInP2AnIidgOmAiJHtpfSJgfXJldHVybiJVKyIrbi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKS5wYWRTdGFydCg0LCIwIil9ZnVuY3Rpb24gVihlLHQsbixpLHIpe2NvbnN0IHM9ZS5saW5lLGE9MStuLWUubGluZVN0YXJ0O3JldHVybiBuZXcgVHQodCxuLGkscyxhLHIpfWZ1bmN0aW9uIERuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dDtmb3IoO3I8aTspe2NvbnN0IHM9bi5jaGFyQ29kZUF0KHIpO3N3aXRjaChzKXtjYXNlIDY1Mjc5OmNhc2UgOTpjYXNlIDMyOmNhc2UgNDQ6KytyO2NvbnRpbnVlO2Nhc2UgMTA6KytyLCsrZS5saW5lLGUubGluZVN0YXJ0PXI7Y29udGludWU7Y2FzZSAxMzpuLmNoYXJDb2RlQXQocisxKT09PTEwP3IrPTI6KytyLCsrZS5saW5lLGUubGluZVN0YXJ0PXI7Y29udGludWU7Y2FzZSAzNTpyZXR1cm4gQ24oZSxyKTtjYXNlIDMzOnJldHVybiBWKGUsbC5CQU5HLHIscisxKTtjYXNlIDM2OnJldHVybiBWKGUsbC5ET0xMQVIscixyKzEpO2Nhc2UgMzg6cmV0dXJuIFYoZSxsLkFNUCxyLHIrMSk7Y2FzZSA0MDpyZXR1cm4gVihlLGwuUEFSRU5fTCxyLHIrMSk7Y2FzZSA0MTpyZXR1cm4gVihlLGwuUEFSRU5fUixyLHIrMSk7Y2FzZSA0NjppZihuLmNoYXJDb2RlQXQocisxKT09PTQ2JiZuLmNoYXJDb2RlQXQocisyKT09PTQ2KXJldHVybiBWKGUsbC5TUFJFQUQscixyKzMpO2JyZWFrO2Nhc2UgNTg6cmV0dXJuIFYoZSxsLkNPTE9OLHIscisxKTtjYXNlIDYxOnJldHVybiBWKGUsbC5FUVVBTFMscixyKzEpO2Nhc2UgNjQ6cmV0dXJuIFYoZSxsLkFULHIscisxKTtjYXNlIDkxOnJldHVybiBWKGUsbC5CUkFDS0VUX0wscixyKzEpO2Nhc2UgOTM6cmV0dXJuIFYoZSxsLkJSQUNLRVRfUixyLHIrMSk7Y2FzZSAxMjM6cmV0dXJuIFYoZSxsLkJSQUNFX0wscixyKzEpO2Nhc2UgMTI0OnJldHVybiBWKGUsbC5QSVBFLHIscisxKTtjYXNlIDEyNTpyZXR1cm4gVihlLGwuQlJBQ0VfUixyLHIrMSk7Y2FzZSAzNDpyZXR1cm4gbi5jaGFyQ29kZUF0KHIrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHIrMik9PT0zND9NbihlLHIpOlJuKGUscil9aWYoTmUocyl8fHM9PT00NSlyZXR1cm4ga24oZSxyLHMpO2lmKEF0KHMpKXJldHVybiAkbihlLHIpO3Rocm93IEcoZS5zb3VyY2UscixzPT09Mzk/YFVuZXhwZWN0ZWQgc2luZ2xlIHF1b3RlIGNoYXJhY3RlciAoJyksIGRpZCB5b3UgbWVhbiB0byB1c2UgYSBkb3VibGUgcXVvdGUgKCIpP2A6ZmUocyl8fHdlKG4scik/YFVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAke29lKGUscil9LmA6YEludmFsaWQgY2hhcmFjdGVyOiAke29lKGUscil9LmApfXJldHVybiBWKGUsbC5FT0YsaSxpKX1mdW5jdGlvbiBDbihlLHQpe2NvbnN0IG49ZS5zb3VyY2UuYm9keSxpPW4ubGVuZ3RoO2xldCByPXQrMTtmb3IoO3I8aTspe2NvbnN0IHM9bi5jaGFyQ29kZUF0KHIpO2lmKHM9PT0xMHx8cz09PTEzKWJyZWFrO2lmKGZlKHMpKSsrcjtlbHNlIGlmKHdlKG4scikpcis9MjtlbHNlIGJyZWFrfXJldHVybiBWKGUsbC5DT01NRU5ULHQscixuLnNsaWNlKHQrMSxyKSl9ZnVuY3Rpb24ga24oZSx0LG4pe2NvbnN0IGk9ZS5zb3VyY2UuYm9keTtsZXQgcj10LHM9bixhPSExO2lmKHM9PT00NSYmKHM9aS5jaGFyQ29kZUF0KCsrcikpLHM9PT00OCl7aWYocz1pLmNoYXJDb2RlQXQoKytyKSxOZShzKSl0aHJvdyBHKGUuc291cmNlLHIsYEludmFsaWQgbnVtYmVyLCB1bmV4cGVjdGVkIGRpZ2l0IGFmdGVyIDA6ICR7b2UoZSxyKX0uYCl9ZWxzZSByPVdlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKTtpZihzPT09NDYmJihhPSEwLHM9aS5jaGFyQ29kZUF0KCsrcikscj1XZShlLHIscykscz1pLmNoYXJDb2RlQXQocikpLChzPT09Njl8fHM9PT0xMDEpJiYoYT0hMCxzPWkuY2hhckNvZGVBdCgrK3IpLChzPT09NDN8fHM9PT00NSkmJihzPWkuY2hhckNvZGVBdCgrK3IpKSxyPVdlKGUscixzKSxzPWkuY2hhckNvZGVBdChyKSkscz09PTQ2fHxBdChzKSl0aHJvdyBHKGUuc291cmNlLHIsYEludmFsaWQgbnVtYmVyLCBleHBlY3RlZCBkaWdpdCBidXQgZ290OiAke29lKGUscil9LmApO3JldHVybiBWKGUsYT9sLkZMT0FUOmwuSU5ULHQscixpLnNsaWNlKHQscikpfWZ1bmN0aW9uIFdlKGUsdCxuKXtpZighTmUobikpdGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIG51bWJlciwgZXhwZWN0ZWQgZGlnaXQgYnV0IGdvdDogJHtvZShlLHQpfS5gKTtjb25zdCBpPWUuc291cmNlLmJvZHk7bGV0IHI9dCsxO2Zvcig7TmUoaS5jaGFyQ29kZUF0KHIpKTspKytyO3JldHVybiByfWZ1bmN0aW9uIFJuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxLHM9cixhPSIiO2Zvcig7cjxpOyl7Y29uc3QgYz1uLmNoYXJDb2RlQXQocik7aWYoYz09PTM0KXJldHVybiBhKz1uLnNsaWNlKHMsciksVihlLGwuU1RSSU5HLHQscisxLGEpO2lmKGM9PT05Mil7YSs9bi5zbGljZShzLHIpO2NvbnN0IGY9bi5jaGFyQ29kZUF0KHIrMSk9PT0xMTc/bi5jaGFyQ29kZUF0KHIrMik9PT0xMjM/UG4oZSxyKTpMbihlLHIpOkZuKGUscik7YSs9Zi52YWx1ZSxyKz1mLnNpemUscz1yO2NvbnRpbnVlfWlmKGM9PT0xMHx8Yz09PTEzKWJyZWFrO2lmKGZlKGMpKSsrcjtlbHNlIGlmKHdlKG4scikpcis9MjtlbHNlIHRocm93IEcoZS5zb3VyY2UscixgSW52YWxpZCBjaGFyYWN0ZXIgd2l0aGluIFN0cmluZzogJHtvZShlLHIpfS5gKX10aHJvdyBHKGUuc291cmNlLHIsIlVudGVybWluYXRlZCBzdHJpbmcuIil9ZnVuY3Rpb24gUG4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHk7bGV0IGk9MCxyPTM7Zm9yKDtyPDEyOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQodCtyKyspO2lmKHM9PT0xMjUpe2lmKHI8NXx8IWZlKGkpKWJyZWFrO3JldHVybnt2YWx1ZTpTdHJpbmcuZnJvbUNvZGVQb2ludChpKSxzaXplOnJ9fWlmKGk9aTw8NHx4ZShzKSxpPDApYnJlYWt9dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCtyKX0iLmApfWZ1bmN0aW9uIExuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9U3Qobix0KzIpO2lmKGZlKGkpKXJldHVybnt2YWx1ZTpTdHJpbmcuZnJvbUNvZGVQb2ludChpKSxzaXplOjZ9O2lmKEl0KGkpJiZuLmNoYXJDb2RlQXQodCs2KT09PTkyJiZuLmNoYXJDb2RlQXQodCs3KT09PTExNyl7Y29uc3Qgcj1TdChuLHQrOCk7aWYoT3QocikpcmV0dXJue3ZhbHVlOlN0cmluZy5mcm9tQ29kZVBvaW50KGksciksc2l6ZToxMn19dGhyb3cgRyhlLnNvdXJjZSx0LGBJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCs2KX0iLmApfWZ1bmN0aW9uIFN0KGUsdCl7cmV0dXJuIHhlKGUuY2hhckNvZGVBdCh0KSk8PDEyfHhlKGUuY2hhckNvZGVBdCh0KzEpKTw8OHx4ZShlLmNoYXJDb2RlQXQodCsyKSk8PDR8eGUoZS5jaGFyQ29kZUF0KHQrMykpfWZ1bmN0aW9uIHhlKGUpe3JldHVybiBlPj00OCYmZTw9NTc/ZS00ODplPj02NSYmZTw9NzA/ZS01NTplPj05NyYmZTw9MTAyP2UtODc6LTF9ZnVuY3Rpb24gRm4oZSx0KXtjb25zdCBuPWUuc291cmNlLmJvZHk7c3dpdGNoKG4uY2hhckNvZGVBdCh0KzEpKXtjYXNlIDM0OnJldHVybnt2YWx1ZTonIicsc2l6ZToyfTtjYXNlIDkyOnJldHVybnt2YWx1ZToiXFwiLHNpemU6Mn07Y2FzZSA0NzpyZXR1cm57dmFsdWU6Ii8iLHNpemU6Mn07Y2FzZSA5ODpyZXR1cm57dmFsdWU6IlxiIixzaXplOjJ9O2Nhc2UgMTAyOnJldHVybnt2YWx1ZToiXGYiLHNpemU6Mn07Y2FzZSAxMTA6cmV0dXJue3ZhbHVlOmAKYCxzaXplOjJ9O2Nhc2UgMTE0OnJldHVybnt2YWx1ZToiXHIiLHNpemU6Mn07Y2FzZSAxMTY6cmV0dXJue3ZhbHVlOiIJIixzaXplOjJ9fXRocm93IEcoZS5zb3VyY2UsdCxgSW52YWxpZCBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOiAiJHtuLnNsaWNlKHQsdCsyKX0iLmApfWZ1bmN0aW9uIE1uKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9ZS5saW5lU3RhcnQscz10KzMsYT1zLGM9IiI7Y29uc3QgZj1bXTtmb3IoO3M8aTspe2NvbnN0IGQ9bi5jaGFyQ29kZUF0KHMpO2lmKGQ9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMik9PT0zNCl7Yys9bi5zbGljZShhLHMpLGYucHVzaChjKTtjb25zdCB1PVYoZSxsLkJMT0NLX1NUUklORyx0LHMrMyxBbihmKS5qb2luKGAKYCkpO3JldHVybiBlLmxpbmUrPWYubGVuZ3RoLTEsZS5saW5lU3RhcnQ9cix1fWlmKGQ9PT05MiYmbi5jaGFyQ29kZUF0KHMrMSk9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMik9PT0zNCYmbi5jaGFyQ29kZUF0KHMrMyk9PT0zNCl7Yys9bi5zbGljZShhLHMpLGE9cysxLHMrPTQ7Y29udGludWV9aWYoZD09PTEwfHxkPT09MTMpe2MrPW4uc2xpY2UoYSxzKSxmLnB1c2goYyksZD09PTEzJiZuLmNoYXJDb2RlQXQocysxKT09PTEwP3MrPTI6KytzLGM9IiIsYT1zLHI9cztjb250aW51ZX1pZihmZShkKSkrK3M7ZWxzZSBpZih3ZShuLHMpKXMrPTI7ZWxzZSB0aHJvdyBHKGUuc291cmNlLHMsYEludmFsaWQgY2hhcmFjdGVyIHdpdGhpbiBTdHJpbmc6ICR7b2UoZSxzKX0uYCl9dGhyb3cgRyhlLnNvdXJjZSxzLCJVbnRlcm1pbmF0ZWQgc3RyaW5nLiIpfWZ1bmN0aW9uICRuKGUsdCl7Y29uc3Qgbj1lLnNvdXJjZS5ib2R5LGk9bi5sZW5ndGg7bGV0IHI9dCsxO2Zvcig7cjxpOyl7Y29uc3Qgcz1uLmNoYXJDb2RlQXQocik7aWYoeG4ocykpKytyO2Vsc2UgYnJlYWt9cmV0dXJuIFYoZSxsLk5BTUUsdCxyLG4uc2xpY2UodCxyKSl9Y29uc3QgQm49MTAsd3Q9MjtmdW5jdGlvbiBaZShlKXtyZXR1cm4gRGUoZSxbXSl9ZnVuY3Rpb24gRGUoZSx0KXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSk7Y2FzZSJmdW5jdGlvbiI6cmV0dXJuIGUubmFtZT9gW2Z1bmN0aW9uICR7ZS5uYW1lfV1gOiJbZnVuY3Rpb25dIjtjYXNlIm9iamVjdCI6cmV0dXJuIFVuKGUsdCk7ZGVmYXVsdDpyZXR1cm4gU3RyaW5nKGUpfX1mdW5jdGlvbiBVbihlLHQpe2lmKGU9PT1udWxsKXJldHVybiJudWxsIjtpZih0LmluY2x1ZGVzKGUpKXJldHVybiJbQ2lyY3VsYXJdIjtjb25zdCBuPVsuLi50LGVdO2lmKFZuKGUpKXtjb25zdCBpPWUudG9KU09OKCk7aWYoaSE9PWUpcmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj9pOkRlKGksbil9ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBxbihlLG4pO3JldHVybiBqbihlLG4pfWZ1bmN0aW9uIFZuKGUpe3JldHVybiB0eXBlb2YgZS50b0pTT049PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gam4oZSx0KXtjb25zdCBuPU9iamVjdC5lbnRyaWVzKGUpO3JldHVybiBuLmxlbmd0aD09PTA/Int9Ijp0Lmxlbmd0aD53dD8iWyIrR24oZSkrIl0iOiJ7ICIrbi5tYXAoKFtyLHNdKT0+cisiOiAiK0RlKHMsdCkpLmpvaW4oIiwgIikrIiB9In1mdW5jdGlvbiBxbihlLHQpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4iW10iO2lmKHQubGVuZ3RoPnd0KXJldHVybiJbQXJyYXldIjtjb25zdCBuPU1hdGgubWluKEJuLGUubGVuZ3RoKSxpPWUubGVuZ3RoLW4scj1bXTtmb3IobGV0IHM9MDtzPG47KytzKXIucHVzaChEZShlW3NdLHQpKTtyZXR1cm4gaT09PTE/ci5wdXNoKCIuLi4gMSBtb3JlIGl0ZW0iKTppPjEmJnIucHVzaChgLi4uICR7aX0gbW9yZSBpdGVtc2ApLCJbIityLmpvaW4oIiwgIikrIl0ifWZ1bmN0aW9uIEduKGUpe2NvbnN0IHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnJlcGxhY2UoL15cW29iamVjdCAvLCIiKS5yZXBsYWNlKC9dJC8sIiIpO2lmKHQ9PT0iT2JqZWN0IiYmdHlwZW9mIGUuY29uc3RydWN0b3I9PSJmdW5jdGlvbiIpe2NvbnN0IG49ZS5jb25zdHJ1Y3Rvci5uYW1lO2lmKHR5cGVvZiBuPT0ic3RyaW5nIiYmbiE9PSIiKXJldHVybiBufXJldHVybiB0fWNvbnN0IHpuPWdsb2JhbFRoaXMucHJvY2VzcyYmZ2xvYmFsVGhpcy5wcm9jZXNzLmVudi5OT0RFX0VOVj09PSJwcm9kdWN0aW9uIj9mdW5jdGlvbih0LG4pe3JldHVybiB0IGluc3RhbmNlb2Ygbn06ZnVuY3Rpb24odCxuKXtpZih0IGluc3RhbmNlb2YgbilyZXR1cm4hMDtpZih0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsKXt2YXIgaTtjb25zdCByPW4ucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ10scz1TeW1ib2wudG9TdHJpbmdUYWcgaW4gdD90W1N5bWJvbC50b1N0cmluZ1RhZ106KGk9dC5jb25zdHJ1Y3Rvcik9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLm5hbWU7aWYocj09PXMpe2NvbnN0IGE9WmUodCk7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlICR7cn0gIiR7YX0iIGZyb20gYW5vdGhlciBtb2R1bGUgb3IgcmVhbG0uCgpFbnN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiAiZ3JhcGhxbCIgaW4gdGhlIG5vZGVfbW9kdWxlcwpkaXJlY3RvcnkuIElmIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiAiZ3JhcGhxbCIgYXJlIHRoZSBkZXBlbmRlbmNpZXMgb2Ygb3RoZXIKcmVsaWVkIG9uIG1vZHVsZXMsIHVzZSAicmVzb2x1dGlvbnMiIHRvIGVuc3VyZSBvbmx5IG9uZSB2ZXJzaW9uIGlzIGluc3RhbGxlZC4KCmh0dHBzOi8veWFybnBrZy5jb20vZW4vZG9jcy9zZWxlY3RpdmUtdmVyc2lvbi1yZXNvbHV0aW9ucwoKRHVwbGljYXRlICJncmFwaHFsIiBtb2R1bGVzIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZGlmZmVyZW50CnZlcnNpb25zIG1heSBoYXZlIGRpZmZlcmVudCBjYXBhYmlsaXRpZXMgYW5kIGJlaGF2aW9yLiBUaGUgZGF0YSBmcm9tIG9uZQp2ZXJzaW9uIHVzZWQgaW4gdGhlIGZ1bmN0aW9uIGZyb20gYW5vdGhlciBjb3VsZCBwcm9kdWNlIGNvbmZ1c2luZyBhbmQKc3B1cmlvdXMgcmVzdWx0cy5gKX19cmV0dXJuITF9O2NsYXNzIER0e2NvbnN0cnVjdG9yKHQsbj0iR3JhcGhRTCByZXF1ZXN0IixpPXtsaW5lOjEsY29sdW1uOjF9KXt0eXBlb2YgdD09InN0cmluZyJ8fFNlKCExLGBCb2R5IG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkOiAke1plKHQpfS5gKSx0aGlzLmJvZHk9dCx0aGlzLm5hbWU9bix0aGlzLmxvY2F0aW9uT2Zmc2V0PWksdGhpcy5sb2NhdGlvbk9mZnNldC5saW5lPjB8fFNlKCExLCJsaW5lIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKSx0aGlzLmxvY2F0aW9uT2Zmc2V0LmNvbHVtbj4wfHxTZSghMSwiY29sdW1uIGluIGxvY2F0aW9uT2Zmc2V0IGlzIDEtaW5kZXhlZCBhbmQgbXVzdCBiZSBwb3NpdGl2ZS4iKX1nZXRbU3ltYm9sLnRvU3RyaW5nVGFnXSgpe3JldHVybiJTb3VyY2UifX1mdW5jdGlvbiBIbihlKXtyZXR1cm4gem4oZSxEdCl9ZnVuY3Rpb24gQ3QoZSx0KXtyZXR1cm4gbmV3IFluKGUsdCkucGFyc2VEb2N1bWVudCgpfWNsYXNzIFlue2NvbnN0cnVjdG9yKHQsbj17fSl7Y29uc3QgaT1Ibih0KT90Om5ldyBEdCh0KTt0aGlzLl9sZXhlcj1uZXcgU24oaSksdGhpcy5fb3B0aW9ucz1uLHRoaXMuX3Rva2VuQ291bnRlcj0wfXBhcnNlTmFtZSgpe2NvbnN0IHQ9dGhpcy5leHBlY3RUb2tlbihsLk5BTUUpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk5BTUUsdmFsdWU6dC52YWx1ZX0pfXBhcnNlRG9jdW1lbnQoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuRE9DVU1FTlQsZGVmaW5pdGlvbnM6dGhpcy5tYW55KGwuU09GLHRoaXMucGFyc2VEZWZpbml0aW9uLGwuRU9GKX0pfXBhcnNlRGVmaW5pdGlvbigpe2lmKHRoaXMucGVlayhsLkJSQUNFX0wpKXJldHVybiB0aGlzLnBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpO2NvbnN0IHQ9dGhpcy5wZWVrRGVzY3JpcHRpb24oKSxuPXQ/dGhpcy5fbGV4ZXIubG9va2FoZWFkKCk6dGhpcy5fbGV4ZXIudG9rZW47aWYobi5raW5kPT09bC5OQU1FKXtzd2l0Y2gobi52YWx1ZSl7Y2FzZSJzY2hlbWEiOnJldHVybiB0aGlzLnBhcnNlU2NoZW1hRGVmaW5pdGlvbigpO2Nhc2Uic2NhbGFyIjpyZXR1cm4gdGhpcy5wYXJzZVNjYWxhclR5cGVEZWZpbml0aW9uKCk7Y2FzZSJ0eXBlIjpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdFR5cGVEZWZpbml0aW9uKCk7Y2FzZSJpbnRlcmZhY2UiOnJldHVybiB0aGlzLnBhcnNlSW50ZXJmYWNlVHlwZURlZmluaXRpb24oKTtjYXNlInVuaW9uIjpyZXR1cm4gdGhpcy5wYXJzZVVuaW9uVHlwZURlZmluaXRpb24oKTtjYXNlImVudW0iOnJldHVybiB0aGlzLnBhcnNlRW51bVR5cGVEZWZpbml0aW9uKCk7Y2FzZSJpbnB1dCI6cmV0dXJuIHRoaXMucGFyc2VJbnB1dE9iamVjdFR5cGVEZWZpbml0aW9uKCk7Y2FzZSJkaXJlY3RpdmUiOnJldHVybiB0aGlzLnBhcnNlRGlyZWN0aXZlRGVmaW5pdGlvbigpfWlmKHQpdGhyb3cgRyh0aGlzLl9sZXhlci5zb3VyY2UsdGhpcy5fbGV4ZXIudG9rZW4uc3RhcnQsIlVuZXhwZWN0ZWQgZGVzY3JpcHRpb24sIGRlc2NyaXB0aW9ucyBhcmUgc3VwcG9ydGVkIG9ubHkgb24gdHlwZSBkZWZpbml0aW9ucy4iKTtzd2l0Y2gobi52YWx1ZSl7Y2FzZSJxdWVyeSI6Y2FzZSJtdXRhdGlvbiI6Y2FzZSJzdWJzY3JpcHRpb24iOnJldHVybiB0aGlzLnBhcnNlT3BlcmF0aW9uRGVmaW5pdGlvbigpO2Nhc2UiZnJhZ21lbnQiOnJldHVybiB0aGlzLnBhcnNlRnJhZ21lbnREZWZpbml0aW9uKCk7Y2FzZSJleHRlbmQiOnJldHVybiB0aGlzLnBhcnNlVHlwZVN5c3RlbUV4dGVuc2lvbigpfX10aHJvdyB0aGlzLnVuZXhwZWN0ZWQobil9cGFyc2VPcGVyYXRpb25EZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtpZih0aGlzLnBlZWsobC5CUkFDRV9MKSlyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5PUEVSQVRJT05fREVGSU5JVElPTixvcGVyYXRpb246bGUuUVVFUlksbmFtZTp2b2lkIDAsdmFyaWFibGVEZWZpbml0aW9uczpbXSxkaXJlY3RpdmVzOltdLHNlbGVjdGlvblNldDp0aGlzLnBhcnNlU2VsZWN0aW9uU2V0KCl9KTtjb25zdCBuPXRoaXMucGFyc2VPcGVyYXRpb25UeXBlKCk7bGV0IGk7cmV0dXJuIHRoaXMucGVlayhsLk5BTUUpJiYoaT10aGlzLnBhcnNlTmFtZSgpKSx0aGlzLm5vZGUodCx7a2luZDpULk9QRVJBVElPTl9ERUZJTklUSU9OLG9wZXJhdGlvbjpuLG5hbWU6aSx2YXJpYWJsZURlZmluaXRpb25zOnRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlT3BlcmF0aW9uVHlwZSgpe2NvbnN0IHQ9dGhpcy5leHBlY3RUb2tlbihsLk5BTUUpO3N3aXRjaCh0LnZhbHVlKXtjYXNlInF1ZXJ5IjpyZXR1cm4gbGUuUVVFUlk7Y2FzZSJtdXRhdGlvbiI6cmV0dXJuIGxlLk1VVEFUSU9OO2Nhc2Uic3Vic2NyaXB0aW9uIjpyZXR1cm4gbGUuU1VCU0NSSVBUSU9OfXRocm93IHRoaXMudW5leHBlY3RlZCh0KX1wYXJzZVZhcmlhYmxlRGVmaW5pdGlvbnMoKXtyZXR1cm4gdGhpcy5vcHRpb25hbE1hbnkobC5QQVJFTl9MLHRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb24sbC5QQVJFTl9SKX1wYXJzZVZhcmlhYmxlRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm5vZGUodGhpcy5fbGV4ZXIudG9rZW4se2tpbmQ6VC5WQVJJQUJMRV9ERUZJTklUSU9OLHZhcmlhYmxlOnRoaXMucGFyc2VWYXJpYWJsZSgpLHR5cGU6KHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5wYXJzZVR5cGVSZWZlcmVuY2UoKSksZGVmYXVsdFZhbHVlOnRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihsLkVRVUFMUyk/dGhpcy5wYXJzZUNvbnN0VmFsdWVMaXRlcmFsKCk6dm9pZCAwLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpfSl9cGFyc2VWYXJpYWJsZSgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5ET0xMQVIpLHRoaXMubm9kZSh0LHtraW5kOlQuVkFSSUFCTEUsbmFtZTp0aGlzLnBhcnNlTmFtZSgpfSl9cGFyc2VTZWxlY3Rpb25TZXQoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuU0VMRUNUSU9OX1NFVCxzZWxlY3Rpb25zOnRoaXMubWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZVNlbGVjdGlvbixsLkJSQUNFX1IpfSl9cGFyc2VTZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy5wZWVrKGwuU1BSRUFEKT90aGlzLnBhcnNlRnJhZ21lbnQoKTp0aGlzLnBhcnNlRmllbGQoKX1wYXJzZUZpZWxkKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VOYW1lKCk7bGV0IGkscjtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQ09MT04pPyhpPW4scj10aGlzLnBhcnNlTmFtZSgpKTpyPW4sdGhpcy5ub2RlKHQse2tpbmQ6VC5GSUVMRCxhbGlhczppLG5hbWU6cixhcmd1bWVudHM6dGhpcy5wYXJzZUFyZ3VtZW50cyghMSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGVlayhsLkJSQUNFX0wpP3RoaXMucGFyc2VTZWxlY3Rpb25TZXQoKTp2b2lkIDB9KX1wYXJzZUFyZ3VtZW50cyh0KXtjb25zdCBuPXQ/dGhpcy5wYXJzZUNvbnN0QXJndW1lbnQ6dGhpcy5wYXJzZUFyZ3VtZW50O3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLlBBUkVOX0wsbixsLlBBUkVOX1IpfXBhcnNlQXJndW1lbnQodD0hMSl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbixpPXRoaXMucGFyc2VOYW1lKCk7cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5ub2RlKG4se2tpbmQ6VC5BUkdVTUVOVCxuYW1lOmksdmFsdWU6dGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCh0KX0pfXBhcnNlQ29uc3RBcmd1bWVudCgpe3JldHVybiB0aGlzLnBhcnNlQXJndW1lbnQoITApfXBhcnNlRnJhZ21lbnQoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0VG9rZW4obC5TUFJFQUQpO2NvbnN0IG49dGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoIm9uIik7cmV0dXJuIW4mJnRoaXMucGVlayhsLk5BTUUpP3RoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfU1BSRUFELG5hbWU6dGhpcy5wYXJzZUZyYWdtZW50TmFtZSgpLGRpcmVjdGl2ZXM6dGhpcy5wYXJzZURpcmVjdGl2ZXMoITEpfSk6dGhpcy5ub2RlKHQse2tpbmQ6VC5JTkxJTkVfRlJBR01FTlQsdHlwZUNvbmRpdGlvbjpuP3RoaXMucGFyc2VOYW1lZFR5cGUoKTp2b2lkIDAsZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pfXBhcnNlRnJhZ21lbnREZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjtyZXR1cm4gdGhpcy5leHBlY3RLZXl3b3JkKCJmcmFnbWVudCIpLHRoaXMuX29wdGlvbnMuYWxsb3dMZWdhY3lGcmFnbWVudFZhcmlhYmxlcz09PSEwP3RoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfREVGSU5JVElPTixuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSx2YXJpYWJsZURlZmluaXRpb25zOnRoaXMucGFyc2VWYXJpYWJsZURlZmluaXRpb25zKCksdHlwZUNvbmRpdGlvbjoodGhpcy5leHBlY3RLZXl3b3JkKCJvbiIpLHRoaXMucGFyc2VOYW1lZFR5cGUoKSksZGlyZWN0aXZlczp0aGlzLnBhcnNlRGlyZWN0aXZlcyghMSksc2VsZWN0aW9uU2V0OnRoaXMucGFyc2VTZWxlY3Rpb25TZXQoKX0pOnRoaXMubm9kZSh0LHtraW5kOlQuRlJBR01FTlRfREVGSU5JVElPTixuYW1lOnRoaXMucGFyc2VGcmFnbWVudE5hbWUoKSx0eXBlQ29uZGl0aW9uOih0aGlzLmV4cGVjdEtleXdvcmQoIm9uIiksdGhpcy5wYXJzZU5hbWVkVHlwZSgpKSxkaXJlY3RpdmVzOnRoaXMucGFyc2VEaXJlY3RpdmVzKCExKSxzZWxlY3Rpb25TZXQ6dGhpcy5wYXJzZVNlbGVjdGlvblNldCgpfSl9cGFyc2VGcmFnbWVudE5hbWUoKXtpZih0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJvbiIpdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMucGFyc2VOYW1lKCl9cGFyc2VWYWx1ZUxpdGVyYWwodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtzd2l0Y2gobi5raW5kKXtjYXNlIGwuQlJBQ0tFVF9MOnJldHVybiB0aGlzLnBhcnNlTGlzdCh0KTtjYXNlIGwuQlJBQ0VfTDpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdCh0KTtjYXNlIGwuSU5UOnJldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZShuLHtraW5kOlQuSU5ULHZhbHVlOm4udmFsdWV9KTtjYXNlIGwuRkxPQVQ6cmV0dXJuIHRoaXMuYWR2YW5jZUxleGVyKCksdGhpcy5ub2RlKG4se2tpbmQ6VC5GTE9BVCx2YWx1ZTpuLnZhbHVlfSk7Y2FzZSBsLlNUUklORzpjYXNlIGwuQkxPQ0tfU1RSSU5HOnJldHVybiB0aGlzLnBhcnNlU3RyaW5nTGl0ZXJhbCgpO2Nhc2UgbC5OQU1FOnN3aXRjaCh0aGlzLmFkdmFuY2VMZXhlcigpLG4udmFsdWUpe2Nhc2UidHJ1ZSI6cmV0dXJuIHRoaXMubm9kZShuLHtraW5kOlQuQk9PTEVBTix2YWx1ZTohMH0pO2Nhc2UiZmFsc2UiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULkJPT0xFQU4sdmFsdWU6ITF9KTtjYXNlIm51bGwiOnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULk5VTEx9KTtkZWZhdWx0OnJldHVybiB0aGlzLm5vZGUobix7a2luZDpULkVOVU0sdmFsdWU6bi52YWx1ZX0pfWNhc2UgbC5ET0xMQVI6aWYodClpZih0aGlzLmV4cGVjdFRva2VuKGwuRE9MTEFSKSx0aGlzLl9sZXhlci50b2tlbi5raW5kPT09bC5OQU1FKXtjb25zdCBpPXRoaXMuX2xleGVyLnRva2VuLnZhbHVlO3Rocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLG4uc3RhcnQsYFVuZXhwZWN0ZWQgdmFyaWFibGUgIiQke2l9IiBpbiBjb25zdGFudCB2YWx1ZS5gKX1lbHNlIHRocm93IHRoaXMudW5leHBlY3RlZChuKTtyZXR1cm4gdGhpcy5wYXJzZVZhcmlhYmxlKCk7ZGVmYXVsdDp0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKX19cGFyc2VDb25zdFZhbHVlTGl0ZXJhbCgpe3JldHVybiB0aGlzLnBhcnNlVmFsdWVMaXRlcmFsKCEwKX1wYXJzZVN0cmluZ0xpdGVyYWwoKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmFkdmFuY2VMZXhlcigpLHRoaXMubm9kZSh0LHtraW5kOlQuU1RSSU5HLHZhbHVlOnQudmFsdWUsYmxvY2s6dC5raW5kPT09bC5CTE9DS19TVFJJTkd9KX1wYXJzZUxpc3QodCl7Y29uc3Qgbj0oKT0+dGhpcy5wYXJzZVZhbHVlTGl0ZXJhbCh0KTtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuTElTVCx2YWx1ZXM6dGhpcy5hbnkobC5CUkFDS0VUX0wsbixsLkJSQUNLRVRfUil9KX1wYXJzZU9iamVjdCh0KXtjb25zdCBuPSgpPT50aGlzLnBhcnNlT2JqZWN0RmllbGQodCk7cmV0dXJuIHRoaXMubm9kZSh0aGlzLl9sZXhlci50b2tlbix7a2luZDpULk9CSkVDVCxmaWVsZHM6dGhpcy5hbnkobC5CUkFDRV9MLG4sbC5CUkFDRV9SKX0pfXBhcnNlT2JqZWN0RmllbGQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbixpPXRoaXMucGFyc2VOYW1lKCk7cmV0dXJuIHRoaXMuZXhwZWN0VG9rZW4obC5DT0xPTiksdGhpcy5ub2RlKG4se2tpbmQ6VC5PQkpFQ1RfRklFTEQsbmFtZTppLHZhbHVlOnRoaXMucGFyc2VWYWx1ZUxpdGVyYWwodCl9KX1wYXJzZURpcmVjdGl2ZXModCl7Y29uc3Qgbj1bXTtmb3IoO3RoaXMucGVlayhsLkFUKTspbi5wdXNoKHRoaXMucGFyc2VEaXJlY3RpdmUodCkpO3JldHVybiBufXBhcnNlQ29uc3REaXJlY3RpdmVzKCl7cmV0dXJuIHRoaXMucGFyc2VEaXJlY3RpdmVzKCEwKX1wYXJzZURpcmVjdGl2ZSh0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO3JldHVybiB0aGlzLmV4cGVjdFRva2VuKGwuQVQpLHRoaXMubm9kZShuLHtraW5kOlQuRElSRUNUSVZFLG5hbWU6dGhpcy5wYXJzZU5hbWUoKSxhcmd1bWVudHM6dGhpcy5wYXJzZUFyZ3VtZW50cyh0KX0pfXBhcnNlVHlwZVJlZmVyZW5jZSgpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47bGV0IG47aWYodGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQlJBQ0tFVF9MKSl7Y29uc3QgaT10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpO3RoaXMuZXhwZWN0VG9rZW4obC5CUkFDS0VUX1IpLG49dGhpcy5ub2RlKHQse2tpbmQ6VC5MSVNUX1RZUEUsdHlwZTppfSl9ZWxzZSBuPXRoaXMucGFyc2VOYW1lZFR5cGUoKTtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuQkFORyk/dGhpcy5ub2RlKHQse2tpbmQ6VC5OT05fTlVMTF9UWVBFLHR5cGU6bn0pOm59cGFyc2VOYW1lZFR5cGUoKXtyZXR1cm4gdGhpcy5ub2RlKHRoaXMuX2xleGVyLnRva2VuLHtraW5kOlQuTkFNRURfVFlQRSxuYW1lOnRoaXMucGFyc2VOYW1lKCl9KX1wZWVrRGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5wZWVrKGwuU1RSSU5HKXx8dGhpcy5wZWVrKGwuQkxPQ0tfU1RSSU5HKX1wYXJzZURlc2NyaXB0aW9uKCl7aWYodGhpcy5wZWVrRGVzY3JpcHRpb24oKSlyZXR1cm4gdGhpcy5wYXJzZVN0cmluZ0xpdGVyYWwoKX1wYXJzZVNjaGVtYURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJzY2hlbWEiKTtjb25zdCBpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMubWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZU9wZXJhdGlvblR5cGVEZWZpbml0aW9uLGwuQlJBQ0VfUik7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuU0NIRU1BX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixkaXJlY3RpdmVzOmksb3BlcmF0aW9uVHlwZXM6cn0pfXBhcnNlT3BlcmF0aW9uVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZU9wZXJhdGlvblR5cGUoKTt0aGlzLmV4cGVjdFRva2VuKGwuQ09MT04pO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWVkVHlwZSgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9QRVJBVElPTl9UWVBFX0RFRklOSVRJT04sb3BlcmF0aW9uOm4sdHlwZTppfSl9cGFyc2VTY2FsYXJUeXBlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoInNjYWxhciIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5TQ0FMQVJfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cn0pfXBhcnNlT2JqZWN0VHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJ0eXBlIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUltcGxlbWVudHNJbnRlcmZhY2VzKCkscz10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCksYT10aGlzLnBhcnNlRmllbGRzRGVmaW5pdGlvbigpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9CSkVDVF9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksaW50ZXJmYWNlczpyLGRpcmVjdGl2ZXM6cyxmaWVsZHM6YX0pfXBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKXtyZXR1cm4gdGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoImltcGxlbWVudHMiKT90aGlzLmRlbGltaXRlZE1hbnkobC5BTVAsdGhpcy5wYXJzZU5hbWVkVHlwZSk6W119cGFyc2VGaWVsZHNEZWZpbml0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlRmllbGREZWZpbml0aW9uLGwuQlJBQ0VfUil9cGFyc2VGaWVsZERlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUFyZ3VtZW50RGVmcygpO3RoaXMuZXhwZWN0VG9rZW4obC5DT0xPTik7Y29uc3Qgcz10aGlzLnBhcnNlVHlwZVJlZmVyZW5jZSgpLGE9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULkZJRUxEX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksYXJndW1lbnRzOnIsdHlwZTpzLGRpcmVjdGl2ZXM6YX0pfXBhcnNlQXJndW1lbnREZWZzKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuUEFSRU5fTCx0aGlzLnBhcnNlSW5wdXRWYWx1ZURlZixsLlBBUkVOX1IpfXBhcnNlSW5wdXRWYWx1ZURlZigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKSxpPXRoaXMucGFyc2VOYW1lKCk7dGhpcy5leHBlY3RUb2tlbihsLkNPTE9OKTtjb25zdCByPXRoaXMucGFyc2VUeXBlUmVmZXJlbmNlKCk7bGV0IHM7dGhpcy5leHBlY3RPcHRpb25hbFRva2VuKGwuRVFVQUxTKSYmKHM9dGhpcy5wYXJzZUNvbnN0VmFsdWVMaXRlcmFsKCkpO2NvbnN0IGE9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULklOUFVUX1ZBTFVFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksdHlwZTpyLGRlZmF1bHRWYWx1ZTpzLGRpcmVjdGl2ZXM6YX0pfXBhcnNlSW50ZXJmYWNlVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJpbnRlcmZhY2UiKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlSW1wbGVtZW50c0ludGVyZmFjZXMoKSxzPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxhPXRoaXMucGFyc2VGaWVsZHNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuSU5URVJGQUNFX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxpbnRlcmZhY2VzOnIsZGlyZWN0aXZlczpzLGZpZWxkczphfSl9cGFyc2VVbmlvblR5cGVEZWZpbml0aW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbixuPXRoaXMucGFyc2VEZXNjcmlwdGlvbigpO3RoaXMuZXhwZWN0S2V5d29yZCgidW5pb24iKTtjb25zdCBpPXRoaXMucGFyc2VOYW1lKCkscj10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscz10aGlzLnBhcnNlVW5pb25NZW1iZXJUeXBlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlVOSU9OX1RZUEVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnIsdHlwZXM6c30pfXBhcnNlVW5pb25NZW1iZXJUeXBlcygpe3JldHVybiB0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4obC5FUVVBTFMpP3RoaXMuZGVsaW1pdGVkTWFueShsLlBJUEUsdGhpcy5wYXJzZU5hbWVkVHlwZSk6W119cGFyc2VFbnVtVHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJlbnVtIik7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUVudW1WYWx1ZXNEZWZpbml0aW9uKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRU5VTV9UWVBFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksZGlyZWN0aXZlczpyLHZhbHVlczpzfSl9cGFyc2VFbnVtVmFsdWVzRGVmaW5pdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbmFsTWFueShsLkJSQUNFX0wsdGhpcy5wYXJzZUVudW1WYWx1ZURlZmluaXRpb24sbC5CUkFDRV9SKX1wYXJzZUVudW1WYWx1ZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCksaT10aGlzLnBhcnNlRW51bVZhbHVlTmFtZSgpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULkVOVU1fVkFMVUVfREVGSU5JVElPTixkZXNjcmlwdGlvbjpuLG5hbWU6aSxkaXJlY3RpdmVzOnJ9KX1wYXJzZUVudW1WYWx1ZU5hbWUoKXtpZih0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJ0cnVlInx8dGhpcy5fbGV4ZXIudG9rZW4udmFsdWU9PT0iZmFsc2UifHx0aGlzLl9sZXhlci50b2tlbi52YWx1ZT09PSJudWxsIil0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSx0aGlzLl9sZXhlci50b2tlbi5zdGFydCxgJHtDZSh0aGlzLl9sZXhlci50b2tlbil9IGlzIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZCBmb3IgYW4gZW51bSB2YWx1ZS5gKTtyZXR1cm4gdGhpcy5wYXJzZU5hbWUoKX1wYXJzZUlucHV0T2JqZWN0VHlwZURlZmluaXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZURlc2NyaXB0aW9uKCk7dGhpcy5leHBlY3RLZXl3b3JkKCJpbnB1dCIpO2NvbnN0IGk9dGhpcy5wYXJzZU5hbWUoKSxyPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxzPXRoaXMucGFyc2VJbnB1dEZpZWxkc0RlZmluaXRpb24oKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5JTlBVVF9PQkpFQ1RfVFlQRV9ERUZJTklUSU9OLGRlc2NyaXB0aW9uOm4sbmFtZTppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlSW5wdXRGaWVsZHNEZWZpbml0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9uYWxNYW55KGwuQlJBQ0VfTCx0aGlzLnBhcnNlSW5wdXRWYWx1ZURlZixsLkJSQUNFX1IpfXBhcnNlVHlwZVN5c3RlbUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIubG9va2FoZWFkKCk7aWYodC5raW5kPT09bC5OQU1FKXN3aXRjaCh0LnZhbHVlKXtjYXNlInNjaGVtYSI6cmV0dXJuIHRoaXMucGFyc2VTY2hlbWFFeHRlbnNpb24oKTtjYXNlInNjYWxhciI6cmV0dXJuIHRoaXMucGFyc2VTY2FsYXJUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJ0eXBlIjpyZXR1cm4gdGhpcy5wYXJzZU9iamVjdFR5cGVFeHRlbnNpb24oKTtjYXNlImludGVyZmFjZSI6cmV0dXJuIHRoaXMucGFyc2VJbnRlcmZhY2VUeXBlRXh0ZW5zaW9uKCk7Y2FzZSJ1bmlvbiI6cmV0dXJuIHRoaXMucGFyc2VVbmlvblR5cGVFeHRlbnNpb24oKTtjYXNlImVudW0iOnJldHVybiB0aGlzLnBhcnNlRW51bVR5cGVFeHRlbnNpb24oKTtjYXNlImlucHV0IjpyZXR1cm4gdGhpcy5wYXJzZUlucHV0T2JqZWN0VHlwZUV4dGVuc2lvbigpfXRocm93IHRoaXMudW5leHBlY3RlZCh0KX1wYXJzZVNjaGVtYUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoInNjaGVtYSIpO2NvbnN0IG49dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLGk9dGhpcy5vcHRpb25hbE1hbnkobC5CUkFDRV9MLHRoaXMucGFyc2VPcGVyYXRpb25UeXBlRGVmaW5pdGlvbixsLkJSQUNFX1IpO2lmKG4ubGVuZ3RoPT09MCYmaS5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlNDSEVNQV9FWFRFTlNJT04sZGlyZWN0aXZlczpuLG9wZXJhdGlvblR5cGVzOml9KX1wYXJzZVNjYWxhclR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJzY2FsYXIiKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCk7aWYoaS5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlNDQUxBUl9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppfSl9cGFyc2VPYmplY3RUeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgidHlwZSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCYmcy5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULk9CSkVDVF9UWVBFX0VYVEVOU0lPTixuYW1lOm4saW50ZXJmYWNlczppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlSW50ZXJmYWNlVHlwZUV4dGVuc2lvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW47dGhpcy5leHBlY3RLZXl3b3JkKCJleHRlbmQiKSx0aGlzLmV4cGVjdEtleXdvcmQoImludGVyZmFjZSIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VJbXBsZW1lbnRzSW50ZXJmYWNlcygpLHI9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHM9dGhpcy5wYXJzZUZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCYmcy5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULklOVEVSRkFDRV9UWVBFX0VYVEVOU0lPTixuYW1lOm4saW50ZXJmYWNlczppLGRpcmVjdGl2ZXM6cixmaWVsZHM6c30pfXBhcnNlVW5pb25UeXBlRXh0ZW5zaW9uKCl7Y29uc3QgdD10aGlzLl9sZXhlci50b2tlbjt0aGlzLmV4cGVjdEtleXdvcmQoImV4dGVuZCIpLHRoaXMuZXhwZWN0S2V5d29yZCgidW5pb24iKTtjb25zdCBuPXRoaXMucGFyc2VOYW1lKCksaT10aGlzLnBhcnNlQ29uc3REaXJlY3RpdmVzKCkscj10aGlzLnBhcnNlVW5pb25NZW1iZXJUeXBlcygpO2lmKGkubGVuZ3RoPT09MCYmci5sZW5ndGg9PT0wKXRocm93IHRoaXMudW5leHBlY3RlZCgpO3JldHVybiB0aGlzLm5vZGUodCx7a2luZDpULlVOSU9OX1RZUEVfRVhURU5TSU9OLG5hbWU6bixkaXJlY3RpdmVzOmksdHlwZXM6cn0pfXBhcnNlRW51bVR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJlbnVtIik7Y29uc3Qgbj10aGlzLnBhcnNlTmFtZSgpLGk9dGhpcy5wYXJzZUNvbnN0RGlyZWN0aXZlcygpLHI9dGhpcy5wYXJzZUVudW1WYWx1ZXNEZWZpbml0aW9uKCk7aWYoaS5sZW5ndGg9PT0wJiZyLmxlbmd0aD09PTApdGhyb3cgdGhpcy51bmV4cGVjdGVkKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRU5VTV9UWVBFX0VYVEVOU0lPTixuYW1lOm4sZGlyZWN0aXZlczppLHZhbHVlczpyfSl9cGFyc2VJbnB1dE9iamVjdFR5cGVFeHRlbnNpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuO3RoaXMuZXhwZWN0S2V5d29yZCgiZXh0ZW5kIiksdGhpcy5leHBlY3RLZXl3b3JkKCJpbnB1dCIpO2NvbnN0IG49dGhpcy5wYXJzZU5hbWUoKSxpPXRoaXMucGFyc2VDb25zdERpcmVjdGl2ZXMoKSxyPXRoaXMucGFyc2VJbnB1dEZpZWxkc0RlZmluaXRpb24oKTtpZihpLmxlbmd0aD09PTAmJnIubGVuZ3RoPT09MCl0aHJvdyB0aGlzLnVuZXhwZWN0ZWQoKTtyZXR1cm4gdGhpcy5ub2RlKHQse2tpbmQ6VC5JTlBVVF9PQkpFQ1RfVFlQRV9FWFRFTlNJT04sbmFtZTpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pfXBhcnNlRGlyZWN0aXZlRGVmaW5pdGlvbigpe2NvbnN0IHQ9dGhpcy5fbGV4ZXIudG9rZW4sbj10aGlzLnBhcnNlRGVzY3JpcHRpb24oKTt0aGlzLmV4cGVjdEtleXdvcmQoImRpcmVjdGl2ZSIpLHRoaXMuZXhwZWN0VG9rZW4obC5BVCk7Y29uc3QgaT10aGlzLnBhcnNlTmFtZSgpLHI9dGhpcy5wYXJzZUFyZ3VtZW50RGVmcygpLHM9dGhpcy5leHBlY3RPcHRpb25hbEtleXdvcmQoInJlcGVhdGFibGUiKTt0aGlzLmV4cGVjdEtleXdvcmQoIm9uIik7Y29uc3QgYT10aGlzLnBhcnNlRGlyZWN0aXZlTG9jYXRpb25zKCk7cmV0dXJuIHRoaXMubm9kZSh0LHtraW5kOlQuRElSRUNUSVZFX0RFRklOSVRJT04sZGVzY3JpcHRpb246bixuYW1lOmksYXJndW1lbnRzOnIscmVwZWF0YWJsZTpzLGxvY2F0aW9uczphfSl9cGFyc2VEaXJlY3RpdmVMb2NhdGlvbnMoKXtyZXR1cm4gdGhpcy5kZWxpbWl0ZWRNYW55KGwuUElQRSx0aGlzLnBhcnNlRGlyZWN0aXZlTG9jYXRpb24pfXBhcnNlRGlyZWN0aXZlTG9jYXRpb24oKXtjb25zdCB0PXRoaXMuX2xleGVyLnRva2VuLG49dGhpcy5wYXJzZU5hbWUoKTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUWUsbi52YWx1ZSkpcmV0dXJuIG47dGhyb3cgdGhpcy51bmV4cGVjdGVkKHQpfW5vZGUodCxuKXtyZXR1cm4gdGhpcy5fb3B0aW9ucy5ub0xvY2F0aW9uIT09ITAmJihuLmxvYz1uZXcgYm4odCx0aGlzLl9sZXhlci5sYXN0VG9rZW4sdGhpcy5fbGV4ZXIuc291cmNlKSksbn1wZWVrKHQpe3JldHVybiB0aGlzLl9sZXhlci50b2tlbi5raW5kPT09dH1leHBlY3RUb2tlbih0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO2lmKG4ua2luZD09PXQpcmV0dXJuIHRoaXMuYWR2YW5jZUxleGVyKCksbjt0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBFeHBlY3RlZCAke2t0KHQpfSwgZm91bmQgJHtDZShuKX0uYCl9ZXhwZWN0T3B0aW9uYWxUb2tlbih0KXtyZXR1cm4gdGhpcy5fbGV4ZXIudG9rZW4ua2luZD09PXQ/KHRoaXMuYWR2YW5jZUxleGVyKCksITApOiExfWV4cGVjdEtleXdvcmQodCl7Y29uc3Qgbj10aGlzLl9sZXhlci50b2tlbjtpZihuLmtpbmQ9PT1sLk5BTUUmJm4udmFsdWU9PT10KXRoaXMuYWR2YW5jZUxleGVyKCk7ZWxzZSB0aHJvdyBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBFeHBlY3RlZCAiJHt0fSIsIGZvdW5kICR7Q2Uobil9LmApfWV4cGVjdE9wdGlvbmFsS2V5d29yZCh0KXtjb25zdCBuPXRoaXMuX2xleGVyLnRva2VuO3JldHVybiBuLmtpbmQ9PT1sLk5BTUUmJm4udmFsdWU9PT10Pyh0aGlzLmFkdmFuY2VMZXhlcigpLCEwKTohMX11bmV4cGVjdGVkKHQpe2NvbnN0IG49dCE9bnVsbD90OnRoaXMuX2xleGVyLnRva2VuO3JldHVybiBHKHRoaXMuX2xleGVyLnNvdXJjZSxuLnN0YXJ0LGBVbmV4cGVjdGVkICR7Q2Uobil9LmApfWFueSh0LG4saSl7dGhpcy5leHBlY3RUb2tlbih0KTtjb25zdCByPVtdO2Zvcig7IXRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihpKTspci5wdXNoKG4uY2FsbCh0aGlzKSk7cmV0dXJuIHJ9b3B0aW9uYWxNYW55KHQsbixpKXtpZih0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCkpe2NvbnN0IHI9W107ZG8gci5wdXNoKG4uY2FsbCh0aGlzKSk7d2hpbGUoIXRoaXMuZXhwZWN0T3B0aW9uYWxUb2tlbihpKSk7cmV0dXJuIHJ9cmV0dXJuW119bWFueSh0LG4saSl7dGhpcy5leHBlY3RUb2tlbih0KTtjb25zdCByPVtdO2RvIHIucHVzaChuLmNhbGwodGhpcykpO3doaWxlKCF0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4oaSkpO3JldHVybiByfWRlbGltaXRlZE1hbnkodCxuKXt0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCk7Y29uc3QgaT1bXTtkbyBpLnB1c2gobi5jYWxsKHRoaXMpKTt3aGlsZSh0aGlzLmV4cGVjdE9wdGlvbmFsVG9rZW4odCkpO3JldHVybiBpfWFkdmFuY2VMZXhlcigpe2NvbnN0e21heFRva2Vuczp0fT10aGlzLl9vcHRpb25zLG49dGhpcy5fbGV4ZXIuYWR2YW5jZSgpO2lmKHQhPT12b2lkIDAmJm4ua2luZCE9PWwuRU9GJiYoKyt0aGlzLl90b2tlbkNvdW50ZXIsdGhpcy5fdG9rZW5Db3VudGVyPnQpKXRocm93IEcodGhpcy5fbGV4ZXIuc291cmNlLG4uc3RhcnQsYERvY3VtZW50IGNvbnRhaW5zIG1vcmUgdGhhdCAke3R9IHRva2Vucy4gUGFyc2luZyBhYm9ydGVkLmApfX1mdW5jdGlvbiBDZShlKXtjb25zdCB0PWUudmFsdWU7cmV0dXJuIGt0KGUua2luZCkrKHQhPW51bGw/YCAiJHt0fSJgOiIiKX1mdW5jdGlvbiBrdChlKXtyZXR1cm4gd24oZSk/YCIke2V9ImA6ZX1mdW5jdGlvbiBKbihlKXtyZXR1cm5gIiR7ZS5yZXBsYWNlKFFuLFhuKX0iYH1jb25zdCBRbj0vW1x4MDAtXHgxZlx4MjJceDVjXHg3Zi1ceDlmXS9nO2Z1bmN0aW9uIFhuKGUpe3JldHVybiBXbltlLmNoYXJDb2RlQXQoMCldfWNvbnN0IFduPVsiXFx1MDAwMCIsIlxcdTAwMDEiLCJcXHUwMDAyIiwiXFx1MDAwMyIsIlxcdTAwMDQiLCJcXHUwMDA1IiwiXFx1MDAwNiIsIlxcdTAwMDciLCJcXGIiLCJcXHQiLCJcXG4iLCJcXHUwMDBCIiwiXFxmIiwiXFxyIiwiXFx1MDAwRSIsIlxcdTAwMEYiLCJcXHUwMDEwIiwiXFx1MDAxMSIsIlxcdTAwMTIiLCJcXHUwMDEzIiwiXFx1MDAxNCIsIlxcdTAwMTUiLCJcXHUwMDE2IiwiXFx1MDAxNyIsIlxcdTAwMTgiLCJcXHUwMDE5IiwiXFx1MDAxQSIsIlxcdTAwMUIiLCJcXHUwMDFDIiwiXFx1MDAxRCIsIlxcdTAwMUUiLCJcXHUwMDFGIiwiIiwiIiwnXFwiJywiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiXFxcXCIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIiIsIlxcdTAwN0YiLCJcXHUwMDgwIiwiXFx1MDA4MSIsIlxcdTAwODIiLCJcXHUwMDgzIiwiXFx1MDA4NCIsIlxcdTAwODUiLCJcXHUwMDg2IiwiXFx1MDA4NyIsIlxcdTAwODgiLCJcXHUwMDg5IiwiXFx1MDA4QSIsIlxcdTAwOEIiLCJcXHUwMDhDIiwiXFx1MDA4RCIsIlxcdTAwOEUiLCJcXHUwMDhGIiwiXFx1MDA5MCIsIlxcdTAwOTEiLCJcXHUwMDkyIiwiXFx1MDA5MyIsIlxcdTAwOTQiLCJcXHUwMDk1IiwiXFx1MDA5NiIsIlxcdTAwOTciLCJcXHUwMDk4IiwiXFx1MDA5OSIsIlxcdTAwOUEiLCJcXHUwMDlCIiwiXFx1MDA5QyIsIlxcdTAwOUQiLCJcXHUwMDlFIiwiXFx1MDA5RiJdLFpuPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEtuKGUsdCxuPWJ0KXtjb25zdCBpPW5ldyBNYXA7Zm9yKGNvbnN0IEUgb2YgT2JqZWN0LnZhbHVlcyhUKSlpLnNldChFLGVyKHQsRSkpO2xldCByLHM9QXJyYXkuaXNBcnJheShlKSxhPVtlXSxjPS0xLGY9W10sZD1lLHUseTtjb25zdCB2PVtdLGI9W107ZG97YysrO2NvbnN0IEU9Yz09PWEubGVuZ3RoLGs9RSYmZi5sZW5ndGghPT0wO2lmKEUpe2lmKHU9Yi5sZW5ndGg9PT0wP3ZvaWQgMDp2W3YubGVuZ3RoLTFdLGQ9eSx5PWIucG9wKCksaylpZihzKXtkPWQuc2xpY2UoKTtsZXQgTD0wO2Zvcihjb25zdFskLHFdb2YgZil7Y29uc3QgQj0kLUw7cT09PW51bGw/KGQuc3BsaWNlKEIsMSksTCsrKTpkW0JdPXF9fWVsc2V7ZD1PYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhkKSk7Zm9yKGNvbnN0W0wsJF1vZiBmKWRbTF09JH1jPXIuaW5kZXgsYT1yLmtleXMsZj1yLmVkaXRzLHM9ci5pbkFycmF5LHI9ci5wcmV2fWVsc2UgaWYoeSl7aWYodT1zP2M6YVtjXSxkPXlbdV0sZD09bnVsbCljb250aW51ZTt2LnB1c2godSl9bGV0IHc7aWYoIUFycmF5LmlzQXJyYXkoZCkpe3ZhciBtLE47TnQoZCl8fFNlKCExLGBJbnZhbGlkIEFTVCBOb2RlOiAke1plKGQpfS5gKTtjb25zdCBMPUU/KG09aS5nZXQoZC5raW5kKSk9PT1udWxsfHxtPT09dm9pZCAwP3ZvaWQgMDptLmxlYXZlOihOPWkuZ2V0KGQua2luZCkpPT09bnVsbHx8Tj09PXZvaWQgMD92b2lkIDA6Ti5lbnRlcjtpZih3PUw9PW51bGw/dm9pZCAwOkwuY2FsbCh0LGQsdSx5LHYsYiksdz09PVpuKWJyZWFrO2lmKHc9PT0hMSl7aWYoIUUpe3YucG9wKCk7Y29udGludWV9fWVsc2UgaWYodyE9PXZvaWQgMCYmKGYucHVzaChbdSx3XSksIUUpKWlmKE50KHcpKWQ9dztlbHNle3YucG9wKCk7Y29udGludWV9fWlmKHc9PT12b2lkIDAmJmsmJmYucHVzaChbdSxkXSksRSl2LnBvcCgpO2Vsc2V7dmFyIGc7cj17aW5BcnJheTpzLGluZGV4OmMsa2V5czphLGVkaXRzOmYscHJldjpyfSxzPUFycmF5LmlzQXJyYXkoZCksYT1zP2Q6KGc9bltkLmtpbmRdKSE9PW51bGwmJmchPT12b2lkIDA/ZzpbXSxjPS0xLGY9W10seSYmYi5wdXNoKHkpLHk9ZH19d2hpbGUociE9PXZvaWQgMCk7cmV0dXJuIGYubGVuZ3RoIT09MD9mW2YubGVuZ3RoLTFdWzFdOmV9ZnVuY3Rpb24gZXIoZSx0KXtjb25zdCBuPWVbdF07cmV0dXJuIHR5cGVvZiBuPT0ib2JqZWN0Ij9uOnR5cGVvZiBuPT0iZnVuY3Rpb24iP3tlbnRlcjpuLGxlYXZlOnZvaWQgMH06e2VudGVyOmUuZW50ZXIsbGVhdmU6ZS5sZWF2ZX19ZnVuY3Rpb24gdHIoZSl7cmV0dXJuIEtuKGUscnIpfWNvbnN0IG5yPTgwLHJyPXtOYW1lOntsZWF2ZTplPT5lLnZhbHVlfSxWYXJpYWJsZTp7bGVhdmU6ZT0+IiQiK2UubmFtZX0sRG9jdW1lbnQ6e2xlYXZlOmU9PnAoZS5kZWZpbml0aW9ucyxgCgpgKX0sT3BlcmF0aW9uRGVmaW5pdGlvbjp7bGVhdmUoZSl7Y29uc3QgdD1TKCIoIixwKGUudmFyaWFibGVEZWZpbml0aW9ucywiLCAiKSwiKSIpLG49cChbZS5vcGVyYXRpb24scChbZS5uYW1lLHRdKSxwKGUuZGlyZWN0aXZlcywiICIpXSwiICIpO3JldHVybihuPT09InF1ZXJ5Ij8iIjpuKyIgIikrZS5zZWxlY3Rpb25TZXR9fSxWYXJpYWJsZURlZmluaXRpb246e2xlYXZlOih7dmFyaWFibGU6ZSx0eXBlOnQsZGVmYXVsdFZhbHVlOm4sZGlyZWN0aXZlczppfSk9PmUrIjogIit0K1MoIiA9ICIsbikrUygiICIscChpLCIgIikpfSxTZWxlY3Rpb25TZXQ6e2xlYXZlOih7c2VsZWN0aW9uczplfSk9PlooZSl9LEZpZWxkOntsZWF2ZSh7YWxpYXM6ZSxuYW1lOnQsYXJndW1lbnRzOm4sZGlyZWN0aXZlczppLHNlbGVjdGlvblNldDpyfSl7Y29uc3Qgcz1TKCIiLGUsIjogIikrdDtsZXQgYT1zK1MoIigiLHAobiwiLCAiKSwiKSIpO3JldHVybiBhLmxlbmd0aD5uciYmKGE9cytTKGAoCmAsa2UocChuLGAKYCkpLGAKKWApKSxwKFthLHAoaSwiICIpLHJdLCIgIil9fSxBcmd1bWVudDp7bGVhdmU6KHtuYW1lOmUsdmFsdWU6dH0pPT5lKyI6ICIrdH0sRnJhZ21lbnRTcHJlYWQ6e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT4iLi4uIitlK1MoIiAiLHAodCwiICIpKX0sSW5saW5lRnJhZ21lbnQ6e2xlYXZlOih7dHlwZUNvbmRpdGlvbjplLGRpcmVjdGl2ZXM6dCxzZWxlY3Rpb25TZXQ6bn0pPT5wKFsiLi4uIixTKCJvbiAiLGUpLHAodCwiICIpLG5dLCIgIil9LEZyYWdtZW50RGVmaW5pdGlvbjp7bGVhdmU6KHtuYW1lOmUsdHlwZUNvbmRpdGlvbjp0LHZhcmlhYmxlRGVmaW5pdGlvbnM6bixkaXJlY3RpdmVzOmksc2VsZWN0aW9uU2V0OnJ9KT0+YGZyYWdtZW50ICR7ZX0ke1MoIigiLHAobiwiLCAiKSwiKSIpfSBvbiAke3R9ICR7UygiIixwKGksIiAiKSwiICIpfWArcn0sSW50VmFsdWU6e2xlYXZlOih7dmFsdWU6ZX0pPT5lfSxGbG9hdFZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sU3RyaW5nVmFsdWU6e2xlYXZlOih7dmFsdWU6ZSxibG9jazp0fSk9PnQ/T24oZSk6Sm4oZSl9LEJvb2xlYW5WYWx1ZTp7bGVhdmU6KHt2YWx1ZTplfSk9PmU/InRydWUiOiJmYWxzZSJ9LE51bGxWYWx1ZTp7bGVhdmU6KCk9PiJudWxsIn0sRW51bVZhbHVlOntsZWF2ZTooe3ZhbHVlOmV9KT0+ZX0sTGlzdFZhbHVlOntsZWF2ZTooe3ZhbHVlczplfSk9PiJbIitwKGUsIiwgIikrIl0ifSxPYmplY3RWYWx1ZTp7bGVhdmU6KHtmaWVsZHM6ZX0pPT4ieyIrcChlLCIsICIpKyJ9In0sT2JqZWN0RmllbGQ6e2xlYXZlOih7bmFtZTplLHZhbHVlOnR9KT0+ZSsiOiAiK3R9LERpcmVjdGl2ZTp7bGVhdmU6KHtuYW1lOmUsYXJndW1lbnRzOnR9KT0+IkAiK2UrUygiKCIscCh0LCIsICIpLCIpIil9LE5hbWVkVHlwZTp7bGVhdmU6KHtuYW1lOmV9KT0+ZX0sTGlzdFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PiJbIitlKyJdIn0sTm9uTnVsbFR5cGU6e2xlYXZlOih7dHlwZTplfSk9PmUrIiEifSxTY2hlbWFEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsZGlyZWN0aXZlczp0LG9wZXJhdGlvblR5cGVzOm59KT0+UygiIixlLGAKYCkrcChbInNjaGVtYSIscCh0LCIgIiksWihuKV0sIiAiKX0sT3BlcmF0aW9uVHlwZURlZmluaXRpb246e2xlYXZlOih7b3BlcmF0aW9uOmUsdHlwZTp0fSk9PmUrIjogIit0fSxTY2FsYXJUeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm59KT0+UygiIixlLGAKYCkrcChbInNjYWxhciIsdCxwKG4sIiAiKV0sIiAiKX0sT2JqZWN0VHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsaW50ZXJmYWNlczpuLGRpcmVjdGl2ZXM6aSxmaWVsZHM6cn0pPT5TKCIiLGUsYApgKStwKFsidHlwZSIsdCxTKCJpbXBsZW1lbnRzICIscChuLCIgJiAiKSkscChpLCIgIiksWihyKV0sIiAiKX0sRmllbGREZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGFyZ3VtZW50czpuLHR5cGU6aSxkaXJlY3RpdmVzOnJ9KT0+UygiIixlLGAKYCkrdCsoUnQobik/UyhgKApgLGtlKHAobixgCmApKSxgCilgKTpTKCIoIixwKG4sIiwgIiksIikiKSkrIjogIitpK1MoIiAiLHAociwiICIpKX0sSW5wdXRWYWx1ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsdHlwZTpuLGRlZmF1bHRWYWx1ZTppLGRpcmVjdGl2ZXM6cn0pPT5TKCIiLGUsYApgKStwKFt0KyI6ICIrbixTKCI9ICIsaSkscChyLCIgIildLCIgIil9LEludGVyZmFjZVR5cGVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGludGVyZmFjZXM6bixkaXJlY3RpdmVzOmksZmllbGRzOnJ9KT0+UygiIixlLGAKYCkrcChbImludGVyZmFjZSIsdCxTKCJpbXBsZW1lbnRzICIscChuLCIgJiAiKSkscChpLCIgIiksWihyKV0sIiAiKX0sVW5pb25UeXBlRGVmaW5pdGlvbjp7bGVhdmU6KHtkZXNjcmlwdGlvbjplLG5hbWU6dCxkaXJlY3RpdmVzOm4sdHlwZXM6aX0pPT5TKCIiLGUsYApgKStwKFsidW5pb24iLHQscChuLCIgIiksUygiPSAiLHAoaSwiIHwgIikpXSwiICIpfSxFbnVtVHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLHZhbHVlczppfSk9PlMoIiIsZSxgCmApK3AoWyJlbnVtIix0LHAobiwiICIpLFooaSldLCIgIil9LEVudW1WYWx1ZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpufSk9PlMoIiIsZSxgCmApK3AoW3QscChuLCIgIildLCIgIil9LElucHV0T2JqZWN0VHlwZURlZmluaXRpb246e2xlYXZlOih7ZGVzY3JpcHRpb246ZSxuYW1lOnQsZGlyZWN0aXZlczpuLGZpZWxkczppfSk9PlMoIiIsZSxgCmApK3AoWyJpbnB1dCIsdCxwKG4sIiAiKSxaKGkpXSwiICIpfSxEaXJlY3RpdmVEZWZpbml0aW9uOntsZWF2ZTooe2Rlc2NyaXB0aW9uOmUsbmFtZTp0LGFyZ3VtZW50czpuLHJlcGVhdGFibGU6aSxsb2NhdGlvbnM6cn0pPT5TKCIiLGUsYApgKSsiZGlyZWN0aXZlIEAiK3QrKFJ0KG4pP1MoYCgKYCxrZShwKG4sYApgKSksYAopYCk6UygiKCIscChuLCIsICIpLCIpIikpKyhpPyIgcmVwZWF0YWJsZSI6IiIpKyIgb24gIitwKHIsIiB8ICIpfSxTY2hlbWFFeHRlbnNpb246e2xlYXZlOih7ZGlyZWN0aXZlczplLG9wZXJhdGlvblR5cGVzOnR9KT0+cChbImV4dGVuZCBzY2hlbWEiLHAoZSwiICIpLFoodCldLCIgIil9LFNjYWxhclR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGRpcmVjdGl2ZXM6dH0pPT5wKFsiZXh0ZW5kIHNjYWxhciIsZSxwKHQsIiAiKV0sIiAiKX0sT2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsaW50ZXJmYWNlczp0LGRpcmVjdGl2ZXM6bixmaWVsZHM6aX0pPT5wKFsiZXh0ZW5kIHR5cGUiLGUsUygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLFooaSldLCIgIil9LEludGVyZmFjZVR5cGVFeHRlbnNpb246e2xlYXZlOih7bmFtZTplLGludGVyZmFjZXM6dCxkaXJlY3RpdmVzOm4sZmllbGRzOml9KT0+cChbImV4dGVuZCBpbnRlcmZhY2UiLGUsUygiaW1wbGVtZW50cyAiLHAodCwiICYgIikpLHAobiwiICIpLFooaSldLCIgIil9LFVuaW9uVHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LHR5cGVzOm59KT0+cChbImV4dGVuZCB1bmlvbiIsZSxwKHQsIiAiKSxTKCI9ICIscChuLCIgfCAiKSldLCIgIil9LEVudW1UeXBlRXh0ZW5zaW9uOntsZWF2ZTooe25hbWU6ZSxkaXJlY3RpdmVzOnQsdmFsdWVzOm59KT0+cChbImV4dGVuZCBlbnVtIixlLHAodCwiICIpLFoobildLCIgIil9LElucHV0T2JqZWN0VHlwZUV4dGVuc2lvbjp7bGVhdmU6KHtuYW1lOmUsZGlyZWN0aXZlczp0LGZpZWxkczpufSk9PnAoWyJleHRlbmQgaW5wdXQiLGUscCh0LCIgIiksWihuKV0sIiAiKX19O2Z1bmN0aW9uIHAoZSx0PSIiKXt2YXIgbjtyZXR1cm4obj1lPT1udWxsP3ZvaWQgMDplLmZpbHRlcihpPT5pKS5qb2luKHQpKSE9PW51bGwmJm4hPT12b2lkIDA/bjoiIn1mdW5jdGlvbiBaKGUpe3JldHVybiBTKGB7CmAsa2UocChlLGAKYCkpLGAKfWApfWZ1bmN0aW9uIFMoZSx0LG49IiIpe3JldHVybiB0IT1udWxsJiZ0IT09IiI/ZSt0K246IiJ9ZnVuY3Rpb24ga2UoZSl7cmV0dXJuIFMoIiAgIixlLnJlcGxhY2UoL1xuL2csYAogIGApKX1mdW5jdGlvbiBSdChlKXt2YXIgdDtyZXR1cm4odD1lPT1udWxsP3ZvaWQgMDplLnNvbWUobj0+bi5pbmNsdWRlcyhgCmApKSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6ITF9Y29uc3QgUHQ9ZT0+e3ZhciBpLHI7bGV0IHQ7Y29uc3Qgbj1lLmRlZmluaXRpb25zLmZpbHRlcihzPT5zLmtpbmQ9PT0iT3BlcmF0aW9uRGVmaW5pdGlvbiIpO3JldHVybiBuLmxlbmd0aD09PTEmJih0PShyPShpPW5bMF0pPT1udWxsP3ZvaWQgMDppLm5hbWUpPT1udWxsP3ZvaWQgMDpyLnZhbHVlKSx0fSxLZT1lPT57aWYodHlwZW9mIGU9PSJzdHJpbmciKXtsZXQgbjt0cnl7Y29uc3QgaT1DdChlKTtuPVB0KGkpfWNhdGNoKGkpe31yZXR1cm57cXVlcnk6ZSxvcGVyYXRpb25OYW1lOm59fWNvbnN0IHQ9UHQoZSk7cmV0dXJue3F1ZXJ5OnRyKGUpLG9wZXJhdGlvbk5hbWU6dH19O2NsYXNzIGhlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtjb25zdCBpPWAke2hlLmV4dHJhY3RNZXNzYWdlKHQpfTogJHtKU09OLnN0cmluZ2lmeSh7cmVzcG9uc2U6dCxyZXF1ZXN0Om59KX1gO3N1cGVyKGkpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLGhlLnByb3RvdHlwZSksdGhpcy5yZXNwb25zZT10LHRoaXMucmVxdWVzdD1uLHR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT09ImZ1bmN0aW9uIiYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxoZSl9c3RhdGljIGV4dHJhY3RNZXNzYWdlKHQpe3ZhciBuLGkscjtyZXR1cm4ocj0oaT0obj10LmVycm9ycyk9PW51bGw/dm9pZCAwOm5bMF0pPT1udWxsP3ZvaWQgMDppLm1lc3NhZ2UpIT1udWxsP3I6YEdyYXBoUUwgRXJyb3IgKENvZGU6ICR7dC5zdGF0dXN9KWB9fXZhciBpcj10eXBlb2YgZ2xvYmFsVGhpcyE9InVuZGVmaW5lZCI/Z2xvYmFsVGhpczp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9InVuZGVmaW5lZCI/Z2xvYmFsOnR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIj9zZWxmOnt9O2Z1bmN0aW9uIEx0KGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIGV0PXtleHBvcnRzOnt9fTsoZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2Ygc2VsZiE9InVuZGVmaW5lZCI/c2VsZjppcixpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcygpe3RoaXMuZmV0Y2g9ITEsdGhpcy5ET01FeGNlcHRpb249bi5ET01FeGNlcHRpb259cmV0dXJuIHMucHJvdG90eXBlPW4sbmV3IHN9KCk7KGZ1bmN0aW9uKHMpeyhmdW5jdGlvbihhKXt2YXIgYz17c2VhcmNoUGFyYW1zOiJVUkxTZWFyY2hQYXJhbXMiaW4gcyxpdGVyYWJsZToiU3ltYm9sImluIHMmJiJpdGVyYXRvciJpbiBTeW1ib2wsYmxvYjoiRmlsZVJlYWRlciJpbiBzJiYiQmxvYiJpbiBzJiZmdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEJsb2IsITB9Y2F0Y2gobyl7cmV0dXJuITF9fSgpLGZvcm1EYXRhOiJGb3JtRGF0YSJpbiBzLGFycmF5QnVmZmVyOiJBcnJheUJ1ZmZlciJpbiBzfTtmdW5jdGlvbiBmKG8pe3JldHVybiBvJiZEYXRhVmlldy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKX1pZihjLmFycmF5QnVmZmVyKXZhciBkPVsiW29iamVjdCBJbnQ4QXJyYXldIiwiW29iamVjdCBVaW50OEFycmF5XSIsIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIiwiW29iamVjdCBJbnQxNkFycmF5XSIsIltvYmplY3QgVWludDE2QXJyYXldIiwiW29iamVjdCBJbnQzMkFycmF5XSIsIltvYmplY3QgVWludDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDMyQXJyYXldIiwiW29iamVjdCBGbG9hdDY0QXJyYXldIl0sdT1BcnJheUJ1ZmZlci5pc1ZpZXd8fGZ1bmN0aW9uKG8pe3JldHVybiBvJiZkLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKT4tMX07ZnVuY3Rpb24geShvKXtpZih0eXBlb2YgbyE9InN0cmluZyImJihvPVN0cmluZyhvKSksL1teYS16MC05XC0jJCUmJyorLl5fYHx+XS9pLnRlc3QobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUiKTtyZXR1cm4gby50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHYobyl7cmV0dXJuIHR5cGVvZiBvIT0ic3RyaW5nIiYmKG89U3RyaW5nKG8pKSxvfWZ1bmN0aW9uIGIobyl7dmFyIGg9e25leHQ6ZnVuY3Rpb24oKXt2YXIgXz1vLnNoaWZ0KCk7cmV0dXJue2RvbmU6Xz09PXZvaWQgMCx2YWx1ZTpffX19O3JldHVybiBjLml0ZXJhYmxlJiYoaFtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIGh9KSxofWZ1bmN0aW9uIG0obyl7dGhpcy5tYXA9e30sbyBpbnN0YW5jZW9mIG0/by5mb3JFYWNoKGZ1bmN0aW9uKGgsXyl7dGhpcy5hcHBlbmQoXyxoKX0sdGhpcyk6QXJyYXkuaXNBcnJheShvKT9vLmZvckVhY2goZnVuY3Rpb24oaCl7dGhpcy5hcHBlbmQoaFswXSxoWzFdKX0sdGhpcyk6byYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZm9yRWFjaChmdW5jdGlvbihoKXt0aGlzLmFwcGVuZChoLG9baF0pfSx0aGlzKX1tLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obyxoKXtvPXkobyksaD12KGgpO3ZhciBfPXRoaXMubWFwW29dO3RoaXMubWFwW29dPV8/XysiLCAiK2g6aH0sbS5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKG8pe2RlbGV0ZSB0aGlzLm1hcFt5KG8pXX0sbS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKG8pe3JldHVybiBvPXkobyksdGhpcy5oYXMobyk/dGhpcy5tYXBbb106bnVsbH0sbS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG8pe3JldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eSh5KG8pKX0sbS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKG8saCl7dGhpcy5tYXBbeShvKV09dihoKX0sbS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihvLGgpe2Zvcih2YXIgXyBpbiB0aGlzLm1hcCl0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShfKSYmby5jYWxsKGgsdGhpcy5tYXBbX10sXyx0aGlzKX0sbS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciBvPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oaCxfKXtvLnB1c2goXyl9KSxiKG8pfSxtLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgbz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGgpe28ucHVzaChoKX0pLGIobyl9LG0ucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgbz1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGgsXyl7by5wdXNoKFtfLGhdKX0pLGIobyl9LGMuaXRlcmFibGUmJihtLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPW0ucHJvdG90eXBlLmVudHJpZXMpO2Z1bmN0aW9uIE4obyl7aWYoby5ib2R5VXNlZClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcigiQWxyZWFkeSByZWFkIikpO28uYm9keVVzZWQ9ITB9ZnVuY3Rpb24gZyhvKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oaCxfKXtvLm9ubG9hZD1mdW5jdGlvbigpe2goby5yZXN1bHQpfSxvLm9uZXJyb3I9ZnVuY3Rpb24oKXtfKG8uZXJyb3IpfX0pfWZ1bmN0aW9uIEUobyl7dmFyIGg9bmV3IEZpbGVSZWFkZXIsXz1nKGgpO3JldHVybiBoLnJlYWRBc0FycmF5QnVmZmVyKG8pLF99ZnVuY3Rpb24gayhvKXt2YXIgaD1uZXcgRmlsZVJlYWRlcixfPWcoaCk7cmV0dXJuIGgucmVhZEFzVGV4dChvKSxffWZ1bmN0aW9uIHcobyl7Zm9yKHZhciBoPW5ldyBVaW50OEFycmF5KG8pLF89bmV3IEFycmF5KGgubGVuZ3RoKSxBPTA7QTxoLmxlbmd0aDtBKyspX1tBXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGhbQV0pO3JldHVybiBfLmpvaW4oIiIpfWZ1bmN0aW9uIEwobyl7aWYoby5zbGljZSlyZXR1cm4gby5zbGljZSgwKTt2YXIgaD1uZXcgVWludDhBcnJheShvLmJ5dGVMZW5ndGgpO3JldHVybiBoLnNldChuZXcgVWludDhBcnJheShvKSksaC5idWZmZXJ9ZnVuY3Rpb24gJCgpe3JldHVybiB0aGlzLmJvZHlVc2VkPSExLHRoaXMuX2luaXRCb2R5PWZ1bmN0aW9uKG8pe3RoaXMuX2JvZHlJbml0PW8sbz90eXBlb2Ygbz09InN0cmluZyI/dGhpcy5fYm9keVRleHQ9bzpjLmJsb2ImJkJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2Yobyk/dGhpcy5fYm9keUJsb2I9bzpjLmZvcm1EYXRhJiZGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKT90aGlzLl9ib2R5Rm9ybURhdGE9bzpjLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG8pP3RoaXMuX2JvZHlUZXh0PW8udG9TdHJpbmcoKTpjLmFycmF5QnVmZmVyJiZjLmJsb2ImJmYobyk/KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcj1MKG8uYnVmZmVyKSx0aGlzLl9ib2R5SW5pdD1uZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpOmMuYXJyYXlCdWZmZXImJihBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihvKXx8dShvKSk/dGhpcy5fYm9keUFycmF5QnVmZmVyPUwobyk6dGhpcy5fYm9keVRleHQ9bz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk6dGhpcy5fYm9keVRleHQ9IiIsdGhpcy5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIil8fCh0eXBlb2Ygbz09InN0cmluZyI/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIiwidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Iik6dGhpcy5fYm9keUJsb2ImJnRoaXMuX2JvZHlCbG9iLnR5cGU/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIix0aGlzLl9ib2R5QmxvYi50eXBlKTpjLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG8pJiZ0aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpKX0sYy5ibG9iJiYodGhpcy5ibG9iPWZ1bmN0aW9uKCl7dmFyIG89Tih0aGlzKTtpZihvKXJldHVybiBvO2lmKHRoaXMuX2JvZHlCbG9iKXJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iIik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keVRleHRdKSl9LHRoaXMuYXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYm9keUFycmF5QnVmZmVyP04odGhpcyl8fFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpOnRoaXMuYmxvYigpLnRoZW4oRSl9KSx0aGlzLnRleHQ9ZnVuY3Rpb24oKXt2YXIgbz1OKHRoaXMpO2lmKG8pcmV0dXJuIG87aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIGsodGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHcodGhpcy5fYm9keUFycmF5QnVmZmVyKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0Iik7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dCl9LGMuZm9ybURhdGEmJih0aGlzLmZvcm1EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oTyl9KSx0aGlzLmpzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKX0sdGhpc312YXIgcT1bIkRFTEVURSIsIkdFVCIsIkhFQUQiLCJPUFRJT05TIiwiUE9TVCIsIlBVVCJdO2Z1bmN0aW9uIEIobyl7dmFyIGg9by50b1VwcGVyQ2FzZSgpO3JldHVybiBxLmluZGV4T2YoaCk+LTE/aDpvfWZ1bmN0aW9uIEkobyxoKXtoPWh8fHt9O3ZhciBfPWguYm9keTtpZihvIGluc3RhbmNlb2YgSSl7aWYoby5ib2R5VXNlZCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBbHJlYWR5IHJlYWQiKTt0aGlzLnVybD1vLnVybCx0aGlzLmNyZWRlbnRpYWxzPW8uY3JlZGVudGlhbHMsaC5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBtKG8uaGVhZGVycykpLHRoaXMubWV0aG9kPW8ubWV0aG9kLHRoaXMubW9kZT1vLm1vZGUsdGhpcy5zaWduYWw9by5zaWduYWwsIV8mJm8uX2JvZHlJbml0IT1udWxsJiYoXz1vLl9ib2R5SW5pdCxvLmJvZHlVc2VkPSEwKX1lbHNlIHRoaXMudXJsPVN0cmluZyhvKTtpZih0aGlzLmNyZWRlbnRpYWxzPWguY3JlZGVudGlhbHN8fHRoaXMuY3JlZGVudGlhbHN8fCJzYW1lLW9yaWdpbiIsKGguaGVhZGVyc3x8IXRoaXMuaGVhZGVycykmJih0aGlzLmhlYWRlcnM9bmV3IG0oaC5oZWFkZXJzKSksdGhpcy5tZXRob2Q9QihoLm1ldGhvZHx8dGhpcy5tZXRob2R8fCJHRVQiKSx0aGlzLm1vZGU9aC5tb2RlfHx0aGlzLm1vZGV8fG51bGwsdGhpcy5zaWduYWw9aC5zaWduYWx8fHRoaXMuc2lnbmFsLHRoaXMucmVmZXJyZXI9bnVsbCwodGhpcy5tZXRob2Q9PT0iR0VUInx8dGhpcy5tZXRob2Q9PT0iSEVBRCIpJiZfKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzIik7dGhpcy5faW5pdEJvZHkoXyl9SS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEkodGhpcyx7Ym9keTp0aGlzLl9ib2R5SW5pdH0pfTtmdW5jdGlvbiBPKG8pe3ZhciBoPW5ldyBGb3JtRGF0YTtyZXR1cm4gby50cmltKCkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKF8pe2lmKF8pe3ZhciBBPV8uc3BsaXQoIj0iKSxSPUEuc2hpZnQoKS5yZXBsYWNlKC9cKy9nLCIgIikseD1BLmpvaW4oIj0iKS5yZXBsYWNlKC9cKy9nLCIgIik7aC5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KFIpLGRlY29kZVVSSUNvbXBvbmVudCh4KSl9fSksaH1mdW5jdGlvbiBqKG8pe3ZhciBoPW5ldyBtLF89by5yZXBsYWNlKC9ccj9cbltcdCBdKy9nLCIgIik7cmV0dXJuIF8uc3BsaXQoL1xyP1xuLykuZm9yRWFjaChmdW5jdGlvbihBKXt2YXIgUj1BLnNwbGl0KCI6IikseD1SLnNoaWZ0KCkudHJpbSgpO2lmKHgpe3ZhciBzZT1SLmpvaW4oIjoiKS50cmltKCk7aC5hcHBlbmQoeCxzZSl9fSksaH0kLmNhbGwoSS5wcm90b3R5cGUpO2Z1bmN0aW9uIFUobyxoKXtofHwoaD17fSksdGhpcy50eXBlPSJkZWZhdWx0Iix0aGlzLnN0YXR1cz1oLnN0YXR1cz09PXZvaWQgMD8yMDA6aC5zdGF0dXMsdGhpcy5vaz10aGlzLnN0YXR1cz49MjAwJiZ0aGlzLnN0YXR1czwzMDAsdGhpcy5zdGF0dXNUZXh0PSJzdGF0dXNUZXh0ImluIGg/aC5zdGF0dXNUZXh0OiJPSyIsdGhpcy5oZWFkZXJzPW5ldyBtKGguaGVhZGVycyksdGhpcy51cmw9aC51cmx8fCIiLHRoaXMuX2luaXRCb2R5KG8pfSQuY2FsbChVLnByb3RvdHlwZSksVS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFUodGhpcy5fYm9keUluaXQse3N0YXR1czp0aGlzLnN0YXR1cyxzdGF0dXNUZXh0OnRoaXMuc3RhdHVzVGV4dCxoZWFkZXJzOm5ldyBtKHRoaXMuaGVhZGVycyksdXJsOnRoaXMudXJsfSl9LFUuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgbz1uZXcgVShudWxsLHtzdGF0dXM6MCxzdGF0dXNUZXh0OiIifSk7cmV0dXJuIG8udHlwZT0iZXJyb3IiLG99O3ZhciB6PVszMDEsMzAyLDMwMywzMDcsMzA4XTtVLnJlZGlyZWN0PWZ1bmN0aW9uKG8saCl7aWYoei5pbmRleE9mKGgpPT09LTEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgc3RhdHVzIGNvZGUiKTtyZXR1cm4gbmV3IFUobnVsbCx7c3RhdHVzOmgsaGVhZGVyczp7bG9jYXRpb246b319KX0sYS5ET01FeGNlcHRpb249cy5ET01FeGNlcHRpb247dHJ5e25ldyBhLkRPTUV4Y2VwdGlvbn1jYXRjaChvKXthLkRPTUV4Y2VwdGlvbj1mdW5jdGlvbihoLF8pe3RoaXMubWVzc2FnZT1oLHRoaXMubmFtZT1fO3ZhciBBPUVycm9yKGgpO3RoaXMuc3RhY2s9QS5zdGFja30sYS5ET01FeGNlcHRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxhLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5ET01FeGNlcHRpb259ZnVuY3Rpb24gWChvLGgpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihfLEEpe3ZhciBSPW5ldyBJKG8saCk7aWYoUi5zaWduYWwmJlIuc2lnbmFsLmFib3J0ZWQpcmV0dXJuIEEobmV3IGEuRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpKTt2YXIgeD1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24gc2UoKXt4LmFib3J0KCl9eC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgSD17c3RhdHVzOnguc3RhdHVzLHN0YXR1c1RleHQ6eC5zdGF0dXNUZXh0LGhlYWRlcnM6aih4LmdldEFsbFJlc3BvbnNlSGVhZGVycygpfHwiIil9O0gudXJsPSJyZXNwb25zZVVSTCJpbiB4P3gucmVzcG9uc2VVUkw6SC5oZWFkZXJzLmdldCgiWC1SZXF1ZXN0LVVSTCIpO3ZhciByZT0icmVzcG9uc2UiaW4geD94LnJlc3BvbnNlOngucmVzcG9uc2VUZXh0O18obmV3IFUocmUsSCkpfSx4Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9LHgub250aW1lb3V0PWZ1bmN0aW9uKCl7QShuZXcgVHlwZUVycm9yKCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkIikpfSx4Lm9uYWJvcnQ9ZnVuY3Rpb24oKXtBKG5ldyBhLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9LHgub3BlbihSLm1ldGhvZCxSLnVybCwhMCksUi5jcmVkZW50aWFscz09PSJpbmNsdWRlIj94LndpdGhDcmVkZW50aWFscz0hMDpSLmNyZWRlbnRpYWxzPT09Im9taXQiJiYoeC53aXRoQ3JlZGVudGlhbHM9ITEpLCJyZXNwb25zZVR5cGUiaW4geCYmYy5ibG9iJiYoeC5yZXNwb25zZVR5cGU9ImJsb2IiKSxSLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbihILHJlKXt4LnNldFJlcXVlc3RIZWFkZXIocmUsSCl9KSxSLnNpZ25hbCYmKFIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixzZSkseC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXt4LnJlYWR5U3RhdGU9PT00JiZSLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsc2UpfSkseC5zZW5kKHR5cGVvZiBSLl9ib2R5SW5pdD09InVuZGVmaW5lZCI/bnVsbDpSLl9ib2R5SW5pdCl9KX1yZXR1cm4gWC5wb2x5ZmlsbD0hMCxzLmZldGNofHwocy5mZXRjaD1YLHMuSGVhZGVycz1tLHMuUmVxdWVzdD1JLHMuUmVzcG9uc2U9VSksYS5IZWFkZXJzPW0sYS5SZXF1ZXN0PUksYS5SZXNwb25zZT1VLGEuZmV0Y2g9WCxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksYX0pKHt9KX0pKGkpLGkuZmV0Y2gucG9ueWZpbGw9ITAsZGVsZXRlIGkuZmV0Y2gucG9seWZpbGw7dmFyIHI9aTt0PXIuZmV0Y2gsdC5kZWZhdWx0PXIuZmV0Y2gsdC5mZXRjaD1yLmZldGNoLHQuSGVhZGVycz1yLkhlYWRlcnMsdC5SZXF1ZXN0PXIuUmVxdWVzdCx0LlJlc3BvbnNlPXIuUmVzcG9uc2UsZS5leHBvcnRzPXR9KShldCxldC5leHBvcnRzKTt2YXIgUmU9ZXQuZXhwb3J0cyxQZT1MdChSZSksc3I9TSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpQZX0sW1JlXSk7Y29uc3QgZGU9ZT0+e2xldCB0PXt9O3JldHVybiBlJiYodHlwZW9mIEhlYWRlcnMhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgSGVhZGVyc3x8c3ImJlJlLkhlYWRlcnMmJmUgaW5zdGFuY2VvZiBSZS5IZWFkZXJzP3Q9ZG4oZSk6QXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2goKFtuLGldKT0+e24mJmkhPT12b2lkIDAmJih0W25dPWkpfSk6dD1lKSx0fSxGdD1lPT5lLnJlcGxhY2UoLyhbXHMsXXwjW15cblxyXSspKy9nLCIgIikudHJpbSgpLGFyPWU9PntpZighQXJyYXkuaXNBcnJheShlLnF1ZXJ5KSl7Y29uc3QgaT1lLHI9W2BxdWVyeT0ke2VuY29kZVVSSUNvbXBvbmVudChGdChpLnF1ZXJ5KSl9YF07cmV0dXJuIGUudmFyaWFibGVzJiZyLnB1c2goYHZhcmlhYmxlcz0ke2VuY29kZVVSSUNvbXBvbmVudChpLmpzb25TZXJpYWxpemVyLnN0cmluZ2lmeShpLnZhcmlhYmxlcykpfWApLGkub3BlcmF0aW9uTmFtZSYmci5wdXNoKGBvcGVyYXRpb25OYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGkub3BlcmF0aW9uTmFtZSl9YCksci5qb2luKCImIil9aWYodHlwZW9mIGUudmFyaWFibGVzIT0idW5kZWZpbmVkIiYmIUFycmF5LmlzQXJyYXkoZS52YXJpYWJsZXMpKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGNyZWF0ZSBxdWVyeSB3aXRoIGdpdmVuIHZhcmlhYmxlIHR5cGUsIGFycmF5IGV4cGVjdGVkIik7Y29uc3QgdD1lLG49ZS5xdWVyeS5yZWR1Y2UoKGkscixzKT0+KGkucHVzaCh7cXVlcnk6RnQociksdmFyaWFibGVzOnQudmFyaWFibGVzP3QuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KHQudmFyaWFibGVzW3NdKTp2b2lkIDB9KSxpKSxbXSk7cmV0dXJuYHF1ZXJ5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQuanNvblNlcmlhbGl6ZXIuc3RyaW5naWZ5KG4pKX1gfSxvcj1lPT50PT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgTjtjb25zdHt1cmw6bixxdWVyeTppLHZhcmlhYmxlczpyLG9wZXJhdGlvbk5hbWU6cyxmZXRjaDphLGZldGNoT3B0aW9uczpjLG1pZGRsZXdhcmU6Zn09dCxkPVAoe30sdC5oZWFkZXJzKTtsZXQgdT0iIix5O2U9PT0iUE9TVCI/KHk9dXIoaSxyLHMsYy5qc29uU2VyaWFsaXplciksdHlwZW9mIHk9PSJzdHJpbmciJiYoZFsiQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL2pzb24iKSk6dT1hcih7cXVlcnk6aSx2YXJpYWJsZXM6cixvcGVyYXRpb25OYW1lOnMsanNvblNlcmlhbGl6ZXI6KE49Yy5qc29uU2VyaWFsaXplcikhPW51bGw/TjpIZX0pO2NvbnN0IHY9UCh7bWV0aG9kOmUsaGVhZGVyczpkLGJvZHk6eX0sYyk7bGV0IGI9bixtPXY7aWYoZil7Y29uc3QgZz15aWVsZCBQcm9taXNlLnJlc29sdmUoZihVZShQKHt9LHYpLHt1cmw6bixvcGVyYXRpb25OYW1lOnMsdmFyaWFibGVzOnJ9KSkpLHt1cmw6a309Zyx3PWdlKGcsWyJ1cmwiXSk7Yj1rLG09d31yZXR1cm4gdSYmKGI9YCR7Yn0/JHt1fWApLHlpZWxkIGEoYixtKX0pO2NsYXNzIGNye2NvbnN0cnVjdG9yKHQsbj17fSl7dGhpcy51cmw9dCx0aGlzLnJlcXVlc3RDb25maWc9bix0aGlzLnJhd1JlcXVlc3Q9KC4uLmkpPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdFtyLHMsYV09aSxjPW1uKHIscyxhKSxnPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczpmLGZldGNoOmQ9UGUsbWV0aG9kOnU9IlBPU1QiLHJlcXVlc3RNaWRkbGV3YXJlOnkscmVzcG9uc2VNaWRkbGV3YXJlOnZ9PWcsYj1nZShnLFsiaGVhZGVycyIsImZldGNoIiwibWV0aG9kIiwicmVxdWVzdE1pZGRsZXdhcmUiLCJyZXNwb25zZU1pZGRsZXdhcmUiXSkse3VybDptfT10aGlzO2Muc2lnbmFsIT09dm9pZCAwJiYoYi5zaWduYWw9Yy5zaWduYWwpO2NvbnN0e29wZXJhdGlvbk5hbWU6Tn09S2UoYy5xdWVyeSk7cmV0dXJuIHR0KHt1cmw6bSxxdWVyeTpjLnF1ZXJ5LHZhcmlhYmxlczpjLnZhcmlhYmxlcyxoZWFkZXJzOlAoUCh7fSxkZShudChmKSkpLGRlKGMucmVxdWVzdEhlYWRlcnMpKSxvcGVyYXRpb25OYW1lOk4sZmV0Y2g6ZCxtZXRob2Q6dSxmZXRjaE9wdGlvbnM6YixtaWRkbGV3YXJlOnl9KS50aGVuKEU9Pih2JiZ2KEUpLEUpKS5jYXRjaChFPT57dGhyb3cgdiYmdihFKSxFfSl9KX1yZXF1ZXN0KHQsLi4ubil7cmV0dXJuIFcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W2kscl09bixzPXBuKHQsaSxyKSxOPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczphLGZldGNoOmM9UGUsbWV0aG9kOmY9IlBPU1QiLHJlcXVlc3RNaWRkbGV3YXJlOmQscmVzcG9uc2VNaWRkbGV3YXJlOnV9PU4seT1nZShOLFsiaGVhZGVycyIsImZldGNoIiwibWV0aG9kIiwicmVxdWVzdE1pZGRsZXdhcmUiLCJyZXNwb25zZU1pZGRsZXdhcmUiXSkse3VybDp2fT10aGlzO3Muc2lnbmFsIT09dm9pZCAwJiYoeS5zaWduYWw9cy5zaWduYWwpO2NvbnN0e3F1ZXJ5OmIsb3BlcmF0aW9uTmFtZTptfT1LZShzLmRvY3VtZW50KTtyZXR1cm4gdHQoe3VybDp2LHF1ZXJ5OmIsdmFyaWFibGVzOnMudmFyaWFibGVzLGhlYWRlcnM6UChQKHt9LGRlKG50KGEpKSksZGUocy5yZXF1ZXN0SGVhZGVycykpLG9wZXJhdGlvbk5hbWU6bSxmZXRjaDpjLG1ldGhvZDpmLGZldGNoT3B0aW9uczp5LG1pZGRsZXdhcmU6ZH0pLnRoZW4oZz0+KHUmJnUoZyksZy5kYXRhKSkuY2F0Y2goZz0+e3Rocm93IHUmJnUoZyksZ30pfSl9YmF0Y2hSZXF1ZXN0cyh0LG4pe3ZhciBkO2NvbnN0IGk9eW4odCxuKSxmPXRoaXMucmVxdWVzdENvbmZpZyx7aGVhZGVyczpyfT1mLHM9Z2UoZixbImhlYWRlcnMiXSk7aS5zaWduYWwhPT12b2lkIDAmJihzLnNpZ25hbD1pLnNpZ25hbCk7Y29uc3QgYT1pLmRvY3VtZW50cy5tYXAoKHtkb2N1bWVudDp1fSk9PktlKHUpLnF1ZXJ5KSxjPWkuZG9jdW1lbnRzLm1hcCgoe3ZhcmlhYmxlczp1fSk9PnUpO3JldHVybiB0dCh7dXJsOnRoaXMudXJsLHF1ZXJ5OmEsdmFyaWFibGVzOmMsaGVhZGVyczpQKFAoe30sZGUobnQocikpKSxkZShpLnJlcXVlc3RIZWFkZXJzKSksb3BlcmF0aW9uTmFtZTp2b2lkIDAsZmV0Y2g6KGQ9dGhpcy5yZXF1ZXN0Q29uZmlnLmZldGNoKSE9bnVsbD9kOlBlLG1ldGhvZDp0aGlzLnJlcXVlc3RDb25maWcubWV0aG9kfHwiUE9TVCIsZmV0Y2hPcHRpb25zOnMsbWlkZGxld2FyZTp0aGlzLnJlcXVlc3RDb25maWcucmVxdWVzdE1pZGRsZXdhcmV9KS50aGVuKHU9Pih0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlJiZ0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlKHUpLHUuZGF0YSkpLmNhdGNoKHU9Pnt0aHJvdyB0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlJiZ0aGlzLnJlcXVlc3RDb25maWcucmVzcG9uc2VNaWRkbGV3YXJlKHUpLHV9KX1zZXRIZWFkZXJzKHQpe3JldHVybiB0aGlzLnJlcXVlc3RDb25maWcuaGVhZGVycz10LHRoaXN9c2V0SGVhZGVyKHQsbil7Y29uc3R7aGVhZGVyczppfT10aGlzLnJlcXVlc3RDb25maWc7cmV0dXJuIGk/aVt0XT1uOnRoaXMucmVxdWVzdENvbmZpZy5oZWFkZXJzPXtbdF06bn0sdGhpc31zZXRFbmRwb2ludCh0KXtyZXR1cm4gdGhpcy51cmw9dCx0aGlzfX1jb25zdCB0dD1lPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt2YXIgdSx5O2NvbnN0e3F1ZXJ5OnQsdmFyaWFibGVzOm4sZmV0Y2hPcHRpb25zOml9PWUscj1vcihobigodT1lLm1ldGhvZCkhPW51bGw/dToicG9zdCIpKSxzPUFycmF5LmlzQXJyYXkoZS5xdWVyeSksYT15aWVsZCByKGUpLGM9eWllbGQgbHIoYSwoeT1pLmpzb25TZXJpYWxpemVyKSE9bnVsbD95OkhlKSxmPUFycmF5LmlzQXJyYXkoYyk/IWMuc29tZSgoe2RhdGE6Yn0pPT4hYik6ISFjLmRhdGEsZD1BcnJheS5pc0FycmF5KGMpfHwhYy5lcnJvcnN8fEFycmF5LmlzQXJyYXkoYy5lcnJvcnMpJiYhYy5lcnJvcnMubGVuZ3RofHxpLmVycm9yUG9saWN5PT09ImFsbCJ8fGkuZXJyb3JQb2xpY3k9PT0iaWdub3JlIjtpZihhLm9rJiZkJiZmKXtjb25zdCB2PShBcnJheS5pc0FycmF5KGMpLGMpLHtlcnJvcnM6Yn09dixtPWdlKHYsWyJlcnJvcnMiXSksTj1pLmVycm9yUG9saWN5PT09Imlnbm9yZSI/bTpjO3JldHVybiBVZShQKHt9LHM/e2RhdGE6Tn06Tikse2hlYWRlcnM6YS5oZWFkZXJzLHN0YXR1czphLnN0YXR1c30pfWVsc2V7Y29uc3QgYj10eXBlb2YgYz09InN0cmluZyI/e2Vycm9yOmN9OmM7dGhyb3cgbmV3IGhlKFVlKFAoe30sYikse3N0YXR1czphLnN0YXR1cyxoZWFkZXJzOmEuaGVhZGVyc30pLHtxdWVyeTp0LHZhcmlhYmxlczpufSl9fSksdXI9KGUsdCxuLGkpPT57Y29uc3Qgcj1pIT1udWxsP2k6SGU7aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHIuc3RyaW5naWZ5KHtxdWVyeTplLHZhcmlhYmxlczp0LG9wZXJhdGlvbk5hbWU6bn0pO2lmKHR5cGVvZiB0IT0idW5kZWZpbmVkIiYmIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIHJlcXVlc3QgYm9keSB3aXRoIGdpdmVuIHZhcmlhYmxlIHR5cGUsIGFycmF5IGV4cGVjdGVkIik7Y29uc3Qgcz1lLnJlZHVjZSgoYSxjLGYpPT4oYS5wdXNoKHtxdWVyeTpjLHZhcmlhYmxlczp0P3RbZl06dm9pZCAwfSksYSksW10pO3JldHVybiByLnN0cmluZ2lmeShzKX0sbHI9KGUsdCk9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2xldCBuO3JldHVybiBlLmhlYWRlcnMuZm9yRWFjaCgoaSxyKT0+e3IudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiJiYobj1pKX0pLG4mJihuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vanNvbiIpfHxuLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiYXBwbGljYXRpb24vZ3JhcGhxbCtqc29uIil8fG4udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJhcHBsaWNhdGlvbi9ncmFwaHFsLXJlc3BvbnNlK2pzb24iKSk/dC5wYXJzZSh5aWVsZCBlLnRleHQoKSk6ZS50ZXh0KCl9KSxudD1lPT50eXBlb2YgZT09ImZ1bmN0aW9uIj9lKCk6ZTt2YXIgcnQ9e2V4cG9ydHM6e319OyhmdW5jdGlvbihlLHQpe3Q9ZS5leHBvcnRzPW4sdC5nZXRTZXJpYWxpemU9aTtmdW5jdGlvbiBuKHIscyxhLGMpe3JldHVybiBKU09OLnN0cmluZ2lmeShyLGkocyxjKSxhKX1mdW5jdGlvbiBpKHIscyl7dmFyIGE9W10sYz1bXTtyZXR1cm4gcz09bnVsbCYmKHM9ZnVuY3Rpb24oZixkKXtyZXR1cm4gYVswXT09PWQ/IltDaXJjdWxhciB+XSI6IltDaXJjdWxhciB+LiIrYy5zbGljZSgwLGEuaW5kZXhPZihkKSkuam9pbigiLiIpKyJdIn0pLGZ1bmN0aW9uKGYsZCl7aWYoYS5sZW5ndGg+MCl7dmFyIHU9YS5pbmRleE9mKHRoaXMpO351P2Euc3BsaWNlKHUrMSk6YS5wdXNoKHRoaXMpLH51P2Muc3BsaWNlKHUsMS8wLGYpOmMucHVzaChmKSx+YS5pbmRleE9mKGQpJiYoZD1zLmNhbGwodGhpcyxmLGQpKX1lbHNlIGEucHVzaChkKTtyZXR1cm4gcj09bnVsbD9kOnIuY2FsbCh0aGlzLGYsZCl9fX0pKHJ0LHJ0LmV4cG9ydHMpO3ZhciBmcj1ydC5leHBvcnRzLHBlPUx0KGZyKTtjb25zdCBNdD0xZTMqMTU7dmFyIExlPWZ1bmN0aW9uKCl7cmV0dXJuIExlPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPTEscj1hcmd1bWVudHMubGVuZ3RoO2k8cjtpKyspe249YXJndW1lbnRzW2ldO2Zvcih2YXIgcyBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHMpJiYodFtzXT1uW3NdKX1yZXR1cm4gdH0sTGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0eXBlb2YgU3VwcHJlc3NlZEVycm9yPT0iZnVuY3Rpb24iJiZTdXBwcmVzc2VkRXJyb3I7dmFyIEZlPW5ldyBNYXAsaXQ9bmV3IE1hcCwkdD0hMCxNZT0hMTtmdW5jdGlvbiBCdChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXHMsXSsvZywiICIpLnRyaW0oKX1mdW5jdGlvbiBocihlKXtyZXR1cm4gQnQoZS5zb3VyY2UuYm9keS5zdWJzdHJpbmcoZS5zdGFydCxlLmVuZCkpfWZ1bmN0aW9uIGRyKGUpe3ZhciB0PW5ldyBTZXQsbj1bXTtyZXR1cm4gZS5kZWZpbml0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGkpe2lmKGkua2luZD09PSJGcmFnbWVudERlZmluaXRpb24iKXt2YXIgcj1pLm5hbWUudmFsdWUscz1ocihpLmxvYyksYT1pdC5nZXQocik7YSYmIWEuaGFzKHMpPyR0JiZjb25zb2xlLndhcm4oIldhcm5pbmc6IGZyYWdtZW50IHdpdGggbmFtZSAiK3IrYCBhbHJlYWR5IGV4aXN0cy4KZ3JhcGhxbC10YWcgZW5mb3JjZXMgYWxsIGZyYWdtZW50IG5hbWVzIGFjcm9zcyB5b3VyIGFwcGxpY2F0aW9uIHRvIGJlIHVuaXF1ZTsgcmVhZCBtb3JlIGFib3V0CnRoaXMgaW4gdGhlIGRvY3M6IGh0dHA6Ly9kZXYuYXBvbGxvZGF0YS5jb20vY29yZS9mcmFnbWVudHMuaHRtbCN1bmlxdWUtbmFtZXNgKTphfHxpdC5zZXQocixhPW5ldyBTZXQpLGEuYWRkKHMpLHQuaGFzKHMpfHwodC5hZGQocyksbi5wdXNoKGkpKX1lbHNlIG4ucHVzaChpKX0pLExlKExlKHt9LGUpLHtkZWZpbml0aW9uczpufSl9ZnVuY3Rpb24gcHIoZSl7dmFyIHQ9bmV3IFNldChlLmRlZmluaXRpb25zKTt0LmZvckVhY2goZnVuY3Rpb24oaSl7aS5sb2MmJmRlbGV0ZSBpLmxvYyxPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBzPWlbcl07cyYmdHlwZW9mIHM9PSJvYmplY3QiJiZ0LmFkZChzKX0pfSk7dmFyIG49ZS5sb2M7cmV0dXJuIG4mJihkZWxldGUgbi5zdGFydFRva2VuLGRlbGV0ZSBuLmVuZFRva2VuKSxlfWZ1bmN0aW9uIG1yKGUpe3ZhciB0PUJ0KGUpO2lmKCFGZS5oYXModCkpe3ZhciBuPUN0KGUse2V4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzOk1lLGFsbG93TGVnYWN5RnJhZ21lbnRWYXJpYWJsZXM6TWV9KTtpZighbnx8bi5raW5kIT09IkRvY3VtZW50Iil0aHJvdyBuZXcgRXJyb3IoIk5vdCBhIHZhbGlkIEdyYXBoUUwgZG9jdW1lbnQuIik7RmUuc2V0KHQscHIoZHIobikpKX1yZXR1cm4gRmUuZ2V0KHQpfWZ1bmN0aW9uIFEoZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07dHlwZW9mIGU9PSJzdHJpbmciJiYoZT1bZV0pO3ZhciBpPWVbMF07cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihyLHMpe3ImJnIua2luZD09PSJEb2N1bWVudCI/aSs9ci5sb2Muc291cmNlLmJvZHk6aSs9cixpKz1lW3MrMV19KSxtcihpKX1mdW5jdGlvbiB5cigpe0ZlLmNsZWFyKCksaXQuY2xlYXIoKX1mdW5jdGlvbiBncigpeyR0PSExfWZ1bmN0aW9uIHZyKCl7TWU9ITB9ZnVuY3Rpb24gRXIoKXtNZT0hMX12YXIgQWU9e2dxbDpRLHJlc2V0Q2FjaGVzOnlyLGRpc2FibGVGcmFnbWVudFdhcm5pbmdzOmdyLGVuYWJsZUV4cGVyaW1lbnRhbEZyYWdtZW50VmFyaWFibGVzOnZyLGRpc2FibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlczpFcn07KGZ1bmN0aW9uKGUpe2UuZ3FsPUFlLmdxbCxlLnJlc2V0Q2FjaGVzPUFlLnJlc2V0Q2FjaGVzLGUuZGlzYWJsZUZyYWdtZW50V2FybmluZ3M9QWUuZGlzYWJsZUZyYWdtZW50V2FybmluZ3MsZS5lbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcz1BZS5lbmFibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcyxlLmRpc2FibGVFeHBlcmltZW50YWxGcmFnbWVudFZhcmlhYmxlcz1BZS5kaXNhYmxlRXhwZXJpbWVudGFsRnJhZ21lbnRWYXJpYWJsZXN9KShRfHwoUT17fSkpLFEuZGVmYXVsdD1RO2NvbnN0IFV0PVFgCglmcmFnbWVudCBNYXRjaFBhcnRzIG9uIE1hdGNoQ29uZmlnIHsKCQlyZWdleFZhbHVlCgkJbWF0Y2hWYWx1ZQoJfQpgLF9yPVFgCgltdXRhdGlvbiBQdXNoUGF5bG9hZCgKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkcGF5bG9hZF9pZDogSUQhCgkJJGV2ZW50czogUmVwbGF5RXZlbnRzSW5wdXQhCgkJJG1lc3NhZ2VzOiBTdHJpbmchCgkJJHJlc291cmNlczogU3RyaW5nIQoJCSR3ZWJfc29ja2V0X2V2ZW50czogU3RyaW5nIQoJCSRlcnJvcnM6IFtFcnJvck9iamVjdElucHV0XSEKCQkkaXNfYmVhY29uOiBCb29sZWFuCgkJJGhhc19zZXNzaW9uX3VubG9hZGVkOiBCb29sZWFuCgkJJGhpZ2hsaWdodF9sb2dzOiBTdHJpbmcKCSkgewoJCXB1c2hQYXlsb2FkKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXBheWxvYWRfaWQ6ICRwYXlsb2FkX2lkCgkJCWV2ZW50czogJGV2ZW50cwoJCQltZXNzYWdlczogJG1lc3NhZ2VzCgkJCXJlc291cmNlczogJHJlc291cmNlcwoJCQl3ZWJfc29ja2V0X2V2ZW50czogJHdlYl9zb2NrZXRfZXZlbnRzCgkJCWVycm9yczogJGVycm9ycwoJCQlpc19iZWFjb246ICRpc19iZWFjb24KCQkJaGFzX3Nlc3Npb25fdW5sb2FkZWQ6ICRoYXNfc2Vzc2lvbl91bmxvYWRlZAoJCQloaWdobGlnaHRfbG9nczogJGhpZ2hsaWdodF9sb2dzCgkJKQoJfQpgLFRyPVFgCgltdXRhdGlvbiBQdXNoUGF5bG9hZENvbXByZXNzZWQoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHBheWxvYWRfaWQ6IElEIQoJCSRkYXRhOiBTdHJpbmchCgkpIHsKCQlwdXNoUGF5bG9hZENvbXByZXNzZWQoCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJcGF5bG9hZF9pZDogJHBheWxvYWRfaWQKCQkJZGF0YTogJGRhdGEKCQkpCgl9CmAsYnI9UWAKCW11dGF0aW9uIGlkZW50aWZ5U2Vzc2lvbigKCQkkc2Vzc2lvbl9zZWN1cmVfaWQ6IFN0cmluZyEKCQkkdXNlcl9pZGVudGlmaWVyOiBTdHJpbmchCgkJJHVzZXJfb2JqZWN0OiBBbnkKCSkgewoJCWlkZW50aWZ5U2Vzc2lvbigKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQl1c2VyX2lkZW50aWZpZXI6ICR1c2VyX2lkZW50aWZpZXIKCQkJdXNlcl9vYmplY3Q6ICR1c2VyX29iamVjdAoJCSkKCX0KYCxOcj1RYAoJbXV0YXRpb24gYWRkU2Vzc2lvblByb3BlcnRpZXMoCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHByb3BlcnRpZXNfb2JqZWN0OiBBbnkKCSkgewoJCWFkZFNlc3Npb25Qcm9wZXJ0aWVzKAoJCQlzZXNzaW9uX3NlY3VyZV9pZDogJHNlc3Npb25fc2VjdXJlX2lkCgkJCXByb3BlcnRpZXNfb2JqZWN0OiAkcHJvcGVydGllc19vYmplY3QKCQkpCgl9CmAseHI9UWAKCW11dGF0aW9uIHB1c2hNZXRyaWNzKCRtZXRyaWNzOiBbTWV0cmljSW5wdXRdISkgewoJCXB1c2hNZXRyaWNzKG1ldHJpY3M6ICRtZXRyaWNzKQoJfQpgLEFyPVFgCgltdXRhdGlvbiBhZGRTZXNzaW9uRmVlZGJhY2soCgkJJHNlc3Npb25fc2VjdXJlX2lkOiBTdHJpbmchCgkJJHVzZXJfbmFtZTogU3RyaW5nCgkJJHVzZXJfZW1haWw6IFN0cmluZwoJCSR2ZXJiYXRpbTogU3RyaW5nIQoJCSR0aW1lc3RhbXA6IFRpbWVzdGFtcCEKCSkgewoJCWFkZFNlc3Npb25GZWVkYmFjaygKCQkJc2Vzc2lvbl9zZWN1cmVfaWQ6ICRzZXNzaW9uX3NlY3VyZV9pZAoJCQl1c2VyX25hbWU6ICR1c2VyX25hbWUKCQkJdXNlcl9lbWFpbDogJHVzZXJfZW1haWwKCQkJdmVyYmF0aW06ICR2ZXJiYXRpbQoJCQl0aW1lc3RhbXA6ICR0aW1lc3RhbXAKCQkpCgl9CmAsSXI9UWAKCW11dGF0aW9uIGluaXRpYWxpemVTZXNzaW9uKAoJCSRzZXNzaW9uX3NlY3VyZV9pZDogU3RyaW5nIQoJCSRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nIQoJCSRlbmFibGVfc3RyaWN0X3ByaXZhY3k6IEJvb2xlYW4hCgkJJHByaXZhY3lfc2V0dGluZzogU3RyaW5nIQoJCSRlbmFibGVfcmVjb3JkaW5nX25ldHdvcmtfY29udGVudHM6IEJvb2xlYW4hCgkJJGNsaWVudFZlcnNpb246IFN0cmluZyEKCQkkZmlyc3Rsb2FkVmVyc2lvbjogU3RyaW5nIQoJCSRjbGllbnRDb25maWc6IFN0cmluZyEKCQkkZW52aXJvbm1lbnQ6IFN0cmluZyEKCQkkaWQ6IFN0cmluZyEKCQkkYXBwVmVyc2lvbjogU3RyaW5nCgkJJHNlcnZpY2VOYW1lOiBTdHJpbmchCgkJJGNsaWVudF9pZDogU3RyaW5nIQoJCSRuZXR3b3JrX3JlY29yZGluZ19kb21haW5zOiBbU3RyaW5nIV0KCQkkZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogQm9vbGVhbgoJKSB7CgkJaW5pdGlhbGl6ZVNlc3Npb24oCgkJCXNlc3Npb25fc2VjdXJlX2lkOiAkc2Vzc2lvbl9zZWN1cmVfaWQKCQkJb3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQ6ICRvcmdhbml6YXRpb25fdmVyYm9zZV9pZAoJCQllbmFibGVfc3RyaWN0X3ByaXZhY3k6ICRlbmFibGVfc3RyaWN0X3ByaXZhY3kKCQkJZW5hYmxlX3JlY29yZGluZ19uZXR3b3JrX2NvbnRlbnRzOiAkZW5hYmxlX3JlY29yZGluZ19uZXR3b3JrX2NvbnRlbnRzCgkJCWNsaWVudFZlcnNpb246ICRjbGllbnRWZXJzaW9uCgkJCWZpcnN0bG9hZFZlcnNpb246ICRmaXJzdGxvYWRWZXJzaW9uCgkJCWNsaWVudENvbmZpZzogJGNsaWVudENvbmZpZwoJCQllbnZpcm9ubWVudDogJGVudmlyb25tZW50CgkJCWFwcFZlcnNpb246ICRhcHBWZXJzaW9uCgkJCXNlcnZpY2VOYW1lOiAkc2VydmljZU5hbWUKCQkJZmluZ2VycHJpbnQ6ICRpZAoJCQljbGllbnRfaWQ6ICRjbGllbnRfaWQKCQkJbmV0d29ya19yZWNvcmRpbmdfZG9tYWluczogJG5ldHdvcmtfcmVjb3JkaW5nX2RvbWFpbnMKCQkJZGlzYWJsZV9zZXNzaW9uX3JlY29yZGluZzogJGRpc2FibGVfc2Vzc2lvbl9yZWNvcmRpbmcKCQkJcHJpdmFjeV9zZXR0aW5nOiAkcHJpdmFjeV9zZXR0aW5nCgkJKSB7CgkJCXNlY3VyZV9pZAoJCQlwcm9qZWN0X2lkCgkJCXNhbXBsaW5nIHsKCQkJCXNwYW5zIHsKCQkJCQluYW1lIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGVzIHsKCQkJCQkJa2V5IHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJfQoJCQkJCWV2ZW50cyB7CgkJCQkJCW5hbWUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQkJa2V5IHsKCQkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCQl9CgkJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCQlzYW1wbGluZ1JhdGlvCgkJCQl9CgkJCQlsb2dzIHsKCQkJCQltZXNzYWdlIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlzZXZlcml0eVRleHQgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZXMgewoJCQkJCQlrZXkgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJCX0KCQkJCQl9CgkJCQkJc2FtcGxpbmdSYXRpbwoJCQkJfQoJCQl9CgkJfQoJfQoJJHtVdH0KYCxPcj1RYAoJcXVlcnkgSWdub3JlKCRpZDogSUQhKSB7CgkJaWdub3JlKGlkOiAkaWQpCgl9CmAsU3I9UWAKCXF1ZXJ5IEdldFNhbXBsaW5nQ29uZmlnKCRvcmdhbml6YXRpb25fdmVyYm9zZV9pZDogU3RyaW5nISkgewoJCXNhbXBsaW5nKG9yZ2FuaXphdGlvbl92ZXJib3NlX2lkOiAkb3JnYW5pemF0aW9uX3ZlcmJvc2VfaWQpIHsKCQkJc3BhbnMgewoJCQkJbmFtZSB7CgkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJfQoJCQkJYXR0cmlidXRlcyB7CgkJCQkJa2V5IHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJfQoJCQkJZXZlbnRzIHsKCQkJCQluYW1lIHsKCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCX0KCQkJCQlhdHRyaWJ1dGVzIHsKCQkJCQkJa2V5IHsKCQkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQkJfQoJCQkJCQlhdHRyaWJ1dGUgewoJCQkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJc2FtcGxpbmdSYXRpbwoJCQl9CgkJCWxvZ3MgewoJCQkJbWVzc2FnZSB7CgkJCQkJLi4uTWF0Y2hQYXJ0cwoJCQkJfQoJCQkJc2V2ZXJpdHlUZXh0IHsKCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQl9CgkJCQlhdHRyaWJ1dGVzIHsKCQkJCQlrZXkgewoJCQkJCQkuLi5NYXRjaFBhcnRzCgkJCQkJfQoJCQkJCWF0dHJpYnV0ZSB7CgkJCQkJCS4uLk1hdGNoUGFydHMKCQkJCQl9CgkJCQl9CgkJCQlzYW1wbGluZ1JhdGlvCgkJCX0KCQl9Cgl9Cgkke1V0fQpgLHdyPShlLHQsbixpKT0+ZSgpO2Z1bmN0aW9uIERyKGUsdD13cil7cmV0dXJue1B1c2hQYXlsb2FkKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KF9yLG4sUChQKHt9LGkpLHIpKSwiUHVzaFBheWxvYWQiLCJtdXRhdGlvbiIsbil9LFB1c2hQYXlsb2FkQ29tcHJlc3NlZChuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChUcixuLFAoUCh7fSxpKSxyKSksIlB1c2hQYXlsb2FkQ29tcHJlc3NlZCIsIm11dGF0aW9uIixuKX0saWRlbnRpZnlTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KGJyLG4sUChQKHt9LGkpLHIpKSwiaWRlbnRpZnlTZXNzaW9uIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uUHJvcGVydGllcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChOcixuLFAoUCh7fSxpKSxyKSksImFkZFNlc3Npb25Qcm9wZXJ0aWVzIiwibXV0YXRpb24iLG4pfSxwdXNoTWV0cmljcyhuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdCh4cixuLFAoUCh7fSxpKSxyKSksInB1c2hNZXRyaWNzIiwibXV0YXRpb24iLG4pfSxhZGRTZXNzaW9uRmVlZGJhY2sobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoQXIsbixQKFAoe30saSkscikpLCJhZGRTZXNzaW9uRmVlZGJhY2siLCJtdXRhdGlvbiIsbil9LGluaXRpYWxpemVTZXNzaW9uKG4saSl7cmV0dXJuIHQocj0+ZS5yZXF1ZXN0KElyLG4sUChQKHt9LGkpLHIpKSwiaW5pdGlhbGl6ZVNlc3Npb24iLCJtdXRhdGlvbiIsbil9LElnbm9yZShuLGkpe3JldHVybiB0KHI9PmUucmVxdWVzdChPcixuLFAoUCh7fSxpKSxyKSksIklnbm9yZSIsInF1ZXJ5IixuKX0sR2V0U2FtcGxpbmdDb25maWcobixpKXtyZXR1cm4gdChyPT5lLnJlcXVlc3QoU3IsbixQKFAoe30saSkscikpLCJHZXRTYW1wbGluZ0NvbmZpZyIsInF1ZXJ5IixuKX19fWNsYXNzIENye2NvbnN0cnVjdG9yKHQsbil7dXQodGhpcywiZGVidWciKTt1dCh0aGlzLCJuYW1lIik7dGhpcy5kZWJ1Zz10LHRoaXMubmFtZT1ufWxvZyguLi50KXtpZih0aGlzLmRlYnVnKXtsZXQgbj1gWyR7RGF0ZS5ub3coKX1dYDt0aGlzLm5hbWUmJihuKz1gIC0gJHt0aGlzLm5hbWV9YCksY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSxbbiwuLi50XSl9fXdhcm4oLi4udCl7bGV0IG49YFske0RhdGUubm93KCl9XWA7dGhpcy5uYW1lJiYobis9YCAtICR7dGhpcy5uYW1lfWApLGNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLFtuLC4uLnRdKX19dmFyIFZ0PShlPT4oZS5CaWxsaW5nUXVvdGFFeGNlZWRlZD0iQmlsbGluZ1F1b3RhRXhjZWVkZWQiLGUpKShWdHx8e30pO2NvbnN0IGtyPTEwLFJyPTFlMyxQcj01MDAsTHI9W1Z0LkJpbGxpbmdRdW90YUV4Y2VlZGVkLnRvU3RyaW5nKCldLEZyPWU9Pnt2YXIgbjtyZXR1cm4oKG49ZS5yZXNwb25zZS5lcnJvcnMpPT1udWxsP3ZvaWQgMDpuLmZpbmQoaT0+THIuaW5jbHVkZXMoaS5tZXNzYWdlKSkpPT09dm9pZCAwfSxNcj0oKT0+e2NvbnN0IGU9KHQsbixpLHIscz0wKT0+Vyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e3JldHVybiB5aWVsZCB0KCl9Y2F0Y2goYSl7aWYoYSBpbnN0YW5jZW9mIGhlJiYhRnIoYSkpdGhyb3cgYTtpZihzPGtyKXJldHVybiB5aWVsZCBuZXcgUHJvbWlzZShjPT5zZXRUaW1lb3V0KGMsUnIrUHIqTWF0aC5wb3coMixzKSkpLHlpZWxkIGUodCxuLGkscixzKzEpO3Rocm93IGNvbnNvbGUuZXJyb3IoYGhpZ2hsaWdodC5pbzogZGF0YSByZXF1ZXN0IGZhaWxlZCBhZnRlciAke3N9IHJldHJpZXNgKSxhfX0pO3JldHVybiBlfSxqdD01LHF0PTJlMywkcj1bIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXTt2YXIgSz0oZT0+KGVbZS5Jbml0aWFsaXplPTBdPSJJbml0aWFsaXplIixlW2UuQXN5bmNFdmVudHM9MV09IkFzeW5jRXZlbnRzIixlW2UuSWRlbnRpZnk9Ml09IklkZW50aWZ5IixlW2UuUHJvcGVydGllcz0zXT0iUHJvcGVydGllcyIsZVtlLk1ldHJpY3M9NF09Ik1ldHJpY3MiLGVbZS5GZWVkYmFjaz01XT0iRmVlZGJhY2siLGVbZS5DdXN0b21FdmVudD02XT0iQ3VzdG9tRXZlbnQiLGVbZS5TdG9wPTddPSJTdG9wIixlKSkoS3x8e30pO2Z1bmN0aW9uIEJyKGUpe3JldHVybiBXKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIG5ldyBQcm9taXNlKG49Pntjb25zdCBpPW5ldyBGaWxlUmVhZGVyO2kub25sb2FkPSgpPT5uKGkucmVzdWx0KSxpLnJlYWRBc0RhdGFVUkwobmV3IEJsb2IoW2VdKSl9KTtyZXR1cm4gdC5zbGljZSh0LmluZGV4T2YoIiwiKSsxKX0pfWNvbnN0ICRlPXNlbGY7ZnVuY3Rpb24gR3QoZSx0KXtjb25zdCBuPXt9LGk9W10scj1bXTtmb3IoY29uc3RbcyxhXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtpZihhPT1udWxsKWNvbnRpbnVlOyRyLmluY2x1ZGVzKHR5cGVvZiBhKXx8aS5wdXNoKHtbc106YX0pO2xldCBjO3R5cGVvZiBhPT0ic3RyaW5nIj9jPWE6Yz1wZShhKSxjLmxlbmd0aD5xdCYmKHIucHVzaCh7W3NdOmF9KSxjPWMuc3Vic3RyaW5nKDAscXQpKSxuW3NdPWN9cmV0dXJuIHQhPT0ic2Vzc2lvbiImJihpLmxlbmd0aD4wJiZjb25zb2xlLndhcm4oYEhpZ2hsaWdodCB3YXMgcGFzc2VkIG9uZSBvciBtb3JlICR7dH0gcHJvcGVydGllcyBub3Qgb2YgdHlwZSBzdHJpbmcsIG51bWJlciwgb3IgYm9vbGVhbi5gLGkpLHIubGVuZ3RoPjAmJmNvbnNvbGUud2FybihgSGlnaGxpZ2h0IHdhcyBwYXNzZWQgb25lIG9yIG1vcmUgJHt0fSBwcm9wZXJ0aWVzIGV4Y2VlZGluZyAyMDAwIGNoYXJhY3RlcnMsIHdoaWNoIHdpbGwgYmUgdHJ1bmNhdGVkLmAscikpLG59e2xldCBlLHQsbixpPTAscj0wLHM9ITEsYT0wLGM9bmV3IENyKCExLCJbd29ya2VyXSIpO2NvbnN0IGY9W10sZD0oKT0+YSE9PTAmJmk8anQmJiEhKG4hPW51bGwmJm4ubGVuZ3RoKSx1PShnLEUpPT57JGUucG9zdE1lc3NhZ2Uoe3Jlc3BvbnNlOnt0eXBlOksuQ3VzdG9tRXZlbnQsdGFnOmcscGF5bG9hZDpFfX0pfSx5PWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e2lkOkUsZXZlbnRzOmssbWVzc2FnZXM6dyxlcnJvcnM6TCxyZXNvdXJjZXNTdHJpbmc6JCx3ZWJTb2NrZXRFdmVudHNTdHJpbmc6cSxoYXNTZXNzaW9uVW5sb2FkZWQ6QixoaWdobGlnaHRMb2dzOkl9PWcsTz1wZSh7bWVzc2FnZXM6d30pO2xldCBqPXtzZXNzaW9uX3NlY3VyZV9pZDpuLHBheWxvYWRfaWQ6RS50b1N0cmluZygpLGV2ZW50czp7ZXZlbnRzOmt9LG1lc3NhZ2VzOk8scmVzb3VyY2VzOiQsd2ViX3NvY2tldF9ldmVudHM6cSxlcnJvcnM6TCxpc19iZWFjb246ITEsaGFzX3Nlc3Npb25fdW5sb2FkZWQ6Qn07SSYmKGouaGlnaGxpZ2h0X2xvZ3M9SSk7Y29uc3QgVT1mbihKU09OLnN0cmluZ2lmeShqKSksej1jbihVKSxYPXlpZWxkIEJyKHopLG89e3R5cGU6Sy5Bc3luY0V2ZW50cyxpZDpFLGV2ZW50c1NpemU6VS5sZW5ndGgsY29tcHJlc3NlZFNpemU6WC5sZW5ndGh9O2MubG9nKGBQdXNoaW5nIHBheWxvYWQ6ICR7SlNPTi5zdHJpbmdpZnkoe3Nlc3Npb25TZWN1cmVJRDpuLGlkOkUsZmlyc3RTSUQ6TWF0aC5taW4oLi4uai5ldmVudHMuZXZlbnRzLm1hcCh4PT54PT1udWxsP3ZvaWQgMDp4Ll9zaWQpLmZpbHRlcih4PT4hIXgpKSxldmVudHNMZW5ndGg6ai5ldmVudHMuZXZlbnRzLmxlbmd0aCxtZXNzYWdlc0xlbmd0aDp3Lmxlbmd0aCxyZXNvdXJjZXNMZW5ndGg6JC5sZW5ndGgsd2ViU29ja2V0TGVuZ3RoOnEubGVuZ3RoLGVycm9yc0xlbmd0aDpMLmxlbmd0aCxidWZMZW5ndGg6VS5sZW5ndGgsY29tcHJlc3NlZExlbmd0aDp6Lmxlbmd0aCxjb21wcmVzc2VkQmFzZTY0TGVuZ3RoOlgubGVuZ3RofSx2b2lkIDAsMil9YCk7Y29uc3QgaD1lLlB1c2hQYXlsb2FkQ29tcHJlc3NlZCh7c2Vzc2lvbl9zZWN1cmVfaWQ6bixwYXlsb2FkX2lkOkUudG9TdHJpbmcoKSxkYXRhOlh9KTtsZXQgXz1Qcm9taXNlLnJlc29sdmUoKTtmLmxlbmd0aCYmKF89ZS5wdXNoTWV0cmljcyh7bWV0cmljczpmfSksZi5zcGxpY2UoMCkpO2xldCBBPXBlcmZvcm1hbmNlLm5vdygpO2NvbnN0IFI9c2V0SW50ZXJ2YWwoKCk9PntBJiZwZXJmb3JtYW5jZS5ub3coKS1BPk10JiYoY29uc29sZS53YXJuKGBVcGxvYWRpbmcgcHVzaFBheWxvYWQgdG9vayB0b28gbG9uZywgZmFpbHVyZSBudW1iZXIgIyR7cn0uYCkscis9MSxjbGVhckludGVydmFsKFIpLHI+PWp0JiYoY29uc29sZS53YXJuKCJVcGxvYWRpbmcgcHVzaFBheWxvYWQgdG9vayB0b28gbG9uZywgc3RvcHBpbmcgcmVjb3JkaW5nIHRvIGF2b2lkIE9PTS4iKSwkZS5wb3N0TWVzc2FnZSh7cmVzcG9uc2U6e3R5cGU6Sy5TdG9wLHJlcXVlc3RTdGFydDpBLGFzeW5jRXZlbnRzUmVzcG9uc2U6b319KSxiKHt0eXBlOksuUHJvcGVydGllcyxwcm9wZXJ0aWVzT2JqZWN0OntzdG9wUmVhc29uOiJQdXNoIFBheWxvYWQgVGltZW91dCJ9LHByb3BlcnR5VHlwZTp7dHlwZToidHJhY2sifX0pKSl9LDEwMCk7dHJ5e3lpZWxkIFByb21pc2UuYWxsKFtoLF9dKSxyJiZwZXJmb3JtYW5jZS5ub3coKS1BPD1NdCYmKGNvbnNvbGUud2FybihgcHVzaFBheWxvYWQgc3VjY2VlZGVkIGFmdGVyICMke3J9IGZhaWx1cmVzLCByZXNldHRpbmcgc3RvcCBzd2l0Y2guYCkscj0wKX1maW5hbGx5e0E9MCxjbGVhckludGVydmFsKFIpfSRlLnBvc3RNZXNzYWdlKHtyZXNwb25zZTpvfSl9KSx2PWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3VzZXJPYmplY3Q6RSx1c2VySWRlbnRpZmllcjprLHNvdXJjZTp3fT1nO3c9PT0ic2VnbWVudCI/dSgiU2VnbWVudCBJZGVudGlmeSIscGUoUCh7dXNlcklkZW50aWZpZXI6a30sRSkpKTp1KCJJZGVudGlmeSIscGUoUCh7dXNlcklkZW50aWZpZXI6a30sRSkpKSx5aWVsZCBlLmlkZW50aWZ5U2Vzc2lvbih7c2Vzc2lvbl9zZWN1cmVfaWQ6bix1c2VyX2lkZW50aWZpZXI6ayx1c2VyX29iamVjdDpHdChFLCJ1c2VyIil9KTtjb25zdCBMPXc9PT0ic2VnbWVudCI/dzoiZGVmYXVsdCI7Yy5sb2coYElkZW50aWZ5ICgke2t9LCBzb3VyY2U6ICR7TH0pIHcvIG9iajogJHtwZShFKX0gQCAke3R9YCl9KSxiPWc9PlcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0e3Byb3BlcnRpZXNPYmplY3Q6RSxwcm9wZXJ0eVR5cGU6a309ZztsZXQgdzsoaz09bnVsbD92b2lkIDA6ay50eXBlKT09PSJzZXNzaW9uIj8odz0iU2Vzc2lvbiIseWllbGQgZS5hZGRTZXNzaW9uUHJvcGVydGllcyh7c2Vzc2lvbl9zZWN1cmVfaWQ6bixwcm9wZXJ0aWVzX29iamVjdDpHdChFLCJzZXNzaW9uIil9KSk6KGs9PW51bGw/dm9pZCAwOmsuc291cmNlKT09PSJzZWdtZW50Ij93PSJTZWdtZW50Ijp3PSJUcmFjayIsdyE9PSJTZXNzaW9uIiYmdSh3LHBlKEUpKSxjLmxvZyhgQWRkaW5nICR7d30gUHJvcGVydGllcyB0byBzZXNzaW9uICgke259KSB3LyBvYmo6ICR7SlNPTi5zdHJpbmdpZnkoRSl9IEAgJHt0fWApfSksbT1nPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmLnB1c2goLi4uZy5tZXRyaWNzLm1hcChFPT4oe25hbWU6RS5uYW1lLHZhbHVlOkUudmFsdWUsc2Vzc2lvbl9zZWN1cmVfaWQ6bixjYXRlZ29yeTpFLmNhdGVnb3J5LGdyb3VwOkUuZ3JvdXAsdGltZXN0YW1wOkUudGltZXN0YW1wLnRvSVNPU3RyaW5nKCksdGFnczpFLnRhZ3N9KSkpfSksTj1nPT5XKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdHt0aW1lc3RhbXA6RSx2ZXJiYXRpbTprLHVzZXJFbWFpbDp3LHVzZXJOYW1lOkx9PWc7eWllbGQgZS5hZGRTZXNzaW9uRmVlZGJhY2soe3Nlc3Npb25fc2VjdXJlX2lkOm4sdGltZXN0YW1wOkUsdmVyYmF0aW06ayx1c2VyX2VtYWlsOncsdXNlcl9uYW1lOkx9KX0pOyRlLm9ubWVzc2FnZT1mdW5jdGlvbihnKXtyZXR1cm4gVyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoZy5kYXRhLm1lc3NhZ2UudHlwZT09PUsuSW5pdGlhbGl6ZSl7dD1nLmRhdGEubWVzc2FnZS5iYWNrZW5kLG49Zy5kYXRhLm1lc3NhZ2Uuc2Vzc2lvblNlY3VyZUlELHM9Zy5kYXRhLm1lc3NhZ2UuZGVidWcsYT1nLmRhdGEubWVzc2FnZS5yZWNvcmRpbmdTdGFydFRpbWUsYy5kZWJ1Zz1zLGU9RHIobmV3IGNyKHQse2hlYWRlcnM6e319KSxNcigpKTtyZXR1cm59aWYoZCgpKXRyeXtnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5Bc3luY0V2ZW50cz95aWVsZCB5KGcuZGF0YS5tZXNzYWdlKTpnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5JZGVudGlmeT95aWVsZCB2KGcuZGF0YS5tZXNzYWdlKTpnLmRhdGEubWVzc2FnZS50eXBlPT09Sy5Qcm9wZXJ0aWVzP3lpZWxkIGIoZy5kYXRhLm1lc3NhZ2UpOmcuZGF0YS5tZXNzYWdlLnR5cGU9PT1LLk1ldHJpY3M/eWllbGQgbShnLmRhdGEubWVzc2FnZSk6Zy5kYXRhLm1lc3NhZ2UudHlwZT09PUsuRmVlZGJhY2smJih5aWVsZCBOKGcuZGF0YS5tZXNzYWdlKSksaT0wfWNhdGNoKEUpe3MmJmNvbnNvbGUuZXJyb3IoRSksaSs9MX19KX19fSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGlnaGxpZ2h0LWNsaWVudC13b3JrZXItQ3BtbDJKMXQuanMubWFwCg==", Fy = (e) => Uint8Array.from(atob(e), (t) => t.charCodeAt(0)), zo = typeof self < "u" && self.Blob && new Blob([Fy(Sc)], { type: "text/javascript;charset=utf-8" });
12921
+ function Ky(e) {
12919
12922
  let t;
12920
12923
  try {
12921
12924
  if (t = zo && (self.URL || self.webkitURL).createObjectURL(zo), !t) throw "";
@@ -12937,7 +12940,7 @@ function Yy(e) {
12937
12940
  }
12938
12941
  }
12939
12942
  var Te = /* @__PURE__ */ ((e) => (e[e.Initialize = 0] = "Initialize", e[e.AsyncEvents = 1] = "AsyncEvents", e[e.Identify = 2] = "Identify", e[e.Properties = 3] = "Properties", e[e.Metrics = 4] = "Metrics", e[e.Feedback = 5] = "Feedback", e[e.CustomEvent = 6] = "CustomEvent", e[e.Stop = 7] = "Stop", e))(Te || {});
12940
- const Uy = ({
12943
+ const Oy = ({
12941
12944
  apiKey: e
12942
12945
  }) => {
12943
12946
  (function(t, i) {
@@ -13020,7 +13023,7 @@ const Uy = ({
13020
13023
  return d = (!d || d.length === 0 ? "$default_instance" : d).toLowerCase(), Object.prototype.hasOwnProperty.call(s._iq, d) || (s._iq[d] = { _q: [] }, b(s._iq[d])), s._iq[d];
13021
13024
  }, t.amplitude = s;
13022
13025
  })(window, document);
13023
- }, Fy = ({
13026
+ }, My = ({
13024
13027
  projectToken: e
13025
13028
  }) => {
13026
13029
  if (window.mixpanel)
@@ -13067,16 +13070,16 @@ const Uy = ({
13067
13070
  }
13068
13071
  })(document, window.mixpanel || []);
13069
13072
  const t = document.createElement("script");
13070
- t.src = Ky, document.head.appendChild(t), t.addEventListener("load", () => {
13073
+ t.src = Ey, document.head.appendChild(t), t.addEventListener("load", () => {
13071
13074
  var i;
13072
13075
  (i = window.mixpanel) == null || i.init(e);
13073
13076
  });
13074
- }, Ky = "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js", Oy = "9.15.0";
13075
- class My {
13077
+ }, Ey = "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js";
13078
+ class Hy {
13076
13079
  constructor(t) {
13077
13080
  N(this, "options"), N(this, "isRunningOnHighlight"), N(this, "organizationID"), N(this, "graphqlSDK"), N(this, "events"), N(this, "sessionData"), N(this, "ready"), N(this, "manualStopped"), N(this, "state"), N(this, "logger"), N(this, "enableSegmentIntegration"), N(this, "privacySetting"), N(this, "enableCanvasRecording"), N(this, "samplingStrategy"), N(this, "inlineImages"), N(this, "inlineVideos"), N(this, "inlineStylesheet"), N(this, "debugOptions"), N(this, "listeners"), N(this, "firstloadVersion"), N(this, "environment"), N(this, "sessionShortcut"), N(this, "appVersion"), N(this, "serviceName"), N(this, "_worker"), N(this, "_optionsInternal"), N(this, "_backendUrl"), N(this, "_recordingStartTime"), N(this, "_isOnLocalHost"), N(this, "_onToggleFeedbackFormVisibility"), N(this, "_isCrossOriginIframe"), N(this, "_eventBytesSinceSnapshot"), N(this, "_lastSnapshotTime"), N(this, "_lastVisibilityChangeTime"), N(this, "pushPayloadTimerId"), N(this, "hasSessionUnloaded"), N(this, "hasPushedData"), N(this, "reloaded"), N(this, "_hasPreviouslyInitialized"), N(this, "_recordStop"), N(this, "_integrations", []);
13078
13081
  var i, s, n, r, l;
13079
- this.options = t, typeof ((i = this.options) == null ? void 0 : i.debug) == "boolean" ? this.debugOptions = this.options.debug ? { clientInteractions: !0 } : {} : this.debugOptions = (n = (s = this.options) == null ? void 0 : s.debug) != null ? n : {}, this.logger = new Po(this.debugOptions.clientInteractions), this._worker = new Yy(), this._worker.onmessage = (a) => {
13082
+ this.options = t, typeof ((i = this.options) == null ? void 0 : i.debug) == "boolean" ? this.debugOptions = this.options.debug ? { clientInteractions: !0 } : {} : this.debugOptions = (n = (s = this.options) == null ? void 0 : s.debug) != null ? n : {}, this.logger = new Po(this.debugOptions.clientInteractions), this._worker = new Ky(), this._worker.onmessage = (a) => {
13080
13083
  var c, u, h;
13081
13084
  ((c = a.data.response) == null ? void 0 : c.type) === Te.AsyncEvents ? (this._eventBytesSinceSnapshot += a.data.response.eventsSize, this.logger.log(
13082
13085
  `Web worker sent payloadID ${a.data.response.id} size ${a.data.response.eventsSize} bytes, compression ratio ${a.data.response.eventsSize / a.data.response.compressedSize}.
@@ -13084,7 +13087,7 @@ class My {
13084
13087
  )) : ((u = a.data.response) == null ? void 0 : u.type) === Te.CustomEvent ? this.addCustomEvent(
13085
13088
  a.data.response.tag,
13086
13089
  a.data.response.payload
13087
- ) : ((h = a.data.response) == null ? void 0 : h.type) === Te.Stop && (We(
13090
+ ) : ((h = a.data.response) == null ? void 0 : h.type) === Te.Stop && (Ze(
13088
13091
  "worker.onmessage",
13089
13092
  "warn",
13090
13093
  "Stopping recording due to worker failure",
@@ -13121,8 +13124,8 @@ class My {
13121
13124
  let s, n;
13122
13125
  if (!i)
13123
13126
  try {
13124
- s = Ie(ye.USER_IDENTIFIER);
13125
- const r = Ie(
13127
+ s = Se(ye.USER_IDENTIFIER);
13128
+ const r = Se(
13126
13129
  ye.USER_OBJECT
13127
13130
  );
13128
13131
  r && (n = JSON.parse(r));
@@ -13157,7 +13160,9 @@ class My {
13157
13160
  }
13158
13161
  identify(t, i = {}, s) {
13159
13162
  if (!t || t === "") {
13160
- console.warn(
13163
+ Ze(
13164
+ "identify",
13165
+ "warn",
13161
13166
  "Highlight's identify() call was passed an empty identifier.",
13162
13167
  { user_identifier: t, user_object: i }
13163
13168
  );
@@ -13197,7 +13202,7 @@ class My {
13197
13202
  start(t) {
13198
13203
  return fe(this, null, function* () {
13199
13204
  var i, s, n, r, l, o, a, c;
13200
- if (!(navigator != null && navigator.webdriver && !window.Cypress || (i = navigator?.userAgent) != null && i.includes("Googlebot") || (s = navigator?.userAgent) != null && s.includes("AdsBot")))
13205
+ if (!((i = navigator?.userAgent) != null && i.includes("Googlebot") || (s = navigator?.userAgent) != null && s.includes("AdsBot")))
13201
13206
  try {
13202
13207
  if (t != null && t.forceNew) {
13203
13208
  yield this._reset(t);
@@ -13209,7 +13214,7 @@ class My {
13209
13214
  this.sessionData,
13210
13215
  this.options
13211
13216
  ), this.sessionData = (n = Ni(this.sessionData.sessionSecureID)) != null ? n : this.sessionData, (r = this.sessionData) != null && r.sessionStartTime ? this._recordingStartTime = (l = this.sessionData) == null ? void 0 : l.sessionStartTime : (this._recordingStartTime = (/* @__PURE__ */ new Date()).getTime(), this.sessionData.sessionStartTime = this._recordingStartTime);
13212
- let u = Ie(sn.CLIENT_ID);
13217
+ let u = Se(sn.CLIENT_ID);
13213
13218
  u || (u = on(), Je(sn.CLIENT_ID, u));
13214
13219
  let h;
13215
13220
  this.options.disableSessionRecording || this.options.disableNetworkRecording !== void 0 || typeof this.options.networkRecording == "boolean" ? h = !1 : h = ((o = this.options.networkRecording) == null ? void 0 : o.recordHeadersAndBody) || !1;
@@ -13279,7 +13284,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13279
13284
  p.bind(this);
13280
13285
  const b = !!this._recordStop;
13281
13286
  this._recordStop && (this._recordStop(), this._recordStop = void 0);
13282
- const [d, I] = gy(
13287
+ const [d, I] = Sy(
13283
13288
  this.privacySetting
13284
13289
  );
13285
13290
  this._recordStop = Le({
@@ -13307,17 +13312,17 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13307
13312
  inlineVideos: this.inlineVideos,
13308
13313
  collectFonts: this.inlineImages,
13309
13314
  inlineStylesheet: this.inlineStylesheet,
13310
- plugins: [Od()],
13315
+ plugins: [Hd()],
13311
13316
  logger: typeof this.options.debug == "boolean" && this.options.debug || typeof this.options.debug == "object" && this.options.debug.domRecording ? {
13312
13317
  debug: this.logger.log,
13313
- warn: We.bind("RecordSDK", "warn")
13318
+ warn: Ze.bind("RecordSDK", "warn")
13314
13319
  } : void 0
13315
13320
  }), b || this.options.recordCrossOriginIframe && this._setupCrossOriginIframeParent(), document.referrer && (window && document.referrer.includes(window.location.origin) || (this.addCustomEvent("Referrer", document.referrer), this.addProperties(
13316
13321
  { referrer: document.referrer },
13317
13322
  { type: "session" }
13318
13323
  ))), this._setupWindowListeners(), this.ready = !0, this.state = "Recording", this.manualStopped = !1;
13319
13324
  } catch (u) {
13320
- We("initializeSession _setupWindowListeners", "warn", u);
13325
+ Ze("initializeSession _setupWindowListeners", "warn", u);
13321
13326
  }
13322
13327
  });
13323
13328
  }
@@ -13374,7 +13379,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13374
13379
  try {
13375
13380
  const s = this;
13376
13381
  this.enableSegmentIntegration && this.listeners.push(
13377
- Gy((r) => {
13382
+ Wy((r) => {
13378
13383
  if (r.type === "track") {
13379
13384
  const l = {};
13380
13385
  l["segment-event"] = r.event, s.addProperties(l, {
@@ -13394,24 +13399,24 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13394
13399
  }
13395
13400
  })
13396
13401
  ), this.listeners.push(
13397
- yy((r) => {
13402
+ Iy((r) => {
13398
13403
  this.reloaded ? (this.addCustomEvent("Reload", r), this.reloaded = !1, s.addProperties(
13399
13404
  { reload: !0 },
13400
13405
  { type: "session" }
13401
13406
  )) : this.addCustomEvent("Navigate", r);
13402
13407
  })
13403
13408
  ), this.listeners.push(
13404
- Td(
13409
+ Ld(
13405
13410
  (r) => {
13406
13411
  this.addCustomEvent("Viewport", r);
13407
13412
  }
13408
13413
  )
13409
13414
  ), this.listeners.push(
13410
- Zy((r, l) => {
13415
+ Gy((r, l) => {
13411
13416
  let o = null, a = null;
13412
13417
  if (l && l.target) {
13413
13418
  const c = l.target;
13414
- o = vd(c), a = c.textContent, a && a.length > 2e3 && (a = a.substring(0, 2e3));
13419
+ o = Nd(c), a = c.textContent, a && a.length > 2e3 && (a = a.substring(0, 2e3));
13415
13420
  }
13416
13421
  this.addCustomEvent("Click", {
13417
13422
  clickTarget: r,
@@ -13420,10 +13425,10 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13420
13425
  });
13421
13426
  })
13422
13427
  ), this.listeners.push(
13423
- Iy((r) => {
13428
+ Vy((r) => {
13424
13429
  r && this.addCustomEvent("Focus", r);
13425
13430
  })
13426
- ), this.sessionShortcut && Xy(this.sessionShortcut, () => {
13431
+ ), this.sessionShortcut && Ry(this.sessionShortcut, () => {
13427
13432
  window.open(
13428
13433
  this.getCurrentSessionURLWithTimestamp(),
13429
13434
  "_blank"
@@ -13433,7 +13438,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13433
13438
  ({ visible: r }) => {
13434
13439
  this._visibilityHandler(!r);
13435
13440
  }
13436
- ), this.logger.log("Set up Electron highlight.run events.")) : (Sy(
13441
+ ), this.logger.log("Set up Electron highlight.run events.")) : (Xy(
13437
13442
  (r) => this._visibilityHandler(r)
13438
13443
  ), this.logger.log("Set up document visibility listener.")), this._hasPreviouslyInitialized = !0);
13439
13444
  const n = () => {
@@ -13443,7 +13448,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13443
13448
  () => window.removeEventListener("beforeunload", n)
13444
13449
  );
13445
13450
  } catch (s) {
13446
- We("initializeSession _setupWindowListeners", "warn", s);
13451
+ Ze("initializeSession _setupWindowListeners", "warn", s);
13447
13452
  }
13448
13453
  const i = () => {
13449
13454
  this.addCustomEvent("Page Unload", ""), wt(this.sessionData.sessionSecureID), Pe(this.sessionData);
@@ -13529,7 +13534,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13529
13534
  }), 0;
13530
13535
  })), yield this._sendPayload({ sendFn: i }), this.hasPushedData = !0, this.sessionData.lastPushTime = Date.now(), Pe(this.sessionData);
13531
13536
  } catch (i) {
13532
- We("_save", "warn", i);
13537
+ Ze("_save", "warn", i);
13533
13538
  }
13534
13539
  this.state === "Recording" && (this.pushPayloadTimerId && (clearTimeout(this.pushPayloadTimerId), this.pushPayloadTimerId = void 0), this.pushPayloadTimerId = setTimeout(() => {
13535
13540
  this._save();
@@ -13560,7 +13565,7 @@ To: ${this._backendUrl}
13560
13565
  Org: ${this.organizationID}
13561
13566
  SessionSecureID: ${this.sessionData.sessionSecureID}`
13562
13567
  );
13563
- const l = Ny();
13568
+ const l = Yy();
13564
13569
  i ? yield i({
13565
13570
  session_secure_id: this.sessionData.sessionSecureID,
13566
13571
  payload_id: (this.sessionData.payloadID++).toString(),
@@ -13588,7 +13593,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13588
13593
  hasSessionUnloaded: this.hasSessionUnloaded,
13589
13594
  highlightLogs: l
13590
13595
  }
13591
- }), Pe(this.sessionData), this.events = this.events.slice(s.length), Jy(l);
13596
+ }), Pe(this.sessionData), this.events = this.events.slice(s.length), Uy(l);
13592
13597
  });
13593
13598
  }
13594
13599
  takeFullSnapshot() {
@@ -13621,7 +13626,19 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13621
13626
  const s = `${this.getFrontendUrl()}/sessions/${t}`;
13622
13627
  if (!s || !i?.sessionStartTime)
13623
13628
  return null;
13624
- const n = (/* @__PURE__ */ new Date()).getTime(), r = new URL(s), l = new URL(s), o = (n - this._recordingStartTime) / 1e3;
13629
+ const n = (/* @__PURE__ */ new Date()).getTime();
13630
+ let r;
13631
+ try {
13632
+ r = new URL(s);
13633
+ } catch (a) {
13634
+ return Ze(
13635
+ "identify",
13636
+ "warn",
13637
+ `failed to construct session url from ${s}`,
13638
+ a
13639
+ ), null;
13640
+ }
13641
+ const l = new URL(r), o = (n - this._recordingStartTime) / 1e3;
13625
13642
  return l.searchParams.set("ts", o.toString()), {
13626
13643
  url: r.toString(),
13627
13644
  urlWithTimestamp: l.toString(),
@@ -13638,7 +13655,7 @@ SessionSecureID: ${this.sessionData.sessionSecureID}`
13638
13655
  return sd;
13639
13656
  }
13640
13657
  }
13641
- class qy extends Nd {
13658
+ class eg extends Yd {
13642
13659
  constructor(t, i) {
13643
13660
  var s = (...p) => (super(...p), N(this, "record"), this), n, r, l, o, a, c, u, h, m;
13644
13661
  try {
@@ -13662,15 +13679,15 @@ class qy extends Nd {
13662
13679
  }
13663
13680
  const p = ge(F({}, i), {
13664
13681
  organizationID: t,
13665
- firstloadVersion: Oy,
13682
+ firstloadVersion: Td,
13666
13683
  environment: i?.environment || "production",
13667
13684
  appVersion: i?.version,
13668
13685
  sessionSecureID: this.sessionSecureID,
13669
13686
  privacySetting: (n = i?.privacySetting) != null ? n : "strict"
13670
13687
  });
13671
- this.record = new My(p), i != null && i.manualStart || this.record.start(), Rt.load(this.record), !((l = (r = i?.integrations) == null ? void 0 : r.mixpanel) != null && l.disabled) && (a = (o = i?.integrations) == null ? void 0 : o.mixpanel) != null && a.projectToken && Fy(i.integrations.mixpanel), !((u = (c = i?.integrations) == null ? void 0 : c.amplitude) != null && u.disabled) && (m = (h = i?.integrations) == null ? void 0 : h.amplitude) != null && m.apiKey && Uy(i.integrations.amplitude);
13688
+ this.record = new Hy(p), i != null && i.manualStart || this.record.start(), Rt.load(this.record), !((l = (r = i?.integrations) == null ? void 0 : r.mixpanel) != null && l.disabled) && (a = (o = i?.integrations) == null ? void 0 : o.mixpanel) != null && a.projectToken && My(i.integrations.mixpanel), !((u = (c = i?.integrations) == null ? void 0 : c.amplitude) != null && u.disabled) && (m = (h = i?.integrations) == null ? void 0 : h.amplitude) != null && m.apiKey && Oy(i.integrations.amplitude);
13672
13689
  } catch (p) {
13673
- We(
13690
+ Ze(
13674
13691
  "Error initializing @launchdarkly/session-replay SDK",
13675
13692
  "error",
13676
13693
  p
@@ -13730,8 +13747,8 @@ class qy extends Nd {
13730
13747
  }
13731
13748
  }
13732
13749
  export {
13733
- qy as E,
13750
+ eg as E,
13734
13751
  Rt as r,
13735
13752
  Bo as x
13736
13753
  };
13737
- //# sourceMappingURL=index-1OdmzmZU.js.map
13754
+ //# sourceMappingURL=index-BnOFliqz.js.map