@getopenpay/openpay-js 0.5.15 → 0.5.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Resource-Ds5bbQ3b.js → Resource-CUhg8dEK.js} +4 -4
- package/dist/{SimpleSpanProcessor-0bSccE1S.js → SimpleSpanProcessor-BtNzab2_.js} +37 -37
- package/dist/{detect-resources-UwRkF4Xd.js → detect-resources-6fNItMfQ.js} +12 -12
- package/dist/{diag-api-CMlZXyyv.js → diag-api-BaoBTidT.js} +1 -1
- package/dist/{index-DFO-DCsT.js → index-2Dpi7rDE.js} +11 -11
- package/dist/{index-CWTkU3J-.js → index-BkFKN09r.js} +1 -1
- package/dist/{index-BZEpD-f0.js → index-BohOdvI5.js} +135 -135
- package/dist/{index-JNJd_YS1.js → index-Cb6WFqJj.js} +33 -33
- package/dist/{index-1jECpTsg.js → index-CfhP31jP.js} +9 -9
- package/dist/{index-BmKZeOoc.js → index-CmjNpx1j.js} +6 -6
- package/dist/{index-CDdbDQxQ.js → index-CsjF5pDg.js} +1 -1
- package/dist/index-Dcezwdcs.js +7000 -0
- package/dist/{index-BhZy-TW3.js → index-DhyFkarT.js} +10 -10
- package/dist/{index-DsxDp11a.js → index-t_WVTb5S.js} +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.es.js +1 -1
- package/dist/index.umd.js +8 -8
- package/dist/{metrics-api-C9pRFfr-.js → metrics-api-CsLzDvjo.js} +28 -28
- package/dist/{suppress-tracing-B94rObkn.js → suppress-tracing-Cu47NVB2.js} +1 -1
- package/dist/{url-CdPstDG9.js → url-CgnFZYDI.js} +8 -8
- package/dist/{utils--M6ihaNw.js → utils-BJ1UAbM8.js} +1 -1
- package/dist/{utils-VJ-0MC7c.js → utils-Dius2V8g.js} +20 -20
- package/package.json +1 -1
- package/dist/index-j7i6AeZa.js +0 -7005
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { e as nt, t as _, i as it, T as L, b as ot, a as T, I as at, S as st } from "./index-
|
|
2
|
-
import { d } from "./diag-api-
|
|
3
|
-
import { o as I, l as ut, n as k, q as lt, j as pt, m as w, r as dt, s as ct, v as N, w as M, x as ft, p as ht, y as V } from "./url-
|
|
4
|
-
import { i as _t, s as x, g as h, a as A, T as v, b as mt, D as vt, c as St, u as yt, B as Z, S as H, C as Et, W as Tt, d as gt, m as Lt, e as Pt } from "./index-
|
|
5
|
-
import { s as At, i as bt } from "./suppress-tracing-
|
|
6
|
-
import { R as Q } from "./Resource-
|
|
1
|
+
import { e as nt, t as _, i as it, T as L, b as ot, a as T, I as at, S as st } from "./index-Dcezwdcs.js";
|
|
2
|
+
import { d } from "./diag-api-BaoBTidT.js";
|
|
3
|
+
import { o as I, l as ut, n as k, q as lt, j as pt, m as w, r as dt, s as ct, v as N, w as M, x as ft, p as ht, y as V } from "./url-CgnFZYDI.js";
|
|
4
|
+
import { i as _t, s as x, g as h, a as A, T as v, b as mt, D as vt, c as St, u as yt, B as Z, S as H, C as Et, W as Tt, d as gt, m as Lt, e as Pt } from "./index-Cb6WFqJj.js";
|
|
5
|
+
import { s as At, i as bt } from "./suppress-tracing-Cu47NVB2.js";
|
|
6
|
+
import { R as Q } from "./Resource-CUhg8dEK.js";
|
|
7
7
|
import { E as U } from "./ExportResult-BacsqwKA.js";
|
|
8
8
|
var wt = "exception", D = function() {
|
|
9
9
|
return D = Object.assign || function(r) {
|
|
@@ -44,7 +44,7 @@ var wt = "exception", D = function() {
|
|
|
44
44
|
return r.concat(i || Array.prototype.slice.call(t));
|
|
45
45
|
}, xt = (
|
|
46
46
|
/** @class */
|
|
47
|
-
function() {
|
|
47
|
+
(function() {
|
|
48
48
|
function r(t, e, n, o, i, a, s, l, u, p) {
|
|
49
49
|
s === void 0 && (s = []), this.attributes = {}, this.links = [], this.events = [], this._droppedAttributesCount = 0, this._droppedEventsCount = 0, this._droppedLinksCount = 0, this.status = {
|
|
50
50
|
code: nt.UNSET
|
|
@@ -159,14 +159,14 @@ var wt = "exception", D = function() {
|
|
|
159
159
|
return typeof o == "string" ? e._truncateToLimitUtil(o, n) : o;
|
|
160
160
|
}) : t;
|
|
161
161
|
}, r;
|
|
162
|
-
}()
|
|
162
|
+
})()
|
|
163
163
|
), P;
|
|
164
164
|
(function(r) {
|
|
165
165
|
r[r.NOT_RECORD = 0] = "NOT_RECORD", r[r.RECORD = 1] = "RECORD", r[r.RECORD_AND_SAMPLED = 2] = "RECORD_AND_SAMPLED";
|
|
166
166
|
})(P || (P = {}));
|
|
167
167
|
var R = (
|
|
168
168
|
/** @class */
|
|
169
|
-
function() {
|
|
169
|
+
(function() {
|
|
170
170
|
function r() {
|
|
171
171
|
}
|
|
172
172
|
return r.prototype.shouldSample = function() {
|
|
@@ -176,10 +176,10 @@ var R = (
|
|
|
176
176
|
}, r.prototype.toString = function() {
|
|
177
177
|
return "AlwaysOffSampler";
|
|
178
178
|
}, r;
|
|
179
|
-
}()
|
|
179
|
+
})()
|
|
180
180
|
), g = (
|
|
181
181
|
/** @class */
|
|
182
|
-
function() {
|
|
182
|
+
(function() {
|
|
183
183
|
function r() {
|
|
184
184
|
}
|
|
185
185
|
return r.prototype.shouldSample = function() {
|
|
@@ -189,10 +189,10 @@ var R = (
|
|
|
189
189
|
}, r.prototype.toString = function() {
|
|
190
190
|
return "AlwaysOnSampler";
|
|
191
191
|
}, r;
|
|
192
|
-
}()
|
|
192
|
+
})()
|
|
193
193
|
), B = (
|
|
194
194
|
/** @class */
|
|
195
|
-
function() {
|
|
195
|
+
(function() {
|
|
196
196
|
function r(t) {
|
|
197
197
|
var e, n, o, i;
|
|
198
198
|
this._root = t.root, this._root || (h(new Error("ParentBasedSampler must have a root sampler configured")), this._root = new g()), this._remoteParentSampled = (e = t.remoteParentSampled) !== null && e !== void 0 ? e : new g(), this._remoteParentNotSampled = (n = t.remoteParentNotSampled) !== null && n !== void 0 ? n : new R(), this._localParentSampled = (o = t.localParentSampled) !== null && o !== void 0 ? o : new g(), this._localParentNotSampled = (i = t.localParentNotSampled) !== null && i !== void 0 ? i : new R();
|
|
@@ -203,10 +203,10 @@ var R = (
|
|
|
203
203
|
}, r.prototype.toString = function() {
|
|
204
204
|
return "ParentBased{root=" + this._root.toString() + ", remoteParentSampled=" + this._remoteParentSampled.toString() + ", remoteParentNotSampled=" + this._remoteParentNotSampled.toString() + ", localParentSampled=" + this._localParentSampled.toString() + ", localParentNotSampled=" + this._localParentNotSampled.toString() + "}";
|
|
205
205
|
}, r;
|
|
206
|
-
}()
|
|
206
|
+
})()
|
|
207
207
|
), W = (
|
|
208
208
|
/** @class */
|
|
209
|
-
function() {
|
|
209
|
+
(function() {
|
|
210
210
|
function r(t) {
|
|
211
211
|
t === void 0 && (t = 0), this._ratio = t, this._ratio = this._normalize(t), this._upperBound = Math.floor(this._ratio * 4294967295);
|
|
212
212
|
}
|
|
@@ -225,7 +225,7 @@ var R = (
|
|
|
225
225
|
}
|
|
226
226
|
return e;
|
|
227
227
|
}, r;
|
|
228
|
-
}()
|
|
228
|
+
})()
|
|
229
229
|
), Rt = v.AlwaysOn, E = 1;
|
|
230
230
|
function J() {
|
|
231
231
|
var r = A();
|
|
@@ -289,7 +289,7 @@ function Nt(r) {
|
|
|
289
289
|
}
|
|
290
290
|
var Mt = (
|
|
291
291
|
/** @class */
|
|
292
|
-
function() {
|
|
292
|
+
(function() {
|
|
293
293
|
function r(t, e) {
|
|
294
294
|
this._exporter = t, this._isExporting = !1, this._finishedSpans = [], this._droppedSpansCount = 0;
|
|
295
295
|
var n = A();
|
|
@@ -368,8 +368,8 @@ var Mt = (
|
|
|
368
368
|
}, r.prototype._clearTimer = function() {
|
|
369
369
|
this._timer !== void 0 && (clearTimeout(this._timer), this._timer = void 0);
|
|
370
370
|
}, r;
|
|
371
|
-
}()
|
|
372
|
-
), Bt = /* @__PURE__ */ function() {
|
|
371
|
+
})()
|
|
372
|
+
), Bt = /* @__PURE__ */ (function() {
|
|
373
373
|
var r = function(t, e) {
|
|
374
374
|
return r = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, o) {
|
|
375
375
|
n.__proto__ = o;
|
|
@@ -386,9 +386,9 @@ var Mt = (
|
|
|
386
386
|
}
|
|
387
387
|
t.prototype = e === null ? Object.create(e) : (n.prototype = e.prototype, new n());
|
|
388
388
|
};
|
|
389
|
-
}(), Dt = (
|
|
389
|
+
})(), Dt = (
|
|
390
390
|
/** @class */
|
|
391
|
-
function(r) {
|
|
391
|
+
(function(r) {
|
|
392
392
|
Bt(t, r);
|
|
393
393
|
function t(e, n) {
|
|
394
394
|
var o = r.call(this, e, n) || this;
|
|
@@ -408,15 +408,15 @@ var Mt = (
|
|
|
408
408
|
}, t.prototype.onShutdown = function() {
|
|
409
409
|
typeof document < "u" && (this._visibilityChangeListener && document.removeEventListener("visibilitychange", this._visibilityChangeListener), this._pageHideListener && document.removeEventListener("pagehide", this._pageHideListener));
|
|
410
410
|
}, t;
|
|
411
|
-
}(Mt)
|
|
411
|
+
})(Mt)
|
|
412
412
|
), Ut = 8, Ft = 16, Gt = (
|
|
413
413
|
/** @class */
|
|
414
|
-
/* @__PURE__ */ function() {
|
|
414
|
+
/* @__PURE__ */ (function() {
|
|
415
415
|
function r() {
|
|
416
416
|
this.generateTraceId = q(Ft), this.generateSpanId = q(Ut);
|
|
417
417
|
}
|
|
418
418
|
return r;
|
|
419
|
-
}()
|
|
419
|
+
})()
|
|
420
420
|
), C = Array(32);
|
|
421
421
|
function q(r) {
|
|
422
422
|
return function() {
|
|
@@ -427,7 +427,7 @@ function q(r) {
|
|
|
427
427
|
}
|
|
428
428
|
var zt = (
|
|
429
429
|
/** @class */
|
|
430
|
-
function() {
|
|
430
|
+
(function() {
|
|
431
431
|
function r(t, e, n) {
|
|
432
432
|
this._tracerProvider = n;
|
|
433
433
|
var o = It(e);
|
|
@@ -473,7 +473,7 @@ var zt = (
|
|
|
473
473
|
}, r.prototype.getActiveSpanProcessor = function() {
|
|
474
474
|
return this._tracerProvider.getActiveSpanProcessor();
|
|
475
475
|
}, r;
|
|
476
|
-
}()
|
|
476
|
+
})()
|
|
477
477
|
), O = function(r) {
|
|
478
478
|
var t = typeof Symbol == "function" && Symbol.iterator, e = t && r[t], n = 0;
|
|
479
479
|
if (e) return e.call(r);
|
|
@@ -485,7 +485,7 @@ var zt = (
|
|
|
485
485
|
throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
486
486
|
}, K = (
|
|
487
487
|
/** @class */
|
|
488
|
-
function() {
|
|
488
|
+
(function() {
|
|
489
489
|
function r(t) {
|
|
490
490
|
this._spanProcessors = t;
|
|
491
491
|
}
|
|
@@ -566,10 +566,10 @@ var zt = (
|
|
|
566
566
|
}, l);
|
|
567
567
|
});
|
|
568
568
|
}, r;
|
|
569
|
-
}()
|
|
569
|
+
})()
|
|
570
570
|
), jt = (
|
|
571
571
|
/** @class */
|
|
572
|
-
function() {
|
|
572
|
+
(function() {
|
|
573
573
|
function r() {
|
|
574
574
|
}
|
|
575
575
|
return r.prototype.onStart = function(t, e) {
|
|
@@ -579,7 +579,7 @@ var zt = (
|
|
|
579
579
|
}, r.prototype.forceFlush = function() {
|
|
580
580
|
return Promise.resolve();
|
|
581
581
|
}, r;
|
|
582
|
-
}()
|
|
582
|
+
})()
|
|
583
583
|
), kt = function(r, t) {
|
|
584
584
|
var e = typeof Symbol == "function" && r[Symbol.iterator];
|
|
585
585
|
if (!e) return r;
|
|
@@ -606,7 +606,7 @@ var zt = (
|
|
|
606
606
|
})(S || (S = {}));
|
|
607
607
|
var te = (
|
|
608
608
|
/** @class */
|
|
609
|
-
function() {
|
|
609
|
+
(function() {
|
|
610
610
|
function r(t) {
|
|
611
611
|
t === void 0 && (t = {});
|
|
612
612
|
var e, n;
|
|
@@ -692,7 +692,7 @@ var te = (
|
|
|
692
692
|
return new gt();
|
|
693
693
|
}]
|
|
694
694
|
]), r._registeredExporters = /* @__PURE__ */ new Map(), r;
|
|
695
|
-
}()
|
|
695
|
+
})()
|
|
696
696
|
), Ht = function(r) {
|
|
697
697
|
var t = typeof Symbol == "function" && Symbol.iterator, e = t && r[t], n = 0;
|
|
698
698
|
if (e) return e.call(r);
|
|
@@ -704,7 +704,7 @@ var te = (
|
|
|
704
704
|
throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
705
705
|
}, ee = (
|
|
706
706
|
/** @class */
|
|
707
|
-
function() {
|
|
707
|
+
(function() {
|
|
708
708
|
function r() {
|
|
709
709
|
}
|
|
710
710
|
return r.prototype.export = function(t, e) {
|
|
@@ -752,7 +752,7 @@ var te = (
|
|
|
752
752
|
if (e)
|
|
753
753
|
return e({ code: U.SUCCESS });
|
|
754
754
|
}, r;
|
|
755
|
-
}()
|
|
755
|
+
})()
|
|
756
756
|
), Qt = function(r, t, e, n) {
|
|
757
757
|
function o(i) {
|
|
758
758
|
return i instanceof e ? i : new e(function(a) {
|
|
@@ -840,7 +840,7 @@ var te = (
|
|
|
840
840
|
}
|
|
841
841
|
}, re = (
|
|
842
842
|
/** @class */
|
|
843
|
-
function() {
|
|
843
|
+
(function() {
|
|
844
844
|
function r(t) {
|
|
845
845
|
this._exporter = t, this._shutdownOnce = new Z(this._shutdown, this), this._unresolvedExports = /* @__PURE__ */ new Set();
|
|
846
846
|
}
|
|
@@ -889,7 +889,7 @@ var te = (
|
|
|
889
889
|
}, r.prototype._shutdown = function() {
|
|
890
890
|
return this._exporter.shutdown();
|
|
891
891
|
}, r;
|
|
892
|
-
}()
|
|
892
|
+
})()
|
|
893
893
|
);
|
|
894
894
|
export {
|
|
895
895
|
R as A,
|
|
@@ -907,4 +907,4 @@ export {
|
|
|
907
907
|
P as d,
|
|
908
908
|
xt as e
|
|
909
909
|
};
|
|
910
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiU2ltcGxlU3BhblByb2Nlc3Nvci0hfnswMDR9fi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZSBhcyBTcGFuU3RhdHVzQ29kZSwgdCBhcyB0cmFjZSwgaSBhcyBpc1NwYW5Db250ZXh0VmFsaWQsIFQgYXMgVHJhY2VGbGFncywgYiBhcyBpc1ZhbGlkVHJhY2VJZCwgYSBhcyBjb250ZXh0LCBJIGFzIElOVkFMSURfU1BBTl9DT05URVhULCBTIGFzIFNwYW5LaW5kIH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5pbXBvcnQgeyBkIGFzIGRpYWcgfSBmcm9tICcuL2RpYWctYXBpLSF+ezAwOH1+LmpzJztcbmltcG9ydCB7IG8gYXMgb3RwZXJmb3JtYW5jZSwgbCBhcyBnZXRUaW1lT3JpZ2luLCBuIGFzIGlzVGltZUlucHV0LCBxIGFzIGhyVGltZUR1cmF0aW9uLCBqIGFzIGhyVGltZSwgbSBhcyBtaWxsaXNUb0hyVGltZSwgciBhcyBpc1RpbWVJbnB1dEhyVGltZSwgcyBhcyBhZGRIclRpbWVzLCB2IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFLCB3IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFLCB4IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFLCBwIGFzIHByb3BhZ2F0aW9uLCB5IGFzIGhyVGltZVRvTWljcm9zZWNvbmRzIH0gZnJvbSAnLi91cmwtIX57MDBkfX4uanMnO1xuaW1wb3J0IHsgaSBhcyBpc0F0dHJpYnV0ZVZhbHVlLCBzIGFzIHNhbml0aXplQXR0cmlidXRlcywgZyBhcyBnbG9iYWxFcnJvckhhbmRsZXIsIGEgYXMgZ2V0RW52LCBUIGFzIFRyYWNlc1NhbXBsZXJWYWx1ZXMsIGIgYXMgZ2V0RW52V2l0aG91dERlZmF1bHRzLCBEIGFzIERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULCBjIGFzIERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCwgdSBhcyB1bnJlZlRpbWVyLCBCIGFzIEJpbmRPbmNlRnV0dXJlLCBTIGFzIFNhbXBsaW5nRGVjaXNpb24kMSwgQyBhcyBDb21wb3NpdGVQcm9wYWdhdG9yLCBXIGFzIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IsIGQgYXMgVzNDQmFnZ2FnZVByb3BhZ2F0b3IsIG0gYXMgbWVyZ2UsIGUgYXMgaW50ZXJuYWwgfSBmcm9tICcuL2luZGV4LSF+ezAwbX1+LmpzJztcbmltcG9ydCB7IHMgYXMgc3VwcHJlc3NUcmFjaW5nLCBpIGFzIGlzVHJhY2luZ1N1cHByZXNzZWQgfSBmcm9tICcuL3N1cHByZXNzLXRyYWNpbmctIX57MDBhfX4uanMnO1xuaW1wb3J0IHsgUiBhcyBSZXNvdXJjZSB9IGZyb20gJy4vUmVzb3VyY2UtIX57MDAyfX4uanMnO1xuaW1wb3J0IHsgRSBhcyBFeHBvcnRSZXN1bHRDb2RlIH0gZnJvbSAnLi9FeHBvcnRSZXN1bHQtIX57MDBpfX4uanMnO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gRXZlbnQgbmFtZSBkZWZpbml0aW9uc1xudmFyIEV4Y2VwdGlvbkV2ZW50TmFtZSA9ICdleGNlcHRpb24nO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fYXNzaWduID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX192YWx1ZXMkMiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn07XG52YXIgX19yZWFkJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNwYW4uXG4gKi9cbnZhciBTcGFuID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU3BhbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIGNhbGxpbmcgU3BhbiBjb25zdHJ1Y3RvciBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIHRyYWNlci5zdGFydFNwYW4uXG4gICAgICogKi9cbiAgICBmdW5jdGlvbiBTcGFuKHBhcmVudFRyYWNlciwgY29udGV4dCwgc3Bhbk5hbWUsIHNwYW5Db250ZXh0LCBraW5kLCBwYXJlbnRTcGFuSWQsIGxpbmtzLCBzdGFydFRpbWUsIF9kZXByZWNhdGVkQ2xvY2ssIC8vIGtlZXBpbmcgdGhpcyBhcmd1bWVudCBldmVuIHRob3VnaCBpdCBpcyB1bnVzZWQgdG8gZW5zdXJlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgYXR0cmlidXRlcykge1xuICAgICAgICBpZiAobGlua3MgPT09IHZvaWQgMCkgeyBsaW5rcyA9IFtdOyB9XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICB0aGlzLmxpbmtzID0gW107XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgICAgIHRoaXMuX2Ryb3BwZWRBdHRyaWJ1dGVzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9kcm9wcGVkTGlua3NDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc3RhdHVzID0ge1xuICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuVU5TRVQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW5kVGltZSA9IFswLCAwXTtcbiAgICAgICAgdGhpcy5fZW5kZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBbLTEsIC0xXTtcbiAgICAgICAgdGhpcy5uYW1lID0gc3Bhbk5hbWU7XG4gICAgICAgIHRoaXMuX3NwYW5Db250ZXh0ID0gc3BhbkNvbnRleHQ7XG4gICAgICAgIHRoaXMucGFyZW50U3BhbklkID0gcGFyZW50U3BhbklkO1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgICAgICB0aGlzLmxpbmtzID0gbGlua3M7XG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZSA9IG90cGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIHRoaXMuX3BlcmZvcm1hbmNlT2Zmc2V0ID1cbiAgICAgICAgICAgIG5vdyAtICh0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZSArIGdldFRpbWVPcmlnaW4oKSk7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZVByb3ZpZGVkID0gc3RhcnRUaW1lICE9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5fZ2V0VGltZShzdGFydFRpbWUgIT09IG51bGwgJiYgc3RhcnRUaW1lICE9PSB2b2lkIDAgPyBzdGFydFRpbWUgOiBub3cpO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gcGFyZW50VHJhY2VyLnJlc291cmNlO1xuICAgICAgICB0aGlzLmluc3RydW1lbnRhdGlvbkxpYnJhcnkgPSBwYXJlbnRUcmFjZXIuaW5zdHJ1bWVudGF0aW9uTGlicmFyeTtcbiAgICAgICAgdGhpcy5fc3BhbkxpbWl0cyA9IHBhcmVudFRyYWNlci5nZXRTcGFuTGltaXRzKCk7XG4gICAgICAgIHRoaXMuX2F0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQgPVxuICAgICAgICAgICAgdGhpcy5fc3BhbkxpbWl0cy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0IHx8IDA7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zcGFuUHJvY2Vzc29yID0gcGFyZW50VHJhY2VyLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IoKTtcbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3Nvci5vblN0YXJ0KHRoaXMsIGNvbnRleHQpO1xuICAgIH1cbiAgICBTcGFuLnByb3RvdHlwZS5zcGFuQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwYW5Db250ZXh0O1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdGhpcy5faXNTcGFuRW5kZWQoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiSW52YWxpZCBhdHRyaWJ1dGUga2V5OiBcIiArIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXR0cmlidXRlVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlcykubGVuZ3RoID49XG4gICAgICAgICAgICB0aGlzLl9zcGFuTGltaXRzLmF0dHJpYnV0ZUNvdW50TGltaXQgJiZcbiAgICAgICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hdHRyaWJ1dGVzLCBrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50Kys7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXNba2V5XSA9IHRoaXMuX3RydW5jYXRlVG9TaXplKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDIoT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9kID0gX19yZWFkJDEoX2MudmFsdWUsIDIpLCBrID0gX2RbMF0sIHYgPSBfZFsxXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBTcGFuIE5hbWVcbiAgICAgKiBAcGFyYW0gW2F0dHJpYnV0ZXNPclN0YXJ0VGltZV0gU3BhbiBhdHRyaWJ1dGVzIG9yIHN0YXJ0IHRpbWVcbiAgICAgKiAgICAgaWYgdHlwZSBpcyB7QHR5cGUgVGltZUlucHV0fSBhbmQgM3JkIHBhcmFtIGlzIHVuZGVmaW5lZFxuICAgICAqIEBwYXJhbSBbdGltZVN0YW1wXSBTcGVjaWZpZWQgdGltZSBzdGFtcCBmb3IgdGhlIGV2ZW50XG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuYWRkRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgYXR0cmlidXRlc09yU3RhcnRUaW1lLCB0aW1lU3RhbXApIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU3BhbkVuZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuX3NwYW5MaW1pdHMuZXZlbnRDb3VudExpbWl0ID09PSAwKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oJ05vIGV2ZW50cyBhbGxvd2VkLicpO1xuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50Kys7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ldmVudHMubGVuZ3RoID49IHRoaXMuX3NwYW5MaW1pdHMuZXZlbnRDb3VudExpbWl0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlhZy5kZWJ1ZygnRHJvcHBpbmcgZXh0cmEgZXZlbnRzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmVudHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1RpbWVJbnB1dChhdHRyaWJ1dGVzT3JTdGFydFRpbWUpKSB7XG4gICAgICAgICAgICBpZiAoIWlzVGltZUlucHV0KHRpbWVTdGFtcCkpIHtcbiAgICAgICAgICAgICAgICB0aW1lU3RhbXAgPSBhdHRyaWJ1dGVzT3JTdGFydFRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRyaWJ1dGVzT3JTdGFydFRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzYW5pdGl6ZUF0dHJpYnV0ZXMoYXR0cmlidXRlc09yU3RhcnRUaW1lKTtcbiAgICAgICAgdGhpcy5ldmVudHMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICAgICAgICAgIHRpbWU6IHRoaXMuX2dldFRpbWUodGltZVN0YW1wKSxcbiAgICAgICAgICAgIGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLmFkZExpbmsgPSBmdW5jdGlvbiAobGluaykge1xuICAgICAgICB0aGlzLmxpbmtzLnB1c2gobGluayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuYWRkTGlua3MgPSBmdW5jdGlvbiAobGlua3MpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLmxpbmtzKS5wdXNoLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5JDEoW10sIF9fcmVhZCQxKGxpbmtzKSwgZmFsc2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5zZXRTdGF0dXMgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NwYW5FbmRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gX19hc3NpZ24oe30sIHN0YXR1cyk7XG4gICAgICAgIC8vIFdoZW4gdXNpbmcgdHJ5LWNhdGNoLCB0aGUgY2F1Z2h0IFwiZXJyb3JcIiBpcyBvZiB0eXBlIGBhbnlgLiBXaGVuIHRoZW4gYXNzaWduaW5nIGBhbnlgIHRvIGBzdGF0dXMubWVzc2FnZWAsXG4gICAgICAgIC8vIFR5cGVTY3JpcHQgd2lsbCBub3QgZXJyb3IuIFdoaWxlIHRoaXMgY2FuIGhhcHBlbiBkdXJpbmcgdXNlIG9mIGFueSBBUEksIGl0IGlzIG1vcmUgY29tbW9uIG9uIFNwYW4jc2V0U3RhdHVzKClcbiAgICAgICAgLy8gYXMgaXQncyBsaWtlbHkgdXNlZCBpbiBhIGNhdGNoLWJsb2NrLiBUaGVyZWZvcmUsIHdlIHZhbGlkYXRlIGlmIGBzdGF0dXMubWVzc2FnZWAgaXMgYWN0dWFsbHkgYSBzdHJpbmcsIG51bGwsIG9yXG4gICAgICAgIC8vIHVuZGVmaW5lZCB0byBhdm9pZCBhbiBpbmNvcnJlY3QgdHlwZSBjYXVzaW5nIGlzc3VlcyBkb3duc3RyZWFtLlxuICAgICAgICBpZiAodGhpcy5zdGF0dXMubWVzc2FnZSAhPSBudWxsICYmIHR5cGVvZiBzdGF0dXMubWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkRyb3BwaW5nIGludmFsaWQgc3RhdHVzLm1lc3NhZ2Ugb2YgdHlwZSAnXCIgKyB0eXBlb2Ygc3RhdHVzLm1lc3NhZ2UgKyBcIicsIGV4cGVjdGVkICdzdHJpbmcnXCIpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RhdHVzLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS51cGRhdGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU3BhbkVuZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoZW5kVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNTcGFuRW5kZWQoKSkge1xuICAgICAgICAgICAgZGlhZy5lcnJvcih0aGlzLm5hbWUgKyBcIiBcIiArIHRoaXMuX3NwYW5Db250ZXh0LnRyYWNlSWQgKyBcIi1cIiArIHRoaXMuX3NwYW5Db250ZXh0LnNwYW5JZCArIFwiIC0gWW91IGNhbiBvbmx5IGNhbGwgZW5kKCkgb24gYSBzcGFuIG9uY2UuXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbmRUaW1lID0gdGhpcy5fZ2V0VGltZShlbmRUaW1lKTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBoclRpbWVEdXJhdGlvbih0aGlzLnN0YXJ0VGltZSwgdGhpcy5lbmRUaW1lKTtcbiAgICAgICAgaWYgKHRoaXMuX2R1cmF0aW9uWzBdIDwgMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKCdJbmNvbnNpc3RlbnQgc3RhcnQgYW5kIGVuZCB0aW1lLCBzdGFydFRpbWUgPiBlbmRUaW1lLiBTZXR0aW5nIHNwYW4gZHVyYXRpb24gdG8gMG1zLicsIHRoaXMuc3RhcnRUaW1lLCB0aGlzLmVuZFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5lbmRUaW1lID0gdGhpcy5zdGFydFRpbWUuc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2R1cmF0aW9uID0gWzAsIDBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJEcm9wcGVkIFwiICsgdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ICsgXCIgZXZlbnRzIGJlY2F1c2UgZXZlbnRDb3VudExpbWl0IHJlYWNoZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3Nvci5vbkVuZCh0aGlzKTtcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLl9nZXRUaW1lID0gZnVuY3Rpb24gKGlucCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucCA9PT0gJ251bWJlcicgJiYgaW5wIDw9IG90cGVyZm9ybWFuY2Uubm93KCkpIHtcbiAgICAgICAgICAgIC8vIG11c3QgYmUgYSBwZXJmb3JtYW5jZSB0aW1lc3RhbXBcbiAgICAgICAgICAgIC8vIGFwcGx5IGNvcnJlY3Rpb24gYW5kIGNvbnZlcnQgdG8gaHJ0aW1lXG4gICAgICAgICAgICByZXR1cm4gaHJUaW1lKGlucCArIHRoaXMuX3BlcmZvcm1hbmNlT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGlucCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBtaWxsaXNUb0hyVGltZShpbnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnAgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbWlsbGlzVG9IclRpbWUoaW5wLmdldFRpbWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVGltZUlucHV0SHJUaW1lKGlucCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0VGltZVByb3ZpZGVkKSB7XG4gICAgICAgICAgICAvLyBpZiB1c2VyIHByb3ZpZGVkIGEgdGltZSBmb3IgdGhlIHN0YXJ0IG1hbnVhbGx5XG4gICAgICAgICAgICAvLyB3ZSBjYW4ndCB1c2UgZHVyYXRpb24gdG8gY2FsY3VsYXRlIGV2ZW50L2VuZCB0aW1lc1xuICAgICAgICAgICAgcmV0dXJuIG1pbGxpc1RvSHJUaW1lKERhdGUubm93KCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtc0R1cmF0aW9uID0gb3RwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMuX3BlcmZvcm1hbmNlU3RhcnRUaW1lO1xuICAgICAgICByZXR1cm4gYWRkSHJUaW1lcyh0aGlzLnN0YXJ0VGltZSwgbWlsbGlzVG9IclRpbWUobXNEdXJhdGlvbikpO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuaXNSZWNvcmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmRlZCA9PT0gZmFsc2U7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5yZWNvcmRFeGNlcHRpb24gPSBmdW5jdGlvbiAoZXhjZXB0aW9uLCB0aW1lKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZXhjZXB0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRV0gPSBleGNlcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZXhjZXB0aW9uLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9UWVBFXSA9IGV4Y2VwdGlvbi5jb2RlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleGNlcHRpb24ubmFtZSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX1RZUEVdID0gZXhjZXB0aW9uLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhjZXB0aW9uLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFXSA9IGV4Y2VwdGlvbi5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5zdGFjaykge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX1NUQUNLVFJBQ0VdID0gZXhjZXB0aW9uLnN0YWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoZXNlIGFyZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmcm9tIHNwZWNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX1RZUEVdIHx8XG4gICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFXSkge1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChFeGNlcHRpb25FdmVudE5hbWUsIGF0dHJpYnV0ZXMsIHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiRmFpbGVkIHRvIHJlY29yZCBhbiBleGNlcHRpb24gXCIgKyBleGNlcHRpb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3Bhbi5wcm90b3R5cGUsIFwiZHVyYXRpb25cIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJlbmRlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuZGVkO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNwYW4ucHJvdG90eXBlLCBcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNwYW4ucHJvdG90eXBlLCBcImRyb3BwZWRFdmVudHNDb3VudFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJkcm9wcGVkTGlua3NDb3VudFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Ryb3BwZWRMaW5rc0NvdW50O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgU3Bhbi5wcm90b3R5cGUuX2lzU3BhbkVuZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZW5kZWQpIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkNhbiBub3QgZXhlY3V0ZSB0aGUgb3BlcmF0aW9uIG9uIGVuZGVkIFNwYW4ge3RyYWNlSWQ6IFwiICsgdGhpcy5fc3BhbkNvbnRleHQudHJhY2VJZCArIFwiLCBzcGFuSWQ6IFwiICsgdGhpcy5fc3BhbkNvbnRleHQuc3BhbklkICsgXCJ9XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmRlZDtcbiAgICB9O1xuICAgIC8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gdHJ1bmNhdGUgZ2l2ZW4gdmFsdWUgd2l0aGluIHNpemVcbiAgICAvLyBmb3IgdmFsdWUgdHlwZSBvZiBzdHJpbmcsIHdpbGwgdHJ1bmNhdGUgdG8gZ2l2ZW4gbGltaXRcbiAgICAvLyBmb3IgdHlwZSBvZiBub24tc3RyaW5nLCB3aWxsIHJldHVybiBzYW1lIHZhbHVlXG4gICAgU3Bhbi5wcm90b3R5cGUuX3RydW5jYXRlVG9MaW1pdFV0aWwgPSBmdW5jdGlvbiAodmFsdWUsIGxpbWl0KSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPD0gbGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGxpbWl0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMgb2YgdHlwZSBzdHJpbmcgYW5kIGhhcyBtb3JlIGNoYXJhY3RlcnMgdGhhbiBnaXZlbiB7QGNvZGUgYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdH0gdGhlblxuICAgICAqIHJldHVybiBzdHJpbmcgd2l0aCB0cnVuY2F0ZWQgdG8ge0Bjb2RlIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR9IGNoYXJhY3RlcnNcbiAgICAgKlxuICAgICAqIElmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMgYXJyYXkgb2Ygc3RyaW5ncyB0aGVuXG4gICAgICogcmV0dXJuIG5ldyBhcnJheSBvZiBzdHJpbmdzIHdpdGggZWFjaCBlbGVtZW50IHRydW5jYXRlZCB0byB7QGNvZGUgYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdH0gY2hhcmFjdGVyc1xuICAgICAqXG4gICAgICogT3RoZXJ3aXNlIHJldHVybiBzYW1lIEF0dHJpYnV0ZSB7QGNvZGUgdmFsdWV9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgQXR0cmlidXRlIHZhbHVlXG4gICAgICogQHJldHVybnMgdHJ1bmNhdGVkIGF0dHJpYnV0ZSB2YWx1ZSBpZiByZXF1aXJlZCwgb3RoZXJ3aXNlIHNhbWUgdmFsdWVcbiAgICAgKi9cbiAgICBTcGFuLnByb3RvdHlwZS5fdHJ1bmNhdGVUb1NpemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGxpbWl0ID0gdGhpcy5fYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdDtcbiAgICAgICAgLy8gQ2hlY2sgbGltaXRcbiAgICAgICAgaWYgKGxpbWl0IDw9IDApIHtcbiAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHZhbHVlcyBhcmUgaW52YWxpZCwgc28gZG8gbm90IHRydW5jYXRlXG4gICAgICAgICAgICBkaWFnLndhcm4oXCJBdHRyaWJ1dGUgdmFsdWUgbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSwgZ290IFwiICsgbGltaXQpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0cmluZ1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RydW5jYXRlVG9MaW1pdFV0aWwodmFsdWUsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiBzdHJpbmdzXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gX3RoaXMuX3RydW5jYXRlVG9MaW1pdFV0aWwodmFsLCBsaW1pdCkgOiB2YWw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlciB0eXBlcywgbm8gbmVlZCB0byBhcHBseSB2YWx1ZSBsZW5ndGggbGltaXRcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIFNwYW47XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHNhbXBsaW5nIGRlY2lzaW9uIHRoYXQgZGV0ZXJtaW5lcyBob3cgYSB7QGxpbmsgU3Bhbn0gd2lsbCBiZSByZWNvcmRlZFxuICogYW5kIGNvbGxlY3RlZC5cbiAqL1xudmFyIFNhbXBsaW5nRGVjaXNpb247XG4oZnVuY3Rpb24gKFNhbXBsaW5nRGVjaXNpb24pIHtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSBmYWxzZWAsIHNwYW4gd2lsbCBub3QgYmUgcmVjb3JkZWQgYW5kIGFsbCBldmVudHNcbiAgICAgKiBhbmQgYXR0cmlidXRlcyB3aWxsIGJlIGRyb3BwZWQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiTk9UX1JFQ09SRFwiXSA9IDBdID0gXCJOT1RfUkVDT1JEXCI7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gdHJ1ZWAsIGJ1dCBgU2FtcGxlZGAgZmxhZyBpbiB7QGxpbmsgVHJhY2VGbGFnc31cbiAgICAgKiBNVVNUIE5PVCBiZSBzZXQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiUkVDT1JEXCJdID0gMV0gPSBcIlJFQ09SRFwiO1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IHRydWVgIEFORCBgU2FtcGxlZGAgZmxhZyBpbiB7QGxpbmsgVHJhY2VGbGFnc31cbiAgICAgKiBNVVNUIGJlIHNldC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJSRUNPUkRfQU5EX1NBTVBMRURcIl0gPSAyXSA9IFwiUkVDT1JEX0FORF9TQU1QTEVEXCI7XG59KShTYW1wbGluZ0RlY2lzaW9uIHx8IChTYW1wbGluZ0RlY2lzaW9uID0ge30pKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBTYW1wbGVyIHRoYXQgc2FtcGxlcyBubyB0cmFjZXMuICovXG52YXIgQWx3YXlzT2ZmU2FtcGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBbHdheXNPZmZTYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPZmZTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT2ZmU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT2ZmU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2FtcGxlciB0aGF0IHNhbXBsZXMgYWxsIHRyYWNlcy4gKi9cbnZhciBBbHdheXNPblNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT25TYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09uU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT25TYW1wbGVyJztcbiAgICB9O1xuICAgIHJldHVybiBBbHdheXNPblNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGNvbXBvc2l0ZSBzYW1wbGVyIHRoYXQgZWl0aGVyIHJlc3BlY3RzIHRoZSBwYXJlbnQgc3BhbidzIHNhbXBsaW5nIGRlY2lzaW9uXG4gKiBvciBkZWxlZ2F0ZXMgdG8gYGRlbGVnYXRlU2FtcGxlcmAgZm9yIHJvb3Qgc3BhbnMuXG4gKi9cbnZhciBQYXJlbnRCYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyZW50QmFzZWRTYW1wbGVyKGNvbmZpZykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb25maWcucm9vdDtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290KSB7XG4gICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIobmV3IEVycm9yKCdQYXJlbnRCYXNlZFNhbXBsZXIgbXVzdCBoYXZlIGEgcm9vdCBzYW1wbGVyIGNvbmZpZ3VyZWQnKSk7XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9hID0gY29uZmlnLnJlbW90ZVBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2IgPSBjb25maWcucmVtb3RlUGFyZW50Tm90U2FtcGxlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYyA9IGNvbmZpZy5sb2NhbFBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkID1cbiAgICAgICAgICAgIChfZCA9IGNvbmZpZy5sb2NhbFBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgfVxuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQsIHNwYW5OYW1lLCBzcGFuS2luZCwgYXR0cmlidXRlcywgbGlua3MpIHtcbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0IHx8ICFpc1NwYW5Db250ZXh0VmFsaWQocGFyZW50Q29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290LnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5pc1JlbW90ZSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICB9O1xuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlBhcmVudEJhc2Vke3Jvb3Q9XCIgKyB0aGlzLl9yb290LnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCByZW1vdGVQYXJlbnROb3RTYW1wbGVkPVwiICsgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCJ9XCI7XG4gICAgfTtcbiAgICByZXR1cm4gUGFyZW50QmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBTYW1wbGVyIHRoYXQgc2FtcGxlcyBhIGdpdmVuIGZyYWN0aW9uIG9mIHRyYWNlcyBiYXNlZCBvZiB0cmFjZSBpZCBkZXRlcm1pbmlzdGljYWxseS4gKi9cbnZhciBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKF9yYXRpbykge1xuICAgICAgICBpZiAoX3JhdGlvID09PSB2b2lkIDApIHsgX3JhdGlvID0gMDsgfVxuICAgICAgICB0aGlzLl9yYXRpbyA9IF9yYXRpbztcbiAgICAgICAgdGhpcy5fcmF0aW8gPSB0aGlzLl9ub3JtYWxpemUoX3JhdGlvKTtcbiAgICAgICAgdGhpcy5fdXBwZXJCb3VuZCA9IE1hdGguZmxvb3IodGhpcy5fcmF0aW8gKiAweGZmZmZmZmZmKTtcbiAgICB9XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgdHJhY2VJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IGlzVmFsaWRUcmFjZUlkKHRyYWNlSWQpICYmIHRoaXMuX2FjY3VtdWxhdGUodHJhY2VJZCkgPCB0aGlzLl91cHBlckJvdW5kXG4gICAgICAgICAgICAgICAgPyBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRFxuICAgICAgICAgICAgICAgIDogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiVHJhY2VJZFJhdGlvQmFzZWR7XCIgKyB0aGlzLl9yYXRpbyArIFwifVwiO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fbm9ybWFsaXplID0gZnVuY3Rpb24gKHJhdGlvKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmF0aW8gIT09ICdudW1iZXInIHx8IGlzTmFOKHJhdGlvKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gcmF0aW8gPj0gMSA/IDEgOiByYXRpbyA8PSAwID8gMCA6IHJhdGlvO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fYWNjdW11bGF0ZSA9IGZ1bmN0aW9uICh0cmFjZUlkKSB7XG4gICAgICAgIHZhciBhY2N1bXVsYXRpb24gPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNlSWQubGVuZ3RoIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zID0gaSAqIDg7XG4gICAgICAgICAgICB2YXIgcGFydCA9IHBhcnNlSW50KHRyYWNlSWQuc2xpY2UocG9zLCBwb3MgKyA4KSwgMTYpO1xuICAgICAgICAgICAgYWNjdW11bGF0aW9uID0gKGFjY3VtdWxhdGlvbiBeIHBhcnQpID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRpb247XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBGQUxMQkFDS19PVEVMX1RSQUNFU19TQU1QTEVSID0gVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPbjtcbnZhciBERUZBVUxUX1JBVElPID0gMTtcbi8qKlxuICogTG9hZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uIEZvciBmaWVsZHMgd2l0aCBwcmltaXRpdmUgdmFsdWVzLCBhbnkgdXNlci1wcm92aWRlZFxuICogdmFsdWUgd2lsbCBvdmVycmlkZSB0aGUgY29ycmVzcG9uZGluZyBkZWZhdWx0IHZhbHVlLiBGb3IgZmllbGRzIHdpdGhcbiAqIG5vbi1wcmltaXRpdmUgdmFsdWVzIChsaWtlIGBzcGFuTGltaXRzYCksIHRoZSB1c2VyLXByb3ZpZGVkIHZhbHVlIHdpbGwgYmVcbiAqIHVzZWQgdG8gZXh0ZW5kIHRoZSBkZWZhdWx0IHZhbHVlLlxuICovXG4vLyBvYmplY3QgbmVlZHMgdG8gYmUgd3JhcHBlZCBpbiB0aGlzIGZ1bmN0aW9uIGFuZCBjYWxsZWQgd2hlbiBuZWVkZWQgb3RoZXJ3aXNlXG4vLyBlbnZzIGFyZSBwYXJzZWQgYmVmb3JlIHRlc3RzIGFyZSByYW4gLSBjYXVzZXMgdGVzdHMgdXNpbmcgdGhlc2UgZW52cyB0byBmYWlsXG5mdW5jdGlvbiBsb2FkRGVmYXVsdENvbmZpZygpIHtcbiAgICB2YXIgZW52ID0gZ2V0RW52KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2FtcGxlcjogYnVpbGRTYW1wbGVyRnJvbUVudihlbnYpLFxuICAgICAgICBmb3JjZUZsdXNoVGltZW91dE1pbGxpczogMzAwMDAsXG4gICAgICAgIGdlbmVyYWxMaW1pdHM6IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ6IGVudi5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVDb3VudExpbWl0OiBlbnYuT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQsXG4gICAgICAgIH0sXG4gICAgICAgIHNwYW5MaW1pdHM6IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZUNvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgICAgICAgICAgbGlua0NvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fTElOS19DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGV2ZW50Q291bnRMaW1pdDogZW52Lk9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVBlckV2ZW50Q291bnRMaW1pdDogZW52Lk9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlULFxuICAgICAgICAgICAgYXR0cmlidXRlUGVyTGlua0NvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlULFxuICAgICAgICB9LFxuICAgICAgICBtZXJnZVJlc291cmNlV2l0aERlZmF1bHRzOiB0cnVlLFxuICAgIH07XG59XG4vKipcbiAqIEJhc2VkIG9uIGVudmlyb25tZW50LCBidWlsZHMgYSBzYW1wbGVyLCBjb21wbGllcyB3aXRoIHNwZWNpZmljYXRpb24uXG4gKiBAcGFyYW0gZW52aXJvbm1lbnQgb3B0aW9uYWwsIGJ5IGRlZmF1bHQgdXNlcyBnZXRFbnYoKSwgYnV0IGFsbG93cyBwYXNzaW5nIGEgdmFsdWUgdG8gcmV1c2UgcGFyc2VkIGVudmlyb25tZW50XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2FtcGxlckZyb21FbnYoZW52aXJvbm1lbnQpIHtcbiAgICBpZiAoZW52aXJvbm1lbnQgPT09IHZvaWQgMCkgeyBlbnZpcm9ubWVudCA9IGdldEVudigpOyB9XG4gICAgc3dpdGNoIChlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSKSB7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPbjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPZmY6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgY2FzZSBUcmFjZXNTYW1wbGVyVmFsdWVzLlBhcmVudEJhc2VkQWx3YXlzT246XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhcmVudEJhc2VkU2FtcGxlcih7XG4gICAgICAgICAgICAgICAgcm9vdDogbmV3IEFsd2F5c09uU2FtcGxlcigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5QYXJlbnRCYXNlZEFsd2F5c09mZjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyZW50QmFzZWRTYW1wbGVyKHtcbiAgICAgICAgICAgICAgICByb290OiBuZXcgQWx3YXlzT2ZmU2FtcGxlcigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5UcmFjZUlkUmF0aW86XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52KGVudmlyb25tZW50KSk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5QYXJlbnRCYXNlZFRyYWNlSWRSYXRpbzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyZW50QmFzZWRTYW1wbGVyKHtcbiAgICAgICAgICAgICAgICByb290OiBuZXcgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKGdldFNhbXBsZXJQcm9iYWJpbGl0eUZyb21FbnYoZW52aXJvbm1lbnQpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVIgdmFsdWUgXFxcIlwiICsgZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUiArIFwiIGludmFsaWQsIGRlZmF1bHRpbmcgdG8gXCIgKyBGQUxMQkFDS19PVEVMX1RSQUNFU19TQU1QTEVSICsgXCJcXFwiLlwiKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0U2FtcGxlclByb2JhYmlsaXR5RnJvbUVudihlbnZpcm9ubWVudCkge1xuICAgIGlmIChlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHID09PSAnJykge1xuICAgICAgICBkaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgaXMgYmxhbmssIGRlZmF1bHRpbmcgdG8gXCIgKyBERUZBVUxUX1JBVElPICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SQVRJTztcbiAgICB9XG4gICAgdmFyIHByb2JhYmlsaXR5ID0gTnVtYmVyKGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHKTtcbiAgICBpZiAoaXNOYU4ocHJvYmFiaWxpdHkpKSB7XG4gICAgICAgIGRpYWcuZXJyb3IoXCJPVEVMX1RSQUNFU19TQU1QTEVSX0FSRz1cIiArIGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHICsgXCIgd2FzIGdpdmVuLCBidXQgaXQgaXMgaW52YWxpZCwgZGVmYXVsdGluZyB0byBcIiArIERFRkFVTFRfUkFUSU8gKyBcIi5cIik7XG4gICAgICAgIHJldHVybiBERUZBVUxUX1JBVElPO1xuICAgIH1cbiAgICBpZiAocHJvYmFiaWxpdHkgPCAwIHx8IHByb2JhYmlsaXR5ID4gMSkge1xuICAgICAgICBkaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9XCIgKyBlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyArIFwiIHdhcyBnaXZlbiwgYnV0IGl0IGlzIG91dCBvZiByYW5nZSAoWzAuLjFdKSwgZGVmYXVsdGluZyB0byBcIiArIERFRkFVTFRfUkFUSU8gKyBcIi5cIik7XG4gICAgICAgIHJldHVybiBERUZBVUxUX1JBVElPO1xuICAgIH1cbiAgICByZXR1cm4gcHJvYmFiaWxpdHk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEZ1bmN0aW9uIHRvIG1lcmdlIERlZmF1bHQgY29uZmlndXJhdGlvbiAoYXMgc3BlY2lmaWVkIGluICcuL2NvbmZpZycpIHdpdGhcbiAqIHVzZXIgcHJvdmlkZWQgY29uZmlndXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnKHVzZXJDb25maWcpIHtcbiAgICB2YXIgcGVySW5zdGFuY2VEZWZhdWx0cyA9IHtcbiAgICAgICAgc2FtcGxlcjogYnVpbGRTYW1wbGVyRnJvbUVudigpLFxuICAgIH07XG4gICAgdmFyIERFRkFVTFRfQ09ORklHID0gbG9hZERlZmF1bHRDb25maWcoKTtcbiAgICB2YXIgdGFyZ2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcsIHBlckluc3RhbmNlRGVmYXVsdHMsIHVzZXJDb25maWcpO1xuICAgIHRhcmdldC5nZW5lcmFsTGltaXRzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcuZ2VuZXJhbExpbWl0cywgdXNlckNvbmZpZy5nZW5lcmFsTGltaXRzIHx8IHt9KTtcbiAgICB0YXJnZXQuc3BhbkxpbWl0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLnNwYW5MaW1pdHMsIHVzZXJDb25maWcuc3BhbkxpbWl0cyB8fCB7fSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbi8qKlxuICogV2hlbiBnZW5lcmFsIGxpbWl0cyBhcmUgcHJvdmlkZWQgYW5kIG1vZGVsIHNwZWNpZmljIGxpbWl0cyBhcmUgbm90LFxuICogY29uZmlndXJlcyB0aGUgbW9kZWwgc3BlY2lmaWMgbGltaXRzIGJ5IHVzaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2VuZXJhbCBvbmVzLlxuICogQHBhcmFtIHVzZXJDb25maWcgVXNlciBwcm92aWRlZCB0cmFjZXIgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiByZWNvbmZpZ3VyZUxpbWl0cyh1c2VyQ29uZmlnKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX207XG4gICAgdmFyIHNwYW5MaW1pdHMgPSBPYmplY3QuYXNzaWduKHt9LCB1c2VyQ29uZmlnLnNwYW5MaW1pdHMpO1xuICAgIHZhciBwYXJzZWRFbnZDb25maWcgPSBnZXRFbnZXaXRob3V0RGVmYXVsdHMoKTtcbiAgICAvKipcbiAgICAgKiBSZWFzc2lnbiBzcGFuIGF0dHJpYnV0ZSBjb3VudCBsaW1pdCB0byB1c2UgZmlyc3Qgbm9uIG51bGwgdmFsdWUgZGVmaW5lZCBieSB1c2VyIG9yIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgICovXG4gICAgc3BhbkxpbWl0cy5hdHRyaWJ1dGVDb3VudExpbWl0ID1cbiAgICAgICAgKF9mID0gKF9lID0gKF9kID0gKF9iID0gKF9hID0gdXNlckNvbmZpZy5zcGFuTGltaXRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXR0cmlidXRlQ291bnRMaW1pdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogKF9jID0gdXNlckNvbmZpZy5nZW5lcmFsTGltaXRzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuYXR0cmlidXRlQ291bnRMaW1pdCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogcGFyc2VkRW52Q29uZmlnLk9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHBhcnNlZEVudkNvbmZpZy5PVEVMX0FUVFJJQlVURV9DT1VOVF9MSU1JVCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQ7XG4gICAgLyoqXG4gICAgICogUmVhc3NpZ24gc3BhbiBhdHRyaWJ1dGUgdmFsdWUgbGVuZ3RoIGxpbWl0IHRvIHVzZSBmaXJzdCBub24gbnVsbCB2YWx1ZSBkZWZpbmVkIGJ5IHVzZXIgb3IgdXNlIGRlZmF1bHQgdmFsdWVcbiAgICAgKi9cbiAgICBzcGFuTGltaXRzLmF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQgPVxuICAgICAgICAoX20gPSAoX2wgPSAoX2sgPSAoX2ggPSAoX2cgPSB1c2VyQ29uZmlnLnNwYW5MaW1pdHMpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0KSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAoX2ogPSB1c2VyQ29uZmlnLmdlbmVyYWxMaW1pdHMpID09PSBudWxsIHx8IF9qID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfai5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0KSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiBwYXJzZWRFbnZDb25maWcuT1RFTF9TUEFOX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHBhcnNlZEVudkNvbmZpZy5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdXNlckNvbmZpZywgeyBzcGFuTGltaXRzOiBzcGFuTGltaXRzIH0pO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFNwYW5Qcm9jZXNzb3J9IHRoYXQgYmF0Y2hlcyBzcGFucyBleHBvcnRlZCBieVxuICogdGhlIFNESyB0aGVuIHB1c2hlcyB0aGVtIHRvIHRoZSBleHBvcnRlciBwaXBlbGluZS5cbiAqL1xudmFyIEJhdGNoU3BhblByb2Nlc3NvckJhc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZShfZXhwb3J0ZXIsIGNvbmZpZykge1xuICAgICAgICB0aGlzLl9leHBvcnRlciA9IF9leHBvcnRlcjtcbiAgICAgICAgdGhpcy5faXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZmluaXNoZWRTcGFucyA9IFtdO1xuICAgICAgICB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA9IDA7XG4gICAgICAgIHZhciBlbnYgPSBnZXRFbnYoKTtcbiAgICAgICAgdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLm1heEV4cG9ydEJhdGNoU2l6ZSkgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBjb25maWcubWF4RXhwb3J0QmF0Y2hTaXplXG4gICAgICAgICAgICAgICAgOiBlbnYuT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFO1xuICAgICAgICB0aGlzLl9tYXhRdWV1ZVNpemUgPVxuICAgICAgICAgICAgdHlwZW9mIChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcubWF4UXVldWVTaXplKSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICA/IGNvbmZpZy5tYXhRdWV1ZVNpemVcbiAgICAgICAgICAgICAgICA6IGVudi5PVEVMX0JTUF9NQVhfUVVFVUVfU0laRTtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVkRGVsYXlNaWxsaXMgPVxuICAgICAgICAgICAgdHlwZW9mIChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuc2NoZWR1bGVkRGVsYXlNaWxsaXMpID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgID8gY29uZmlnLnNjaGVkdWxlZERlbGF5TWlsbGlzXG4gICAgICAgICAgICAgICAgOiBlbnYuT1RFTF9CU1BfU0NIRURVTEVfREVMQVk7XG4gICAgICAgIHRoaXMuX2V4cG9ydFRpbWVvdXRNaWxsaXMgPVxuICAgICAgICAgICAgdHlwZW9mIChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuZXhwb3J0VGltZW91dE1pbGxpcykgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBjb25maWcuZXhwb3J0VGltZW91dE1pbGxpc1xuICAgICAgICAgICAgICAgIDogZW52Lk9URUxfQlNQX0VYUE9SVF9USU1FT1VUO1xuICAgICAgICB0aGlzLl9zaHV0ZG93bk9uY2UgPSBuZXcgQmluZE9uY2VGdXR1cmUodGhpcy5fc2h1dGRvd24sIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplID4gdGhpcy5fbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oJ0JhdGNoU3BhblByb2Nlc3NvcjogbWF4RXhwb3J0QmF0Y2hTaXplIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byBtYXhRdWV1ZVNpemUsIHNldHRpbmcgbWF4RXhwb3J0QmF0Y2hTaXplIHRvIG1hdGNoIG1heFF1ZXVlU2l6ZScpO1xuICAgICAgICAgICAgdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplID0gdGhpcy5fbWF4UXVldWVTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZmx1c2hBbGwoKTtcbiAgICB9O1xuICAgIC8vIGRvZXMgbm90aGluZy5cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKF9zcGFuLCBfcGFyZW50Q29udGV4dCkgeyB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3NodXRkb3duT25jZS5pc0NhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWRkVG9CdWZmZXIoc3Bhbik7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5jYWxsKCk7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLm9uU2h1dGRvd24oKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZmx1c2hBbGwoKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZXhwb3J0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogQWRkIGEgc3BhbiBpbiB0aGUgYnVmZmVyLiAqL1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9hZGRUb0J1ZmZlciA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aCA+PSB0aGlzLl9tYXhRdWV1ZVNpemUpIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHJlYWNoZWQsIGRyb3Agc3BhblxuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlhZy5kZWJ1ZygnbWF4UXVldWVTaXplIHJlYWNoZWQsIGRyb3BwaW5nIHNwYW5zJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIHNvbWUgc3BhbnMgd2VyZSBkcm9wcGVkLCBsb2cgb25jZSB3aXRoIGNvdW50IG9mIHNwYW5zIGRyb3BwZWRcbiAgICAgICAgICAgIGRpYWcud2FybihcIkRyb3BwZWQgXCIgKyB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCArIFwiIHNwYW5zIGJlY2F1c2UgbWF4UXVldWVTaXplIHJlYWNoZWRcIik7XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmluaXNoZWRTcGFucy5wdXNoKHNwYW4pO1xuICAgICAgICB0aGlzLl9tYXliZVN0YXJ0VGltZXIoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlbmQgYWxsIHNwYW5zIHRvIHRoZSBleHBvcnRlciByZXNwZWN0aW5nIHRoZSBiYXRjaCBzaXplIGxpbWl0XG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgb24gZm9yY2VGbHVzaCBvciBzaHV0ZG93bixcbiAgICAgKiBmb3IgYWxsIG90aGVyIGNhc2VzIF9mbHVzaCBzaG91bGQgYmUgdXNlZFxuICAgICAqICovXG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX2ZsdXNoQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGJhdGNoZXNcbiAgICAgICAgICAgIHZhciBjb3VudCA9IE1hdGguY2VpbChfdGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggLyBfdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gY291bnQ7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKF90aGlzLl9mbHVzaE9uZUJhdGNoKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX2ZsdXNoT25lQmF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXIoKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIGRvbid0IHdhaXQgYW55bW9yZSBmb3IgZXhwb3J0LCB0aGlzIHdheSB0aGUgbmV4dCBiYXRjaCBjYW4gc3RhcnRcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdUaW1lb3V0JykpO1xuICAgICAgICAgICAgfSwgX3RoaXMuX2V4cG9ydFRpbWVvdXRNaWxsaXMpO1xuICAgICAgICAgICAgLy8gcHJldmVudCBkb3duc3RyZWFtIGV4cG9ydGVyIGNhbGxzIGZyb20gZ2VuZXJhdGluZyBzcGFuc1xuICAgICAgICAgICAgY29udGV4dC53aXRoKHN1cHByZXNzVHJhY2luZyhjb250ZXh0LmFjdGl2ZSgpKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBmaW5pc2hlZCBzcGFucyBidWZmZXIgaGVyZSBiZWNhdXNlIHRoZSBuZXh0IGludm9jYXRpb25zIG9mIHRoZSBfZmx1c2ggbWV0aG9kXG4gICAgICAgICAgICAgICAgLy8gY291bGQgcGFzcyB0aGUgc2FtZSBmaW5pc2hlZCBzcGFucyB0byB0aGUgZXhwb3J0ZXIgaWYgdGhlIGJ1ZmZlciBpcyBjbGVhcmVkXG4gICAgICAgICAgICAgICAgLy8gb3V0c2lkZSB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbGJhY2suXG4gICAgICAgICAgICAgICAgdmFyIHNwYW5zO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPD0gX3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBzcGFucyA9IF90aGlzLl9maW5pc2hlZFNwYW5zO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZmluaXNoZWRTcGFucyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBfdGhpcy5fZmluaXNoZWRTcGFucy5zcGxpY2UoMCwgX3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBkb0V4cG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9leHBvcnRlci5leHBvcnQoc3BhbnMsIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvZGUgPT09IEV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgoX2EgPSByZXN1bHQuZXJyb3IpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBFcnJvcignQmF0Y2hTcGFuUHJvY2Vzc29yOiBzcGFuIGV4cG9ydCBmYWlsZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIHBlbmRpbmdSZXNvdXJjZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzcGFucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IHNwYW5zW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbi5yZXNvdXJjZS5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnJlc291cmNlLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXNvdXJjZXMgIT09IG51bGwgJiYgcGVuZGluZ1Jlc291cmNlcyAhPT0gdm9pZCAwID8gcGVuZGluZ1Jlc291cmNlcyA6IChwZW5kaW5nUmVzb3VyY2VzID0gW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1Jlc291cmNlcy5wdXNoKHNwYW4ucmVzb3VyY2Uud2FpdEZvckFzeW5jQXR0cmlidXRlcygpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBzY2hlZHVsaW5nIGEgcHJvbWlzZSB0byBtYWtlIHRoZSBiZWhhdmlvciBtb3JlIHByZWRpY3RhYmxlIGFuZCBlYXNpZXIgdG8gdGVzdFxuICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nUmVzb3VyY2VzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvRXhwb3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChwZW5kaW5nUmVzb3VyY2VzKS50aGVuKGRvRXhwb3J0LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fbWF5YmVTdGFydFRpbWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5faXNFeHBvcnRpbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLl9pc0V4cG9ydGluZyA9IHRydWU7XG4gICAgICAgICAgICBfdGhpcy5fZmx1c2hPbmVCYXRjaCgpXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9pc0V4cG9ydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jbGVhclRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9tYXliZVN0YXJ0VGltZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9pc0V4cG9ydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdsb2JhbEVycm9ySGFuZGxlcihlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyB3ZSBvbmx5IHdhaXQgaWYgdGhlIHF1ZXVlIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZWxlbWVudHMgeWV0XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aCA+PSB0aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90aW1lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZmx1c2goKTsgfSwgdGhpcy5fc2NoZWR1bGVkRGVsYXlNaWxsaXMpO1xuICAgICAgICB1bnJlZlRpbWVyKHRoaXMuX3RpbWVyKTtcbiAgICB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9jbGVhclRpbWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fdGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZTtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBCYXRjaFNwYW5Qcm9jZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJhdGNoU3BhblByb2Nlc3NvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCYXRjaFNwYW5Qcm9jZXNzb3IoX2V4cG9ydGVyLCBjb25maWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgX2V4cG9ydGVyLCBjb25maWcpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9uSW5pdChjb25maWcpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEJhdGNoU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25Jbml0ID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5kaXNhYmxlQXV0b0ZsdXNoT25Eb2N1bWVudEhpZGUpICE9PSB0cnVlICYmXG4gICAgICAgICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZm9yY2VGbHVzaCgpLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3BhZ2VIaWRlTGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZm9yY2VGbHVzaCgpLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICAgICAgLy8gdXNlICdwYWdlaGlkZScgZXZlbnQgYXMgYSBmYWxsYmFjayBmb3IgU2FmYXJpOyBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNjc2OVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCB0aGlzLl9wYWdlSGlkZUxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vblNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BhZ2VIaWRlTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIHRoaXMuX3BhZ2VIaWRlTGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQmF0Y2hTcGFuUHJvY2Vzc29yO1xufShCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgU1BBTl9JRF9CWVRFUyA9IDg7XG52YXIgVFJBQ0VfSURfQllURVMgPSAxNjtcbnZhciBSYW5kb21JZEdlbmVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSYW5kb21JZEdlbmVyYXRvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSByYW5kb20gMTYtYnl0ZSB0cmFjZSBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDMyIGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDEyOCBiaXRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRyYWNlSWQgPSBnZXRJZEdlbmVyYXRvcihUUkFDRV9JRF9CWVRFUyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDgtYnl0ZSBzcGFuIElEIGZvcm1hdHRlZC9lbmNvZGVkIGFzIGEgMTYgbG93ZXJjYXNlIGhleFxuICAgICAgICAgKiBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gNjQgYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVTcGFuSWQgPSBnZXRJZEdlbmVyYXRvcihTUEFOX0lEX0JZVEVTKTtcbiAgICB9XG4gICAgcmV0dXJuIFJhbmRvbUlkR2VuZXJhdG9yO1xufSgpKTtcbnZhciBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSA9IEFycmF5KDMyKTtcbmZ1bmN0aW9uIGdldElkR2VuZXJhdG9yKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlSWQoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMgKiAyOyBpKyspIHtcbiAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTYpICsgNDg7XG4gICAgICAgICAgICAvLyB2YWxpZCBoZXggY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgNDgtNTcgYW5kIDk3LTEwMlxuICAgICAgICAgICAgaWYgKFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldID49IDU4KSB7XG4gICAgICAgICAgICAgICAgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVlbaV0gKz0gMzk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkuc2xpY2UoMCwgYnl0ZXMgKiAyKSk7XG4gICAgfTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgYmFzaWMgdHJhY2VyLlxuICovXG52YXIgVHJhY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVHJhY2VyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFRyYWNlcihpbnN0cnVtZW50YXRpb25MaWJyYXJ5LCBjb25maWcsIF90cmFjZXJQcm92aWRlcikge1xuICAgICAgICB0aGlzLl90cmFjZXJQcm92aWRlciA9IF90cmFjZXJQcm92aWRlcjtcbiAgICAgICAgdmFyIGxvY2FsQ29uZmlnID0gbWVyZ2VDb25maWcoY29uZmlnKTtcbiAgICAgICAgdGhpcy5fc2FtcGxlciA9IGxvY2FsQ29uZmlnLnNhbXBsZXI7XG4gICAgICAgIHRoaXMuX2dlbmVyYWxMaW1pdHMgPSBsb2NhbENvbmZpZy5nZW5lcmFsTGltaXRzO1xuICAgICAgICB0aGlzLl9zcGFuTGltaXRzID0gbG9jYWxDb25maWcuc3BhbkxpbWl0cztcbiAgICAgICAgdGhpcy5faWRHZW5lcmF0b3IgPSBjb25maWcuaWRHZW5lcmF0b3IgfHwgbmV3IFJhbmRvbUlkR2VuZXJhdG9yKCk7XG4gICAgICAgIHRoaXMucmVzb3VyY2UgPSBfdHJhY2VyUHJvdmlkZXIucmVzb3VyY2U7XG4gICAgICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uTGlicmFyeSA9IGluc3RydW1lbnRhdGlvbkxpYnJhcnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhIG5ldyBTcGFuIG9yIHJldHVybnMgdGhlIGRlZmF1bHQgTm9vcFNwYW4gYmFzZWQgb24gdGhlIHNhbXBsaW5nXG4gICAgICogZGVjaXNpb24uXG4gICAgICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5zdGFydFNwYW4gPSBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucywgY29udGV4dCQxKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBpZiAoY29udGV4dCQxID09PSB2b2lkIDApIHsgY29udGV4dCQxID0gY29udGV4dC5hY3RpdmUoKTsgfVxuICAgICAgICAvLyByZW1vdmUgc3BhbiBmcm9tIGNvbnRleHQgaW4gY2FzZSBhIHJvb3Qgc3BhbiBpcyByZXF1ZXN0ZWQgdmlhIG9wdGlvbnNcbiAgICAgICAgaWYgKG9wdGlvbnMucm9vdCkge1xuICAgICAgICAgICAgY29udGV4dCQxID0gdHJhY2UuZGVsZXRlU3Bhbihjb250ZXh0JDEpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRTcGFuID0gdHJhY2UuZ2V0U3Bhbihjb250ZXh0JDEpO1xuICAgICAgICBpZiAoaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0JDEpKSB7XG4gICAgICAgICAgICBkaWFnLmRlYnVnKCdJbnN0cnVtZW50YXRpb24gc3VwcHJlc3NlZCwgcmV0dXJuaW5nIE5vb3AgU3BhbicpO1xuICAgICAgICAgICAgdmFyIG5vblJlY29yZGluZ1NwYW4gPSB0cmFjZS53cmFwU3BhbkNvbnRleHQoSU5WQUxJRF9TUEFOX0NPTlRFWFQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vblJlY29yZGluZ1NwYW47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudFNwYW5Db250ZXh0ID0gcGFyZW50U3BhbiA9PT0gbnVsbCB8fCBwYXJlbnRTcGFuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnRTcGFuLnNwYW5Db250ZXh0KCk7XG4gICAgICAgIHZhciBzcGFuSWQgPSB0aGlzLl9pZEdlbmVyYXRvci5nZW5lcmF0ZVNwYW5JZCgpO1xuICAgICAgICB2YXIgdHJhY2VJZDtcbiAgICAgICAgdmFyIHRyYWNlU3RhdGU7XG4gICAgICAgIHZhciBwYXJlbnRTcGFuSWQ7XG4gICAgICAgIGlmICghcGFyZW50U3BhbkNvbnRleHQgfHxcbiAgICAgICAgICAgICF0cmFjZS5pc1NwYW5Db250ZXh0VmFsaWQocGFyZW50U3BhbkNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyBOZXcgcm9vdCBzcGFuLlxuICAgICAgICAgICAgdHJhY2VJZCA9IHRoaXMuX2lkR2VuZXJhdG9yLmdlbmVyYXRlVHJhY2VJZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTmV3IGNoaWxkIHNwYW4uXG4gICAgICAgICAgICB0cmFjZUlkID0gcGFyZW50U3BhbkNvbnRleHQudHJhY2VJZDtcbiAgICAgICAgICAgIHRyYWNlU3RhdGUgPSBwYXJlbnRTcGFuQ29udGV4dC50cmFjZVN0YXRlO1xuICAgICAgICAgICAgcGFyZW50U3BhbklkID0gcGFyZW50U3BhbkNvbnRleHQuc3BhbklkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzcGFuS2luZCA9IChfYSA9IG9wdGlvbnMua2luZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogU3BhbktpbmQuSU5URVJOQUw7XG4gICAgICAgIHZhciBsaW5rcyA9ICgoX2IgPSBvcHRpb25zLmxpbmtzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXSkubWFwKGZ1bmN0aW9uIChsaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxpbmsuY29udGV4dCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBzYW5pdGl6ZUF0dHJpYnV0ZXMobGluay5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHNhbml0aXplQXR0cmlidXRlcyhvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICAgICAgICAvLyBtYWtlIHNhbXBsaW5nIGRlY2lzaW9uXG4gICAgICAgIHZhciBzYW1wbGluZ1Jlc3VsdCA9IHRoaXMuX3NhbXBsZXIuc2hvdWxkU2FtcGxlKGNvbnRleHQkMSwgdHJhY2VJZCwgbmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgdHJhY2VTdGF0ZSA9IChfYyA9IHNhbXBsaW5nUmVzdWx0LnRyYWNlU3RhdGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRyYWNlU3RhdGU7XG4gICAgICAgIHZhciB0cmFjZUZsYWdzID0gc2FtcGxpbmdSZXN1bHQuZGVjaXNpb24gPT09IFNhbXBsaW5nRGVjaXNpb24kMS5SRUNPUkRfQU5EX1NBTVBMRURcbiAgICAgICAgICAgID8gVHJhY2VGbGFncy5TQU1QTEVEXG4gICAgICAgICAgICA6IFRyYWNlRmxhZ3MuTk9ORTtcbiAgICAgICAgdmFyIHNwYW5Db250ZXh0ID0geyB0cmFjZUlkOiB0cmFjZUlkLCBzcGFuSWQ6IHNwYW5JZCwgdHJhY2VGbGFnczogdHJhY2VGbGFncywgdHJhY2VTdGF0ZTogdHJhY2VTdGF0ZSB9O1xuICAgICAgICBpZiAoc2FtcGxpbmdSZXN1bHQuZGVjaXNpb24gPT09IFNhbXBsaW5nRGVjaXNpb24kMS5OT1RfUkVDT1JEKSB7XG4gICAgICAgICAgICBkaWFnLmRlYnVnKCdSZWNvcmRpbmcgaXMgb2ZmLCBwcm9wYWdhdGluZyBjb250ZXh0IGluIGEgbm9uLXJlY29yZGluZyBzcGFuJyk7XG4gICAgICAgICAgICB2YXIgbm9uUmVjb3JkaW5nU3BhbiA9IHRyYWNlLndyYXBTcGFuQ29udGV4dChzcGFuQ29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gbm9uUmVjb3JkaW5nU3BhbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgaW5pdGlhbCBzcGFuIGF0dHJpYnV0ZXMuIFRoZSBhdHRyaWJ1dGVzIG9iamVjdCBtYXkgaGF2ZSBiZWVuIG11dGF0ZWRcbiAgICAgICAgLy8gYnkgdGhlIHNhbXBsZXIsIHNvIHdlIHNhbml0aXplIHRoZSBtZXJnZWQgYXR0cmlidXRlcyBiZWZvcmUgc2V0dGluZyB0aGVtLlxuICAgICAgICB2YXIgaW5pdEF0dHJpYnV0ZXMgPSBzYW5pdGl6ZUF0dHJpYnV0ZXMoT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCBzYW1wbGluZ1Jlc3VsdC5hdHRyaWJ1dGVzKSk7XG4gICAgICAgIHZhciBzcGFuID0gbmV3IFNwYW4odGhpcywgY29udGV4dCQxLCBuYW1lLCBzcGFuQ29udGV4dCwgc3BhbktpbmQsIHBhcmVudFNwYW5JZCwgbGlua3MsIG9wdGlvbnMuc3RhcnRUaW1lLCB1bmRlZmluZWQsIGluaXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfTtcbiAgICBUcmFjZXIucHJvdG90eXBlLnN0YXJ0QWN0aXZlU3BhbiA9IGZ1bmN0aW9uIChuYW1lLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgICAgIHZhciBvcHRzO1xuICAgICAgICB2YXIgY3R4O1xuICAgICAgICB2YXIgZm47XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGZuID0gYXJnMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGZuID0gYXJnMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdHMgPSBhcmcyO1xuICAgICAgICAgICAgY3R4ID0gYXJnMztcbiAgICAgICAgICAgIGZuID0gYXJnNDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50Q29udGV4dCA9IGN0eCAhPT0gbnVsbCAmJiBjdHggIT09IHZvaWQgMCA/IGN0eCA6IGNvbnRleHQuYWN0aXZlKCk7XG4gICAgICAgIHZhciBzcGFuID0gdGhpcy5zdGFydFNwYW4obmFtZSwgb3B0cywgcGFyZW50Q29udGV4dCk7XG4gICAgICAgIHZhciBjb250ZXh0V2l0aFNwYW5TZXQgPSB0cmFjZS5zZXRTcGFuKHBhcmVudENvbnRleHQsIHNwYW4pO1xuICAgICAgICByZXR1cm4gY29udGV4dC53aXRoKGNvbnRleHRXaXRoU3BhblNldCwgZm4sIHVuZGVmaW5lZCwgc3Bhbik7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgYWN0aXZlIHtAbGluayBHZW5lcmFsTGltaXRzfS4gKi9cbiAgICBUcmFjZXIucHJvdG90eXBlLmdldEdlbmVyYWxMaW1pdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmFsTGltaXRzO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSB7QGxpbmsgU3BhbkxpbWl0c30uICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5nZXRTcGFuTGltaXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3BhbkxpbWl0cztcbiAgICB9O1xuICAgIFRyYWNlci5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlclByb3ZpZGVyLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IoKTtcbiAgICB9O1xuICAgIHJldHVybiBUcmFjZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFNwYW5Qcm9jZXNzb3J9IHRoYXQgc2ltcGx5IGZvcndhcmRzIGFsbFxuICogcmVjZWl2ZWQgZXZlbnRzIHRvIGEgbGlzdCBvZiB7QGxpbmsgU3BhblByb2Nlc3Nvcn1zLlxuICovXG52YXIgTXVsdGlTcGFuUHJvY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE11bHRpU3BhblByb2Nlc3Nvcihfc3BhblByb2Nlc3NvcnMpIHtcbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3NvcnMgPSBfc3BhblByb2Nlc3NvcnM7XG4gICAgfVxuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuZm9yY2VGbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQxKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuUHJvY2Vzc29yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzcGFuUHJvY2Vzc29yLmZvcmNlRmx1c2goKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZXJyb3IgfHwgbmV3IEVycm9yKCdNdWx0aVNwYW5Qcm9jZXNzb3I6IGZvcmNlRmx1c2ggZmFpbGVkJykpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChzcGFuLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQxKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuUHJvY2Vzc29yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgc3BhblByb2Nlc3Nvci5vblN0YXJ0KHNwYW4sIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB2YXIgZV8zLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3Iub25FbmQoc3Bhbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTXVsdGlTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVfNCwgX2E7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQxKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuUHJvY2Vzc29yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzcGFuUHJvY2Vzc29yLnNodXRkb3duKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzRfMSkgeyBlXzQgPSB7IGVycm9yOiBlXzRfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNCkgdGhyb3cgZV80LmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBNdWx0aVNwYW5Qcm9jZXNzb3I7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIE5vLW9wIGltcGxlbWVudGF0aW9uIG9mIFNwYW5Qcm9jZXNzb3IgKi9cbnZhciBOb29wU3BhblByb2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb29wU3BhblByb2Nlc3NvcigpIHtcbiAgICB9XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uU3RhcnQgPSBmdW5jdGlvbiAoX3NwYW4sIF9jb250ZXh0KSB7IH07XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKF9zcGFuKSB7IH07XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICBOb29wU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuZm9yY2VGbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIE5vb3BTcGFuUHJvY2Vzc29yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xudmFyIEZvcmNlRmx1c2hTdGF0ZTtcbihmdW5jdGlvbiAoRm9yY2VGbHVzaFN0YXRlKSB7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcInJlc29sdmVkXCJdID0gMF0gPSBcInJlc29sdmVkXCI7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcInRpbWVvdXRcIl0gPSAxXSA9IFwidGltZW91dFwiO1xuICAgIEZvcmNlRmx1c2hTdGF0ZVtGb3JjZUZsdXNoU3RhdGVbXCJlcnJvclwiXSA9IDJdID0gXCJlcnJvclwiO1xuICAgIEZvcmNlRmx1c2hTdGF0ZVtGb3JjZUZsdXNoU3RhdGVbXCJ1bnJlc29sdmVkXCJdID0gM10gPSBcInVucmVzb2x2ZWRcIjtcbn0pKEZvcmNlRmx1c2hTdGF0ZSB8fCAoRm9yY2VGbHVzaFN0YXRlID0ge30pKTtcbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgYmFzaWMgdHJhY2VyIHByb3ZpZGVyIHdoaWNoIHBsYXRmb3JtIGxpYnJhcmllcyBjYW4gZXh0ZW5kXG4gKi9cbnZhciBCYXNpY1RyYWNlclByb3ZpZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2ljVHJhY2VyUHJvdmlkZXIoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5fdHJhY2VycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIG1lcmdlZENvbmZpZyA9IG1lcmdlKHt9LCBsb2FkRGVmYXVsdENvbmZpZygpLCByZWNvbmZpZ3VyZUxpbWl0cyhjb25maWcpKTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IChfYSA9IG1lcmdlZENvbmZpZy5yZXNvdXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUmVzb3VyY2UuZW1wdHkoKTtcbiAgICAgICAgaWYgKG1lcmdlZENvbmZpZy5tZXJnZVJlc291cmNlV2l0aERlZmF1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlID0gUmVzb3VyY2UuZGVmYXVsdCgpLm1lcmdlKHRoaXMucmVzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZENvbmZpZywge1xuICAgICAgICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKF9iID0gY29uZmlnLnNwYW5Qcm9jZXNzb3JzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoY29uZmlnLnNwYW5Qcm9jZXNzb3JzKSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGRlZmF1bHRFeHBvcnRlciA9IHRoaXMuX2J1aWxkRXhwb3J0ZXJGcm9tRW52KCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEV4cG9ydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmF0Y2hQcm9jZXNzb3IgPSBuZXcgQmF0Y2hTcGFuUHJvY2Vzc29yKGRlZmF1bHRFeHBvcnRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gYmF0Y2hQcm9jZXNzb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3IgPSBuZXcgTm9vcFNwYW5Qcm9jZXNzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5nZXRUcmFjZXIgPSBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZSArIFwiQFwiICsgKHZlcnNpb24gfHwgJycpICsgXCI6XCIgKyAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwpIHx8ICcnKTtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFjZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFjZXJzLnNldChrZXksIG5ldyBUcmFjZXIoeyBuYW1lOiBuYW1lLCB2ZXJzaW9uOiB2ZXJzaW9uLCBzY2hlbWFVcmw6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwgfSwgdGhpcy5fY29uZmlnLCB0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlcnMuZ2V0KGtleSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIHtAbGluayBUcmFjZXJDb25maWd9IHNwYW5Qcm9jZXNzb3JzIHByb3BlcnR5XG4gICAgICogQWRkcyBhIG5ldyB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gdG8gdGhpcyB0cmFjZXIuXG4gICAgICogQHBhcmFtIHNwYW5Qcm9jZXNzb3IgdGhlIG5ldyBTcGFuUHJvY2Vzc29yIHRvIGJlIGFkZGVkLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmFkZFNwYW5Qcm9jZXNzb3IgPSBmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gc2luY2Ugd2UgbWlnaHQgaGF2ZSBlbmFibGVkIGJ5IGRlZmF1bHQgYSBiYXRjaFByb2Nlc3Nvciwgd2UgZGlzYWJsZSBpdFxuICAgICAgICAgICAgLy8gYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yXG4gICAgICAgICAgICAgICAgLnNodXRkb3duKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWFnLmVycm9yKCdFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2h1dGRvd24gY3VycmVudCBzcGFuIHByb2Nlc3NvcicsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMucHVzaChzcGFuUHJvY2Vzc29yKTtcbiAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlU3BhblByb2Nlc3NvcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHRoaXMgVHJhY2VyUHJvdmlkZXIgZm9yIHVzZSB3aXRoIHRoZSBPcGVuVGVsZW1ldHJ5IEFQSS5cbiAgICAgKiBVbmRlZmluZWQgdmFsdWVzIG1heSBiZSByZXBsYWNlZCB3aXRoIGRlZmF1bHRzLCBhbmRcbiAgICAgKiBudWxsIHZhbHVlcyB3aWxsIGJlIHNraXBwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBTREsgcmVnaXN0cmF0aW9uXG4gICAgICovXG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB0cmFjZS5zZXRHbG9iYWxUcmFjZXJQcm92aWRlcih0aGlzKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm9wYWdhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbmZpZy5wcm9wYWdhdG9yID0gdGhpcy5fYnVpbGRQcm9wYWdhdG9yRnJvbUVudigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY29udGV4dE1hbmFnZXIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2V0R2xvYmFsQ29udGV4dE1hbmFnZXIoY29uZmlnLmNvbnRleHRNYW5hZ2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnByb3BhZ2F0b3IpIHtcbiAgICAgICAgICAgIHByb3BhZ2F0aW9uLnNldEdsb2JhbFByb3BhZ2F0b3IoY29uZmlnLnByb3BhZ2F0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGltZW91dCA9IHRoaXMuX2NvbmZpZy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcztcbiAgICAgICAgdmFyIHByb21pc2VzID0gdGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLm1hcChmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0SW50ZXJ2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgRXJyb3IoXCJTcGFuIHByb2Nlc3NvciBkaWQgbm90IGNvbXBsZXRlZCB3aXRoaW4gdGltZW91dCBwZXJpb2Qgb2YgXCIgKyB0aW1lb3V0ICsgXCIgbXNcIikpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0O1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3JcbiAgICAgICAgICAgICAgICAgICAgLmZvcmNlRmx1c2goKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS5yZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBGb3JjZUZsdXNoU3RhdGUuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gcmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0ICE9PSBGb3JjZUZsdXNoU3RhdGUucmVzb2x2ZWQ7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIHJlamVjdChbZXJyb3JdKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3Iuc2h1dGRvd24oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRTIGNhbm5vdCB5ZXQgaW5mZXIgdGhlIHR5cGUgb2YgdGhpcy5jb25zdHJ1Y3RvcjpcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzM4NDEjaXNzdWVjb21tZW50LTMzNzU2MDE0NlxuICAgICAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZSBnZXR0ZXJzIGluIHlvdXIgY2hpbGQgY2xhc3MuXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHJlZ2lzdGVyZWQgY29tcG9uZW50IG1hcHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFjcm9zcyBhbGxcbiAgICAgKiBjbGFzc2VzIGluIHRoZSBpbmhlcml0YW5jZSB0cmVlLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLl9nZXRQcm9wYWdhdG9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZFByb3BhZ2F0b3JzLmdldChuYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKCk7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fZ2V0U3BhbkV4cG9ydGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZEV4cG9ydGVycy5nZXQobmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYSgpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuX2J1aWxkUHJvcGFnYXRvckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIHBlciBzcGVjLCBwcm9wYWdhdG9ycyBmcm9tIGVudiBtdXN0IGJlIGRlZHVwbGljYXRlZFxuICAgICAgICB2YXIgdW5pcXVlUHJvcGFnYXRvck5hbWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGdldEVudigpLk9URUxfUFJPUEFHQVRPUlMpKTtcbiAgICAgICAgdmFyIHByb3BhZ2F0b3JzID0gdW5pcXVlUHJvcGFnYXRvck5hbWVzLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfdGhpcy5fZ2V0UHJvcGFnYXRvcihuYW1lKTtcbiAgICAgICAgICAgIGlmICghcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIlByb3BhZ2F0b3IgXFxcIlwiICsgbmFtZSArIFwiXFxcIiByZXF1ZXN0ZWQgdGhyb3VnaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB2YWxpZFByb3BhZ2F0b3JzID0gcHJvcGFnYXRvcnMucmVkdWNlKGZ1bmN0aW9uIChsaXN0LCBpdGVtKSB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGlmICh2YWxpZFByb3BhZ2F0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaXF1ZVByb3BhZ2F0b3JOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFByb3BhZ2F0b3JzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVQcm9wYWdhdG9yKHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdG9yczogdmFsaWRQcm9wYWdhdG9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fYnVpbGRFeHBvcnRlckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleHBvcnRlck5hbWUgPSBnZXRFbnYoKS5PVEVMX1RSQUNFU19FWFBPUlRFUjtcbiAgICAgICAgaWYgKGV4cG9ydGVyTmFtZSA9PT0gJ25vbmUnIHx8IGV4cG9ydGVyTmFtZSA9PT0gJycpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBleHBvcnRlciA9IHRoaXMuX2dldFNwYW5FeHBvcnRlcihleHBvcnRlck5hbWUpO1xuICAgICAgICBpZiAoIWV4cG9ydGVyKSB7XG4gICAgICAgICAgICBkaWFnLmVycm9yKFwiRXhwb3J0ZXIgXFxcIlwiICsgZXhwb3J0ZXJOYW1lICsgXCJcXFwiIHJlcXVlc3RlZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVuYXZhaWxhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwb3J0ZXI7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLl9yZWdpc3RlcmVkUHJvcGFnYXRvcnMgPSBuZXcgTWFwKFtcbiAgICAgICAgWyd0cmFjZWNvbnRleHQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpOyB9XSxcbiAgICAgICAgWydiYWdnYWdlJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFczQ0JhZ2dhZ2VQcm9wYWdhdG9yKCk7IH1dLFxuICAgIF0pO1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIuX3JlZ2lzdGVyZWRFeHBvcnRlcnMgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIEJhc2ljVHJhY2VyUHJvdmlkZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKlxuICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3BhbkV4cG9ydGVyfSB0aGF0IHByaW50cyBzcGFucyB0byB0aGVcbiAqIGNvbnNvbGUuIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuXG4gKlxuICogTk9URTogVGhpcyB7QGxpbmsgU3BhbkV4cG9ydGVyfSBpcyBpbnRlbmRlZCBmb3IgZGlhZ25vc3RpY3MgdXNlIG9ubHksIG91dHB1dCByZW5kZXJlZCB0byB0aGUgY29uc29sZSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG52YXIgQ29uc29sZVNwYW5FeHBvcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25zb2xlU3BhbkV4cG9ydGVyKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHBvcnQgc3BhbnMuXG4gICAgICogQHBhcmFtIHNwYW5zXG4gICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuZXhwb3J0ID0gZnVuY3Rpb24gKHNwYW5zLCByZXN1bHRDYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VuZFNwYW5zKHNwYW5zLCByZXN1bHRDYWxsYmFjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaHV0ZG93biB0aGUgZXhwb3J0ZXIuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NlbmRTcGFucyhbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlRmx1c2goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4cG9ydHMgYW55IHBlbmRpbmcgc3BhbnMgaW4gZXhwb3J0ZXJcbiAgICAgKi9cbiAgICBDb25zb2xlU3BhbkV4cG9ydGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBzcGFuIGluZm8gaW50byBtb3JlIHJlYWRhYmxlIGZvcm1hdFxuICAgICAqIEBwYXJhbSBzcGFuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuX2V4cG9ydEluZm8gPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4ucmVzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnN0cnVtZW50YXRpb25TY29wZTogc3Bhbi5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LFxuICAgICAgICAgICAgdHJhY2VJZDogc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQsXG4gICAgICAgICAgICBwYXJlbnRJZDogc3Bhbi5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICB0cmFjZVN0YXRlOiAoX2EgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgbmFtZTogc3Bhbi5uYW1lLFxuICAgICAgICAgICAgaWQ6IHNwYW4uc3BhbkNvbnRleHQoKS5zcGFuSWQsXG4gICAgICAgICAgICBraW5kOiBzcGFuLmtpbmQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGhyVGltZVRvTWljcm9zZWNvbmRzKHNwYW4uc3RhcnRUaW1lKSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBoclRpbWVUb01pY3Jvc2Vjb25kcyhzcGFuLmR1cmF0aW9uKSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgIHN0YXR1czogc3Bhbi5zdGF0dXMsXG4gICAgICAgICAgICBldmVudHM6IHNwYW4uZXZlbnRzLFxuICAgICAgICAgICAgbGlua3M6IHNwYW4ubGlua3MsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93aW5nIHNwYW5zIGluIGNvbnNvbGVcbiAgICAgKiBAcGFyYW0gc3BhbnNcbiAgICAgKiBAcGFyYW0gZG9uZVxuICAgICAqL1xuICAgIENvbnNvbGVTcGFuRXhwb3J0ZXIucHJvdG90eXBlLl9zZW5kU3BhbnMgPSBmdW5jdGlvbiAoc3BhbnMsIGRvbmUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzcGFuc18xID0gX192YWx1ZXMoc3BhbnMpLCBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKTsgIXNwYW5zXzFfMS5kb25lOyBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuID0gc3BhbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKHRoaXMuX2V4cG9ydEluZm8oc3BhbiksIHsgZGVwdGg6IDMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFuc18xXzEgJiYgIXNwYW5zXzFfMS5kb25lICYmIChfYSA9IHNwYW5zXzEucmV0dXJuKSkgX2EuY2FsbChzcGFuc18xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoeyBjb2RlOiBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb25zb2xlU3BhbkV4cG9ydGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTcGFuUHJvY2Vzc29yfSB0aGF0IGNvbnZlcnRzIHRoZSB7QGxpbmsgU3Bhbn1cbiAqIHRvIHtAbGluayBSZWFkYWJsZVNwYW59IGFuZCBwYXNzZXMgaXQgdG8gdGhlIGNvbmZpZ3VyZWQgZXhwb3J0ZXIuXG4gKlxuICogT25seSBzcGFucyB0aGF0IGFyZSBzYW1wbGVkIGFyZSBjb252ZXJ0ZWQuXG4gKlxuICogTk9URTogVGhpcyB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gZXhwb3J0cyBldmVyeSBlbmRlZCBzcGFuIGluZGl2aWR1YWxseSBpbnN0ZWFkIG9mIGJhdGNoaW5nIHNwYW5zIHRvZ2V0aGVyLCB3aGljaCBjYXVzZXMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgd2l0aCBtb3N0IGV4cG9ydGVycy4gRm9yIHByb2R1Y3Rpb24gdXNlLCBwbGVhc2UgY29uc2lkZXIgdXNpbmcgdGhlIHtAbGluayBCYXRjaFNwYW5Qcm9jZXNzb3J9IGluc3RlYWQuXG4gKi9cbnZhciBTaW1wbGVTcGFuUHJvY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNpbXBsZVNwYW5Qcm9jZXNzb3IoX2V4cG9ydGVyKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydGVyID0gX2V4cG9ydGVyO1xuICAgICAgICB0aGlzLl9zaHV0ZG93bk9uY2UgPSBuZXcgQmluZE9uY2VGdXR1cmUodGhpcy5fc2h1dGRvd24sIHRoaXMpO1xuICAgICAgICB0aGlzLl91bnJlc29sdmVkRXhwb3J0cyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgU2ltcGxlU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuZm9yY2VGbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBcbiAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgdW5yZXNvbHZlZCByZXNvdXJjZXMgYmVmb3JlIHJlc29sdmluZ1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHRoaXMuX3VucmVzb2x2ZWRFeHBvcnRzKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdCB1bnJlc29sdmVkIHJlc291cmNlcyBiZWZvcmUgcmVzb2x2aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2V4cG9ydGVyLmZvcmNlRmx1c2gpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5fZXhwb3J0ZXIuZm9yY2VGbHVzaCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKF9zcGFuLCBfcGFyZW50Q29udGV4dCkgeyB9O1xuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKHRoaXMuX3NodXRkb3duT25jZS5pc0NhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRvRXhwb3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGludGVybmFsXG4gICAgICAgICAgICAgICAgLl9leHBvcnQoX3RoaXMuX2V4cG9ydGVyLCBbc3Bhbl0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvZGUgIT09IEV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUykge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoKF9hID0gcmVzdWx0LmVycm9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgRXJyb3IoXCJTaW1wbGVTcGFuUHJvY2Vzc29yOiBzcGFuIGV4cG9ydCBmYWlsZWQgKHN0YXR1cyBcIiArIHJlc3VsdCArIFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyBBdm9pZCBzY2hlZHVsaW5nIGEgcHJvbWlzZSB0byBtYWtlIHRoZSBiZWhhdmlvciBtb3JlIHByZWRpY3RhYmxlIGFuZCBlYXNpZXIgdG8gdGVzdFxuICAgICAgICBpZiAoc3Bhbi5yZXNvdXJjZS5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nKSB7XG4gICAgICAgICAgICB2YXIgZXhwb3J0UHJvbWlzZV8xID0gKF9iID0gKF9hID0gc3Bhbi5yZXNvdXJjZSkud2FpdEZvckFzeW5jQXR0cmlidXRlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRQcm9taXNlXzEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMuZGVsZXRlKGV4cG9ydFByb21pc2VfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBkb0V4cG9ydCgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgeyByZXR1cm4gZ2xvYmFsRXJyb3JIYW5kbGVyKGVycik7IH0pO1xuICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHVucmVzb2x2ZWQgZXhwb3J0c1xuICAgICAgICAgICAgaWYgKGV4cG9ydFByb21pc2VfMSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMuYWRkKGV4cG9ydFByb21pc2VfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2b2lkIGRvRXhwb3J0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLmNhbGwoKTtcbiAgICB9O1xuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLl9zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydGVyLnNodXRkb3duKCk7XG4gICAgfTtcbiAgICByZXR1cm4gU2ltcGxlU3BhblByb2Nlc3Nvcjtcbn0oKSk7XG5cbmV4cG9ydCB7IEFsd2F5c09mZlNhbXBsZXIgYXMgQSwgQmFzaWNUcmFjZXJQcm92aWRlciBhcyBCLCBDb25zb2xlU3BhbkV4cG9ydGVyIGFzIEMsIEZvcmNlRmx1c2hTdGF0ZSBhcyBGLCBOb29wU3BhblByb2Nlc3NvciBhcyBOLCBQYXJlbnRCYXNlZFNhbXBsZXIgYXMgUCwgUmFuZG9tSWRHZW5lcmF0b3IgYXMgUiwgU2ltcGxlU3BhblByb2Nlc3NvciBhcyBTLCBUcmFjZXIgYXMgVCwgQmF0Y2hTcGFuUHJvY2Vzc29yIGFzIGEsIEFsd2F5c09uU2FtcGxlciBhcyBiLCBUcmFjZUlkUmF0aW9CYXNlZFNh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WCxFQUFFO0FBQUE7IiwKICAibmFtZXMiOiBbIlNwYW5TdGF0dXNDb2RlIiwgInRyYWNlIiwgImlzU3BhbkNvbnRleHRWYWxpZCIsICJUcmFjZUZsYWdzIiwgImlzVmFsaWRUcmFjZUlkIiwgImNvbnRleHQiLCAiSU5WQUxJRF9TUEFOX0NPTlRFWFQiLCAiU3BhbktpbmQiLCAib3RwZXJmb3JtYW5jZSIsICJnZXRUaW1lT3JpZ2luIiwgImlzVGltZUlucHV0IiwgImhyVGltZUR1cmF0aW9uIiwgImhyVGltZSIsICJtaWxsaXNUb0hyVGltZSIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJhZGRIclRpbWVzIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFIiwgInByb3BhZ2F0aW9uIiwgImhyVGltZVRvTWljcm9zZWNvbmRzIiwgImlzQXR0cmlidXRlVmFsdWUiLCAic2FuaXRpemVBdHRyaWJ1dGVzIiwgImdsb2JhbEVycm9ySGFuZGxlciIsICJnZXRFbnYiLCAiVHJhY2VzU2FtcGxlclZhbHVlcyIsICJnZXRFbnZXaXRob3V0RGVmYXVsdHMiLCAiREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgInVucmVmVGltZXIiLCAiQmluZE9uY2VGdXR1cmUiLCAiU2FtcGxpbmdEZWNpc2lvbiQxIiwgIkNvbXBvc2l0ZVByb3BhZ2F0b3IiLCAiVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvciIsICJXM0NCYWdnYWdlUHJvcGFnYXRvciIsICJtZXJnZSIsICJpbnRlcm5hbCIsICJzdXBwcmVzc1RyYWNpbmciLCAiaXNUcmFjaW5nU3VwcHJlc3NlZCIsICJSZXNvdXJjZSIsICJFeHBvcnRSZXN1bHRDb2RlIiwgIkV4Y2VwdGlvbkV2ZW50TmFtZSIsICJfX2Fzc2lnbiIsICJ0IiwgInMiLCAiaSIsICJwIiwgIl9fdmFsdWVzJDIiLCAibyIsICJtIiwgIl9fcmVhZCQxIiwgIm4iLCAiciIsICJhciIsICJlIiwgImVycm9yIiwgIl9fc3ByZWFkQXJyYXkkMSIsICJ0byIsICJmcm9tIiwgInBhY2siLCAibCIsICJTcGFuIiwgInBhcmVudFRyYWNlciIsICJzcGFuTmFtZSIsICJzcGFuQ29udGV4dCIsICJraW5kIiwgInBhcmVudFNwYW5JZCIsICJsaW5rcyIsICJzdGFydFRpbWUiLCAiX2RlcHJlY2F0ZWRDbG9jayIsICJhdHRyaWJ1dGVzIiwgIm5vdyIsICJrZXkiLCAidmFsdWUiLCAiZGlhZyIsICJlXzEiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiayIsICJ2IiwgImVfMV8xIiwgIm5hbWUiLCAiYXR0cmlidXRlc09yU3RhcnRUaW1lIiwgInRpbWVTdGFtcCIsICJsaW5rIiwgInN0YXR1cyIsICJlbmRUaW1lIiwgImlucCIsICJtc0R1cmF0aW9uIiwgImV4Y2VwdGlvbiIsICJ0aW1lIiwgImxpbWl0IiwgIl90aGlzIiwgInZhbCIsICJTYW1wbGluZ0RlY2lzaW9uIiwgIkFsd2F5c09mZlNhbXBsZXIiLCAiQWx3YXlzT25TYW1wbGVyIiwgIlBhcmVudEJhc2VkU2FtcGxlciIsICJjb25maWciLCAidHJhY2VJZCIsICJzcGFuS2luZCIsICJwYXJlbnRDb250ZXh0IiwgIlRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlciIsICJfcmF0aW8iLCAicmF0aW8iLCAiYWNjdW11bGF0aW9uIiwgInBvcyIsICJwYXJ0IiwgIkZBTExCQUNLX09URUxfVFJBQ0VTX1NBTVBMRVIiLCAiREVGQVVMVF9SQVRJTyIsICJsb2FkRGVmYXVsdENvbmZpZyIsICJlbnYiLCAiYnVpbGRTYW1wbGVyRnJvbUVudiIsICJlbnZpcm9ubWVudCIsICJnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52IiwgInByb2JhYmlsaXR5IiwgIm1lcmdlQ29uZmlnIiwgInVzZXJDb25maWciLCAicGVySW5zdGFuY2VEZWZhdWx0cyIsICJERUZBVUxUX0NPTkZJRyIsICJ0YXJnZXQiLCAicmVjb25maWd1cmVMaW1pdHMiLCAiX2UiLCAiX2YiLCAiX2ciLCAiX2giLCAiX2oiLCAiX2siLCAiX2wiLCAiX20iLCAic3BhbkxpbWl0cyIsICJwYXJzZWRFbnZDb25maWciLCAiQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZSIsICJfZXhwb3J0ZXIiLCAiX3NwYW4iLCAiX3BhcmVudENvbnRleHQiLCAic3BhbiIsICJyZXNvbHZlIiwgInJlamVjdCIsICJwcm9taXNlcyIsICJjb3VudCIsICJqIiwgInRpbWVyIiwgInNwYW5zIiwgImRvRXhwb3J0IiwgInJlc3VsdCIsICJwZW5kaW5nUmVzb3VyY2VzIiwgImxlbiIsICJlcnIiLCAiZmx1c2giLCAiX19leHRlbmRzIiwgImV4dGVuZFN0YXRpY3MiLCAiZCIsICJiIiwgIl9fIiwgIkJhdGNoU3BhblByb2Nlc3NvciIsICJfc3VwZXIiLCAiU1BBTl9JRF9CWVRFUyIsICJUUkFDRV9JRF9CWVRFUyIsICJSYW5kb21JZEdlbmVyYXRvciIsICJnZXRJZEdlbmVyYXRvciIsICJTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSIsICJieXRlcyIsICJUcmFjZXIiLCAiaW5zdHJ1bWVudGF0aW9uTGlicmFyeSIsICJfdHJhY2VyUHJvdmlkZXIiLCAibG9jYWxDb25maWciLCAib3B0aW9ucyIsICJjb250ZXh0JDEiLCAicGFyZW50U3BhbiIsICJub25SZWNvcmRpbmdTcGFuIiwgInBhcmVudFNwYW5Db250ZXh0IiwgInNwYW5JZCIsICJ0cmFjZVN0YXRlIiwgInNhbXBsaW5nUmVzdWx0IiwgInRyYWNlRmxhZ3MiLCAiaW5pdEF0dHJpYnV0ZXMiLCAiYXJnMiIsICJhcmczIiwgImFyZzQiLCAib3B0cyIsICJjdHgiLCAiZm4iLCAiY29udGV4dFdpdGhTcGFuU2V0IiwgIl9fdmFsdWVzJDEiLCAiTXVsdGlTcGFuUHJvY2Vzc29yIiwgIl9zcGFuUHJvY2Vzc29ycyIsICJzcGFuUHJvY2Vzc29yIiwgImVfMiIsICJlXzJfMSIsICJlXzMiLCAiZV8zXzEiLCAiZV80IiwgImVfNF8xIiwgIk5vb3BTcGFuUHJvY2Vzc29yIiwgIl9jb250ZXh0IiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkZvcmNlRmx1c2hTdGF0ZSIsICJCYXNpY1RyYWNlclByb3ZpZGVyIiwgIm1lcmdlZENvbmZpZyIsICJkZWZhdWx0RXhwb3J0ZXIiLCAiYmF0Y2hQcm9jZXNzb3IiLCAidmVyc2lvbiIsICJ0aW1lb3V0IiwgInN0YXRlIiwgInRpbWVvdXRJbnRlcnZhbCIsICJyZXN1bHRzIiwgImVycm9ycyIsICJ1bmlxdWVQcm9wYWdhdG9yTmFtZXMiLCAicHJvcGFnYXRvcnMiLCAicHJvcGFnYXRvciIsICJ2YWxpZFByb3BhZ2F0b3JzIiwgImxpc3QiLCAiaXRlbSIsICJleHBvcnRlck5hbWUiLCAiZXhwb3J0ZXIiLCAiX192YWx1ZXMiLCAiQ29uc29sZVNwYW5FeHBvcnRlciIsICJyZXN1bHRDYWxsYmFjayIsICJkb25lIiwgInNwYW5zXzEiLCAic3BhbnNfMV8xIiwgIl9fYXdhaXRlciIsICJ0aGlzQXJnIiwgIl9hcmd1bWVudHMiLCAiUCIsICJnZW5lcmF0b3IiLCAiYWRvcHQiLCAiZnVsZmlsbGVkIiwgInN0ZXAiLCAicmVqZWN0ZWQiLCAiX19nZW5lcmF0b3IiLCAiYm9keSIsICJfIiwgImYiLCAieSIsICJnIiwgInZlcmIiLCAib3AiLCAiU2ltcGxlU3BhblByb2Nlc3NvciIsICJleHBvcnRQcm9taXNlXzEiXQp9Cg==
|
|
910
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiU2ltcGxlU3BhblByb2Nlc3Nvci0hfnswMDR9fi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZSBhcyBTcGFuU3RhdHVzQ29kZSwgdCBhcyB0cmFjZSwgaSBhcyBpc1NwYW5Db250ZXh0VmFsaWQsIFQgYXMgVHJhY2VGbGFncywgYiBhcyBpc1ZhbGlkVHJhY2VJZCwgYSBhcyBjb250ZXh0LCBJIGFzIElOVkFMSURfU1BBTl9DT05URVhULCBTIGFzIFNwYW5LaW5kIH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5pbXBvcnQgeyBkIGFzIGRpYWcgfSBmcm9tICcuL2RpYWctYXBpLSF+ezAwOH1+LmpzJztcbmltcG9ydCB7IG8gYXMgb3RwZXJmb3JtYW5jZSwgbCBhcyBnZXRUaW1lT3JpZ2luLCBuIGFzIGlzVGltZUlucHV0LCBxIGFzIGhyVGltZUR1cmF0aW9uLCBqIGFzIGhyVGltZSwgbSBhcyBtaWxsaXNUb0hyVGltZSwgciBhcyBpc1RpbWVJbnB1dEhyVGltZSwgcyBhcyBhZGRIclRpbWVzLCB2IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFLCB3IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFLCB4IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFLCBwIGFzIHByb3BhZ2F0aW9uLCB5IGFzIGhyVGltZVRvTWljcm9zZWNvbmRzIH0gZnJvbSAnLi91cmwtIX57MDBkfX4uanMnO1xuaW1wb3J0IHsgaSBhcyBpc0F0dHJpYnV0ZVZhbHVlLCBzIGFzIHNhbml0aXplQXR0cmlidXRlcywgZyBhcyBnbG9iYWxFcnJvckhhbmRsZXIsIGEgYXMgZ2V0RW52LCBUIGFzIFRyYWNlc1NhbXBsZXJWYWx1ZXMsIGIgYXMgZ2V0RW52V2l0aG91dERlZmF1bHRzLCBEIGFzIERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULCBjIGFzIERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCwgdSBhcyB1bnJlZlRpbWVyLCBCIGFzIEJpbmRPbmNlRnV0dXJlLCBTIGFzIFNhbXBsaW5nRGVjaXNpb24kMSwgQyBhcyBDb21wb3NpdGVQcm9wYWdhdG9yLCBXIGFzIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IsIGQgYXMgVzNDQmFnZ2FnZVByb3BhZ2F0b3IsIG0gYXMgbWVyZ2UsIGUgYXMgaW50ZXJuYWwgfSBmcm9tICcuL2luZGV4LSF+ezAwbX1+LmpzJztcbmltcG9ydCB7IHMgYXMgc3VwcHJlc3NUcmFjaW5nLCBpIGFzIGlzVHJhY2luZ1N1cHByZXNzZWQgfSBmcm9tICcuL3N1cHByZXNzLXRyYWNpbmctIX57MDBhfX4uanMnO1xuaW1wb3J0IHsgUiBhcyBSZXNvdXJjZSB9IGZyb20gJy4vUmVzb3VyY2UtIX57MDAyfX4uanMnO1xuaW1wb3J0IHsgRSBhcyBFeHBvcnRSZXN1bHRDb2RlIH0gZnJvbSAnLi9FeHBvcnRSZXN1bHQtIX57MDBpfX4uanMnO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLy8gRXZlbnQgbmFtZSBkZWZpbml0aW9uc1xudmFyIEV4Y2VwdGlvbkV2ZW50TmFtZSA9ICdleGNlcHRpb24nO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fYXNzaWduID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX192YWx1ZXMkMiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn07XG52YXIgX19yZWFkJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNwYW4uXG4gKi9cbnZhciBTcGFuID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgU3BhbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIGNhbGxpbmcgU3BhbiBjb25zdHJ1Y3RvciBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIHRyYWNlci5zdGFydFNwYW4uXG4gICAgICogKi9cbiAgICBmdW5jdGlvbiBTcGFuKHBhcmVudFRyYWNlciwgY29udGV4dCwgc3Bhbk5hbWUsIHNwYW5Db250ZXh0LCBraW5kLCBwYXJlbnRTcGFuSWQsIGxpbmtzLCBzdGFydFRpbWUsIF9kZXByZWNhdGVkQ2xvY2ssIC8vIGtlZXBpbmcgdGhpcyBhcmd1bWVudCBldmVuIHRob3VnaCBpdCBpcyB1bnVzZWQgdG8gZW5zdXJlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgYXR0cmlidXRlcykge1xuICAgICAgICBpZiAobGlua3MgPT09IHZvaWQgMCkgeyBsaW5rcyA9IFtdOyB9XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICB0aGlzLmxpbmtzID0gW107XG4gICAgICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgICAgIHRoaXMuX2Ryb3BwZWRBdHRyaWJ1dGVzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLl9kcm9wcGVkTGlua3NDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc3RhdHVzID0ge1xuICAgICAgICAgICAgY29kZTogU3BhblN0YXR1c0NvZGUuVU5TRVQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW5kVGltZSA9IFswLCAwXTtcbiAgICAgICAgdGhpcy5fZW5kZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBbLTEsIC0xXTtcbiAgICAgICAgdGhpcy5uYW1lID0gc3Bhbk5hbWU7XG4gICAgICAgIHRoaXMuX3NwYW5Db250ZXh0ID0gc3BhbkNvbnRleHQ7XG4gICAgICAgIHRoaXMucGFyZW50U3BhbklkID0gcGFyZW50U3BhbklkO1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgICAgICB0aGlzLmxpbmtzID0gbGlua3M7XG4gICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZSA9IG90cGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIHRoaXMuX3BlcmZvcm1hbmNlT2Zmc2V0ID1cbiAgICAgICAgICAgIG5vdyAtICh0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZSArIGdldFRpbWVPcmlnaW4oKSk7XG4gICAgICAgIHRoaXMuX3N0YXJ0VGltZVByb3ZpZGVkID0gc3RhcnRUaW1lICE9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5fZ2V0VGltZShzdGFydFRpbWUgIT09IG51bGwgJiYgc3RhcnRUaW1lICE9PSB2b2lkIDAgPyBzdGFydFRpbWUgOiBub3cpO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gcGFyZW50VHJhY2VyLnJlc291cmNlO1xuICAgICAgICB0aGlzLmluc3RydW1lbnRhdGlvbkxpYnJhcnkgPSBwYXJlbnRUcmFjZXIuaW5zdHJ1bWVudGF0aW9uTGlicmFyeTtcbiAgICAgICAgdGhpcy5fc3BhbkxpbWl0cyA9IHBhcmVudFRyYWNlci5nZXRTcGFuTGltaXRzKCk7XG4gICAgICAgIHRoaXMuX2F0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQgPVxuICAgICAgICAgICAgdGhpcy5fc3BhbkxpbWl0cy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0IHx8IDA7XG4gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zcGFuUHJvY2Vzc29yID0gcGFyZW50VHJhY2VyLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IoKTtcbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3Nvci5vblN0YXJ0KHRoaXMsIGNvbnRleHQpO1xuICAgIH1cbiAgICBTcGFuLnByb3RvdHlwZS5zcGFuQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwYW5Db250ZXh0O1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdGhpcy5faXNTcGFuRW5kZWQoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiSW52YWxpZCBhdHRyaWJ1dGUga2V5OiBcIiArIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXR0cmlidXRlVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuYXR0cmlidXRlcykubGVuZ3RoID49XG4gICAgICAgICAgICB0aGlzLl9zcGFuTGltaXRzLmF0dHJpYnV0ZUNvdW50TGltaXQgJiZcbiAgICAgICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hdHRyaWJ1dGVzLCBrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50Kys7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXNba2V5XSA9IHRoaXMuX3RydW5jYXRlVG9TaXplKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDIoT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9kID0gX19yZWFkJDEoX2MudmFsdWUsIDIpLCBrID0gX2RbMF0sIHYgPSBfZFsxXTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBTcGFuIE5hbWVcbiAgICAgKiBAcGFyYW0gW2F0dHJpYnV0ZXNPclN0YXJ0VGltZV0gU3BhbiBhdHRyaWJ1dGVzIG9yIHN0YXJ0IHRpbWVcbiAgICAgKiAgICAgaWYgdHlwZSBpcyB7QHR5cGUgVGltZUlucHV0fSBhbmQgM3JkIHBhcmFtIGlzIHVuZGVmaW5lZFxuICAgICAqIEBwYXJhbSBbdGltZVN0YW1wXSBTcGVjaWZpZWQgdGltZSBzdGFtcCBmb3IgdGhlIGV2ZW50XG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuYWRkRXZlbnQgPSBmdW5jdGlvbiAobmFtZSwgYXR0cmlidXRlc09yU3RhcnRUaW1lLCB0aW1lU3RhbXApIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU3BhbkVuZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuX3NwYW5MaW1pdHMuZXZlbnRDb3VudExpbWl0ID09PSAwKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oJ05vIGV2ZW50cyBhbGxvd2VkLicpO1xuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50Kys7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ldmVudHMubGVuZ3RoID49IHRoaXMuX3NwYW5MaW1pdHMuZXZlbnRDb3VudExpbWl0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlhZy5kZWJ1ZygnRHJvcHBpbmcgZXh0cmEgZXZlbnRzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmVudHMuc2hpZnQoKTtcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1RpbWVJbnB1dChhdHRyaWJ1dGVzT3JTdGFydFRpbWUpKSB7XG4gICAgICAgICAgICBpZiAoIWlzVGltZUlucHV0KHRpbWVTdGFtcCkpIHtcbiAgICAgICAgICAgICAgICB0aW1lU3RhbXAgPSBhdHRyaWJ1dGVzT3JTdGFydFRpbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRyaWJ1dGVzT3JTdGFydFRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzYW5pdGl6ZUF0dHJpYnV0ZXMoYXR0cmlidXRlc09yU3RhcnRUaW1lKTtcbiAgICAgICAgdGhpcy5ldmVudHMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICAgICAgICAgIHRpbWU6IHRoaXMuX2dldFRpbWUodGltZVN0YW1wKSxcbiAgICAgICAgICAgIGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLmFkZExpbmsgPSBmdW5jdGlvbiAobGluaykge1xuICAgICAgICB0aGlzLmxpbmtzLnB1c2gobGluayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuYWRkTGlua3MgPSBmdW5jdGlvbiAobGlua3MpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLmxpbmtzKS5wdXNoLmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5JDEoW10sIF9fcmVhZCQxKGxpbmtzKSwgZmFsc2UpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5zZXRTdGF0dXMgPSBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NwYW5FbmRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gX19hc3NpZ24oe30sIHN0YXR1cyk7XG4gICAgICAgIC8vIFdoZW4gdXNpbmcgdHJ5LWNhdGNoLCB0aGUgY2F1Z2h0IFwiZXJyb3JcIiBpcyBvZiB0eXBlIGBhbnlgLiBXaGVuIHRoZW4gYXNzaWduaW5nIGBhbnlgIHRvIGBzdGF0dXMubWVzc2FnZWAsXG4gICAgICAgIC8vIFR5cGVTY3JpcHQgd2lsbCBub3QgZXJyb3IuIFdoaWxlIHRoaXMgY2FuIGhhcHBlbiBkdXJpbmcgdXNlIG9mIGFueSBBUEksIGl0IGlzIG1vcmUgY29tbW9uIG9uIFNwYW4jc2V0U3RhdHVzKClcbiAgICAgICAgLy8gYXMgaXQncyBsaWtlbHkgdXNlZCBpbiBhIGNhdGNoLWJsb2NrLiBUaGVyZWZvcmUsIHdlIHZhbGlkYXRlIGlmIGBzdGF0dXMubWVzc2FnZWAgaXMgYWN0dWFsbHkgYSBzdHJpbmcsIG51bGwsIG9yXG4gICAgICAgIC8vIHVuZGVmaW5lZCB0byBhdm9pZCBhbiBpbmNvcnJlY3QgdHlwZSBjYXVzaW5nIGlzc3VlcyBkb3duc3RyZWFtLlxuICAgICAgICBpZiAodGhpcy5zdGF0dXMubWVzc2FnZSAhPSBudWxsICYmIHR5cGVvZiBzdGF0dXMubWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkRyb3BwaW5nIGludmFsaWQgc3RhdHVzLm1lc3NhZ2Ugb2YgdHlwZSAnXCIgKyB0eXBlb2Ygc3RhdHVzLm1lc3NhZ2UgKyBcIicsIGV4cGVjdGVkICdzdHJpbmcnXCIpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RhdHVzLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS51cGRhdGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU3BhbkVuZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoZW5kVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNTcGFuRW5kZWQoKSkge1xuICAgICAgICAgICAgZGlhZy5lcnJvcih0aGlzLm5hbWUgKyBcIiBcIiArIHRoaXMuX3NwYW5Db250ZXh0LnRyYWNlSWQgKyBcIi1cIiArIHRoaXMuX3NwYW5Db250ZXh0LnNwYW5JZCArIFwiIC0gWW91IGNhbiBvbmx5IGNhbGwgZW5kKCkgb24gYSBzcGFuIG9uY2UuXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbmRUaW1lID0gdGhpcy5fZ2V0VGltZShlbmRUaW1lKTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBoclRpbWVEdXJhdGlvbih0aGlzLnN0YXJ0VGltZSwgdGhpcy5lbmRUaW1lKTtcbiAgICAgICAgaWYgKHRoaXMuX2R1cmF0aW9uWzBdIDwgMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKCdJbmNvbnNpc3RlbnQgc3RhcnQgYW5kIGVuZCB0aW1lLCBzdGFydFRpbWUgPiBlbmRUaW1lLiBTZXR0aW5nIHNwYW4gZHVyYXRpb24gdG8gMG1zLicsIHRoaXMuc3RhcnRUaW1lLCB0aGlzLmVuZFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5lbmRUaW1lID0gdGhpcy5zdGFydFRpbWUuc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2R1cmF0aW9uID0gWzAsIDBdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJEcm9wcGVkIFwiICsgdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ICsgXCIgZXZlbnRzIGJlY2F1c2UgZXZlbnRDb3VudExpbWl0IHJlYWNoZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3Nvci5vbkVuZCh0aGlzKTtcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLl9nZXRUaW1lID0gZnVuY3Rpb24gKGlucCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucCA9PT0gJ251bWJlcicgJiYgaW5wIDw9IG90cGVyZm9ybWFuY2Uubm93KCkpIHtcbiAgICAgICAgICAgIC8vIG11c3QgYmUgYSBwZXJmb3JtYW5jZSB0aW1lc3RhbXBcbiAgICAgICAgICAgIC8vIGFwcGx5IGNvcnJlY3Rpb24gYW5kIGNvbnZlcnQgdG8gaHJ0aW1lXG4gICAgICAgICAgICByZXR1cm4gaHJUaW1lKGlucCArIHRoaXMuX3BlcmZvcm1hbmNlT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGlucCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBtaWxsaXNUb0hyVGltZShpbnApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnAgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbWlsbGlzVG9IclRpbWUoaW5wLmdldFRpbWUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVGltZUlucHV0SHJUaW1lKGlucCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0VGltZVByb3ZpZGVkKSB7XG4gICAgICAgICAgICAvLyBpZiB1c2VyIHByb3ZpZGVkIGEgdGltZSBmb3IgdGhlIHN0YXJ0IG1hbnVhbGx5XG4gICAgICAgICAgICAvLyB3ZSBjYW4ndCB1c2UgZHVyYXRpb24gdG8gY2FsY3VsYXRlIGV2ZW50L2VuZCB0aW1lc1xuICAgICAgICAgICAgcmV0dXJuIG1pbGxpc1RvSHJUaW1lKERhdGUubm93KCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtc0R1cmF0aW9uID0gb3RwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMuX3BlcmZvcm1hbmNlU3RhcnRUaW1lO1xuICAgICAgICByZXR1cm4gYWRkSHJUaW1lcyh0aGlzLnN0YXJ0VGltZSwgbWlsbGlzVG9IclRpbWUobXNEdXJhdGlvbikpO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuaXNSZWNvcmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmRlZCA9PT0gZmFsc2U7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5yZWNvcmRFeGNlcHRpb24gPSBmdW5jdGlvbiAoZXhjZXB0aW9uLCB0aW1lKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZXhjZXB0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRV0gPSBleGNlcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZXhjZXB0aW9uLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9UWVBFXSA9IGV4Y2VwdGlvbi5jb2RlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleGNlcHRpb24ubmFtZSkge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX1RZUEVdID0gZXhjZXB0aW9uLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXhjZXB0aW9uLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFXSA9IGV4Y2VwdGlvbi5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5zdGFjaykge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX1NUQUNLVFJBQ0VdID0gZXhjZXB0aW9uLnN0YWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoZXNlIGFyZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmcm9tIHNwZWNcbiAgICAgICAgaWYgKGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX1RZUEVdIHx8XG4gICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFXSkge1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudChFeGNlcHRpb25FdmVudE5hbWUsIGF0dHJpYnV0ZXMsIHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiRmFpbGVkIHRvIHJlY29yZCBhbiBleGNlcHRpb24gXCIgKyBleGNlcHRpb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3Bhbi5wcm90b3R5cGUsIFwiZHVyYXRpb25cIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJlbmRlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuZGVkO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNwYW4ucHJvdG90eXBlLCBcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNwYW4ucHJvdG90eXBlLCBcImRyb3BwZWRFdmVudHNDb3VudFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJkcm9wcGVkTGlua3NDb3VudFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Ryb3BwZWRMaW5rc0NvdW50O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgU3Bhbi5wcm90b3R5cGUuX2lzU3BhbkVuZGVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fZW5kZWQpIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkNhbiBub3QgZXhlY3V0ZSB0aGUgb3BlcmF0aW9uIG9uIGVuZGVkIFNwYW4ge3RyYWNlSWQ6IFwiICsgdGhpcy5fc3BhbkNvbnRleHQudHJhY2VJZCArIFwiLCBzcGFuSWQ6IFwiICsgdGhpcy5fc3BhbkNvbnRleHQuc3BhbklkICsgXCJ9XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmRlZDtcbiAgICB9O1xuICAgIC8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gdHJ1bmNhdGUgZ2l2ZW4gdmFsdWUgd2l0aGluIHNpemVcbiAgICAvLyBmb3IgdmFsdWUgdHlwZSBvZiBzdHJpbmcsIHdpbGwgdHJ1bmNhdGUgdG8gZ2l2ZW4gbGltaXRcbiAgICAvLyBmb3IgdHlwZSBvZiBub24tc3RyaW5nLCB3aWxsIHJldHVybiBzYW1lIHZhbHVlXG4gICAgU3Bhbi5wcm90b3R5cGUuX3RydW5jYXRlVG9MaW1pdFV0aWwgPSBmdW5jdGlvbiAodmFsdWUsIGxpbWl0KSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPD0gbGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGxpbWl0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMgb2YgdHlwZSBzdHJpbmcgYW5kIGhhcyBtb3JlIGNoYXJhY3RlcnMgdGhhbiBnaXZlbiB7QGNvZGUgYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdH0gdGhlblxuICAgICAqIHJldHVybiBzdHJpbmcgd2l0aCB0cnVuY2F0ZWQgdG8ge0Bjb2RlIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR9IGNoYXJhY3RlcnNcbiAgICAgKlxuICAgICAqIElmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdmFsdWUgaXMgYXJyYXkgb2Ygc3RyaW5ncyB0aGVuXG4gICAgICogcmV0dXJuIG5ldyBhcnJheSBvZiBzdHJpbmdzIHdpdGggZWFjaCBlbGVtZW50IHRydW5jYXRlZCB0byB7QGNvZGUgYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdH0gY2hhcmFjdGVyc1xuICAgICAqXG4gICAgICogT3RoZXJ3aXNlIHJldHVybiBzYW1lIEF0dHJpYnV0ZSB7QGNvZGUgdmFsdWV9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUgQXR0cmlidXRlIHZhbHVlXG4gICAgICogQHJldHVybnMgdHJ1bmNhdGVkIGF0dHJpYnV0ZSB2YWx1ZSBpZiByZXF1aXJlZCwgb3RoZXJ3aXNlIHNhbWUgdmFsdWVcbiAgICAgKi9cbiAgICBTcGFuLnByb3RvdHlwZS5fdHJ1bmNhdGVUb1NpemUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGxpbWl0ID0gdGhpcy5fYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdDtcbiAgICAgICAgLy8gQ2hlY2sgbGltaXRcbiAgICAgICAgaWYgKGxpbWl0IDw9IDApIHtcbiAgICAgICAgICAgIC8vIE5lZ2F0aXZlIHZhbHVlcyBhcmUgaW52YWxpZCwgc28gZG8gbm90IHRydW5jYXRlXG4gICAgICAgICAgICBkaWFnLndhcm4oXCJBdHRyaWJ1dGUgdmFsdWUgbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSwgZ290IFwiICsgbGltaXQpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0cmluZ1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RydW5jYXRlVG9MaW1pdFV0aWwodmFsdWUsIGxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiBzdHJpbmdzXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gX3RoaXMuX3RydW5jYXRlVG9MaW1pdFV0aWwodmFsLCBsaW1pdCkgOiB2YWw7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlciB0eXBlcywgbm8gbmVlZCB0byBhcHBseSB2YWx1ZSBsZW5ndGggbGltaXRcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgcmV0dXJuIFNwYW47XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIHNhbXBsaW5nIGRlY2lzaW9uIHRoYXQgZGV0ZXJtaW5lcyBob3cgYSB7QGxpbmsgU3Bhbn0gd2lsbCBiZSByZWNvcmRlZFxuICogYW5kIGNvbGxlY3RlZC5cbiAqL1xudmFyIFNhbXBsaW5nRGVjaXNpb247XG4oZnVuY3Rpb24gKFNhbXBsaW5nRGVjaXNpb24pIHtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSBmYWxzZWAsIHNwYW4gd2lsbCBub3QgYmUgcmVjb3JkZWQgYW5kIGFsbCBldmVudHNcbiAgICAgKiBhbmQgYXR0cmlidXRlcyB3aWxsIGJlIGRyb3BwZWQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiTk9UX1JFQ09SRFwiXSA9IDBdID0gXCJOT1RfUkVDT1JEXCI7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gdHJ1ZWAsIGJ1dCBgU2FtcGxlZGAgZmxhZyBpbiB7QGxpbmsgVHJhY2VGbGFnc31cbiAgICAgKiBNVVNUIE5PVCBiZSBzZXQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiUkVDT1JEXCJdID0gMV0gPSBcIlJFQ09SRFwiO1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IHRydWVgIEFORCBgU2FtcGxlZGAgZmxhZyBpbiB7QGxpbmsgVHJhY2VGbGFnc31cbiAgICAgKiBNVVNUIGJlIHNldC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJSRUNPUkRfQU5EX1NBTVBMRURcIl0gPSAyXSA9IFwiUkVDT1JEX0FORF9TQU1QTEVEXCI7XG59KShTYW1wbGluZ0RlY2lzaW9uIHx8IChTYW1wbGluZ0RlY2lzaW9uID0ge30pKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBTYW1wbGVyIHRoYXQgc2FtcGxlcyBubyB0cmFjZXMuICovXG52YXIgQWx3YXlzT2ZmU2FtcGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBbHdheXNPZmZTYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPZmZTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT2ZmU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT2ZmU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2FtcGxlciB0aGF0IHNhbXBsZXMgYWxsIHRyYWNlcy4gKi9cbnZhciBBbHdheXNPblNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT25TYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09uU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT25TYW1wbGVyJztcbiAgICB9O1xuICAgIHJldHVybiBBbHdheXNPblNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBBIGNvbXBvc2l0ZSBzYW1wbGVyIHRoYXQgZWl0aGVyIHJlc3BlY3RzIHRoZSBwYXJlbnQgc3BhbidzIHNhbXBsaW5nIGRlY2lzaW9uXG4gKiBvciBkZWxlZ2F0ZXMgdG8gYGRlbGVnYXRlU2FtcGxlcmAgZm9yIHJvb3Qgc3BhbnMuXG4gKi9cbnZhciBQYXJlbnRCYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyZW50QmFzZWRTYW1wbGVyKGNvbmZpZykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb25maWcucm9vdDtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290KSB7XG4gICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIobmV3IEVycm9yKCdQYXJlbnRCYXNlZFNhbXBsZXIgbXVzdCBoYXZlIGEgcm9vdCBzYW1wbGVyIGNvbmZpZ3VyZWQnKSk7XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9hID0gY29uZmlnLnJlbW90ZVBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2IgPSBjb25maWcucmVtb3RlUGFyZW50Tm90U2FtcGxlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYyA9IGNvbmZpZy5sb2NhbFBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkID1cbiAgICAgICAgICAgIChfZCA9IGNvbmZpZy5sb2NhbFBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgfVxuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQsIHNwYW5OYW1lLCBzcGFuS2luZCwgYXR0cmlidXRlcywgbGlua3MpIHtcbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0IHx8ICFpc1NwYW5Db250ZXh0VmFsaWQocGFyZW50Q29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290LnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5pc1JlbW90ZSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICB9O1xuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlBhcmVudEJhc2Vke3Jvb3Q9XCIgKyB0aGlzLl9yb290LnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCByZW1vdGVQYXJlbnROb3RTYW1wbGVkPVwiICsgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCJ9XCI7XG4gICAgfTtcbiAgICByZXR1cm4gUGFyZW50QmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBTYW1wbGVyIHRoYXQgc2FtcGxlcyBhIGdpdmVuIGZyYWN0aW9uIG9mIHRyYWNlcyBiYXNlZCBvZiB0cmFjZSBpZCBkZXRlcm1pbmlzdGljYWxseS4gKi9cbnZhciBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKF9yYXRpbykge1xuICAgICAgICBpZiAoX3JhdGlvID09PSB2b2lkIDApIHsgX3JhdGlvID0gMDsgfVxuICAgICAgICB0aGlzLl9yYXRpbyA9IF9yYXRpbztcbiAgICAgICAgdGhpcy5fcmF0aW8gPSB0aGlzLl9ub3JtYWxpemUoX3JhdGlvKTtcbiAgICAgICAgdGhpcy5fdXBwZXJCb3VuZCA9IE1hdGguZmxvb3IodGhpcy5fcmF0aW8gKiAweGZmZmZmZmZmKTtcbiAgICB9XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgdHJhY2VJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IGlzVmFsaWRUcmFjZUlkKHRyYWNlSWQpICYmIHRoaXMuX2FjY3VtdWxhdGUodHJhY2VJZCkgPCB0aGlzLl91cHBlckJvdW5kXG4gICAgICAgICAgICAgICAgPyBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRFxuICAgICAgICAgICAgICAgIDogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiVHJhY2VJZFJhdGlvQmFzZWR7XCIgKyB0aGlzLl9yYXRpbyArIFwifVwiO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fbm9ybWFsaXplID0gZnVuY3Rpb24gKHJhdGlvKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmF0aW8gIT09ICdudW1iZXInIHx8IGlzTmFOKHJhdGlvKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gcmF0aW8gPj0gMSA/IDEgOiByYXRpbyA8PSAwID8gMCA6IHJhdGlvO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fYWNjdW11bGF0ZSA9IGZ1bmN0aW9uICh0cmFjZUlkKSB7XG4gICAgICAgIHZhciBhY2N1bXVsYXRpb24gPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNlSWQubGVuZ3RoIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zID0gaSAqIDg7XG4gICAgICAgICAgICB2YXIgcGFydCA9IHBhcnNlSW50KHRyYWNlSWQuc2xpY2UocG9zLCBwb3MgKyA4KSwgMTYpO1xuICAgICAgICAgICAgYWNjdW11bGF0aW9uID0gKGFjY3VtdWxhdGlvbiBeIHBhcnQpID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRpb247XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBGQUxMQkFDS19PVEVMX1RSQUNFU19TQU1QTEVSID0gVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPbjtcbnZhciBERUZBVUxUX1JBVElPID0gMTtcbi8qKlxuICogTG9hZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uIEZvciBmaWVsZHMgd2l0aCBwcmltaXRpdmUgdmFsdWVzLCBhbnkgdXNlci1wcm92aWRlZFxuICogdmFsdWUgd2lsbCBvdmVycmlkZSB0aGUgY29ycmVzcG9uZGluZyBkZWZhdWx0IHZhbHVlLiBGb3IgZmllbGRzIHdpdGhcbiAqIG5vbi1wcmltaXRpdmUgdmFsdWVzIChsaWtlIGBzcGFuTGltaXRzYCksIHRoZSB1c2VyLXByb3ZpZGVkIHZhbHVlIHdpbGwgYmVcbiAqIHVzZWQgdG8gZXh0ZW5kIHRoZSBkZWZhdWx0IHZhbHVlLlxuICovXG4vLyBvYmplY3QgbmVlZHMgdG8gYmUgd3JhcHBlZCBpbiB0aGlzIGZ1bmN0aW9uIGFuZCBjYWxsZWQgd2hlbiBuZWVkZWQgb3RoZXJ3aXNlXG4vLyBlbnZzIGFyZSBwYXJzZWQgYmVmb3JlIHRlc3RzIGFyZSByYW4gLSBjYXVzZXMgdGVzdHMgdXNpbmcgdGhlc2UgZW52cyB0byBmYWlsXG5mdW5jdGlvbiBsb2FkRGVmYXVsdENvbmZpZygpIHtcbiAgICB2YXIgZW52ID0gZ2V0RW52KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2FtcGxlcjogYnVpbGRTYW1wbGVyRnJvbUVudihlbnYpLFxuICAgICAgICBmb3JjZUZsdXNoVGltZW91dE1pbGxpczogMzAwMDAsXG4gICAgICAgIGdlbmVyYWxMaW1pdHM6IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ6IGVudi5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVDb3VudExpbWl0OiBlbnYuT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQsXG4gICAgICAgIH0sXG4gICAgICAgIHNwYW5MaW1pdHM6IHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZUNvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgICAgICAgICAgbGlua0NvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fTElOS19DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGV2ZW50Q291bnRMaW1pdDogZW52Lk9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVBlckV2ZW50Q291bnRMaW1pdDogZW52Lk9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlULFxuICAgICAgICAgICAgYXR0cmlidXRlUGVyTGlua0NvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlULFxuICAgICAgICB9LFxuICAgICAgICBtZXJnZVJlc291cmNlV2l0aERlZmF1bHRzOiB0cnVlLFxuICAgIH07XG59XG4vKipcbiAqIEJhc2VkIG9uIGVudmlyb25tZW50LCBidWlsZHMgYSBzYW1wbGVyLCBjb21wbGllcyB3aXRoIHNwZWNpZmljYXRpb24uXG4gKiBAcGFyYW0gZW52aXJvbm1lbnQgb3B0aW9uYWwsIGJ5IGRlZmF1bHQgdXNlcyBnZXRFbnYoKSwgYnV0IGFsbG93cyBwYXNzaW5nIGEgdmFsdWUgdG8gcmV1c2UgcGFyc2VkIGVudmlyb25tZW50XG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2FtcGxlckZyb21FbnYoZW52aXJvbm1lbnQpIHtcbiAgICBpZiAoZW52aXJvbm1lbnQgPT09IHZvaWQgMCkgeyBlbnZpcm9ubWVudCA9IGdldEVudigpOyB9XG4gICAgc3dpdGNoIChlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSKSB7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPbjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5BbHdheXNPZmY6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgY2FzZSBUcmFjZXNTYW1wbGVyVmFsdWVzLlBhcmVudEJhc2VkQWx3YXlzT246XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhcmVudEJhc2VkU2FtcGxlcih7XG4gICAgICAgICAgICAgICAgcm9vdDogbmV3IEFsd2F5c09uU2FtcGxlcigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5QYXJlbnRCYXNlZEFsd2F5c09mZjpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyZW50QmFzZWRTYW1wbGVyKHtcbiAgICAgICAgICAgICAgICByb290OiBuZXcgQWx3YXlzT2ZmU2FtcGxlcigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5UcmFjZUlkUmF0aW86XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52KGVudmlyb25tZW50KSk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5QYXJlbnRCYXNlZFRyYWNlSWRSYXRpbzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGFyZW50QmFzZWRTYW1wbGVyKHtcbiAgICAgICAgICAgICAgICByb290OiBuZXcgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKGdldFNhbXBsZXJQcm9iYWJpbGl0eUZyb21FbnYoZW52aXJvbm1lbnQpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVIgdmFsdWUgXFxcIlwiICsgZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUiArIFwiIGludmFsaWQsIGRlZmF1bHRpbmcgdG8gXCIgKyBGQUxMQkFDS19PVEVMX1RSQUNFU19TQU1QTEVSICsgXCJcXFwiLlwiKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0U2FtcGxlclByb2JhYmlsaXR5RnJvbUVudihlbnZpcm9ubWVudCkge1xuICAgIGlmIChlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHID09PSAnJykge1xuICAgICAgICBkaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgaXMgYmxhbmssIGRlZmF1bHRpbmcgdG8gXCIgKyBERUZBVUxUX1JBVElPICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SQVRJTztcbiAgICB9XG4gICAgdmFyIHByb2JhYmlsaXR5ID0gTnVtYmVyKGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHKTtcbiAgICBpZiAoaXNOYU4ocHJvYmFiaWxpdHkpKSB7XG4gICAgICAgIGRpYWcuZXJyb3IoXCJPVEVMX1RSQUNFU19TQU1QTEVSX0FSRz1cIiArIGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHICsgXCIgd2FzIGdpdmVuLCBidXQgaXQgaXMgaW52YWxpZCwgZGVmYXVsdGluZyB0byBcIiArIERFRkFVTFRfUkFUSU8gKyBcIi5cIik7XG4gICAgICAgIHJldHVybiBERUZBVUxUX1JBVElPO1xuICAgIH1cbiAgICBpZiAocHJvYmFiaWxpdHkgPCAwIHx8IHByb2JhYmlsaXR5ID4gMSkge1xuICAgICAgICBkaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9XCIgKyBlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyArIFwiIHdhcyBnaXZlbiwgYnV0IGl0IGlzIG91dCBvZiByYW5nZSAoWzAuLjFdKSwgZGVmYXVsdGluZyB0byBcIiArIERFRkFVTFRfUkFUSU8gKyBcIi5cIik7XG4gICAgICAgIHJldHVybiBERUZBVUxUX1JBVElPO1xuICAgIH1cbiAgICByZXR1cm4gcHJvYmFiaWxpdHk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEZ1bmN0aW9uIHRvIG1lcmdlIERlZmF1bHQgY29uZmlndXJhdGlvbiAoYXMgc3BlY2lmaWVkIGluICcuL2NvbmZpZycpIHdpdGhcbiAqIHVzZXIgcHJvdmlkZWQgY29uZmlndXJhdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnKHVzZXJDb25maWcpIHtcbiAgICB2YXIgcGVySW5zdGFuY2VEZWZhdWx0cyA9IHtcbiAgICAgICAgc2FtcGxlcjogYnVpbGRTYW1wbGVyRnJvbUVudigpLFxuICAgIH07XG4gICAgdmFyIERFRkFVTFRfQ09ORklHID0gbG9hZERlZmF1bHRDb25maWcoKTtcbiAgICB2YXIgdGFyZ2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcsIHBlckluc3RhbmNlRGVmYXVsdHMsIHVzZXJDb25maWcpO1xuICAgIHRhcmdldC5nZW5lcmFsTGltaXRzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9DT05GSUcuZ2VuZXJhbExpbWl0cywgdXNlckNvbmZpZy5nZW5lcmFsTGltaXRzIHx8IHt9KTtcbiAgICB0YXJnZXQuc3BhbkxpbWl0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLnNwYW5MaW1pdHMsIHVzZXJDb25maWcuc3BhbkxpbWl0cyB8fCB7fSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbi8qKlxuICogV2hlbiBnZW5lcmFsIGxpbWl0cyBhcmUgcHJvdmlkZWQgYW5kIG1vZGVsIHNwZWNpZmljIGxpbWl0cyBhcmUgbm90LFxuICogY29uZmlndXJlcyB0aGUgbW9kZWwgc3BlY2lmaWMgbGltaXRzIGJ5IHVzaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2VuZXJhbCBvbmVzLlxuICogQHBhcmFtIHVzZXJDb25maWcgVXNlciBwcm92aWRlZCB0cmFjZXIgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiByZWNvbmZpZ3VyZUxpbWl0cyh1c2VyQ29uZmlnKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2osIF9rLCBfbCwgX207XG4gICAgdmFyIHNwYW5MaW1pdHMgPSBPYmplY3QuYXNzaWduKHt9LCB1c2VyQ29uZmlnLnNwYW5MaW1pdHMpO1xuICAgIHZhciBwYXJzZWRFbnZDb25maWcgPSBnZXRFbnZXaXRob3V0RGVmYXVsdHMoKTtcbiAgICAvKipcbiAgICAgKiBSZWFzc2lnbiBzcGFuIGF0dHJpYnV0ZSBjb3VudCBsaW1pdCB0byB1c2UgZmlyc3Qgbm9uIG51bGwgdmFsdWUgZGVmaW5lZCBieSB1c2VyIG9yIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgICovXG4gICAgc3BhbkxpbWl0cy5hdHRyaWJ1dGVDb3VudExpbWl0ID1cbiAgICAgICAgKF9mID0gKF9lID0gKF9kID0gKF9iID0gKF9hID0gdXNlckNvbmZpZy5zcGFuTGltaXRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXR0cmlidXRlQ291bnRMaW1pdCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogKF9jID0gdXNlckNvbmZpZy5nZW5lcmFsTGltaXRzKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuYXR0cmlidXRlQ291bnRMaW1pdCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogcGFyc2VkRW52Q29uZmlnLk9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IHBhcnNlZEVudkNvbmZpZy5PVEVMX0FUVFJJQlVURV9DT1VOVF9MSU1JVCkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQ7XG4gICAgLyoqXG4gICAgICogUmVhc3NpZ24gc3BhbiBhdHRyaWJ1dGUgdmFsdWUgbGVuZ3RoIGxpbWl0IHRvIHVzZSBmaXJzdCBub24gbnVsbCB2YWx1ZSBkZWZpbmVkIGJ5IHVzZXIgb3IgdXNlIGRlZmF1bHQgdmFsdWVcbiAgICAgKi9cbiAgICBzcGFuTGltaXRzLmF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQgPVxuICAgICAgICAoX20gPSAoX2wgPSAoX2sgPSAoX2ggPSAoX2cgPSB1c2VyQ29uZmlnLnNwYW5MaW1pdHMpID09PSBudWxsIHx8IF9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0KSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAoX2ogPSB1c2VyQ29uZmlnLmdlbmVyYWxMaW1pdHMpID09PSBudWxsIHx8IF9qID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfai5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0KSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiBwYXJzZWRFbnZDb25maWcuT1RFTF9TUEFOX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQpICE9PSBudWxsICYmIF9sICE9PSB2b2lkIDAgPyBfbCA6IHBhcnNlZEVudkNvbmZpZy5PVEVMX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQpICE9PSBudWxsICYmIF9tICE9PSB2b2lkIDAgPyBfbSA6IERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdXNlckNvbmZpZywgeyBzcGFuTGltaXRzOiBzcGFuTGltaXRzIH0pO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFNwYW5Qcm9jZXNzb3J9IHRoYXQgYmF0Y2hlcyBzcGFucyBleHBvcnRlZCBieVxuICogdGhlIFNESyB0aGVuIHB1c2hlcyB0aGVtIHRvIHRoZSBleHBvcnRlciBwaXBlbGluZS5cbiAqL1xudmFyIEJhdGNoU3BhblByb2Nlc3NvckJhc2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZShfZXhwb3J0ZXIsIGNvbmZpZykge1xuICAgICAgICB0aGlzLl9leHBvcnRlciA9IF9leHBvcnRlcjtcbiAgICAgICAgdGhpcy5faXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZmluaXNoZWRTcGFucyA9IFtdO1xuICAgICAgICB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA9IDA7XG4gICAgICAgIHZhciBlbnYgPSBnZXRFbnYoKTtcbiAgICAgICAgdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLm1heEV4cG9ydEJhdGNoU2l6ZSkgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBjb25maWcubWF4RXhwb3J0QmF0Y2hTaXplXG4gICAgICAgICAgICAgICAgOiBlbnYuT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFO1xuICAgICAgICB0aGlzLl9tYXhRdWV1ZVNpemUgPVxuICAgICAgICAgICAgdHlwZW9mIChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcubWF4UXVldWVTaXplKSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICA/IGNvbmZpZy5tYXhRdWV1ZVNpemVcbiAgICAgICAgICAgICAgICA6IGVudi5PVEVMX0JTUF9NQVhfUVVFVUVfU0laRTtcbiAgICAgICAgdGhpcy5fc2NoZWR1bGVkRGVsYXlNaWxsaXMgPVxuICAgICAgICAgICAgdHlwZW9mIChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuc2NoZWR1bGVkRGVsYXlNaWxsaXMpID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgID8gY29uZmlnLnNjaGVkdWxlZERlbGF5TWlsbGlzXG4gICAgICAgICAgICAgICAgOiBlbnYuT1RFTF9CU1BfU0NIRURVTEVfREVMQVk7XG4gICAgICAgIHRoaXMuX2V4cG9ydFRpbWVvdXRNaWxsaXMgPVxuICAgICAgICAgICAgdHlwZW9mIChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuZXhwb3J0VGltZW91dE1pbGxpcykgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBjb25maWcuZXhwb3J0VGltZW91dE1pbGxpc1xuICAgICAgICAgICAgICAgIDogZW52Lk9URUxfQlNQX0VYUE9SVF9USU1FT1VUO1xuICAgICAgICB0aGlzLl9zaHV0ZG93bk9uY2UgPSBuZXcgQmluZE9uY2VGdXR1cmUodGhpcy5fc2h1dGRvd24sIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplID4gdGhpcy5fbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oJ0JhdGNoU3BhblByb2Nlc3NvcjogbWF4RXhwb3J0QmF0Y2hTaXplIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byBtYXhRdWV1ZVNpemUsIHNldHRpbmcgbWF4RXhwb3J0QmF0Y2hTaXplIHRvIG1hdGNoIG1heFF1ZXVlU2l6ZScpO1xuICAgICAgICAgICAgdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplID0gdGhpcy5fbWF4UXVldWVTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UucHJvbWlzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZmx1c2hBbGwoKTtcbiAgICB9O1xuICAgIC8vIGRvZXMgbm90aGluZy5cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKF9zcGFuLCBfcGFyZW50Q29udGV4dCkgeyB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3NodXRkb3duT25jZS5pc0NhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYWRkVG9CdWZmZXIoc3Bhbik7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5jYWxsKCk7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLm9uU2h1dGRvd24oKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZmx1c2hBbGwoKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZXhwb3J0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICAvKiogQWRkIGEgc3BhbiBpbiB0aGUgYnVmZmVyLiAqL1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9hZGRUb0J1ZmZlciA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aCA+PSB0aGlzLl9tYXhRdWV1ZVNpemUpIHtcbiAgICAgICAgICAgIC8vIGxpbWl0IHJlYWNoZWQsIGRyb3Agc3BhblxuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3BwZWRTcGFuc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlhZy5kZWJ1ZygnbWF4UXVldWVTaXplIHJlYWNoZWQsIGRyb3BwaW5nIHNwYW5zJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIHNvbWUgc3BhbnMgd2VyZSBkcm9wcGVkLCBsb2cgb25jZSB3aXRoIGNvdW50IG9mIHNwYW5zIGRyb3BwZWRcbiAgICAgICAgICAgIGRpYWcud2FybihcIkRyb3BwZWQgXCIgKyB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCArIFwiIHNwYW5zIGJlY2F1c2UgbWF4UXVldWVTaXplIHJlYWNoZWRcIik7XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmluaXNoZWRTcGFucy5wdXNoKHNwYW4pO1xuICAgICAgICB0aGlzLl9tYXliZVN0YXJ0VGltZXIoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFNlbmQgYWxsIHNwYW5zIHRvIHRoZSBleHBvcnRlciByZXNwZWN0aW5nIHRoZSBiYXRjaCBzaXplIGxpbWl0XG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgb24gZm9yY2VGbHVzaCBvciBzaHV0ZG93bixcbiAgICAgKiBmb3IgYWxsIG90aGVyIGNhc2VzIF9mbHVzaCBzaG91bGQgYmUgdXNlZFxuICAgICAqICovXG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX2ZsdXNoQWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHByb21pc2VzID0gW107XG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGJhdGNoZXNcbiAgICAgICAgICAgIHZhciBjb3VudCA9IE1hdGguY2VpbChfdGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggLyBfdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gY291bnQ7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKF90aGlzLl9mbHVzaE9uZUJhdGNoKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX2ZsdXNoT25lQmF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2NsZWFyVGltZXIoKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIGRvbid0IHdhaXQgYW55bW9yZSBmb3IgZXhwb3J0LCB0aGlzIHdheSB0aGUgbmV4dCBiYXRjaCBjYW4gc3RhcnRcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdUaW1lb3V0JykpO1xuICAgICAgICAgICAgfSwgX3RoaXMuX2V4cG9ydFRpbWVvdXRNaWxsaXMpO1xuICAgICAgICAgICAgLy8gcHJldmVudCBkb3duc3RyZWFtIGV4cG9ydGVyIGNhbGxzIGZyb20gZ2VuZXJhdGluZyBzcGFuc1xuICAgICAgICAgICAgY29udGV4dC53aXRoKHN1cHByZXNzVHJhY2luZyhjb250ZXh0LmFjdGl2ZSgpKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBmaW5pc2hlZCBzcGFucyBidWZmZXIgaGVyZSBiZWNhdXNlIHRoZSBuZXh0IGludm9jYXRpb25zIG9mIHRoZSBfZmx1c2ggbWV0aG9kXG4gICAgICAgICAgICAgICAgLy8gY291bGQgcGFzcyB0aGUgc2FtZSBmaW5pc2hlZCBzcGFucyB0byB0aGUgZXhwb3J0ZXIgaWYgdGhlIGJ1ZmZlciBpcyBjbGVhcmVkXG4gICAgICAgICAgICAgICAgLy8gb3V0c2lkZSB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbGJhY2suXG4gICAgICAgICAgICAgICAgdmFyIHNwYW5zO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPD0gX3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBzcGFucyA9IF90aGlzLl9maW5pc2hlZFNwYW5zO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZmluaXNoZWRTcGFucyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBfdGhpcy5fZmluaXNoZWRTcGFucy5zcGxpY2UoMCwgX3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBkb0V4cG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9leHBvcnRlci5leHBvcnQoc3BhbnMsIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvZGUgPT09IEV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgoX2EgPSByZXN1bHQuZXJyb3IpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBFcnJvcignQmF0Y2hTcGFuUHJvY2Vzc29yOiBzcGFuIGV4cG9ydCBmYWlsZWQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIHBlbmRpbmdSZXNvdXJjZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzcGFucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3BhbiA9IHNwYW5zW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3Bhbi5yZXNvdXJjZS5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnJlc291cmNlLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXNvdXJjZXMgIT09IG51bGwgJiYgcGVuZGluZ1Jlc291cmNlcyAhPT0gdm9pZCAwID8gcGVuZGluZ1Jlc291cmNlcyA6IChwZW5kaW5nUmVzb3VyY2VzID0gW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1Jlc291cmNlcy5wdXNoKHNwYW4ucmVzb3VyY2Uud2FpdEZvckFzeW5jQXR0cmlidXRlcygpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBzY2hlZHVsaW5nIGEgcHJvbWlzZSB0byBtYWtlIHRoZSBiZWhhdmlvciBtb3JlIHByZWRpY3RhYmxlIGFuZCBlYXNpZXIgdG8gdGVzdFxuICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nUmVzb3VyY2VzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvRXhwb3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChwZW5kaW5nUmVzb3VyY2VzKS50aGVuKGRvRXhwb3J0LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fbWF5YmVTdGFydFRpbWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodGhpcy5faXNFeHBvcnRpbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLl9pc0V4cG9ydGluZyA9IHRydWU7XG4gICAgICAgICAgICBfdGhpcy5fZmx1c2hPbmVCYXRjaCgpXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9pc0V4cG9ydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9jbGVhclRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9tYXliZVN0YXJ0VGltZXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIF90aGlzLl9pc0V4cG9ydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGdsb2JhbEVycm9ySGFuZGxlcihlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyB3ZSBvbmx5IHdhaXQgaWYgdGhlIHF1ZXVlIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZWxlbWVudHMgeWV0XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aCA+PSB0aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBmbHVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90aW1lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZmx1c2goKTsgfSwgdGhpcy5fc2NoZWR1bGVkRGVsYXlNaWxsaXMpO1xuICAgICAgICB1bnJlZlRpbWVyKHRoaXMuX3RpbWVyKTtcbiAgICB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9jbGVhclRpbWVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fdGltZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZTtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBCYXRjaFNwYW5Qcm9jZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEJhdGNoU3BhblByb2Nlc3NvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBCYXRjaFNwYW5Qcm9jZXNzb3IoX2V4cG9ydGVyLCBjb25maWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgX2V4cG9ydGVyLCBjb25maWcpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLm9uSW5pdChjb25maWcpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEJhdGNoU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25Jbml0ID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5kaXNhYmxlQXV0b0ZsdXNoT25Eb2N1bWVudEhpZGUpICE9PSB0cnVlICYmXG4gICAgICAgICAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZm9yY2VGbHVzaCgpLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX3BhZ2VIaWRlTGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuZm9yY2VGbHVzaCgpLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICAgICAgLy8gdXNlICdwYWdlaGlkZScgZXZlbnQgYXMgYSBmYWxsYmFjayBmb3IgU2FmYXJpOyBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExNjc2OVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCB0aGlzLl9wYWdlSGlkZUxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vblNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3BhZ2VIaWRlTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIHRoaXMuX3BhZ2VIaWRlTGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQmF0Y2hTcGFuUHJvY2Vzc29yO1xufShCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgU1BBTl9JRF9CWVRFUyA9IDg7XG52YXIgVFJBQ0VfSURfQllURVMgPSAxNjtcbnZhciBSYW5kb21JZEdlbmVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSYW5kb21JZEdlbmVyYXRvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSByYW5kb20gMTYtYnl0ZSB0cmFjZSBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDMyIGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDEyOCBiaXRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZW5lcmF0ZVRyYWNlSWQgPSBnZXRJZEdlbmVyYXRvcihUUkFDRV9JRF9CWVRFUyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDgtYnl0ZSBzcGFuIElEIGZvcm1hdHRlZC9lbmNvZGVkIGFzIGEgMTYgbG93ZXJjYXNlIGhleFxuICAgICAgICAgKiBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gNjQgYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVTcGFuSWQgPSBnZXRJZEdlbmVyYXRvcihTUEFOX0lEX0JZVEVTKTtcbiAgICB9XG4gICAgcmV0dXJuIFJhbmRvbUlkR2VuZXJhdG9yO1xufSgpKTtcbnZhciBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSA9IEFycmF5KDMyKTtcbmZ1bmN0aW9uIGdldElkR2VuZXJhdG9yKGJ5dGVzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlSWQoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMgKiAyOyBpKyspIHtcbiAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTYpICsgNDg7XG4gICAgICAgICAgICAvLyB2YWxpZCBoZXggY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgNDgtNTcgYW5kIDk3LTEwMlxuICAgICAgICAgICAgaWYgKFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldID49IDU4KSB7XG4gICAgICAgICAgICAgICAgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVlbaV0gKz0gMzk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkuc2xpY2UoMCwgYnl0ZXMgKiAyKSk7XG4gICAgfTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgYmFzaWMgdHJhY2VyLlxuICovXG52YXIgVHJhY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgVHJhY2VyIGluc3RhbmNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIFRyYWNlcihpbnN0cnVtZW50YXRpb25MaWJyYXJ5LCBjb25maWcsIF90cmFjZXJQcm92aWRlcikge1xuICAgICAgICB0aGlzLl90cmFjZXJQcm92aWRlciA9IF90cmFjZXJQcm92aWRlcjtcbiAgICAgICAgdmFyIGxvY2FsQ29uZmlnID0gbWVyZ2VDb25maWcoY29uZmlnKTtcbiAgICAgICAgdGhpcy5fc2FtcGxlciA9IGxvY2FsQ29uZmlnLnNhbXBsZXI7XG4gICAgICAgIHRoaXMuX2dlbmVyYWxMaW1pdHMgPSBsb2NhbENvbmZpZy5nZW5lcmFsTGltaXRzO1xuICAgICAgICB0aGlzLl9zcGFuTGltaXRzID0gbG9jYWxDb25maWcuc3BhbkxpbWl0cztcbiAgICAgICAgdGhpcy5faWRHZW5lcmF0b3IgPSBjb25maWcuaWRHZW5lcmF0b3IgfHwgbmV3IFJhbmRvbUlkR2VuZXJhdG9yKCk7XG4gICAgICAgIHRoaXMucmVzb3VyY2UgPSBfdHJhY2VyUHJvdmlkZXIucmVzb3VyY2U7XG4gICAgICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uTGlicmFyeSA9IGluc3RydW1lbnRhdGlvbkxpYnJhcnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhIG5ldyBTcGFuIG9yIHJldHVybnMgdGhlIGRlZmF1bHQgTm9vcFNwYW4gYmFzZWQgb24gdGhlIHNhbXBsaW5nXG4gICAgICogZGVjaXNpb24uXG4gICAgICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5zdGFydFNwYW4gPSBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucywgY29udGV4dCQxKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICBpZiAoY29udGV4dCQxID09PSB2b2lkIDApIHsgY29udGV4dCQxID0gY29udGV4dC5hY3RpdmUoKTsgfVxuICAgICAgICAvLyByZW1vdmUgc3BhbiBmcm9tIGNvbnRleHQgaW4gY2FzZSBhIHJvb3Qgc3BhbiBpcyByZXF1ZXN0ZWQgdmlhIG9wdGlvbnNcbiAgICAgICAgaWYgKG9wdGlvbnMucm9vdCkge1xuICAgICAgICAgICAgY29udGV4dCQxID0gdHJhY2UuZGVsZXRlU3Bhbihjb250ZXh0JDEpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRTcGFuID0gdHJhY2UuZ2V0U3Bhbihjb250ZXh0JDEpO1xuICAgICAgICBpZiAoaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0JDEpKSB7XG4gICAgICAgICAgICBkaWFnLmRlYnVnKCdJbnN0cnVtZW50YXRpb24gc3VwcHJlc3NlZCwgcmV0dXJuaW5nIE5vb3AgU3BhbicpO1xuICAgICAgICAgICAgdmFyIG5vblJlY29yZGluZ1NwYW4gPSB0cmFjZS53cmFwU3BhbkNvbnRleHQoSU5WQUxJRF9TUEFOX0NPTlRFWFQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vblJlY29yZGluZ1NwYW47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudFNwYW5Db250ZXh0ID0gcGFyZW50U3BhbiA9PT0gbnVsbCB8fCBwYXJlbnRTcGFuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJlbnRTcGFuLnNwYW5Db250ZXh0KCk7XG4gICAgICAgIHZhciBzcGFuSWQgPSB0aGlzLl9pZEdlbmVyYXRvci5nZW5lcmF0ZVNwYW5JZCgpO1xuICAgICAgICB2YXIgdHJhY2VJZDtcbiAgICAgICAgdmFyIHRyYWNlU3RhdGU7XG4gICAgICAgIHZhciBwYXJlbnRTcGFuSWQ7XG4gICAgICAgIGlmICghcGFyZW50U3BhbkNvbnRleHQgfHxcbiAgICAgICAgICAgICF0cmFjZS5pc1NwYW5Db250ZXh0VmFsaWQocGFyZW50U3BhbkNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyBOZXcgcm9vdCBzcGFuLlxuICAgICAgICAgICAgdHJhY2VJZCA9IHRoaXMuX2lkR2VuZXJhdG9yLmdlbmVyYXRlVHJhY2VJZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTmV3IGNoaWxkIHNwYW4uXG4gICAgICAgICAgICB0cmFjZUlkID0gcGFyZW50U3BhbkNvbnRleHQudHJhY2VJZDtcbiAgICAgICAgICAgIHRyYWNlU3RhdGUgPSBwYXJlbnRTcGFuQ29udGV4dC50cmFjZVN0YXRlO1xuICAgICAgICAgICAgcGFyZW50U3BhbklkID0gcGFyZW50U3BhbkNvbnRleHQuc3BhbklkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzcGFuS2luZCA9IChfYSA9IG9wdGlvbnMua2luZCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogU3BhbktpbmQuSU5URVJOQUw7XG4gICAgICAgIHZhciBsaW5rcyA9ICgoX2IgPSBvcHRpb25zLmxpbmtzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXSkubWFwKGZ1bmN0aW9uIChsaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxpbmsuY29udGV4dCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBzYW5pdGl6ZUF0dHJpYnV0ZXMobGluay5hdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHNhbml0aXplQXR0cmlidXRlcyhvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICAgICAgICAvLyBtYWtlIHNhbXBsaW5nIGRlY2lzaW9uXG4gICAgICAgIHZhciBzYW1wbGluZ1Jlc3VsdCA9IHRoaXMuX3NhbXBsZXIuc2hvdWxkU2FtcGxlKGNvbnRleHQkMSwgdHJhY2VJZCwgbmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgdHJhY2VTdGF0ZSA9IChfYyA9IHNhbXBsaW5nUmVzdWx0LnRyYWNlU3RhdGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHRyYWNlU3RhdGU7XG4gICAgICAgIHZhciB0cmFjZUZsYWdzID0gc2FtcGxpbmdSZXN1bHQuZGVjaXNpb24gPT09IFNhbXBsaW5nRGVjaXNpb24kMS5SRUNPUkRfQU5EX1NBTVBMRURcbiAgICAgICAgICAgID8gVHJhY2VGbGFncy5TQU1QTEVEXG4gICAgICAgICAgICA6IFRyYWNlRmxhZ3MuTk9ORTtcbiAgICAgICAgdmFyIHNwYW5Db250ZXh0ID0geyB0cmFjZUlkOiB0cmFjZUlkLCBzcGFuSWQ6IHNwYW5JZCwgdHJhY2VGbGFnczogdHJhY2VGbGFncywgdHJhY2VTdGF0ZTogdHJhY2VTdGF0ZSB9O1xuICAgICAgICBpZiAoc2FtcGxpbmdSZXN1bHQuZGVjaXNpb24gPT09IFNhbXBsaW5nRGVjaXNpb24kMS5OT1RfUkVDT1JEKSB7XG4gICAgICAgICAgICBkaWFnLmRlYnVnKCdSZWNvcmRpbmcgaXMgb2ZmLCBwcm9wYWdhdGluZyBjb250ZXh0IGluIGEgbm9uLXJlY29yZGluZyBzcGFuJyk7XG4gICAgICAgICAgICB2YXIgbm9uUmVjb3JkaW5nU3BhbiA9IHRyYWNlLndyYXBTcGFuQ29udGV4dChzcGFuQ29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gbm9uUmVjb3JkaW5nU3BhbjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgaW5pdGlhbCBzcGFuIGF0dHJpYnV0ZXMuIFRoZSBhdHRyaWJ1dGVzIG9iamVjdCBtYXkgaGF2ZSBiZWVuIG11dGF0ZWRcbiAgICAgICAgLy8gYnkgdGhlIHNhbXBsZXIsIHNvIHdlIHNhbml0aXplIHRoZSBtZXJnZWQgYXR0cmlidXRlcyBiZWZvcmUgc2V0dGluZyB0aGVtLlxuICAgICAgICB2YXIgaW5pdEF0dHJpYnV0ZXMgPSBzYW5pdGl6ZUF0dHJpYnV0ZXMoT2JqZWN0LmFzc2lnbihhdHRyaWJ1dGVzLCBzYW1wbGluZ1Jlc3VsdC5hdHRyaWJ1dGVzKSk7XG4gICAgICAgIHZhciBzcGFuID0gbmV3IFNwYW4odGhpcywgY29udGV4dCQxLCBuYW1lLCBzcGFuQ29udGV4dCwgc3BhbktpbmQsIHBhcmVudFNwYW5JZCwgbGlua3MsIG9wdGlvbnMuc3RhcnRUaW1lLCB1bmRlZmluZWQsIGluaXRBdHRyaWJ1dGVzKTtcbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfTtcbiAgICBUcmFjZXIucHJvdG90eXBlLnN0YXJ0QWN0aXZlU3BhbiA9IGZ1bmN0aW9uIChuYW1lLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgICAgIHZhciBvcHRzO1xuICAgICAgICB2YXIgY3R4O1xuICAgICAgICB2YXIgZm47XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGZuID0gYXJnMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGZuID0gYXJnMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdHMgPSBhcmcyO1xuICAgICAgICAgICAgY3R4ID0gYXJnMztcbiAgICAgICAgICAgIGZuID0gYXJnNDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50Q29udGV4dCA9IGN0eCAhPT0gbnVsbCAmJiBjdHggIT09IHZvaWQgMCA/IGN0eCA6IGNvbnRleHQuYWN0aXZlKCk7XG4gICAgICAgIHZhciBzcGFuID0gdGhpcy5zdGFydFNwYW4obmFtZSwgb3B0cywgcGFyZW50Q29udGV4dCk7XG4gICAgICAgIHZhciBjb250ZXh0V2l0aFNwYW5TZXQgPSB0cmFjZS5zZXRTcGFuKHBhcmVudENvbnRleHQsIHNwYW4pO1xuICAgICAgICByZXR1cm4gY29udGV4dC53aXRoKGNvbnRleHRXaXRoU3BhblNldCwgZm4sIHVuZGVmaW5lZCwgc3Bhbik7XG4gICAgfTtcbiAgICAvKiogUmV0dXJucyB0aGUgYWN0aXZlIHtAbGluayBHZW5lcmFsTGltaXRzfS4gKi9cbiAgICBUcmFjZXIucHJvdG90eXBlLmdldEdlbmVyYWxMaW1pdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZW5lcmFsTGltaXRzO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSB7QGxpbmsgU3BhbkxpbWl0c30uICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5nZXRTcGFuTGltaXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3BhbkxpbWl0cztcbiAgICB9O1xuICAgIFRyYWNlci5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlclByb3ZpZGVyLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IoKTtcbiAgICB9O1xuICAgIHJldHVybiBUcmFjZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFNwYW5Qcm9jZXNzb3J9IHRoYXQgc2ltcGx5IGZvcndhcmRzIGFsbFxuICogcmVjZWl2ZWQgZXZlbnRzIHRvIGEgbGlzdCBvZiB7QGxpbmsgU3BhblByb2Nlc3Nvcn1zLlxuICovXG52YXIgTXVsdGlTcGFuUHJvY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE11bHRpU3BhblByb2Nlc3Nvcihfc3BhblByb2Nlc3NvcnMpIHtcbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3NvcnMgPSBfc3BhblByb2Nlc3NvcnM7XG4gICAgfVxuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuZm9yY2VGbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQxKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuUHJvY2Vzc29yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzcGFuUHJvY2Vzc29yLmZvcmNlRmx1c2goKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZXJyb3IgfHwgbmV3IEVycm9yKCdNdWx0aVNwYW5Qcm9jZXNzb3I6IGZvcmNlRmx1c2ggZmFpbGVkJykpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChzcGFuLCBjb250ZXh0KSB7XG4gICAgICAgIHZhciBlXzIsIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQxKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuUHJvY2Vzc29yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgc3BhblByb2Nlc3Nvci5vblN0YXJ0KHNwYW4sIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25FbmQgPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB2YXIgZV8zLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3Iub25FbmQoc3Bhbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfM18xKSB7IGVfMyA9IHsgZXJyb3I6IGVfM18xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8zKSB0aHJvdyBlXzMuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTXVsdGlTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVfNCwgX2E7XG4gICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQxKHRoaXMuX3NwYW5Qcm9jZXNzb3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuUHJvY2Vzc29yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChzcGFuUHJvY2Vzc29yLnNodXRkb3duKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzRfMSkgeyBlXzQgPSB7IGVycm9yOiBlXzRfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNCkgdGhyb3cgZV80LmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBNdWx0aVNwYW5Qcm9jZXNzb3I7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIE5vLW9wIGltcGxlbWVudGF0aW9uIG9mIFNwYW5Qcm9jZXNzb3IgKi9cbnZhciBOb29wU3BhblByb2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBOb29wU3BhblByb2Nlc3NvcigpIHtcbiAgICB9XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uU3RhcnQgPSBmdW5jdGlvbiAoX3NwYW4sIF9jb250ZXh0KSB7IH07XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKF9zcGFuKSB7IH07XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICBOb29wU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuZm9yY2VGbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgcmV0dXJuIE5vb3BTcGFuUHJvY2Vzc29yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xudmFyIEZvcmNlRmx1c2hTdGF0ZTtcbihmdW5jdGlvbiAoRm9yY2VGbHVzaFN0YXRlKSB7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcInJlc29sdmVkXCJdID0gMF0gPSBcInJlc29sdmVkXCI7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcInRpbWVvdXRcIl0gPSAxXSA9IFwidGltZW91dFwiO1xuICAgIEZvcmNlRmx1c2hTdGF0ZVtGb3JjZUZsdXNoU3RhdGVbXCJlcnJvclwiXSA9IDJdID0gXCJlcnJvclwiO1xuICAgIEZvcmNlRmx1c2hTdGF0ZVtGb3JjZUZsdXNoU3RhdGVbXCJ1bnJlc29sdmVkXCJdID0gM10gPSBcInVucmVzb2x2ZWRcIjtcbn0pKEZvcmNlRmx1c2hTdGF0ZSB8fCAoRm9yY2VGbHVzaFN0YXRlID0ge30pKTtcbi8qKlxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgYmFzaWMgdHJhY2VyIHByb3ZpZGVyIHdoaWNoIHBsYXRmb3JtIGxpYnJhcmllcyBjYW4gZXh0ZW5kXG4gKi9cbnZhciBCYXNpY1RyYWNlclByb3ZpZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhc2ljVHJhY2VyUHJvdmlkZXIoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5fdHJhY2VycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIG1lcmdlZENvbmZpZyA9IG1lcmdlKHt9LCBsb2FkRGVmYXVsdENvbmZpZygpLCByZWNvbmZpZ3VyZUxpbWl0cyhjb25maWcpKTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IChfYSA9IG1lcmdlZENvbmZpZy5yZXNvdXJjZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogUmVzb3VyY2UuZW1wdHkoKTtcbiAgICAgICAgaWYgKG1lcmdlZENvbmZpZy5tZXJnZVJlc291cmNlV2l0aERlZmF1bHRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlID0gUmVzb3VyY2UuZGVmYXVsdCgpLm1lcmdlKHRoaXMucmVzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZENvbmZpZywge1xuICAgICAgICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKF9iID0gY29uZmlnLnNwYW5Qcm9jZXNzb3JzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoY29uZmlnLnNwYW5Qcm9jZXNzb3JzKSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGRlZmF1bHRFeHBvcnRlciA9IHRoaXMuX2J1aWxkRXhwb3J0ZXJGcm9tRW52KCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEV4cG9ydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmF0Y2hQcm9jZXNzb3IgPSBuZXcgQmF0Y2hTcGFuUHJvY2Vzc29yKGRlZmF1bHRFeHBvcnRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gYmF0Y2hQcm9jZXNzb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3IgPSBuZXcgTm9vcFNwYW5Qcm9jZXNzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5nZXRUcmFjZXIgPSBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZSArIFwiQFwiICsgKHZlcnNpb24gfHwgJycpICsgXCI6XCIgKyAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwpIHx8ICcnKTtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFjZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFjZXJzLnNldChrZXksIG5ldyBUcmFjZXIoeyBuYW1lOiBuYW1lLCB2ZXJzaW9uOiB2ZXJzaW9uLCBzY2hlbWFVcmw6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwgfSwgdGhpcy5fY29uZmlnLCB0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlcnMuZ2V0KGtleSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIHtAbGluayBUcmFjZXJDb25maWd9IHNwYW5Qcm9jZXNzb3JzIHByb3BlcnR5XG4gICAgICogQWRkcyBhIG5ldyB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gdG8gdGhpcyB0cmFjZXIuXG4gICAgICogQHBhcmFtIHNwYW5Qcm9jZXNzb3IgdGhlIG5ldyBTcGFuUHJvY2Vzc29yIHRvIGJlIGFkZGVkLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmFkZFNwYW5Qcm9jZXNzb3IgPSBmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gc2luY2Ugd2UgbWlnaHQgaGF2ZSBlbmFibGVkIGJ5IGRlZmF1bHQgYSBiYXRjaFByb2Nlc3Nvciwgd2UgZGlzYWJsZSBpdFxuICAgICAgICAgICAgLy8gYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yXG4gICAgICAgICAgICAgICAgLnNodXRkb3duKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWFnLmVycm9yKCdFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2h1dGRvd24gY3VycmVudCBzcGFuIHByb2Nlc3NvcicsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMucHVzaChzcGFuUHJvY2Vzc29yKTtcbiAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlU3BhblByb2Nlc3NvcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHRoaXMgVHJhY2VyUHJvdmlkZXIgZm9yIHVzZSB3aXRoIHRoZSBPcGVuVGVsZW1ldHJ5IEFQSS5cbiAgICAgKiBVbmRlZmluZWQgdmFsdWVzIG1heSBiZSByZXBsYWNlZCB3aXRoIGRlZmF1bHRzLCBhbmRcbiAgICAgKiBudWxsIHZhbHVlcyB3aWxsIGJlIHNraXBwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBTREsgcmVnaXN0cmF0aW9uXG4gICAgICovXG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB0cmFjZS5zZXRHbG9iYWxUcmFjZXJQcm92aWRlcih0aGlzKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm9wYWdhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbmZpZy5wcm9wYWdhdG9yID0gdGhpcy5fYnVpbGRQcm9wYWdhdG9yRnJvbUVudigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY29udGV4dE1hbmFnZXIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2V0R2xvYmFsQ29udGV4dE1hbmFnZXIoY29uZmlnLmNvbnRleHRNYW5hZ2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnByb3BhZ2F0b3IpIHtcbiAgICAgICAgICAgIHByb3BhZ2F0aW9uLnNldEdsb2JhbFByb3BhZ2F0b3IoY29uZmlnLnByb3BhZ2F0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGltZW91dCA9IHRoaXMuX2NvbmZpZy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcztcbiAgICAgICAgdmFyIHByb21pc2VzID0gdGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLm1hcChmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0SW50ZXJ2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgRXJyb3IoXCJTcGFuIHByb2Nlc3NvciBkaWQgbm90IGNvbXBsZXRlZCB3aXRoaW4gdGltZW91dCBwZXJpb2Qgb2YgXCIgKyB0aW1lb3V0ICsgXCIgbXNcIikpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0O1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3JcbiAgICAgICAgICAgICAgICAgICAgLmZvcmNlRmx1c2goKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS5yZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBGb3JjZUZsdXNoU3RhdGUuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gcmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0ICE9PSBGb3JjZUZsdXNoU3RhdGUucmVzb2x2ZWQ7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIHJlamVjdChbZXJyb3JdKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3Iuc2h1dGRvd24oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRTIGNhbm5vdCB5ZXQgaW5mZXIgdGhlIHR5cGUgb2YgdGhpcy5jb25zdHJ1Y3RvcjpcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzM4NDEjaXNzdWVjb21tZW50LTMzNzU2MDE0NlxuICAgICAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZSBnZXR0ZXJzIGluIHlvdXIgY2hpbGQgY2xhc3MuXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHJlZ2lzdGVyZWQgY29tcG9uZW50IG1hcHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFjcm9zcyBhbGxcbiAgICAgKiBjbGFzc2VzIGluIHRoZSBpbmhlcml0YW5jZSB0cmVlLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLl9nZXRQcm9wYWdhdG9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZFByb3BhZ2F0b3JzLmdldChuYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKCk7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fZ2V0U3BhbkV4cG9ydGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZEV4cG9ydGVycy5nZXQobmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYSgpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuX2J1aWxkUHJvcGFnYXRvckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIHBlciBzcGVjLCBwcm9wYWdhdG9ycyBmcm9tIGVudiBtdXN0IGJlIGRlZHVwbGljYXRlZFxuICAgICAgICB2YXIgdW5pcXVlUHJvcGFnYXRvck5hbWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGdldEVudigpLk9URUxfUFJPUEFHQVRPUlMpKTtcbiAgICAgICAgdmFyIHByb3BhZ2F0b3JzID0gdW5pcXVlUHJvcGFnYXRvck5hbWVzLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfdGhpcy5fZ2V0UHJvcGFnYXRvcihuYW1lKTtcbiAgICAgICAgICAgIGlmICghcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIlByb3BhZ2F0b3IgXFxcIlwiICsgbmFtZSArIFwiXFxcIiByZXF1ZXN0ZWQgdGhyb3VnaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB2YWxpZFByb3BhZ2F0b3JzID0gcHJvcGFnYXRvcnMucmVkdWNlKGZ1bmN0aW9uIChsaXN0LCBpdGVtKSB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGlmICh2YWxpZFByb3BhZ2F0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaXF1ZVByb3BhZ2F0b3JOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFByb3BhZ2F0b3JzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVQcm9wYWdhdG9yKHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdG9yczogdmFsaWRQcm9wYWdhdG9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fYnVpbGRFeHBvcnRlckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleHBvcnRlck5hbWUgPSBnZXRFbnYoKS5PVEVMX1RSQUNFU19FWFBPUlRFUjtcbiAgICAgICAgaWYgKGV4cG9ydGVyTmFtZSA9PT0gJ25vbmUnIHx8IGV4cG9ydGVyTmFtZSA9PT0gJycpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBleHBvcnRlciA9IHRoaXMuX2dldFNwYW5FeHBvcnRlcihleHBvcnRlck5hbWUpO1xuICAgICAgICBpZiAoIWV4cG9ydGVyKSB7XG4gICAgICAgICAgICBkaWFnLmVycm9yKFwiRXhwb3J0ZXIgXFxcIlwiICsgZXhwb3J0ZXJOYW1lICsgXCJcXFwiIHJlcXVlc3RlZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVuYXZhaWxhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwb3J0ZXI7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLl9yZWdpc3RlcmVkUHJvcGFnYXRvcnMgPSBuZXcgTWFwKFtcbiAgICAgICAgWyd0cmFjZWNvbnRleHQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpOyB9XSxcbiAgICAgICAgWydiYWdnYWdlJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFczQ0JhZ2dhZ2VQcm9wYWdhdG9yKCk7IH1dLFxuICAgIF0pO1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIuX3JlZ2lzdGVyZWRFeHBvcnRlcnMgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIEJhc2ljVHJhY2VyUHJvdmlkZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKlxuICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3BhbkV4cG9ydGVyfSB0aGF0IHByaW50cyBzcGFucyB0byB0aGVcbiAqIGNvbnNvbGUuIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuXG4gKlxuICogTk9URTogVGhpcyB7QGxpbmsgU3BhbkV4cG9ydGVyfSBpcyBpbnRlbmRlZCBmb3IgZGlhZ25vc3RpY3MgdXNlIG9ubHksIG91dHB1dCByZW5kZXJlZCB0byB0aGUgY29uc29sZSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG52YXIgQ29uc29sZVNwYW5FeHBvcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25zb2xlU3BhbkV4cG9ydGVyKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHBvcnQgc3BhbnMuXG4gICAgICogQHBhcmFtIHNwYW5zXG4gICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuZXhwb3J0ID0gZnVuY3Rpb24gKHNwYW5zLCByZXN1bHRDYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VuZFNwYW5zKHNwYW5zLCByZXN1bHRDYWxsYmFjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaHV0ZG93biB0aGUgZXhwb3J0ZXIuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NlbmRTcGFucyhbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlRmx1c2goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4cG9ydHMgYW55IHBlbmRpbmcgc3BhbnMgaW4gZXhwb3J0ZXJcbiAgICAgKi9cbiAgICBDb25zb2xlU3BhbkV4cG9ydGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBzcGFuIGluZm8gaW50byBtb3JlIHJlYWRhYmxlIGZvcm1hdFxuICAgICAqIEBwYXJhbSBzcGFuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuX2V4cG9ydEluZm8gPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4ucmVzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnN0cnVtZW50YXRpb25TY29wZTogc3Bhbi5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LFxuICAgICAgICAgICAgdHJhY2VJZDogc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQsXG4gICAgICAgICAgICBwYXJlbnRJZDogc3Bhbi5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICB0cmFjZVN0YXRlOiAoX2EgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgbmFtZTogc3Bhbi5uYW1lLFxuICAgICAgICAgICAgaWQ6IHNwYW4uc3BhbkNvbnRleHQoKS5zcGFuSWQsXG4gICAgICAgICAgICBraW5kOiBzcGFuLmtpbmQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGhyVGltZVRvTWljcm9zZWNvbmRzKHNwYW4uc3RhcnRUaW1lKSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBoclRpbWVUb01pY3Jvc2Vjb25kcyhzcGFuLmR1cmF0aW9uKSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgIHN0YXR1czogc3Bhbi5zdGF0dXMsXG4gICAgICAgICAgICBldmVudHM6IHNwYW4uZXZlbnRzLFxuICAgICAgICAgICAgbGlua3M6IHNwYW4ubGlua3MsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93aW5nIHNwYW5zIGluIGNvbnNvbGVcbiAgICAgKiBAcGFyYW0gc3BhbnNcbiAgICAgKiBAcGFyYW0gZG9uZVxuICAgICAqL1xuICAgIENvbnNvbGVTcGFuRXhwb3J0ZXIucHJvdG90eXBlLl9zZW5kU3BhbnMgPSBmdW5jdGlvbiAoc3BhbnMsIGRvbmUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzcGFuc18xID0gX192YWx1ZXMoc3BhbnMpLCBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKTsgIXNwYW5zXzFfMS5kb25lOyBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuID0gc3BhbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKHRoaXMuX2V4cG9ydEluZm8oc3BhbiksIHsgZGVwdGg6IDMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFuc18xXzEgJiYgIXNwYW5zXzFfMS5kb25lICYmIChfYSA9IHNwYW5zXzEucmV0dXJuKSkgX2EuY2FsbChzcGFuc18xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoeyBjb2RlOiBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb25zb2xlU3BhbkV4cG9ydGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX2F3YWl0ZXIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTcGFuUHJvY2Vzc29yfSB0aGF0IGNvbnZlcnRzIHRoZSB7QGxpbmsgU3Bhbn1cbiAqIHRvIHtAbGluayBSZWFkYWJsZVNwYW59IGFuZCBwYXNzZXMgaXQgdG8gdGhlIGNvbmZpZ3VyZWQgZXhwb3J0ZXIuXG4gKlxuICogT25seSBzcGFucyB0aGF0IGFyZSBzYW1wbGVkIGFyZSBjb252ZXJ0ZWQuXG4gKlxuICogTk9URTogVGhpcyB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gZXhwb3J0cyBldmVyeSBlbmRlZCBzcGFuIGluZGl2aWR1YWxseSBpbnN0ZWFkIG9mIGJhdGNoaW5nIHNwYW5zIHRvZ2V0aGVyLCB3aGljaCBjYXVzZXMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQgd2l0aCBtb3N0IGV4cG9ydGVycy4gRm9yIHByb2R1Y3Rpb24gdXNlLCBwbGVhc2UgY29uc2lkZXIgdXNpbmcgdGhlIHtAbGluayBCYXRjaFNwYW5Qcm9jZXNzb3J9IGluc3RlYWQuXG4gKi9cbnZhciBTaW1wbGVTcGFuUHJvY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNpbXBsZVNwYW5Qcm9jZXNzb3IoX2V4cG9ydGVyKSB7XG4gICAgICAgIHRoaXMuX2V4cG9ydGVyID0gX2V4cG9ydGVyO1xuICAgICAgICB0aGlzLl9zaHV0ZG93bk9uY2UgPSBuZXcgQmluZE9uY2VGdXR1cmUodGhpcy5fc2h1dGRvd24sIHRoaXMpO1xuICAgICAgICB0aGlzLl91bnJlc29sdmVkRXhwb3J0cyA9IG5ldyBTZXQoKTtcbiAgICB9XG4gICAgU2ltcGxlU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuZm9yY2VGbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBcbiAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgdW5yZXNvbHZlZCByZXNvdXJjZXMgYmVmb3JlIHJlc29sdmluZ1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHRoaXMuX3VucmVzb2x2ZWRFeHBvcnRzKSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2FpdCB1bnJlc29sdmVkIHJlc291cmNlcyBiZWZvcmUgcmVzb2x2aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2V4cG9ydGVyLmZvcmNlRmx1c2gpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgdGhpcy5fZXhwb3J0ZXIuZm9yY2VGbHVzaCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKF9zcGFuLCBfcGFyZW50Q29udGV4dCkgeyB9O1xuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKHRoaXMuX3NodXRkb3duT25jZS5pc0NhbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGRvRXhwb3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGludGVybmFsXG4gICAgICAgICAgICAgICAgLl9leHBvcnQoX3RoaXMuX2V4cG9ydGVyLCBbc3Bhbl0pXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNvZGUgIT09IEV4cG9ydFJlc3VsdENvZGUuU1VDQ0VTUykge1xuICAgICAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoKF9hID0gcmVzdWx0LmVycm9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgRXJyb3IoXCJTaW1wbGVTcGFuUHJvY2Vzc29yOiBzcGFuIGV4cG9ydCBmYWlsZWQgKHN0YXR1cyBcIiArIHJlc3VsdCArIFwiKVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICAvLyBBdm9pZCBzY2hlZHVsaW5nIGEgcHJvbWlzZSB0byBtYWtlIHRoZSBiZWhhdmlvciBtb3JlIHByZWRpY3RhYmxlIGFuZCBlYXNpZXIgdG8gdGVzdFxuICAgICAgICBpZiAoc3Bhbi5yZXNvdXJjZS5hc3luY0F0dHJpYnV0ZXNQZW5kaW5nKSB7XG4gICAgICAgICAgICB2YXIgZXhwb3J0UHJvbWlzZV8xID0gKF9iID0gKF9hID0gc3Bhbi5yZXNvdXJjZSkud2FpdEZvckFzeW5jQXR0cmlidXRlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChleHBvcnRQcm9taXNlXzEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMuZGVsZXRlKGV4cG9ydFByb21pc2VfMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBkb0V4cG9ydCgpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgeyByZXR1cm4gZ2xvYmFsRXJyb3JIYW5kbGVyKGVycik7IH0pO1xuICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHVucmVzb2x2ZWQgZXhwb3J0c1xuICAgICAgICAgICAgaWYgKGV4cG9ydFByb21pc2VfMSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMuYWRkKGV4cG9ydFByb21pc2VfMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2b2lkIGRvRXhwb3J0KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLmNhbGwoKTtcbiAgICB9O1xuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLl9zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cG9ydGVyLnNodXRkb3duKCk7XG4gICAgfTtcbiAgICByZXR1cm4gU2ltcGxlU3BhblByb2Nlc3Nvcjtcbn0oKSk7XG5cbmV4cG9ydCB7IEFsd2F5c09mZlNhbXBsZXIgYXMgQSwgQmFzaWNUcmFjZXJQcm92aWRlciBhcyBCLCBDb25zb2xlU3BhbkV4cG9ydGVyIGFzIEMsIEZvcmNlRmx1c2hTdGF0ZSBhcyBGLCBOb29wU3BhblByb2Nlc3NvciBhcyBOLCBQYXJlbnRCYXNlZFNhbXBsZXIgYXMgUCwgUmFuZG9tSWRHZW5lcmF0b3IgYXMgUiwgU2ltcGxlU3BhblByb2Nlc3NvciBhcyBTLCBUcmFjZXIgYXMgVCwgQmF0Y2hTcGFuUHJvY2Vzc29yIGFzIGEsIEFsd2F5c09uU2FtcGxlciBhcyBiLCBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIgYXMgYywgU2FtcGxpbmdEZWNpc2lvbiBhcyBkLCBTcGFuIGFzIGUgfTsiXSwKICAibWFwcGluZ3MiOiAiQUFBQSxTQUFTLEtBQUtBLElBQWdCLEtBQUtDLEdBQU8sS0FBS0MsSUFBb0IsS0FBS0MsR0FBWSxLQUFLQyxJQUFnQixLQUFLQyxHQUFTLEtBQUtDLElBQXNCLEtBQUtDLFVBQWdCO0FBQ3ZLLFNBQVMsU0FBaUI7QUFDMUIsU0FBUyxLQUFLQyxHQUFlLEtBQUtDLElBQWUsS0FBS0MsR0FBYSxLQUFLQyxJQUFnQixLQUFLQyxJQUFRLEtBQUtDLEdBQWdCLEtBQUtDLElBQW1CLEtBQUtDLElBQVksS0FBS0MsR0FBeUIsS0FBS0MsR0FBNEIsS0FBS0MsSUFBK0IsS0FBS0MsSUFBYSxLQUFLQyxTQUE0QjtBQUN6VCxTQUFTLEtBQUtDLElBQWtCLEtBQUtDLEdBQW9CLEtBQUtDLEdBQW9CLEtBQUtDLEdBQVEsS0FBS0MsR0FBcUIsS0FBS0MsSUFBdUIsS0FBS0MsSUFBK0IsS0FBS0MsSUFBc0MsS0FBS0MsSUFBWSxLQUFLQyxHQUFnQixLQUFLQyxHQUFvQixLQUFLQyxJQUFxQixLQUFLQyxJQUEyQixLQUFLQyxJQUFzQixLQUFLQyxJQUFPLEtBQUtDLFVBQWdCO0FBQ3paLFNBQVMsS0FBS0MsSUFBaUIsS0FBS0MsVUFBMkI7QUFDL0QsU0FBUyxLQUFLQyxTQUFnQjtBQUM5QixTQUFTLEtBQUtDLFNBQXdCO0FBa0J0QyxJQUFJQyxLQUFxQixhQWlCckJDLElBQWdELFdBQVk7QUFDNUQsU0FBQUEsSUFBVyxPQUFPLFVBQVUsU0FBU0MsR0FBRztBQUNwQyxhQUFTQyxHQUFHQyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVFBLElBQUksR0FBR0EsS0FBSztBQUNqRCxNQUFBRCxJQUFJLFVBQVVDLENBQUM7QUFDZixlQUFTQyxLQUFLRixFQUFHLENBQUksT0FBTyxVQUFVLGVBQWUsS0FBS0EsR0FBR0UsQ0FBQyxNQUMxREgsRUFBRUcsQ0FBQyxJQUFJRixFQUFFRSxDQUFDO0FBQUEsSUFDbEI7QUFDQSxXQUFPSDtBQUFBLEVBQ1gsR0FDT0QsRUFBUyxNQUFNLE1BQU0sU0FBUztBQUN6QyxHQUNJSyxLQUFrRCxTQUFTQyxHQUFHO0FBQzlELE1BQUlKLElBQUksT0FBTyxVQUFXLGNBQWMsT0FBTyxVQUFVSyxJQUFJTCxLQUFLSSxFQUFFSixDQUFDLEdBQUdDLElBQUk7QUFDNUUsTUFBSUksRUFBRyxRQUFPQSxFQUFFLEtBQUtELENBQUM7QUFDdEIsTUFBSUEsS0FBSyxPQUFPQSxFQUFFLFVBQVcsU0FBVSxRQUFPO0FBQUEsSUFDMUMsTUFBTSxXQUFZO0FBQ2QsYUFBSUEsS0FBS0gsS0FBS0csRUFBRSxXQUFRQSxJQUFJLFNBQ3JCLEVBQUUsT0FBT0EsS0FBS0EsRUFBRUgsR0FBRyxHQUFHLE1BQU0sQ0FBQ0csRUFBRTtBQUFBLElBQzFDO0FBQUEsRUFDSjtBQUNBLFFBQU0sSUFBSSxVQUFVSixJQUFJLDRCQUE0QixpQ0FBaUM7QUFDekYsR0FDSU0sSUFBOEMsU0FBVUYsR0FBR0csR0FBRztBQUM5RCxNQUFJRixJQUFJLE9BQU8sVUFBVyxjQUFjRCxFQUFFLE9BQU8sUUFBUTtBQUN6RCxNQUFJLENBQUNDLEVBQUcsUUFBT0Q7QUFDZixNQUFJSCxJQUFJSSxFQUFFLEtBQUtELENBQUMsR0FBR0ksR0FBR0MsSUFBSyxDQUFDLEdBQUdDO0FBQy9CLE1BQUk7QUFDQSxZQUFRSCxNQUFNLFVBQVVBLE1BQU0sTUFBTSxFQUFFQyxJQUFJUCxFQUFFLEtBQUssR0FBRyxPQUFNLENBQUFRLEVBQUcsS0FBS0QsRUFBRSxLQUFLO0FBQUEsRUFDN0UsU0FDT0csR0FBTztBQUFFLElBQUFELElBQUksRUFBRSxPQUFPQyxFQUFNO0FBQUEsRUFBRyxVQUN0QztBQUNJLFFBQUk7QUFDQSxNQUFJSCxLQUFLLENBQUNBLEVBQUUsU0FBU0gsSUFBSUosRUFBRSxXQUFZSSxFQUFFLEtBQUtKLENBQUM7QUFBQSxJQUNuRCxVQUNBO0FBQVUsVUFBSVMsRUFBRyxPQUFNQSxFQUFFO0FBQUEsSUFBTztBQUFBLEVBQ3BDO0FBQ0EsU0FBT0Q7QUFDWCxHQUNJRyxLQUE0RCxTQUFVQyxHQUFJQyxHQUFNQyxHQUFNO0FBQ3RGLE1BQUlBLEtBQVEsVUFBVSxXQUFXLEVBQUcsVUFBU2QsSUFBSSxHQUFHZSxJQUFJRixFQUFLLFFBQVFMLEdBQUlSLElBQUllLEdBQUdmO0FBQzVFLEtBQUlRLEtBQU0sRUFBRVIsS0FBS2EsUUFDUkwsTUFBSUEsSUFBSyxNQUFNLFVBQVUsTUFBTSxLQUFLSyxHQUFNLEdBQUdiLENBQUMsSUFDbkRRLEVBQUdSLENBQUMsSUFBSWEsRUFBS2IsQ0FBQztBQUd0QixTQUFPWSxFQUFHLE9BQU9KLEtBQU0sTUFBTSxVQUFVLE1BQU0sS0FBS0ssQ0FBSSxDQUFDO0FBQzNELEdBSUlHO0FBQUE7QUFBQSxHQUFzQixXQUFZO0FBTWxDLGFBQVNBLEVBQUtDLEdBQWN6RCxHQUFTMEQsR0FBVUMsR0FBYUMsR0FBTUMsR0FBY0MsR0FBT0MsR0FBV0MsR0FDbEdDLEdBQVk7QUFDUixNQUFJSCxNQUFVLFdBQVVBLElBQVEsQ0FBQyxJQUNqQyxLQUFLLGFBQWEsQ0FBQyxHQUNuQixLQUFLLFFBQVEsQ0FBQyxHQUNkLEtBQUssU0FBUyxDQUFDLEdBQ2YsS0FBSywwQkFBMEIsR0FDL0IsS0FBSyxzQkFBc0IsR0FDM0IsS0FBSyxxQkFBcUIsR0FDMUIsS0FBSyxTQUFTO0FBQUEsUUFDVixNQUFNbkUsR0FBZTtBQUFBLE1BQ3pCLEdBQ0EsS0FBSyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQ3BCLEtBQUssU0FBUyxJQUNkLEtBQUssWUFBWSxDQUFDLElBQUksRUFBRSxHQUN4QixLQUFLLE9BQU8rRCxHQUNaLEtBQUssZUFBZUMsR0FDcEIsS0FBSyxlQUFlRSxHQUNwQixLQUFLLE9BQU9ELEdBQ1osS0FBSyxRQUFRRTtBQUNiLFVBQUlJLElBQU0sS0FBSyxJQUFJO0FBQ25CLFdBQUssd0JBQXdCL0QsRUFBYyxJQUFJLEdBQy9DLEtBQUsscUJBQ0QrRCxLQUFPLEtBQUssd0JBQXdCOUQsR0FBYyxJQUN0RCxLQUFLLHFCQUFxQjJELEtBQWEsTUFDdkMsS0FBSyxZQUFZLEtBQUssU0FBU0EsS0FBeURHLENBQUcsR0FDM0YsS0FBSyxXQUFXVCxFQUFhLFVBQzdCLEtBQUsseUJBQXlCQSxFQUFhLHdCQUMzQyxLQUFLLGNBQWNBLEVBQWEsY0FBYyxHQUM5QyxLQUFLLDZCQUNELEtBQUssWUFBWSw2QkFBNkIsR0FDOUNRLEtBQWMsUUFDZCxLQUFLLGNBQWNBLENBQVUsR0FFakMsS0FBSyxpQkFBaUJSLEVBQWEsdUJBQXVCLEdBQzFELEtBQUssZUFBZSxRQUFRLE1BQU16RCxDQUFPO0FBQUEsSUFDN0M7QUFDQSxXQUFBd0QsRUFBSyxVQUFVLGNBQWMsV0FBWTtBQUNyQyxhQUFPLEtBQUs7QUFBQSxJQUNoQixHQUNBQSxFQUFLLFVBQVUsZUFBZSxTQUFVVyxHQUFLQyxHQUFPO0FBQ2hELGFBQUlBLEtBQVMsUUFBUSxLQUFLLGFBQWEsSUFDNUIsT0FDUEQsRUFBSSxXQUFXLEtBQ2ZFLEVBQUssS0FBSyw0QkFBNEJGLENBQUcsR0FDbEMsUUFFTm5ELEdBQWlCb0QsQ0FBSyxJQUl2QixPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUUsVUFDN0IsS0FBSyxZQUFZLHVCQUNqQixDQUFDLE9BQU8sVUFBVSxlQUFlLEtBQUssS0FBSyxZQUFZRCxDQUFHLEtBQzFELEtBQUssMkJBQ0UsU0FFWCxLQUFLLFdBQVdBLENBQUcsSUFBSSxLQUFLLGdCQUFnQkMsQ0FBSyxHQUMxQyxTQVZIQyxFQUFLLEtBQUssMENBQTBDRixDQUFHLEdBQ2hEO0FBQUEsSUFVZixHQUNBWCxFQUFLLFVBQVUsZ0JBQWdCLFNBQVVTLEdBQVk7QUFDakQsVUFBSUssR0FBS0M7QUFDVCxVQUFJO0FBQ0EsaUJBQVNDLElBQUs5QixHQUFXLE9BQU8sUUFBUXVCLENBQVUsQ0FBQyxHQUFHUSxJQUFLRCxFQUFHLEtBQUssR0FBRyxDQUFDQyxFQUFHLE1BQU1BLElBQUtELEVBQUcsS0FBSyxHQUFHO0FBQzVGLGNBQUlFLElBQUs3QixFQUFTNEIsRUFBRyxPQUFPLENBQUMsR0FBR0UsSUFBSUQsRUFBRyxDQUFDLEdBQUdFLElBQUlGLEVBQUcsQ0FBQztBQUNuRCxlQUFLLGFBQWFDLEdBQUdDLENBQUM7QUFBQSxRQUMxQjtBQUFBLE1BQ0osU0FDT0MsR0FBTztBQUFFLFFBQUFQLElBQU0sRUFBRSxPQUFPTyxFQUFNO0FBQUEsTUFBRyxVQUN4QztBQUNJLFlBQUk7QUFDQSxVQUFJSixLQUFNLENBQUNBLEVBQUcsU0FBU0YsSUFBS0MsRUFBRyxXQUFTRCxFQUFHLEtBQUtDLENBQUU7QUFBQSxRQUN0RCxVQUNBO0FBQVUsY0FBSUYsRUFBSyxPQUFNQSxFQUFJO0FBQUEsUUFBTztBQUFBLE1BQ3hDO0FBQ0EsYUFBTztBQUFBLElBQ1gsR0FRQWQsRUFBSyxVQUFVLFdBQVcsU0FBVXNCLEdBQU1DLEdBQXVCQyxHQUFXO0FBQ3hFLFVBQUksS0FBSyxhQUFhO0FBQ2xCLGVBQU87QUFDWCxVQUFJLEtBQUssWUFBWSxvQkFBb0I7QUFDckMsZUFBQVgsRUFBSyxLQUFLLG9CQUFvQixHQUM5QixLQUFLLHVCQUNFO0FBRVgsTUFBSSxLQUFLLE9BQU8sVUFBVSxLQUFLLFlBQVksb0JBQ25DLEtBQUssd0JBQXdCLEtBQzdCQSxFQUFLLE1BQU0sd0JBQXdCLEdBRXZDLEtBQUssT0FBTyxNQUFNLEdBQ2xCLEtBQUssd0JBRUxoRSxFQUFZMEUsQ0FBcUIsTUFDNUIxRSxFQUFZMkUsQ0FBUyxNQUN0QkEsSUFBWUQsSUFFaEJBLElBQXdCO0FBRTVCLFVBQUlkLElBQWFoRCxFQUFtQjhELENBQXFCO0FBQ3pELGtCQUFLLE9BQU8sS0FBSztBQUFBLFFBQ2IsTUFBTUQ7QUFBQSxRQUNOLFlBQVliO0FBQUEsUUFDWixNQUFNLEtBQUssU0FBU2UsQ0FBUztBQUFBLFFBQzdCLHdCQUF3QjtBQUFBLE1BQzVCLENBQUMsR0FDTTtBQUFBLElBQ1gsR0FDQXhCLEVBQUssVUFBVSxVQUFVLFNBQVV5QixHQUFNO0FBQ3JDLGtCQUFLLE1BQU0sS0FBS0EsQ0FBSSxHQUNiO0FBQUEsSUFDWCxHQUNBekIsRUFBSyxVQUFVLFdBQVcsU0FBVU0sR0FBTztBQUN2QyxVQUFJUztBQUNKLGNBQUNBLElBQUssS0FBSyxPQUFPLEtBQUssTUFBTUEsR0FBSXBCLEdBQWdCLENBQUMsR0FBR04sRUFBU2lCLENBQUssR0FBRyxFQUFLLENBQUMsR0FDckU7QUFBQSxJQUNYLEdBQ0FOLEVBQUssVUFBVSxZQUFZLFNBQVUwQixHQUFRO0FBQ3pDLGFBQUksS0FBSyxhQUFhLElBQ1gsUUFDWCxLQUFLLFNBQVM3QyxFQUFTLENBQUMsR0FBRzZDLENBQU0sR0FLN0IsS0FBSyxPQUFPLFdBQVcsUUFBUSxPQUFPQSxFQUFPLFdBQVksYUFDekRiLEVBQUssS0FBSyw4Q0FBOEMsT0FBT2EsRUFBTyxVQUFVLHNCQUFzQixHQUN0RyxPQUFPLEtBQUssT0FBTyxVQUVoQjtBQUFBLElBQ1gsR0FDQTFCLEVBQUssVUFBVSxhQUFhLFNBQVVzQixHQUFNO0FBQ3hDLGFBQUksS0FBSyxhQUFhLElBQ1gsUUFDWCxLQUFLLE9BQU9BLEdBQ0w7QUFBQSxJQUNYLEdBQ0F0QixFQUFLLFVBQVUsTUFBTSxTQUFVMkIsR0FBUztBQUNwQyxVQUFJLEtBQUssYUFBYSxHQUFHO0FBQ3JCLFFBQUFkLEVBQUssTUFBTSxLQUFLLE9BQU8sTUFBTSxLQUFLLGFBQWEsVUFBVSxNQUFNLEtBQUssYUFBYSxTQUFTLDRDQUE0QztBQUN0STtBQUFBLE1BQ0o7QUFDQSxXQUFLLFNBQVMsSUFDZCxLQUFLLFVBQVUsS0FBSyxTQUFTYyxDQUFPLEdBQ3BDLEtBQUssWUFBWTdFLEdBQWUsS0FBSyxXQUFXLEtBQUssT0FBTyxHQUN4RCxLQUFLLFVBQVUsQ0FBQyxJQUFJLE1BQ3BCK0QsRUFBSyxLQUFLLHVGQUF1RixLQUFLLFdBQVcsS0FBSyxPQUFPLEdBQzdILEtBQUssVUFBVSxLQUFLLFVBQVUsTUFBTSxHQUNwQyxLQUFLLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFFdEIsS0FBSyxzQkFBc0IsS0FDM0JBLEVBQUssS0FBSyxhQUFhLEtBQUssc0JBQXNCLHlDQUF5QyxHQUUvRixLQUFLLGVBQWUsTUFBTSxJQUFJO0FBQUEsSUFDbEMsR0FDQWIsRUFBSyxVQUFVLFdBQVcsU0FBVTRCLEdBQUs7QUFDckMsVUFBSSxPQUFPQSxLQUFRLFlBQVlBLEtBQU9qRixFQUFjLElBQUk7QUFHcEQsZUFBT0ksR0FBTzZFLElBQU0sS0FBSyxrQkFBa0I7QUFFL0MsVUFBSSxPQUFPQSxLQUFRO0FBQ2YsZUFBTzVFLEVBQWU0RSxDQUFHO0FBRTdCLFVBQUlBLGFBQWU7QUFDZixlQUFPNUUsRUFBZTRFLEVBQUksUUFBUSxDQUFDO0FBRXZDLFVBQUkzRSxHQUFrQjJFLENBQUc7QUFDckIsZUFBT0E7QUFFWCxVQUFJLEtBQUs7QUFHTCxlQUFPNUUsRUFBZSxLQUFLLElBQUksQ0FBQztBQUVwQyxVQUFJNkUsSUFBYWxGLEVBQWMsSUFBSSxJQUFJLEtBQUs7QUFDNUMsYUFBT08sR0FBVyxLQUFLLFdBQVdGLEVBQWU2RSxDQUFVLENBQUM7QUFBQSxJQUNoRSxHQUNBN0IsRUFBSyxVQUFVLGNBQWMsV0FBWTtBQUNyQyxhQUFPLEtBQUssV0FBVztBQUFBLElBQzNCLEdBQ0FBLEVBQUssVUFBVSxrQkFBa0IsU0FBVThCLEdBQVdDLEdBQU07QUFDeEQsVUFBSXRCLElBQWEsQ0FBQztBQUNsQixNQUFJLE9BQU9xQixLQUFjLFdBQ3JCckIsRUFBV3JELENBQTBCLElBQUkwRSxJQUVwQ0EsTUFDREEsRUFBVSxPQUNWckIsRUFBV3RELENBQXVCLElBQUkyRSxFQUFVLEtBQUssU0FBUyxJQUV6REEsRUFBVSxTQUNmckIsRUFBV3RELENBQXVCLElBQUkyRSxFQUFVLE9BRWhEQSxFQUFVLFlBQ1ZyQixFQUFXckQsQ0FBMEIsSUFBSTBFLEVBQVUsVUFFbkRBLEVBQVUsVUFDVnJCLEVBQVdwRCxFQUE2QixJQUFJeUUsRUFBVSxTQUkxRHJCLEVBQVd0RCxDQUF1QixLQUNsQ3NELEVBQVdyRCxDQUEwQixJQUNyQyxLQUFLLFNBQVN3QixJQUFvQjZCLEdBQVlzQixDQUFJLElBR2xEbEIsRUFBSyxLQUFLLG1DQUFtQ2lCLENBQVM7QUFBQSxJQUU5RCxHQUNBLE9BQU8sZUFBZTlCLEVBQUssV0FBVyxZQUFZO0FBQUEsTUFDOUMsS0FBSyxXQUFZO0FBQ2IsZUFBTyxLQUFLO0FBQUEsTUFDaEI7QUFBQSxNQUNBLFlBQVk7QUFBQSxNQUNaLGNBQWM7QUFBQSxJQUNsQixDQUFDLEdBQ0QsT0FBTyxlQUFlQSxFQUFLLFdBQVcsU0FBUztBQUFBLE1BQzNDLEtBQUssV0FBWTtBQUNiLGVBQU8sS0FBSztBQUFBLE1BQ2hCO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDbEIsQ0FBQyxHQUNELE9BQU8sZUFBZUEsRUFBSyxXQUFXLDBCQUEwQjtBQUFBLE1BQzVELEtBQUssV0FBWTtBQUNiLGVBQU8sS0FBSztBQUFBLE1BQ2hCO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDbEIsQ0FBQyxHQUNELE9BQU8sZUFBZUEsRUFBSyxXQUFXLHNCQUFzQjtBQUFBLE1BQ3hELEtBQUssV0FBWTtBQUNiLGVBQU8sS0FBSztBQUFBLE1BQ2hCO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDbEIsQ0FBQyxHQUNELE9BQU8sZUFBZUEsRUFBSyxXQUFXLHFCQUFxQjtBQUFBLE1BQ3ZELEtBQUssV0FBWTtBQUNiLGVBQU8sS0FBSztBQUFBLE1BQ2hCO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDbEIsQ0FBQyxHQUNEQSxFQUFLLFVBQVUsZUFBZSxXQUFZO0FBQ3RDLGFBQUksS0FBSyxVQUNMYSxFQUFLLEtBQUssMkRBQTJELEtBQUssYUFBYSxVQUFVLGVBQWUsS0FBSyxhQUFhLFNBQVMsR0FBRyxHQUUzSSxLQUFLO0FBQUEsSUFDaEIsR0FJQWIsRUFBSyxVQUFVLHVCQUF1QixTQUFVWSxHQUFPb0IsR0FBTztBQUMxRCxhQUFJcEIsRUFBTSxVQUFVb0IsSUFDVHBCLElBRUpBLEVBQU0sVUFBVSxHQUFHb0IsQ0FBSztBQUFBLElBQ25DLEdBYUFoQyxFQUFLLFVBQVUsa0JBQWtCLFNBQVVZLEdBQU87QUFDOUMsVUFBSXFCLElBQVEsTUFDUkQsSUFBUSxLQUFLO0FBRWpCLGFBQUlBLEtBQVMsS0FFVG5CLEVBQUssS0FBSyxpREFBaURtQixDQUFLLEdBQ3pEcEIsS0FHUCxPQUFPQSxLQUFVLFdBQ1YsS0FBSyxxQkFBcUJBLEdBQU9vQixDQUFLLElBRzdDLE1BQU0sUUFBUXBCLENBQUssSUFDWkEsRUFBTSxJQUFJLFNBQVVzQixHQUFLO0FBQzVCLGVBQU8sT0FBT0EsS0FBUSxXQUFXRCxFQUFNLHFCQUFxQkMsR0FBS0YsQ0FBSyxJQUFJRTtBQUFBLE1BQzlFLENBQUMsSUFHRXRCO0FBQUEsSUFDWCxHQUNPWjtBQUFBLEVBQ1gsR0FBRTtBQUFBLEdBcUJFbUM7QUFBQSxDQUNILFNBQVVBLEdBQWtCO0FBS3pCLEVBQUFBLEVBQWlCQSxFQUFpQixhQUFnQixDQUFDLElBQUksY0FLdkRBLEVBQWlCQSxFQUFpQixTQUFZLENBQUMsSUFBSSxVQUtuREEsRUFBaUJBLEVBQWlCLHFCQUF3QixDQUFDLElBQUk7QUFDbkUsR0FBR0EsTUFBcUJBLElBQW1CLENBQUMsRUFBRTtBQWtCOUMsSUFBSUM7QUFBQTtBQUFBLEdBQWtDLFdBQVk7QUFDOUMsYUFBU0EsSUFBbUI7QUFBQSxJQUM1QjtBQUNBLFdBQUFBLEVBQWlCLFVBQVUsZUFBZSxXQUFZO0FBQ2xELGFBQU87QUFBQSxRQUNILFVBQVVELEVBQWlCO0FBQUEsTUFDL0I7QUFBQSxJQUNKLEdBQ0FDLEVBQWlCLFVBQVUsV0FBVyxXQUFZO0FBQzlDLGFBQU87QUFBQSxJQUNYLEdBQ09BO0FBQUEsRUFDWCxHQUFFO0FBQUEsR0FrQkVDO0FBQUE7QUFBQSxHQUFpQyxXQUFZO0FBQzdDLGFBQVNBLElBQWtCO0FBQUEsSUFDM0I7QUFDQSxXQUFBQSxFQUFnQixVQUFVLGVBQWUsV0FBWTtBQUNqRCxhQUFPO0FBQUEsUUFDSCxVQUFVRixFQUFpQjtBQUFBLE1BQy9CO0FBQUEsSUFDSixHQUNBRSxFQUFnQixVQUFVLFdBQVcsV0FBWTtBQUM3QyxhQUFPO0FBQUEsSUFDWCxHQUNPQTtBQUFBLEVBQ1gsR0FBRTtBQUFBLEdBcUJFQztBQUFBO0FBQUEsR0FBb0MsV0FBWTtBQUNoRCxhQUFTQSxFQUFtQkMsR0FBUTtBQUNoQyxVQUFJeEIsR0FBSUMsR0FBSUMsR0FBSUM7QUFDaEIsV0FBSyxRQUFRcUIsRUFBTyxNQUNmLEtBQUssVUFDTjdFLEVBQW1CLElBQUksTUFBTSx3REFBd0QsQ0FBQyxHQUN0RixLQUFLLFFBQVEsSUFBSTJFLEVBQWdCLElBRXJDLEtBQUssd0JBQ0F0QixJQUFLd0IsRUFBTyx5QkFBeUIsUUFBUXhCLE1BQU8sU0FBU0EsSUFBSyxJQUFJc0IsRUFBZ0IsR0FDM0YsS0FBSywyQkFDQXJCLElBQUt1QixFQUFPLDRCQUE0QixRQUFRdkIsTUFBTyxTQUFTQSxJQUFLLElBQUlvQixFQUFpQixHQUMvRixLQUFLLHVCQUNBbkIsSUFBS3NCLEVBQU8sd0JBQXdCLFFBQVF0QixNQUFPLFNBQVNBLElBQUssSUFBSW9CLEVBQWdCLEdBQzFGLEtBQUssMEJBQ0FuQixJQUFLcUIsRUFBTywyQkFBMkIsUUFBUXJCLE1BQU8sU0FBU0EsSUFBSyxJQUFJa0IsRUFBaUI7QUFBQSxJQUNsRztBQUNBLFdBQUFFLEVBQW1CLFVBQVUsZUFBZSxTQUFVOUYsR0FBU2dHLEdBQVN0QyxHQUFVdUMsR0FBVWhDLEdBQVlILEdBQU87QUFDM0csVUFBSW9DLElBQWdCdEcsRUFBTSxlQUFlSSxDQUFPO0FBQ2hELGFBQUksQ0FBQ2tHLEtBQWlCLENBQUNyRyxHQUFtQnFHLENBQWEsSUFDNUMsS0FBSyxNQUFNLGFBQWFsRyxHQUFTZ0csR0FBU3RDLEdBQVV1QyxHQUFVaEMsR0FBWUgsQ0FBSyxJQUV0Rm9DLEVBQWMsV0FDVkEsRUFBYyxhQUFhcEcsRUFBVyxVQUMvQixLQUFLLHFCQUFxQixhQUFhRSxHQUFTZ0csR0FBU3RDLEdBQVV1QyxHQUFVaEMsR0FBWUgsQ0FBSyxJQUVsRyxLQUFLLHdCQUF3QixhQUFhOUQsR0FBU2dHLEdBQVN0QyxHQUFVdUMsR0FBVWhDLEdBQVlILENBQUssSUFFeEdvQyxFQUFjLGFBQWFwRyxFQUFXLFVBQy9CLEtBQUssb0JBQW9CLGFBQWFFLEdBQVNnRyxHQUFTdEMsR0FBVXVDLEdBQVVoQyxHQUFZSCxDQUFLLElBRWpHLEtBQUssdUJBQXVCLGFBQWE5RCxHQUFTZ0csR0FBU3RDLEdBQVV1QyxHQUFVaEMsR0FBWUgsQ0FBSztBQUFBLElBQzNHLEdBQ0FnQyxFQUFtQixVQUFVLFdBQVcsV0FBWTtBQUNoRCxhQUFPLHNCQUFzQixLQUFLLE1BQU0sU0FBUyxJQUFJLDJCQUEyQixLQUFLLHFCQUFxQixTQUFTLElBQUksOEJBQThCLEtBQUssd0JBQXdCLFNBQVMsSUFBSSwwQkFBMEIsS0FBSyxvQkFBb0IsU0FBUyxJQUFJLDZCQUE2QixLQUFLLHVCQUF1QixTQUFTLElBQUk7QUFBQSxJQUN6VSxHQUNPQTtBQUFBLEVBQ1gsR0FBRTtBQUFBLEdBa0JFSztBQUFBO0FBQUEsR0FBMEMsV0FBWTtBQUN0RCxhQUFTQSxFQUF5QkMsR0FBUTtBQUN0QyxNQUFJQSxNQUFXLFdBQVVBLElBQVMsSUFDbEMsS0FBSyxTQUFTQSxHQUNkLEtBQUssU0FBUyxLQUFLLFdBQVdBLENBQU0sR0FDcEMsS0FBSyxjQUFjLEtBQUssTUFBTSxLQUFLLFNBQVMsVUFBVTtBQUFBLElBQzFEO0FBQ0EsV0FBQUQsRUFBeUIsVUFBVSxlQUFlLFNBQVVuRyxHQUFTZ0csR0FBUztBQUMxRSxhQUFPO0FBQUEsUUFDSCxVQUFVakcsR0FBZWlHLENBQU8sS0FBSyxLQUFLLFlBQVlBLENBQU8sSUFBSSxLQUFLLGNBQ2hFTCxFQUFpQixxQkFDakJBLEVBQWlCO0FBQUEsTUFDM0I7QUFBQSxJQUNKLEdBQ0FRLEVBQXlCLFVBQVUsV0FBVyxXQUFZO0FBQ3RELGFBQU8sdUJBQXVCLEtBQUssU0FBUztBQUFBLElBQ2hELEdBQ0FBLEVBQXlCLFVBQVUsYUFBYSxTQUFVRSxHQUFPO0FBQzdELGFBQUksT0FBT0EsS0FBVSxZQUFZLE1BQU1BLENBQUssSUFDakMsSUFDSkEsS0FBUyxJQUFJLElBQUlBLEtBQVMsSUFBSSxJQUFJQTtBQUFBLElBQzdDLEdBQ0FGLEVBQXlCLFVBQVUsY0FBYyxTQUFVSCxHQUFTO0FBRWhFLGVBRElNLElBQWUsR0FDVjlELElBQUksR0FBR0EsSUFBSXdELEVBQVEsU0FBUyxHQUFHeEQsS0FBSztBQUN6QyxZQUFJK0QsSUFBTS9ELElBQUksR0FDVmdFLElBQU8sU0FBU1IsRUFBUSxNQUFNTyxHQUFLQSxJQUFNLENBQUMsR0FBRyxFQUFFO0FBQ25ELFFBQUFELEtBQWdCQSxJQUFlRSxPQUFVO0FBQUEsTUFDN0M7QUFDQSxhQUFPRjtBQUFBLElBQ1gsR0FDT0g7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQWlCRU0sS0FBK0JyRixFQUFvQixVQUNuRHNGLElBQWdCO0FBU3BCLFNBQVNDLElBQW9CO0FBQ3pCLE1BQUlDLElBQU16RixFQUFPO0FBQ2pCLFNBQU87QUFBQSxJQUNILFNBQVMwRixFQUFvQkQsQ0FBRztBQUFBLElBQ2hDLHlCQUF5QjtBQUFBLElBQ3pCLGVBQWU7QUFBQSxNQUNYLDJCQUEyQkEsRUFBSTtBQUFBLE1BQy9CLHFCQUFxQkEsRUFBSTtBQUFBLElBQzdCO0FBQUEsSUFDQSxZQUFZO0FBQUEsTUFDUiwyQkFBMkJBLEVBQUk7QUFBQSxNQUMvQixxQkFBcUJBLEVBQUk7QUFBQSxNQUN6QixnQkFBZ0JBLEVBQUk7QUFBQSxNQUNwQixpQkFBaUJBLEVBQUk7QUFBQSxNQUNyQiw2QkFBNkJBLEVBQUk7QUFBQSxNQUNqQyw0QkFBNEJBLEVBQUk7QUFBQSxJQUNwQztBQUFBLElBQ0EsMkJBQTJCO0FBQUEsRUFDL0I7QUFDSjtBQUtBLFNBQVNDLEVBQW9CQyxHQUFhO0FBRXRDLFVBRElBLE1BQWdCLFdBQVVBLElBQWMzRixFQUFPLElBQzNDMkYsRUFBWSxxQkFBcUI7QUFBQSxJQUNyQyxLQUFLMUYsRUFBb0I7QUFDckIsYUFBTyxJQUFJeUUsRUFBZ0I7QUFBQSxJQUMvQixLQUFLekUsRUFBb0I7QUFDckIsYUFBTyxJQUFJd0UsRUFBaUI7QUFBQSxJQUNoQyxLQUFLeEUsRUFBb0I7QUFDckIsYUFBTyxJQUFJMEUsRUFBbUI7QUFBQSxRQUMxQixNQUFNLElBQUlELEVBQWdCO0FBQUEsTUFDOUIsQ0FBQztBQUFBLElBQ0wsS0FBS3pFLEVBQW9CO0FBQ3JCLGFBQU8sSUFBSTBFLEVBQW1CO0FBQUEsUUFDMUIsTUFBTSxJQUFJRixFQUFpQjtBQUFBLE1BQy9CLENBQUM7QUFBQSxJQUNMLEtBQUt4RSxFQUFvQjtBQUNyQixhQUFPLElBQUkrRSxFQUF5QlksRUFBNkJELENBQVcsQ0FBQztBQUFBLElBQ2pGLEtBQUsxRixFQUFvQjtBQUNyQixhQUFPLElBQUkwRSxFQUFtQjtBQUFBLFFBQzFCLE1BQU0sSUFBSUssRUFBeUJZLEVBQTZCRCxDQUFXLENBQUM7QUFBQSxNQUNoRixDQUFDO0FBQUEsSUFDTDtBQUNJLGFBQUF6QyxFQUFLLE1BQU0sZ0NBQWlDeUMsRUFBWSxzQkFBc0IsNkJBQTZCTCxLQUErQixJQUFLLEdBQ3hJLElBQUlaLEVBQWdCO0FBQUEsRUFDbkM7QUFDSjtBQUNBLFNBQVNrQixFQUE2QkQsR0FBYTtBQUMvQyxNQUFJQSxFQUFZLDRCQUE0QixVQUN4Q0EsRUFBWSw0QkFBNEI7QUFDeEMsV0FBQXpDLEVBQUssTUFBTSxxREFBcURxQyxJQUFnQixHQUFHLEdBQzVFQTtBQUVYLE1BQUlNLElBQWMsT0FBT0YsRUFBWSx1QkFBdUI7QUFDNUQsU0FBSSxNQUFNRSxDQUFXLEtBQ2pCM0MsRUFBSyxNQUFNLDZCQUE2QnlDLEVBQVksMEJBQTBCLGtEQUFrREosSUFBZ0IsR0FBRyxHQUM1SUEsS0FFUE0sSUFBYyxLQUFLQSxJQUFjLEtBQ2pDM0MsRUFBSyxNQUFNLDZCQUE2QnlDLEVBQVksMEJBQTBCLGdFQUFnRUosSUFBZ0IsR0FBRyxHQUMxSkEsS0FFSk07QUFDWDtBQXFCQSxTQUFTQyxHQUFZQyxHQUFZO0FBQzdCLE1BQUlDLElBQXNCO0FBQUEsSUFDdEIsU0FBU04sRUFBb0I7QUFBQSxFQUNqQyxHQUNJTyxJQUFpQlQsRUFBa0IsR0FDbkNVLElBQVMsT0FBTyxPQUFPLENBQUMsR0FBR0QsR0FBZ0JELEdBQXFCRCxDQUFVO0FBQzlFLFNBQUFHLEVBQU8sZ0JBQWdCLE9BQU8sT0FBTyxDQUFDLEdBQUdELEVBQWUsZUFBZUYsRUFBVyxpQkFBaUIsQ0FBQyxDQUFDLEdBQ3JHRyxFQUFPLGFBQWEsT0FBTyxPQUFPLENBQUMsR0FBR0QsRUFBZSxZQUFZRixFQUFXLGNBQWMsQ0FBQyxDQUFDLEdBQ3JGRztBQUNYO0FBTUEsU0FBU0MsR0FBa0JKLEdBQVk7QUFDbkMsTUFBSTNDLEdBQUlDLEdBQUlDLEdBQUlDLEdBQUk2QyxHQUFJQyxHQUFJQyxHQUFJQyxHQUFJQyxHQUFJQyxHQUFJQyxHQUFJQyxHQUM1Q0MsSUFBYSxPQUFPLE9BQU8sQ0FBQyxHQUFHYixFQUFXLFVBQVUsR0FDcERjLElBQWtCM0csR0FBc0I7QUFJNUMsU0FBQTBHLEVBQVcsdUJBQ05QLEtBQU1ELEtBQU03QyxLQUFNRixLQUFNRCxJQUFLMkMsRUFBVyxnQkFBZ0IsUUFBUTNDLE1BQU8sU0FBUyxTQUFTQSxFQUFHLHlCQUF5QixRQUFRQyxNQUFPLFNBQVNBLEtBQU1DLElBQUt5QyxFQUFXLG1CQUFtQixRQUFRekMsTUFBTyxTQUFTLFNBQVNBLEVBQUcseUJBQXlCLFFBQVFDLE1BQU8sU0FBU0EsSUFBS3NELEVBQWdCLHFDQUFxQyxRQUFRVCxNQUFPLFNBQVNBLElBQUtTLEVBQWdCLGdDQUFnQyxRQUFRUixNQUFPLFNBQVNBLElBQUtsRyxJQUlwYnlHLEVBQVcsNkJBQ05ELEtBQU1ELEtBQU1ELEtBQU1GLEtBQU1ELElBQUtQLEVBQVcsZ0JBQWdCLFFBQVFPLE1BQU8sU0FBUyxTQUFTQSxFQUFHLCtCQUErQixRQUFRQyxNQUFPLFNBQVNBLEtBQU1DLElBQUtULEVBQVcsbUJBQW1CLFFBQVFTLE1BQU8sU0FBUyxTQUFTQSxFQUFHLCtCQUErQixRQUFRQyxNQUFPLFNBQVNBLElBQUtJLEVBQWdCLDRDQUE0QyxRQUFRSCxNQUFPLFNBQVNBLElBQUtHLEVBQWdCLHVDQUF1QyxRQUFRRixNQUFPLFNBQVNBLElBQUt2RyxJQUN2YyxPQUFPLE9BQU8sQ0FBQyxHQUFHMkYsR0FBWSxFQUFFLFlBQVlhLEVBQVcsQ0FBQztBQUNuRTtBQXFCQSxJQUFJRTtBQUFBO0FBQUEsR0FBd0MsV0FBWTtBQUNwRCxhQUFTQSxFQUF1QkMsR0FBV25DLEdBQVE7QUFDL0MsV0FBSyxZQUFZbUMsR0FDakIsS0FBSyxlQUFlLElBQ3BCLEtBQUssaUJBQWlCLENBQUMsR0FDdkIsS0FBSyxxQkFBcUI7QUFDMUIsVUFBSXRCLElBQU16RixFQUFPO0FBQ2pCLFdBQUssc0JBQ0QsT0FBd0Q0RSxHQUFPLHNCQUF3QixXQUNqRkEsRUFBTyxxQkFDUGEsRUFBSSxnQ0FDZCxLQUFLLGdCQUNELE9BQXdEYixHQUFPLGdCQUFrQixXQUMzRUEsRUFBTyxlQUNQYSxFQUFJLHlCQUNkLEtBQUssd0JBQ0QsT0FBd0RiLEdBQU8sd0JBQTBCLFdBQ25GQSxFQUFPLHVCQUNQYSxFQUFJLHlCQUNkLEtBQUssdUJBQ0QsT0FBd0RiLEdBQU8sdUJBQXlCLFdBQ2xGQSxFQUFPLHNCQUNQYSxFQUFJLHlCQUNkLEtBQUssZ0JBQWdCLElBQUluRixFQUFlLEtBQUssV0FBVyxJQUFJLEdBQ3hELEtBQUssc0JBQXNCLEtBQUssa0JBQ2hDNEMsRUFBSyxLQUFLLG1JQUFtSSxHQUM3SSxLQUFLLHNCQUFzQixLQUFLO0FBQUEsSUFFeEM7QUFDQSxXQUFBNEQsRUFBdUIsVUFBVSxhQUFhLFdBQVk7QUFDdEQsYUFBSSxLQUFLLGNBQWMsV0FDWixLQUFLLGNBQWMsVUFFdkIsS0FBSyxVQUFVO0FBQUEsSUFDMUIsR0FFQUEsRUFBdUIsVUFBVSxVQUFVLFNBQVVFLEdBQU9DLEdBQWdCO0FBQUEsSUFBRSxHQUM5RUgsRUFBdUIsVUFBVSxRQUFRLFNBQVVJLEdBQU07QUFDckQsTUFBSSxLQUFLLGNBQWMsYUFHbEJBLEVBQUssWUFBWSxFQUFFLGFBQWF2SSxFQUFXLGFBQWEsS0FHN0QsS0FBSyxhQUFhdUksQ0FBSTtBQUFBLElBQzFCLEdBQ0FKLEVBQXVCLFVBQVUsV0FBVyxXQUFZO0FBQ3BELGFBQU8sS0FBSyxjQUFjLEtBQUs7QUFBQSxJQUNuQyxHQUNBQSxFQUF1QixVQUFVLFlBQVksV0FBWTtBQUNyRCxVQUFJeEMsSUFBUTtBQUNaLGFBQU8sUUFBUSxRQUFRLEVBQ2xCLEtBQUssV0FBWTtBQUNsQixlQUFPQSxFQUFNLFdBQVc7QUFBQSxNQUM1QixDQUFDLEVBQ0ksS0FBSyxXQUFZO0FBQ2xCLGVBQU9BLEVBQU0sVUFBVTtBQUFBLE1BQzNCLENBQUMsRUFDSSxLQUFLLFdBQVk7QUFDbEIsZUFBT0EsRUFBTSxVQUFVLFNBQVM7QUFBQSxNQUNwQyxDQUFDO0FBQUEsSUFDTCxHQUVBd0MsRUFBdUIsVUFBVSxlQUFlLFNBQVVJLEdBQU07QUFDNUQsVUFBSSxLQUFLLGVBQWUsVUFBVSxLQUFLLGVBQWU7QUFFbEQsUUFBSSxLQUFLLHVCQUF1QixLQUM1QmhFLEVBQUssTUFBTSxzQ0FBc0MsR0FFckQsS0FBSztBQUNMO0FBQUEsTUFDSjtBQUNBLE1BQUksS0FBSyxxQkFBcUIsTUFFMUJBLEVBQUssS0FBSyxhQUFhLEtBQUsscUJBQXFCLHFDQUFxQyxHQUN0RixLQUFLLHFCQUFxQixJQUU5QixLQUFLLGVBQWUsS0FBS2dFLENBQUksR0FDN0IsS0FBSyxpQkFBaUI7QUFBQSxJQUMxQixHQU1BSixFQUF1QixVQUFVLFlBQVksV0FBWTtBQUNyRCxVQUFJeEMsSUFBUTtBQUNaLGFBQU8sSUFBSSxRQUFRLFNBQVU2QyxHQUFTQyxHQUFRO0FBSTFDLGlCQUhJQyxJQUFXLENBQUMsR0FFWkMsSUFBUSxLQUFLLEtBQUtoRCxFQUFNLGVBQWUsU0FBU0EsRUFBTSxtQkFBbUIsR0FDcEVqRCxJQUFJLEdBQUdrRyxJQUFJRCxHQUFPakcsSUFBSWtHLEdBQUdsRztBQUM5QixVQUFBZ0csRUFBUyxLQUFLL0MsRUFBTSxlQUFlLENBQUM7QUFFeEMsZ0JBQVEsSUFBSStDLENBQVEsRUFDZixLQUFLLFdBQVk7QUFDbEIsVUFBQUYsRUFBUTtBQUFBLFFBQ1osQ0FBQyxFQUNJLE1BQU1DLENBQU07QUFBQSxNQUNyQixDQUFDO0FBQUEsSUFDTCxHQUNBTixFQUF1QixVQUFVLGlCQUFpQixXQUFZO0FBQzFELFVBQUl4QyxJQUFRO0FBRVosYUFEQSxLQUFLLFlBQVksR0FDYixLQUFLLGVBQWUsV0FBVyxJQUN4QixRQUFRLFFBQVEsSUFFcEIsSUFBSSxRQUFRLFNBQVU2QyxHQUFTQyxHQUFRO0FBQzFDLFlBQUlJLElBQVEsV0FBVyxXQUFZO0FBRS9CLFVBQUFKLEVBQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUFBLFFBQy9CLEdBQUc5QyxFQUFNLG9CQUFvQjtBQUU3QixRQUFBekYsRUFBUSxLQUFLZ0MsR0FBZ0JoQyxFQUFRLE9BQU8sQ0FBQyxHQUFHLFdBQVk7QUFJeEQsY0FBSTRJO0FBQ0osVUFBSW5ELEVBQU0sZUFBZSxVQUFVQSxFQUFNLHVCQUNyQ21ELElBQVFuRCxFQUFNLGdCQUNkQSxFQUFNLGlCQUFpQixDQUFDLEtBR3hCbUQsSUFBUW5ELEVBQU0sZUFBZSxPQUFPLEdBQUdBLEVBQU0sbUJBQW1CO0FBZXBFLG1CQWJJb0QsSUFBVyxXQUFZO0FBQ3ZCLG1CQUFPcEQsRUFBTSxVQUFVLE9BQU9tRCxHQUFPLFNBQVVFLEdBQVE7QUFDbkQsa0JBQUl2RTtBQUNKLDJCQUFhb0UsQ0FBSyxHQUNkRyxFQUFPLFNBQVMzRyxFQUFpQixVQUNqQ21HLEVBQVEsSUFHUkMsR0FBUWhFLElBQUt1RSxFQUFPLFdBQVcsUUFBUXZFLE1BQU8sU0FBU0EsSUFBSyxJQUFJLE1BQU0sd0NBQXdDLENBQUM7QUFBQSxZQUV2SCxDQUFDO0FBQUEsVUFDTCxHQUNJd0UsSUFBbUIsTUFDZHZHLElBQUksR0FBR3dHLElBQU1KLEVBQU0sUUFBUXBHLElBQUl3RyxHQUFLeEcsS0FBSztBQUM5QyxnQkFBSTZGLElBQU9PLEVBQU1wRyxDQUFDO0FBQ2xCLFlBQUk2RixFQUFLLFNBQVMsMEJBQ2RBLEVBQUssU0FBUywyQkFDZFUsTUFBK0VBLElBQW1CLENBQUMsSUFDbkdBLEVBQWlCLEtBQUtWLEVBQUssU0FBUyx1QkFBdUIsQ0FBQztBQUFBLFVBRXBFO0FBRUEsVUFBSVUsTUFBcUIsT0FDckJGLEVBQVMsSUFHVCxRQUFRLElBQUlFLENBQWdCLEVBQUUsS0FBS0YsR0FBVSxTQUFVSSxHQUFLO0FBQ3hELFlBQUEvSCxFQUFtQitILENBQUcsR0FDdEJWLEVBQU9VLENBQUc7QUFBQSxVQUNkLENBQUM7QUFBQSxRQUVULENBQUM7QUFBQSxNQUNMLENBQUM7QUFBQSxJQUNMLEdBQ0FoQixFQUF1QixVQUFVLG1CQUFtQixXQUFZO0FBQzVELFVBQUl4QyxJQUFRO0FBQ1osVUFBSSxNQUFLLGNBRVQ7QUFBQSxZQUFJeUQsSUFBUSxXQUFZO0FBQ3BCLFVBQUF6RCxFQUFNLGVBQWUsSUFDckJBLEVBQU0sZUFBZSxFQUNoQixRQUFRLFdBQVk7QUFDckIsWUFBQUEsRUFBTSxlQUFlLElBQ2pCQSxFQUFNLGVBQWUsU0FBUyxNQUM5QkEsRUFBTSxZQUFZLEdBQ2xCQSxFQUFNLGlCQUFpQjtBQUFBLFVBRS9CLENBQUMsRUFDSSxNQUFNLFNBQVV4QyxHQUFHO0FBQ3BCLFlBQUF3QyxFQUFNLGVBQWUsSUFDckJ2RSxFQUFtQitCLENBQUM7QUFBQSxVQUN4QixDQUFDO0FBQUEsUUFDTDtBQUVBLFlBQUksS0FBSyxlQUFlLFVBQVUsS0FBSztBQUNuQyxpQkFBT2lHLEVBQU07QUFFakIsUUFBSSxLQUFLLFdBQVcsV0FFcEIsS0FBSyxTQUFTLFdBQVcsV0FBWTtBQUFFLGlCQUFPQSxFQUFNO0FBQUEsUUFBRyxHQUFHLEtBQUsscUJBQXFCLEdBQ3BGMUgsR0FBVyxLQUFLLE1BQU07QUFBQTtBQUFBLElBQzFCLEdBQ0F5RyxFQUF1QixVQUFVLGNBQWMsV0FBWTtBQUN2RCxNQUFJLEtBQUssV0FBVyxXQUNoQixhQUFhLEtBQUssTUFBTSxHQUN4QixLQUFLLFNBQVM7QUFBQSxJQUV0QixHQUNPQTtBQUFBLEVBQ1gsR0FBRTtBQUFBLEdBaUJFa0IsS0FBbUQsNEJBQVk7QUFDL0QsTUFBSUMsSUFBZ0IsU0FBVUMsR0FBR0MsR0FBRztBQUNoQyxXQUFBRixJQUFnQixPQUFPLGtCQUNsQixFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsU0FBUyxTQUFVQyxHQUFHQyxHQUFHO0FBQUUsTUFBQUQsRUFBRSxZQUFZQztBQUFBLElBQUcsS0FDMUUsU0FBVUQsR0FBR0MsR0FBRztBQUFFLGVBQVM3RyxLQUFLNkcsRUFBRyxDQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUtBLEdBQUc3RyxDQUFDLE1BQUc0RyxFQUFFNUcsQ0FBQyxJQUFJNkcsRUFBRTdHLENBQUM7QUFBQSxJQUFHLEdBQzdGMkcsRUFBY0MsR0FBR0MsQ0FBQztBQUFBLEVBQzdCO0FBQ0EsU0FBTyxTQUFVRCxHQUFHQyxHQUFHO0FBQ25CLFFBQUksT0FBT0EsS0FBTSxjQUFjQSxNQUFNO0FBQ2pDLFlBQU0sSUFBSSxVQUFVLHlCQUF5QixPQUFPQSxDQUFDLElBQUksK0JBQStCO0FBQzVGLElBQUFGLEVBQWNDLEdBQUdDLENBQUM7QUFDbEIsYUFBU0MsSUFBSztBQUFFLFdBQUssY0FBY0Y7QUFBQSxJQUFHO0FBQ3RDLElBQUFBLEVBQUUsWUFBWUMsTUFBTSxPQUFPLE9BQU8sT0FBT0EsQ0FBQyxLQUFLQyxFQUFHLFlBQVlELEVBQUUsV0FBVyxJQUFJQyxFQUFHO0FBQUEsRUFDdEY7QUFDSixHQUFHLEdBQ0NDO0FBQUE7QUFBQSxHQUFvQyxTQUFVQyxHQUFRO0FBQ3RELElBQUFOLEdBQVVLLEdBQW9CQyxDQUFNO0FBQ3BDLGFBQVNELEVBQW1CdEIsR0FBV25DLEdBQVE7QUFDM0MsVUFBSU4sSUFBUWdFLEVBQU8sS0FBSyxNQUFNdkIsR0FBV25DLENBQU0sS0FBSztBQUNwRCxhQUFBTixFQUFNLE9BQU9NLENBQU0sR0FDWk47QUFBQSxJQUNYO0FBQ0EsV0FBQStELEVBQW1CLFVBQVUsU0FBUyxTQUFVekQsR0FBUTtBQUNwRCxVQUFJTixJQUFRO0FBQ1osTUFBcURNLEdBQU8sbUNBQW9DLE1BQzVGLE9BQU8sV0FBYSxRQUNwQixLQUFLLDRCQUE0QixXQUFZO0FBQ3pDLFFBQUksU0FBUyxvQkFBb0IsWUFDN0JOLEVBQU0sV0FBVyxFQUFFLE1BQU0sU0FBVXZDLEdBQU87QUFDdEMsVUFBQWhDLEVBQW1CZ0MsQ0FBSztBQUFBLFFBQzVCLENBQUM7QUFBQSxNQUVULEdBQ0EsS0FBSyxvQkFBb0IsV0FBWTtBQUNqQyxRQUFBdUMsRUFBTSxXQUFXLEVBQUUsTUFBTSxTQUFVdkMsR0FBTztBQUN0QyxVQUFBaEMsRUFBbUJnQyxDQUFLO0FBQUEsUUFDNUIsQ0FBQztBQUFBLE1BQ0wsR0FDQSxTQUFTLGlCQUFpQixvQkFBb0IsS0FBSyx5QkFBeUIsR0FFNUUsU0FBUyxpQkFBaUIsWUFBWSxLQUFLLGlCQUFpQjtBQUFBLElBRXBFLEdBQ0FzRyxFQUFtQixVQUFVLGFBQWEsV0FBWTtBQUNsRCxNQUFJLE9BQU8sV0FBYSxRQUNoQixLQUFLLDZCQUNMLFNBQVMsb0JBQW9CLG9CQUFvQixLQUFLLHlCQUF5QixHQUUvRSxLQUFLLHFCQUNMLFNBQVMsb0JBQW9CLFlBQVksS0FBSyxpQkFBaUI7QUFBQSxJQUczRSxHQUNPQTtBQUFBLEVBQ1gsR0FBRXZCLEVBQXNCO0FBQUEsR0FpQnBCeUIsS0FBZ0IsR0FDaEJDLEtBQWlCLElBQ2pCQztBQUFBO0FBQUEsRUFBbUMsNEJBQVk7QUFDL0MsYUFBU0EsSUFBb0I7QUFLekIsV0FBSyxrQkFBa0JDLEVBQWVGLEVBQWMsR0FLcEQsS0FBSyxpQkFBaUJFLEVBQWVILEVBQWE7QUFBQSxJQUN0RDtBQUNBLFdBQU9FO0FBQUEsRUFDWCxHQUFFO0FBQUEsR0FDRUUsSUFBMEIsTUFBTSxFQUFFO0FBQ3RDLFNBQVNELEVBQWVFLEdBQU87QUFDM0IsU0FBTyxXQUFzQjtBQUN6QixhQUFTdkgsSUFBSSxHQUFHQSxJQUFJdUgsSUFBUSxHQUFHdkg7QUFDM0IsTUFBQXNILEVBQXdCdEgsQ0FBQyxJQUFJLEtBQUssTUFBTSxLQUFLLE9BQU8sSUFBSSxFQUFFLElBQUksSUFFMURzSCxFQUF3QnRILENBQUMsS0FBSyxPQUM5QnNILEVBQXdCdEgsQ0FBQyxLQUFLO0FBR3RDLFdBQU8sT0FBTyxhQUFhLE1BQU0sTUFBTXNILEVBQXdCLE1BQU0sR0FBR0MsSUFBUSxDQUFDLENBQUM7QUFBQSxFQUN0RjtBQUNKO0FBb0JBLElBQUlDO0FBQUE7QUFBQSxHQUF3QixXQUFZO0FBSXBDLGFBQVNBLEVBQU9DLEdBQXdCbEUsR0FBUW1FLEdBQWlCO0FBQzdELFdBQUssa0JBQWtCQTtBQUN2QixVQUFJQyxJQUFjbEQsR0FBWWxCLENBQU07QUFDcEMsV0FBSyxXQUFXb0UsRUFBWSxTQUM1QixLQUFLLGlCQUFpQkEsRUFBWSxlQUNsQyxLQUFLLGNBQWNBLEVBQVksWUFDL0IsS0FBSyxlQUFlcEUsRUFBTyxlQUFlLElBQUk2RCxHQUFrQixHQUNoRSxLQUFLLFdBQVdNLEVBQWdCLFVBQ2hDLEtBQUsseUJBQXlCRDtBQUFBLElBQ2xDO0FBS0EsV0FBQUQsRUFBTyxVQUFVLFlBQVksU0FBVWxGLEdBQU1zRixHQUFTQyxHQUFXO0FBQzdELFVBQUk5RixHQUFJQyxHQUFJQztBQUNaLE1BQUkyRixNQUFZLFdBQVVBLElBQVUsQ0FBQyxJQUNqQ0MsTUFBYyxXQUFVQSxJQUFZckssRUFBUSxPQUFPLElBRW5Eb0ssRUFBUSxTQUNSQyxJQUFZekssRUFBTSxXQUFXeUssQ0FBUztBQUUxQyxVQUFJQyxJQUFhMUssRUFBTSxRQUFReUssQ0FBUztBQUN4QyxVQUFJcEksR0FBb0JvSSxDQUFTLEdBQUc7QUFDaEMsUUFBQWhHLEVBQUssTUFBTSxpREFBaUQ7QUFDNUQsWUFBSWtHLElBQW1CM0ssRUFBTSxnQkFBZ0JLLEVBQW9CO0FBQ2pFLGVBQU9zSztBQUFBLE1BQ1g7QUFDQSxVQUFJQyxJQUE0RUYsR0FBVyxZQUFZLEdBQ25HRyxJQUFTLEtBQUssYUFBYSxlQUFlLEdBQzFDekUsR0FDQTBFLEdBQ0E3RztBQUNKLE1BQUksQ0FBQzJHLEtBQ0QsQ0FBQzVLLEVBQU0sbUJBQW1CNEssQ0FBaUIsSUFFM0N4RSxJQUFVLEtBQUssYUFBYSxnQkFBZ0IsS0FJNUNBLElBQVV3RSxFQUFrQixTQUM1QkUsSUFBYUYsRUFBa0IsWUFDL0IzRyxJQUFlMkcsRUFBa0I7QUFFckMsVUFBSXZFLEtBQVkxQixJQUFLNkYsRUFBUSxVQUFVLFFBQVE3RixNQUFPLFNBQVNBLElBQUtyRSxHQUFTLFVBQ3pFNEQsTUFBVVUsSUFBSzRGLEVBQVEsV0FBVyxRQUFRNUYsTUFBTyxTQUFTQSxJQUFLLENBQUMsR0FBRyxJQUFJLFNBQVVTLEdBQU07QUFDdkYsZUFBTztBQUFBLFVBQ0gsU0FBU0EsRUFBSztBQUFBLFVBQ2QsWUFBWWhFLEVBQW1CZ0UsRUFBSyxVQUFVO0FBQUEsUUFDbEQ7QUFBQSxNQUNKLENBQUMsR0FDR2hCLElBQWFoRCxFQUFtQm1KLEVBQVEsVUFBVSxHQUVsRE8sSUFBaUIsS0FBSyxTQUFTLGFBQWFOLEdBQVdyRSxHQUFTbEIsR0FBTW1CLEdBQVVoQyxHQUFZSCxDQUFLO0FBQ3JHLE1BQUE0RyxLQUFjakcsSUFBS2tHLEVBQWUsZ0JBQWdCLFFBQVFsRyxNQUFPLFNBQVNBLElBQUtpRztBQUMvRSxVQUFJRSxLQUFhRCxFQUFlLGFBQWFqSixFQUFtQixxQkFDMUQ1QixFQUFXLFVBQ1hBLEVBQVcsTUFDYjZELElBQWMsRUFBRSxTQUFTcUMsR0FBUyxRQUFReUUsR0FBUSxZQUFZRyxJQUFZLFlBQVlGLEVBQVc7QUFDckcsVUFBSUMsRUFBZSxhQUFhakosRUFBbUIsWUFBWTtBQUMzRCxRQUFBMkMsRUFBSyxNQUFNLCtEQUErRDtBQUMxRSxZQUFJa0csSUFBbUIzSyxFQUFNLGdCQUFnQitELENBQVc7QUFDeEQsZUFBTzRHO0FBQUEsTUFDWDtBQUdBLFVBQUlNLEtBQWlCNUosRUFBbUIsT0FBTyxPQUFPZ0QsR0FBWTBHLEVBQWUsVUFBVSxDQUFDLEdBQ3hGdEMsS0FBTyxJQUFJN0UsR0FBSyxNQUFNNkcsR0FBV3ZGLEdBQU1uQixHQUFhc0MsR0FBVXBDLEdBQWNDLEdBQU9zRyxFQUFRLFdBQVcsUUFBV1MsRUFBYztBQUNuSSxhQUFPeEM7QUFBQSxJQUNYLEdBQ0EyQixFQUFPLFVBQVUsa0JBQWtCLFNBQVVsRixHQUFNZ0csR0FBTUMsR0FBTUMsR0FBTTtBQUNqRSxVQUFJQyxHQUNBQyxHQUNBQztBQUNKLFVBQUksWUFBVSxTQUFTLElBR2xCO0FBQUEsUUFBSSxVQUFVLFdBQVcsSUFDMUJBLElBQUtMLElBRUEsVUFBVSxXQUFXLEtBQzFCRyxJQUFPSCxHQUNQSyxJQUFLSixNQUdMRSxJQUFPSCxHQUNQSSxJQUFNSCxHQUNOSSxJQUFLSDtBQUVULFlBQUk5RSxJQUFnQmdGLEtBQXVDbEwsRUFBUSxPQUFPLEdBQ3RFcUksSUFBTyxLQUFLLFVBQVV2RCxHQUFNbUcsR0FBTS9FLENBQWEsR0FDL0NrRixJQUFxQnhMLEVBQU0sUUFBUXNHLEdBQWVtQyxDQUFJO0FBQzFELGVBQU9ySSxFQUFRLEtBQUtvTCxHQUFvQkQsR0FBSSxRQUFXOUMsQ0FBSTtBQUFBO0FBQUEsSUFDL0QsR0FFQTJCLEVBQU8sVUFBVSxtQkFBbUIsV0FBWTtBQUM1QyxhQUFPLEtBQUs7QUFBQSxJQUNoQixHQUVBQSxFQUFPLFVBQVUsZ0JBQWdCLFdBQVk7QUFDekMsYUFBTyxLQUFLO0FBQUEsSUFDaEIsR0FDQUEsRUFBTyxVQUFVLHlCQUF5QixXQUFZO0FBQ2xELGFBQU8sS0FBSyxnQkFBZ0IsdUJBQXVCO0FBQUEsSUFDdkQsR0FDT0E7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQWlCRXFCLElBQWtELFNBQVMxSSxHQUFHO0FBQzlELE1BQUlKLElBQUksT0FBTyxVQUFXLGNBQWMsT0FBTyxVQUFVSyxJQUFJTCxLQUFLSSxFQUFFSixDQUFDLEdBQUdDLElBQUk7QUFDNUUsTUFBSUksRUFBRyxRQUFPQSxFQUFFLEtBQUtELENBQUM7QUFDdEIsTUFBSUEsS0FBSyxPQUFPQSxFQUFFLFVBQVcsU0FBVSxRQUFPO0FBQUEsSUFDMUMsTUFBTSxXQUFZO0FBQ2QsYUFBSUEsS0FBS0gsS0FBS0csRUFBRSxXQUFRQSxJQUFJLFNBQ3JCLEVBQUUsT0FBT0EsS0FBS0EsRUFBRUgsR0FBRyxHQUFHLE1BQU0sQ0FBQ0csRUFBRTtBQUFBLElBQzFDO0FBQUEsRUFDSjtBQUNBLFFBQU0sSUFBSSxVQUFVSixJQUFJLDRCQUE0QixpQ0FBaUM7QUFDekYsR0FLSStJO0FBQUE7QUFBQSxHQUFvQyxXQUFZO0FBQ2hELGFBQVNBLEVBQW1CQyxHQUFpQjtBQUN6QyxXQUFLLGtCQUFrQkE7QUFBQSxJQUMzQjtBQUNBLFdBQUFELEVBQW1CLFVBQVUsYUFBYSxXQUFZO0FBQ2xELFVBQUloSCxHQUFLQyxHQUNMaUUsSUFBVyxDQUFDO0FBQ2hCLFVBQUk7QUFDQSxpQkFBU2hFLElBQUs2RyxFQUFXLEtBQUssZUFBZSxHQUFHNUcsSUFBS0QsRUFBRyxLQUFLLEdBQUcsQ0FBQ0MsRUFBRyxNQUFNQSxJQUFLRCxFQUFHLEtBQUssR0FBRztBQUN0RixjQUFJZ0gsSUFBZ0IvRyxFQUFHO0FBQ3ZCLFVBQUErRCxFQUFTLEtBQUtnRCxFQUFjLFdBQVcsQ0FBQztBQUFBLFFBQzVDO0FBQUEsTUFDSixTQUNPM0csR0FBTztBQUFFLFFBQUFQLElBQU0sRUFBRSxPQUFPTyxFQUFNO0FBQUEsTUFBRyxVQUN4QztBQUNJLFlBQUk7QUFDQSxVQUFJSixLQUFNLENBQUNBLEVBQUcsU0FBU0YsSUFBS0MsRUFBRyxXQUFTRCxFQUFHLEtBQUtDLENBQUU7QUFBQSxRQUN0RCxVQUNBO0FBQVUsY0FBSUYsRUFBSyxPQUFNQSxFQUFJO0FBQUEsUUFBTztBQUFBLE1BQ3hDO0FBQ0EsYUFBTyxJQUFJLFFBQVEsU0FBVWdFLEdBQVM7QUFDbEMsZ0JBQVEsSUFBSUUsQ0FBUSxFQUNmLEtBQUssV0FBWTtBQUNsQixVQUFBRixFQUFRO0FBQUEsUUFDWixDQUFDLEVBQ0ksTUFBTSxTQUFVcEYsR0FBTztBQUN4QixVQUFBaEMsRUFBbUJnQyxLQUFTLElBQUksTUFBTSx1Q0FBdUMsQ0FBQyxHQUM5RW9GLEVBQVE7QUFBQSxRQUNaLENBQUM7QUFBQSxNQUNMLENBQUM7QUFBQSxJQUNMLEdBQ0FnRCxFQUFtQixVQUFVLFVBQVUsU0FBVWpELEdBQU1ySSxHQUFTO0FBQzVELFVBQUl5TCxHQUFLbEg7QUFDVCxVQUFJO0FBQ0EsaUJBQVNDLElBQUs2RyxFQUFXLEtBQUssZUFBZSxHQUFHNUcsSUFBS0QsRUFBRyxLQUFLLEdBQUcsQ0FBQ0MsRUFBRyxNQUFNQSxJQUFLRCxFQUFHLEtBQUssR0FBRztBQUN0RixjQUFJZ0gsSUFBZ0IvRyxFQUFHO0FBQ3ZCLFVBQUErRyxFQUFjLFFBQVFuRCxHQUFNckksQ0FBTztBQUFBLFFBQ3ZDO0FBQUEsTUFDSixTQUNPMEwsR0FBTztBQUFFLFFBQUFELElBQU0sRUFBRSxPQUFPQyxFQUFNO0FBQUEsTUFBRyxVQUN4QztBQUNJLFlBQUk7QUFDQSxVQUFJakgsS0FBTSxDQUFDQSxFQUFHLFNBQVNGLElBQUtDLEVBQUcsV0FBU0QsRUFBRyxLQUFLQyxDQUFFO0FBQUEsUUFDdEQsVUFDQTtBQUFVLGNBQUlpSCxFQUFLLE9BQU1BLEVBQUk7QUFBQSxRQUFPO0FBQUEsTUFDeEM7QUFBQSxJQUNKLEdBQ0FILEVBQW1CLFVBQVUsUUFBUSxTQUFVakQsR0FBTTtBQUNqRCxVQUFJc0QsR0FBS3BIO0FBQ1QsVUFBSTtBQUNBLGlCQUFTQyxJQUFLNkcsRUFBVyxLQUFLLGVBQWUsR0FBRzVHLElBQUtELEVBQUcsS0FBSyxHQUFHLENBQUNDLEVBQUcsTUFBTUEsSUFBS0QsRUFBRyxLQUFLLEdBQUc7QUFDdEYsY0FBSWdILElBQWdCL0csRUFBRztBQUN2QixVQUFBK0csRUFBYyxNQUFNbkQsQ0FBSTtBQUFBLFFBQzVCO0FBQUEsTUFDSixTQUNPdUQsR0FBTztBQUFFLFFBQUFELElBQU0sRUFBRSxPQUFPQyxFQUFNO0FBQUEsTUFBRyxVQUN4QztBQUNJLFlBQUk7QUFDQSxVQUFJbkgsS0FBTSxDQUFDQSxFQUFHLFNBQVNGLElBQUtDLEVBQUcsV0FBU0QsRUFBRyxLQUFLQyxDQUFFO0FBQUEsUUFDdEQsVUFDQTtBQUFVLGNBQUltSCxFQUFLLE9BQU1BLEVBQUk7QUFBQSxRQUFPO0FBQUEsTUFDeEM7QUFBQSxJQUNKLEdBQ0FMLEVBQW1CLFVBQVUsV0FBVyxXQUFZO0FBQ2hELFVBQUlPLEdBQUt0SCxHQUNMaUUsSUFBVyxDQUFDO0FBQ2hCLFVBQUk7QUFDQSxpQkFBU2hFLElBQUs2RyxFQUFXLEtBQUssZUFBZSxHQUFHNUcsSUFBS0QsRUFBRyxLQUFLLEdBQUcsQ0FBQ0MsRUFBRyxNQUFNQSxJQUFLRCxFQUFHLEtBQUssR0FBRztBQUN0RixjQUFJZ0gsSUFBZ0IvRyxFQUFHO0FBQ3ZCLFVBQUErRCxFQUFTLEtBQUtnRCxFQUFjLFNBQVMsQ0FBQztBQUFBLFFBQzFDO0FBQUEsTUFDSixTQUNPTSxHQUFPO0FBQUUsUUFBQUQsSUFBTSxFQUFFLE9BQU9DLEVBQU07QUFBQSxNQUFHLFVBQ3hDO0FBQ0ksWUFBSTtBQUNBLFVBQUlySCxLQUFNLENBQUNBLEVBQUcsU0FBU0YsSUFBS0MsRUFBRyxXQUFTRCxFQUFHLEtBQUtDLENBQUU7QUFBQSxRQUN0RCxVQUNBO0FBQVUsY0FBSXFILEVBQUssT0FBTUEsRUFBSTtBQUFBLFFBQU87QUFBQSxNQUN4QztBQUNBLGFBQU8sSUFBSSxRQUFRLFNBQVV2RCxHQUFTQyxHQUFRO0FBQzFDLGdCQUFRLElBQUlDLENBQVEsRUFBRSxLQUFLLFdBQVk7QUFDbkMsVUFBQUYsRUFBUTtBQUFBLFFBQ1osR0FBR0MsQ0FBTTtBQUFBLE1BQ2IsQ0FBQztBQUFBLElBQ0wsR0FDTytDO0FBQUEsRUFDWCxHQUFFO0FBQUEsR0FrQkVTO0FBQUE7QUFBQSxHQUFtQyxXQUFZO0FBQy9DLGFBQVNBLElBQW9CO0FBQUEsSUFDN0I7QUFDQSxXQUFBQSxFQUFrQixVQUFVLFVBQVUsU0FBVTVELEdBQU82RCxHQUFVO0FBQUEsSUFBRSxHQUNuRUQsRUFBa0IsVUFBVSxRQUFRLFNBQVU1RCxHQUFPO0FBQUEsSUFBRSxHQUN2RDRELEVBQWtCLFVBQVUsV0FBVyxXQUFZO0FBQy9DLGFBQU8sUUFBUSxRQUFRO0FBQUEsSUFDM0IsR0FDQUEsRUFBa0IsVUFBVSxhQUFhLFdBQVk7QUFDakQsYUFBTyxRQUFRLFFBQVE7QUFBQSxJQUMzQixHQUNPQTtBQUFBLEVBQ1gsR0FBRTtBQUFBLEdBaUJFRSxLQUE0QyxTQUFVdEosR0FBR0csR0FBRztBQUM1RCxNQUFJRixJQUFJLE9BQU8sVUFBVyxjQUFjRCxFQUFFLE9BQU8sUUFBUTtBQUN6RCxNQUFJLENBQUNDLEVBQUcsUUFBT0Q7QUFDZixNQUFJSCxJQUFJSSxFQUFFLEtBQUtELENBQUMsR0FBR0ksR0FBR0MsSUFBSyxDQUFDLEdBQUdDO0FBQy9CLE1BQUk7QUFDQSxZQUFRSCxNQUFNLFVBQVVBLE1BQU0sTUFBTSxFQUFFQyxJQUFJUCxFQUFFLEtBQUssR0FBRyxPQUFNLENBQUFRLEVBQUcsS0FBS0QsRUFBRSxLQUFLO0FBQUEsRUFDN0UsU0FDT0csR0FBTztBQUFFLElBQUFELElBQUksRUFBRSxPQUFPQyxFQUFNO0FBQUEsRUFBRyxVQUN0QztBQUNJLFFBQUk7QUFDQSxNQUFJSCxLQUFLLENBQUNBLEVBQUUsU0FBU0gsSUFBSUosRUFBRSxXQUFZSSxFQUFFLEtBQUtKLENBQUM7QUFBQSxJQUNuRCxVQUNBO0FBQVUsVUFBSVMsRUFBRyxPQUFNQSxFQUFFO0FBQUEsSUFBTztBQUFBLEVBQ3BDO0FBQ0EsU0FBT0Q7QUFDWCxHQUNJa0osS0FBMEQsU0FBVTlJLEdBQUlDLEdBQU1DLEdBQU07QUFDcEYsTUFBSUEsS0FBUSxVQUFVLFdBQVcsRUFBRyxVQUFTZCxJQUFJLEdBQUdlLElBQUlGLEVBQUssUUFBUUwsR0FBSVIsSUFBSWUsR0FBR2Y7QUFDNUUsS0FBSVEsS0FBTSxFQUFFUixLQUFLYSxRQUNSTCxNQUFJQSxJQUFLLE1BQU0sVUFBVSxNQUFNLEtBQUtLLEdBQU0sR0FBR2IsQ0FBQyxJQUNuRFEsRUFBR1IsQ0FBQyxJQUFJYSxFQUFLYixDQUFDO0FBR3RCLFNBQU9ZLEVBQUcsT0FBT0osS0FBTSxNQUFNLFVBQVUsTUFBTSxLQUFLSyxDQUFJLENBQUM7QUFDM0QsR0FDSThJO0FBQUEsQ0FDSCxTQUFVQSxHQUFpQjtBQUN4QixFQUFBQSxFQUFnQkEsRUFBZ0IsV0FBYyxDQUFDLElBQUksWUFDbkRBLEVBQWdCQSxFQUFnQixVQUFhLENBQUMsSUFBSSxXQUNsREEsRUFBZ0JBLEVBQWdCLFFBQVcsQ0FBQyxJQUFJLFNBQ2hEQSxFQUFnQkEsRUFBZ0IsYUFBZ0IsQ0FBQyxJQUFJO0FBQ3pELEdBQUdBLE1BQW9CQSxJQUFrQixDQUFDLEVBQUU7QUFJNUMsSUFBSUM7QUFBQTtBQUFBLEdBQXFDLFdBQVk7QUFDakQsYUFBU0EsRUFBb0JyRyxHQUFRO0FBQ2pDLE1BQUlBLE1BQVcsV0FBVUEsSUFBUyxDQUFDO0FBQ25DLFVBQUl4QixHQUFJQztBQUNSLFdBQUssNEJBQTRCLENBQUMsR0FDbEMsS0FBSyxXQUFXLG9CQUFJLElBQUk7QUFDeEIsVUFBSTZILElBQWV2SyxHQUFNLENBQUMsR0FBRzZFLEVBQWtCLEdBQUdXLEdBQWtCdkIsQ0FBTSxDQUFDO0FBUTNFLFVBUEEsS0FBSyxZQUFZeEIsSUFBSzhILEVBQWEsY0FBYyxRQUFROUgsTUFBTyxTQUFTQSxJQUFLckMsRUFBUyxNQUFNLEdBQ3pGbUssRUFBYSw4QkFDYixLQUFLLFdBQVduSyxFQUFTLFFBQVEsRUFBRSxNQUFNLEtBQUssUUFBUSxJQUUxRCxLQUFLLFVBQVUsT0FBTyxPQUFPLENBQUMsR0FBR21LLEdBQWM7QUFBQSxRQUMzQyxVQUFVLEtBQUs7QUFBQSxNQUNuQixDQUFDLEdBQ0ksR0FBQTdILElBQUt1QixFQUFPLG9CQUFvQixRQUFRdkIsTUFBTyxXQUFrQkEsRUFBRztBQUNyRSxhQUFLLDRCQUE0QjBILEdBQWMsQ0FBQyxHQUFHRCxHQUFPbEcsRUFBTyxjQUFjLEdBQUcsRUFBSyxHQUN2RixLQUFLLHNCQUFzQixJQUFJdUYsRUFBbUIsS0FBSyx5QkFBeUI7QUFBQSxXQUUvRTtBQUNELFlBQUlnQixJQUFrQixLQUFLLHNCQUFzQjtBQUNqRCxZQUFJQSxNQUFvQixRQUFXO0FBQy9CLGNBQUlDLElBQWlCLElBQUkvQyxHQUFtQjhDLENBQWU7QUFDM0QsZUFBSyxzQkFBc0JDO0FBQUEsUUFDL0I7QUFFSSxlQUFLLHNCQUFzQixJQUFJUixHQUFrQjtBQUFBLE1BRXpEO0FBQUEsSUFDSjtBQUNBLFdBQUFLLEVBQW9CLFVBQVUsWUFBWSxTQUFVdEgsR0FBTTBILEdBQVNwQyxHQUFTO0FBQ3hFLFVBQUlqRyxJQUFNVyxJQUFPLE9BQU8wSCxLQUFXLE1BQU0sT0FBMERwQyxHQUFRLGFBQWM7QUFDekgsYUFBSyxLQUFLLFNBQVMsSUFBSWpHLENBQUcsS0FDdEIsS0FBSyxTQUFTLElBQUlBLEdBQUssSUFBSTZGLEdBQU8sRUFBRSxNQUFNbEYsR0FBTSxTQUFTMEgsR0FBUyxXQUE2RHBDLEdBQVEsVUFBVSxHQUFHLEtBQUssU0FBUyxJQUFJLENBQUMsR0FHcEssS0FBSyxTQUFTLElBQUlqRyxDQUFHO0FBQUEsSUFDaEMsR0FNQWlJLEVBQW9CLFVBQVUsbUJBQW1CLFNBQVVaLEdBQWU7QUFDdEUsTUFBSSxLQUFLLDBCQUEwQixXQUFXLEtBRzFDLEtBQUssb0JBQ0EsU0FBUyxFQUNULE1BQU0sU0FBVXZDLEdBQUs7QUFDdEIsZUFBTzVFLEVBQUssTUFBTSx5REFBeUQ0RSxDQUFHO0FBQUEsTUFDbEYsQ0FBQyxHQUVMLEtBQUssMEJBQTBCLEtBQUt1QyxDQUFhLEdBQ2pELEtBQUssc0JBQXNCLElBQUlGLEVBQW1CLEtBQUsseUJBQXlCO0FBQUEsSUFDcEYsR0FDQWMsRUFBb0IsVUFBVSx5QkFBeUIsV0FBWTtBQUMvRCxhQUFPLEtBQUs7QUFBQSxJQUNoQixHQVFBQSxFQUFvQixVQUFVLFdBQVcsU0FBVXJHLEdBQVE7QUFDdkQsTUFBSUEsTUFBVyxXQUFVQSxJQUFTLENBQUMsSUFDbkNuRyxFQUFNLHdCQUF3QixJQUFJLEdBQzlCbUcsRUFBTyxlQUFlLFdBQ3RCQSxFQUFPLGFBQWEsS0FBSyx3QkFBd0IsSUFFakRBLEVBQU8sa0JBQ1AvRixFQUFRLHdCQUF3QitGLEVBQU8sY0FBYyxHQUVyREEsRUFBTyxjQUNQakYsR0FBWSxvQkFBb0JpRixFQUFPLFVBQVU7QUFBQSxJQUV6RCxHQUNBcUcsRUFBb0IsVUFBVSxhQUFhLFdBQVk7QUFDbkQsVUFBSUssSUFBVSxLQUFLLFFBQVEseUJBQ3ZCakUsSUFBVyxLQUFLLDBCQUEwQixJQUFJLFNBQVVnRCxHQUFlO0FBQ3ZFLGVBQU8sSUFBSSxRQUFRLFNBQVVsRCxHQUFTO0FBQ2xDLGNBQUlvRSxHQUNBQyxJQUFrQixXQUFXLFdBQVk7QUFDekMsWUFBQXJFLEVBQVEsSUFBSSxNQUFNLCtEQUErRG1FLElBQVUsS0FBSyxDQUFDLEdBQ2pHQyxJQUFRUCxFQUFnQjtBQUFBLFVBQzVCLEdBQUdNLENBQU87QUFDVixVQUFBakIsRUFDSyxXQUFXLEVBQ1gsS0FBSyxXQUFZO0FBQ2xCLHlCQUFhbUIsQ0FBZSxHQUN4QkQsTUFBVVAsRUFBZ0IsWUFDMUJPLElBQVFQLEVBQWdCLFVBQ3hCN0QsRUFBUW9FLENBQUs7QUFBQSxVQUVyQixDQUFDLEVBQ0ksTUFBTSxTQUFVeEosR0FBTztBQUN4Qix5QkFBYXlKLENBQWUsR0FDNUJELElBQVFQLEVBQWdCLE9BQ3hCN0QsRUFBUXBGLENBQUs7QUFBQSxVQUNqQixDQUFDO0FBQUEsUUFDTCxDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQ0QsYUFBTyxJQUFJLFFBQVEsU0FBVW9GLEdBQVNDLEdBQVE7QUFDMUMsZ0JBQVEsSUFBSUMsQ0FBUSxFQUNmLEtBQUssU0FBVW9FLEdBQVM7QUFDekIsY0FBSUMsSUFBU0QsRUFBUSxPQUFPLFNBQVU5RCxHQUFRO0FBQUUsbUJBQU9BLE1BQVdxRCxFQUFnQjtBQUFBLFVBQVUsQ0FBQztBQUM3RixVQUFJVSxFQUFPLFNBQVMsSUFDaEJ0RSxFQUFPc0UsQ0FBTSxJQUdidkUsRUFBUTtBQUFBLFFBRWhCLENBQUMsRUFDSSxNQUFNLFNBQVVwRixHQUFPO0FBQUUsaUJBQU9xRixFQUFPLENBQUNyRixDQUFLLENBQUM7QUFBQSxRQUFHLENBQUM7QUFBQSxNQUMzRCxDQUFDO0FBQUEsSUFDTCxHQUNBa0osRUFBb0IsVUFBVSxXQUFXLFdBQVk7QUFDakQsYUFBTyxLQUFLLG9CQUFvQixTQUFTO0FBQUEsSUFDN0MsR0FRQUEsRUFBb0IsVUFBVSxpQkFBaUIsU0FBVXRILEdBQU07QUFDM0QsVUFBSVA7QUFDSixjQUFRQSxJQUFLLEtBQUssWUFBWSx1QkFBdUIsSUFBSU8sQ0FBSSxPQUFPLFFBQVFQLE1BQU8sU0FBUyxTQUFTQSxFQUFHO0FBQUEsSUFDNUcsR0FDQTZILEVBQW9CLFVBQVUsbUJBQW1CLFNBQVV0SCxHQUFNO0FBQzdELFVBQUlQO0FBQ0osY0FBUUEsSUFBSyxLQUFLLFlBQVkscUJBQXFCLElBQUlPLENBQUksT0FBTyxRQUFRUCxNQUFPLFNBQVMsU0FBU0EsRUFBRztBQUFBLElBQzFHLEdBQ0E2SCxFQUFvQixVQUFVLDBCQUEwQixXQUFZO0FBQ2hFLFVBQUkzRyxJQUFRLE1BRVJxSCxJQUF3QixNQUFNLEtBQUssSUFBSSxJQUFJM0wsRUFBTyxFQUFFLGdCQUFnQixDQUFDLEdBQ3JFNEwsSUFBY0QsRUFBc0IsSUFBSSxTQUFVaEksR0FBTTtBQUN4RCxZQUFJa0ksSUFBYXZILEVBQU0sZUFBZVgsQ0FBSTtBQUMxQyxlQUFLa0ksS0FDRDNJLEVBQUssS0FBSyxpQkFBa0JTLElBQU8sMERBQTJELEdBRTNGa0k7QUFBQSxNQUNYLENBQUMsR0FDR0MsSUFBbUJGLEVBQVksT0FBTyxTQUFVRyxHQUFNQyxHQUFNO0FBQzVELGVBQUlBLEtBQ0FELEVBQUssS0FBS0MsQ0FBSSxHQUVYRDtBQUFBLE1BQ1gsR0FBRyxDQUFDLENBQUM7QUFDTCxVQUFJRCxFQUFpQixXQUFXO0FBRzNCLGVBQUlILEVBQXNCLFdBQVcsSUFDL0JHLEVBQWlCLENBQUMsSUFHbEIsSUFBSXRMLEdBQW9CO0FBQUEsVUFDM0IsYUFBYXNMO0FBQUEsUUFDakIsQ0FBQztBQUFBLElBRVQsR0FDQWIsRUFBb0IsVUFBVSx3QkFBd0IsV0FBWTtBQUM5RCxVQUFJZ0IsSUFBZWpNLEVBQU8sRUFBRTtBQUM1QixVQUFJLEVBQUFpTSxNQUFpQixVQUFVQSxNQUFpQixLQUVoRDtBQUFBLFlBQUlDLElBQVcsS0FBSyxpQkFBaUJELENBQVk7QUFDakQsZUFBS0MsS0FDRGhKLEVBQUssTUFBTSxlQUFnQitJLElBQWUsMERBQTJELEdBRWxHQztBQUFBO0FBQUEsSUFDWCxHQUNBakIsRUFBb0IseUJBQXlCLG9CQUFJLElBQUk7QUFBQSxNQUNqRCxDQUFDLGdCQUFnQixXQUFZO0FBQUUsZUFBTyxJQUFJeEssR0FBMEI7QUFBQSxNQUFHLENBQUM7QUFBQSxNQUN4RSxDQUFDLFdBQVcsV0FBWTtBQUFFLGVBQU8sSUFBSUMsR0FBcUI7QUFBQSxNQUFHLENBQUM7QUFBQSxJQUNsRSxDQUFDLEdBQ0R1SyxFQUFvQix1QkFBdUIsb0JBQUksSUFBSSxHQUM1Q0E7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQWlCRWtCLEtBQWdELFNBQVMzSyxHQUFHO0FBQzVELE1BQUlKLElBQUksT0FBTyxVQUFXLGNBQWMsT0FBTyxVQUFVSyxJQUFJTCxLQUFLSSxFQUFFSixDQUFDLEdBQUdDLElBQUk7QUFDNUUsTUFBSUksRUFBRyxRQUFPQSxFQUFFLEtBQUtELENBQUM7QUFDdEIsTUFBSUEsS0FBSyxPQUFPQSxFQUFFLFVBQVcsU0FBVSxRQUFPO0FBQUEsSUFDMUMsTUFBTSxXQUFZO0FBQ2QsYUFBSUEsS0FBS0gsS0FBS0csRUFBRSxXQUFRQSxJQUFJLFNBQ3JCLEVBQUUsT0FBT0EsS0FBS0EsRUFBRUgsR0FBRyxHQUFHLE1BQU0sQ0FBQ0csRUFBRTtBQUFBLElBQzFDO0FBQUEsRUFDSjtBQUNBLFFBQU0sSUFBSSxVQUFVSixJQUFJLDRCQUE0QixpQ0FBaUM7QUFDekYsR0FRSWdMO0FBQUE7QUFBQSxHQUFxQyxXQUFZO0FBQ2pELGFBQVNBLElBQXNCO0FBQUEsSUFDL0I7QUFNQSxXQUFBQSxFQUFvQixVQUFVLFNBQVMsU0FBVTNFLEdBQU80RSxHQUFnQjtBQUNwRSxhQUFPLEtBQUssV0FBVzVFLEdBQU80RSxDQUFjO0FBQUEsSUFDaEQsR0FJQUQsRUFBb0IsVUFBVSxXQUFXLFdBQVk7QUFDakQsa0JBQUssV0FBVyxDQUFDLENBQUMsR0FDWCxLQUFLLFdBQVc7QUFBQSxJQUMzQixHQUlBQSxFQUFvQixVQUFVLGFBQWEsV0FBWTtBQUNuRCxhQUFPLFFBQVEsUUFBUTtBQUFBLElBQzNCLEdBS0FBLEVBQW9CLFVBQVUsY0FBYyxTQUFVbEYsR0FBTTtBQUN4RCxVQUFJOUQ7QUFDSixhQUFPO0FBQUEsUUFDSCxVQUFVO0FBQUEsVUFDTixZQUFZOEQsRUFBSyxTQUFTO0FBQUEsUUFDOUI7QUFBQSxRQUNBLHNCQUFzQkEsRUFBSztBQUFBLFFBQzNCLFNBQVNBLEVBQUssWUFBWSxFQUFFO0FBQUEsUUFDNUIsVUFBVUEsRUFBSztBQUFBLFFBQ2YsYUFBYTlELElBQUs4RCxFQUFLLFlBQVksRUFBRSxnQkFBZ0IsUUFBUTlELE1BQU8sU0FBUyxTQUFTQSxFQUFHLFVBQVU7QUFBQSxRQUNuRyxNQUFNOEQsRUFBSztBQUFBLFFBQ1gsSUFBSUEsRUFBSyxZQUFZLEVBQUU7QUFBQSxRQUN2QixNQUFNQSxFQUFLO0FBQUEsUUFDWCxXQUFXdEgsRUFBcUJzSCxFQUFLLFNBQVM7QUFBQSxRQUM5QyxVQUFVdEgsRUFBcUJzSCxFQUFLLFFBQVE7QUFBQSxRQUM1QyxZQUFZQSxFQUFLO0FBQUEsUUFDakIsUUFBUUEsRUFBSztBQUFBLFFBQ2IsUUFBUUEsRUFBSztBQUFBLFFBQ2IsT0FBT0EsRUFBSztBQUFBLE1BQ2hCO0FBQUEsSUFDSixHQU1Ba0YsRUFBb0IsVUFBVSxhQUFhLFNBQVUzRSxHQUFPNkUsR0FBTTtBQUM5RCxVQUFJbkosR0FBS0M7QUFDVCxVQUFJO0FBQ0EsaUJBQVNtSixJQUFVSixHQUFTMUUsQ0FBSyxHQUFHK0UsSUFBWUQsRUFBUSxLQUFLLEdBQUcsQ0FBQ0MsRUFBVSxNQUFNQSxJQUFZRCxFQUFRLEtBQUssR0FBRztBQUN6RyxjQUFJckYsSUFBT3NGLEVBQVU7QUFDckIsa0JBQVEsSUFBSSxLQUFLLFlBQVl0RixDQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQ3BEO0FBQUEsTUFDSixTQUNPeEQsR0FBTztBQUFFLFFBQUFQLElBQU0sRUFBRSxPQUFPTyxFQUFNO0FBQUEsTUFBRyxVQUN4QztBQUNJLFlBQUk7QUFDQSxVQUFJOEksS0FBYSxDQUFDQSxFQUFVLFNBQVNwSixJQUFLbUosRUFBUSxXQUFTbkosRUFBRyxLQUFLbUosQ0FBTztBQUFBLFFBQzlFLFVBQ0E7QUFBVSxjQUFJcEosRUFBSyxPQUFNQSxFQUFJO0FBQUEsUUFBTztBQUFBLE1BQ3hDO0FBQ0EsVUFBSW1KO0FBQ0EsZUFBT0EsRUFBSyxFQUFFLE1BQU10TCxFQUFpQixRQUFRLENBQUM7QUFBQSxJQUV0RCxHQUNPb0w7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQWlCRUssS0FBa0QsU0FBVUMsR0FBU0MsR0FBWUMsR0FBR0MsR0FBVztBQUMvRixXQUFTQyxFQUFNN0osR0FBTztBQUFFLFdBQU9BLGFBQWlCMkosSUFBSTNKLElBQVEsSUFBSTJKLEVBQUUsU0FBVXpGLEdBQVM7QUFBRSxNQUFBQSxFQUFRbEUsQ0FBSztBQUFBLElBQUcsQ0FBQztBQUFBLEVBQUc7QUFDM0csU0FBTyxLQUFLMkosTUFBTUEsSUFBSSxVQUFVLFNBQVV6RixHQUFTQyxHQUFRO0FBQ3ZELGFBQVMyRixFQUFVOUosR0FBTztBQUFFLFVBQUk7QUFBRSxRQUFBK0osRUFBS0gsRUFBVSxLQUFLNUosQ0FBSyxDQUFDO0FBQUEsTUFBRyxTQUFTbkIsR0FBRztBQUFFLFFBQUFzRixFQUFPdEYsQ0FBQztBQUFBLE1BQUc7QUFBQSxJQUFFO0FBQzFGLGFBQVNtTCxFQUFTaEssR0FBTztBQUFFLFVBQUk7QUFBRSxRQUFBK0osRUFBS0gsRUFBVSxNQUFTNUosQ0FBSyxDQUFDO0FBQUEsTUFBRyxTQUFTbkIsR0FBRztBQUFFLFFBQUFzRixFQUFPdEYsQ0FBQztBQUFBLE1BQUc7QUFBQSxJQUFFO0FBQzdGLGFBQVNrTCxFQUFLckYsR0FBUTtBQUFFLE1BQUFBLEVBQU8sT0FBT1IsRUFBUVEsRUFBTyxLQUFLLElBQUltRixFQUFNbkYsRUFBTyxLQUFLLEVBQUUsS0FBS29GLEdBQVdFLENBQVE7QUFBQSxJQUFHO0FBQzdHLElBQUFELEdBQU1ILElBQVlBLEVBQVUsTUFBTUgsR0FBU0MsS0FBYyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFBQSxFQUN4RSxDQUFDO0FBQ0wsR0FDSU8sS0FBc0QsU0FBVVIsR0FBU1MsR0FBTTtBQUMvRSxNQUFJQyxJQUFJLEVBQUUsT0FBTyxHQUFHLE1BQU0sV0FBVztBQUFFLFFBQUlqTSxFQUFFLENBQUMsSUFBSSxFQUFHLE9BQU1BLEVBQUUsQ0FBQztBQUFHLFdBQU9BLEVBQUUsQ0FBQztBQUFBLEVBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxHQUFHa00sR0FBR0MsR0FBR25NLEdBQUdvTTtBQUMvRyxTQUFPQSxJQUFJLEVBQUUsTUFBTUMsRUFBSyxDQUFDLEdBQUcsT0FBU0EsRUFBSyxDQUFDLEdBQUcsUUFBVUEsRUFBSyxDQUFDLEVBQUUsR0FBRyxPQUFPLFVBQVcsZUFBZUQsRUFBRSxPQUFPLFFBQVEsSUFBSSxXQUFXO0FBQUUsV0FBTztBQUFBLEVBQU0sSUFBSUE7QUFDdkosV0FBU0MsRUFBSzdMLEdBQUc7QUFBRSxXQUFPLFNBQVU4QixHQUFHO0FBQUUsYUFBT3VKLEVBQUssQ0FBQ3JMLEdBQUc4QixDQUFDLENBQUM7QUFBQSxJQUFHO0FBQUEsRUFBRztBQUNqRSxXQUFTdUosRUFBS1MsR0FBSTtBQUNkLFFBQUlKLEVBQUcsT0FBTSxJQUFJLFVBQVUsaUNBQWlDO0FBQzVELFdBQU9ELElBQUcsS0FBSTtBQUNWLFVBQUlDLElBQUksR0FBR0MsTUFBTW5NLElBQUlzTSxFQUFHLENBQUMsSUFBSSxJQUFJSCxFQUFFLFNBQVlHLEVBQUcsQ0FBQyxJQUFJSCxFQUFFLFdBQWNuTSxJQUFJbU0sRUFBRSxXQUFjbk0sRUFBRSxLQUFLbU0sQ0FBQyxHQUFHLEtBQUtBLEVBQUUsU0FBUyxFQUFFbk0sSUFBSUEsRUFBRSxLQUFLbU0sR0FBR0csRUFBRyxDQUFDLENBQUMsR0FBRyxLQUFNLFFBQU90TTtBQUUzSixjQURJbU0sSUFBSSxHQUFHbk0sTUFBR3NNLElBQUssQ0FBQ0EsRUFBRyxDQUFDLElBQUksR0FBR3RNLEVBQUUsS0FBSyxJQUM5QnNNLEVBQUcsQ0FBQyxHQUFHO0FBQUEsUUFDWCxLQUFLO0FBQUEsUUFBRyxLQUFLO0FBQUcsVUFBQXRNLElBQUlzTTtBQUFJO0FBQUEsUUFDeEIsS0FBSztBQUFHLGlCQUFBTCxFQUFFLFNBQWdCLEVBQUUsT0FBT0ssRUFBRyxDQUFDLEdBQUcsTUFBTSxHQUFNO0FBQUEsUUFDdEQsS0FBSztBQUFHLFVBQUFMLEVBQUUsU0FBU0UsSUFBSUcsRUFBRyxDQUFDLEdBQUdBLElBQUssQ0FBQyxDQUFDO0FBQUc7QUFBQSxRQUN4QyxLQUFLO0FBQUcsVUFBQUEsSUFBS0wsRUFBRSxJQUFJLElBQUksR0FBR0EsRUFBRSxLQUFLLElBQUk7QUFBRztBQUFBLFFBQ3hDO0FBQ0ksY0FBTWpNLElBQUlpTSxFQUFFLE1BQU0sRUFBQWpNLElBQUlBLEVBQUUsU0FBUyxLQUFLQSxFQUFFQSxFQUFFLFNBQVMsQ0FBQyxPQUFPc00sRUFBRyxDQUFDLE1BQU0sS0FBS0EsRUFBRyxDQUFDLE1BQU0sSUFBSTtBQUFFLFlBQUFMLElBQUk7QUFBRztBQUFBLFVBQVU7QUFDM0csY0FBSUssRUFBRyxDQUFDLE1BQU0sTUFBTSxDQUFDdE0sS0FBTXNNLEVBQUcsQ0FBQyxJQUFJdE0sRUFBRSxDQUFDLEtBQUtzTSxFQUFHLENBQUMsSUFBSXRNLEVBQUUsQ0FBQyxJQUFLO0FBQUUsWUFBQWlNLEVBQUUsUUFBUUssRUFBRyxDQUFDO0FBQUc7QUFBQSxVQUFPO0FBQ3JGLGNBQUlBLEVBQUcsQ0FBQyxNQUFNLEtBQUtMLEVBQUUsUUFBUWpNLEVBQUUsQ0FBQyxHQUFHO0FBQUUsWUFBQWlNLEVBQUUsUUFBUWpNLEVBQUUsQ0FBQyxHQUFHQSxJQUFJc007QUFBSTtBQUFBLFVBQU87QUFDcEUsY0FBSXRNLEtBQUtpTSxFQUFFLFFBQVFqTSxFQUFFLENBQUMsR0FBRztBQUFFLFlBQUFpTSxFQUFFLFFBQVFqTSxFQUFFLENBQUMsR0FBR2lNLEVBQUUsSUFBSSxLQUFLSyxDQUFFO0FBQUc7QUFBQSxVQUFPO0FBQ2xFLFVBQUl0TSxFQUFFLENBQUMsS0FBR2lNLEVBQUUsSUFBSSxJQUFJLEdBQ3BCQSxFQUFFLEtBQUssSUFBSTtBQUFHO0FBQUEsTUFDdEI7QUFDQSxNQUFBSyxJQUFLTixFQUFLLEtBQUtULEdBQVNVLENBQUM7QUFBQSxJQUM3QixTQUFTdEwsR0FBRztBQUFFLE1BQUEyTCxJQUFLLENBQUMsR0FBRzNMLENBQUMsR0FBR3dMLElBQUk7QUFBQSxJQUFHLFVBQUU7QUFBVSxNQUFBRCxJQUFJbE0sSUFBSTtBQUFBLElBQUc7QUFDekQsUUFBSXNNLEVBQUcsQ0FBQyxJQUFJLEVBQUcsT0FBTUEsRUFBRyxDQUFDO0FBQUcsV0FBTyxFQUFFLE9BQU9BLEVBQUcsQ0FBQyxJQUFJQSxFQUFHLENBQUMsSUFBSSxRQUFRLE1BQU0sR0FBSztBQUFBLEVBQ25GO0FBQ0osR0FTSUM7QUFBQTtBQUFBLEdBQXFDLFdBQVk7QUFDakQsYUFBU0EsRUFBb0IzRyxHQUFXO0FBQ3BDLFdBQUssWUFBWUEsR0FDakIsS0FBSyxnQkFBZ0IsSUFBSXpHLEVBQWUsS0FBSyxXQUFXLElBQUksR0FDNUQsS0FBSyxxQkFBcUIsb0JBQUksSUFBSTtBQUFBLElBQ3RDO0FBQ0EsV0FBQW9OLEVBQW9CLFVBQVUsYUFBYSxXQUFZO0FBQ25ELGFBQU9qQixHQUFVLE1BQU0sUUFBUSxRQUFRLFdBQVk7QUFDL0MsZUFBT1MsR0FBWSxNQUFNLFNBQVU5SixHQUFJO0FBQ25DLGtCQUFRQSxFQUFHLE9BQU87QUFBQSxZQUNkLEtBQUs7QUFFTCxxQkFBTyxDQUFDLEdBQWEsUUFBUSxJQUFJLE1BQU0sS0FBSyxLQUFLLGtCQUFrQixDQUFDLENBQUM7QUFBQSxZQUNyRSxLQUFLO0FBR0QscUJBREFBLEVBQUcsS0FBSyxHQUNILEtBQUssVUFBVSxhQUNiLENBQUMsR0FBYSxLQUFLLFVBQVUsV0FBVyxDQUFDLElBRFQsQ0FBQyxHQUFhLENBQUM7QUFBQSxZQUUxRCxLQUFLO0FBQ0QsY0FBQUEsRUFBRyxLQUFLLEdBQ1JBLEVBQUcsUUFBUTtBQUFBLFlBQ2YsS0FBSztBQUFHLHFCQUFPO0FBQUEsZ0JBQUM7QUFBQTtBQUFBLGNBQVk7QUFBQSxVQUNoQztBQUFBLFFBQ0osQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUFBLElBQ0wsR0FDQXNLLEVBQW9CLFVBQVUsVUFBVSxTQUFVMUcsR0FBT0MsR0FBZ0I7QUFBQSxJQUFFLEdBQzNFeUcsRUFBb0IsVUFBVSxRQUFRLFNBQVV4RyxHQUFNO0FBQ2xELFVBQUk1QyxJQUFRLE1BQ1JsQixHQUFJQztBQUNSLFVBQUksTUFBSyxjQUFjLGFBR2xCNkQsRUFBSyxZQUFZLEVBQUUsYUFBYXZJLEVBQVcsYUFBYSxHQUc3RDtBQUFBLFlBQUkrSSxJQUFXLFdBQVk7QUFDdkIsaUJBQU85RyxHQUNGLFFBQVEwRCxFQUFNLFdBQVcsQ0FBQzRDLENBQUksQ0FBQyxFQUMvQixLQUFLLFNBQVVTLEdBQVE7QUFDeEIsZ0JBQUl2RTtBQUNKLFlBQUl1RSxFQUFPLFNBQVMzRyxFQUFpQixXQUNqQ2pCLEdBQW9CcUQsSUFBS3VFLEVBQU8sV0FBVyxRQUFRdkUsTUFBTyxTQUFTQSxJQUFLLElBQUksTUFBTSxxREFBcUR1RSxJQUFTLEdBQUcsQ0FBQztBQUFBLFVBRTVKLENBQUMsRUFDSSxNQUFNLFNBQVU1RixHQUFPO0FBQ3hCLFlBQUFoQyxFQUFtQmdDLENBQUs7QUFBQSxVQUM1QixDQUFDO0FBQUEsUUFDTDtBQUVBLFlBQUltRixFQUFLLFNBQVMsd0JBQXdCO0FBQ3RDLGNBQUl5RyxLQUFtQnRLLEtBQU1ELElBQUs4RCxFQUFLLFVBQVUsNEJBQTRCLFFBQVE3RCxNQUFPLFNBQVMsU0FBU0EsRUFBRyxLQUFLRCxDQUFFLEVBQUUsS0FBSyxXQUFZO0FBQ3ZJLG1CQUFJdUssS0FBbUIsUUFDbkJySixFQUFNLG1CQUFtQixPQUFPcUosQ0FBZSxHQUU1Q2pHLEVBQVM7QUFBQSxVQUNwQixHQUFHLFNBQVVJLEdBQUs7QUFBRSxtQkFBTy9ILEVBQW1CK0gsQ0FBRztBQUFBLFVBQUcsQ0FBQztBQUVyRCxVQUFJNkYsS0FBbUIsUUFDbkIsS0FBSyxtQkFBbUIsSUFBSUEsQ0FBZTtBQUFBLFFBRW5EO0FBRUksVUFBS2pHLEVBQVM7QUFBQTtBQUFBLElBRXRCLEdBQ0FnRyxFQUFvQixVQUFVLFdBQVcsV0FBWTtBQUNqRCxhQUFPLEtBQUssY0FBYyxLQUFLO0FBQUEsSUFDbkMsR0FDQUEsRUFBb0IsVUFBVSxZQUFZLFdBQVk7QUFDbEQsYUFBTyxLQUFLLFVBQVUsU0FBUztBQUFBLElBQ25DLEdBQ09BO0FBQUEsRUFDWCxHQUFFO0FBQUE7IiwKICAibmFtZXMiOiBbIlNwYW5TdGF0dXNDb2RlIiwgInRyYWNlIiwgImlzU3BhbkNvbnRleHRWYWxpZCIsICJUcmFjZUZsYWdzIiwgImlzVmFsaWRUcmFjZUlkIiwgImNvbnRleHQiLCAiSU5WQUxJRF9TUEFOX0NPTlRFWFQiLCAiU3BhbktpbmQiLCAib3RwZXJmb3JtYW5jZSIsICJnZXRUaW1lT3JpZ2luIiwgImlzVGltZUlucHV0IiwgImhyVGltZUR1cmF0aW9uIiwgImhyVGltZSIsICJtaWxsaXNUb0hyVGltZSIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJhZGRIclRpbWVzIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFIiwgInByb3BhZ2F0aW9uIiwgImhyVGltZVRvTWljcm9zZWNvbmRzIiwgImlzQXR0cmlidXRlVmFsdWUiLCAic2FuaXRpemVBdHRyaWJ1dGVzIiwgImdsb2JhbEVycm9ySGFuZGxlciIsICJnZXRFbnYiLCAiVHJhY2VzU2FtcGxlclZhbHVlcyIsICJnZXRFbnZXaXRob3V0RGVmYXVsdHMiLCAiREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgInVucmVmVGltZXIiLCAiQmluZE9uY2VGdXR1cmUiLCAiU2FtcGxpbmdEZWNpc2lvbiQxIiwgIkNvbXBvc2l0ZVByb3BhZ2F0b3IiLCAiVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvciIsICJXM0NCYWdnYWdlUHJvcGFnYXRvciIsICJtZXJnZSIsICJpbnRlcm5hbCIsICJzdXBwcmVzc1RyYWNpbmciLCAiaXNUcmFjaW5nU3VwcHJlc3NlZCIsICJSZXNvdXJjZSIsICJFeHBvcnRSZXN1bHRDb2RlIiwgIkV4Y2VwdGlvbkV2ZW50TmFtZSIsICJfX2Fzc2lnbiIsICJ0IiwgInMiLCAiaSIsICJwIiwgIl9fdmFsdWVzJDIiLCAibyIsICJtIiwgIl9fcmVhZCQxIiwgIm4iLCAiciIsICJhciIsICJlIiwgImVycm9yIiwgIl9fc3ByZWFkQXJyYXkkMSIsICJ0byIsICJmcm9tIiwgInBhY2siLCAibCIsICJTcGFuIiwgInBhcmVudFRyYWNlciIsICJzcGFuTmFtZSIsICJzcGFuQ29udGV4dCIsICJraW5kIiwgInBhcmVudFNwYW5JZCIsICJsaW5rcyIsICJzdGFydFRpbWUiLCAiX2RlcHJlY2F0ZWRDbG9jayIsICJhdHRyaWJ1dGVzIiwgIm5vdyIsICJrZXkiLCAidmFsdWUiLCAiZGlhZyIsICJlXzEiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiayIsICJ2IiwgImVfMV8xIiwgIm5hbWUiLCAiYXR0cmlidXRlc09yU3RhcnRUaW1lIiwgInRpbWVTdGFtcCIsICJsaW5rIiwgInN0YXR1cyIsICJlbmRUaW1lIiwgImlucCIsICJtc0R1cmF0aW9uIiwgImV4Y2VwdGlvbiIsICJ0aW1lIiwgImxpbWl0IiwgIl90aGlzIiwgInZhbCIsICJTYW1wbGluZ0RlY2lzaW9uIiwgIkFsd2F5c09mZlNhbXBsZXIiLCAiQWx3YXlzT25TYW1wbGVyIiwgIlBhcmVudEJhc2VkU2FtcGxlciIsICJjb25maWciLCAidHJhY2VJZCIsICJzcGFuS2luZCIsICJwYXJlbnRDb250ZXh0IiwgIlRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlciIsICJfcmF0aW8iLCAicmF0aW8iLCAiYWNjdW11bGF0aW9uIiwgInBvcyIsICJwYXJ0IiwgIkZBTExCQUNLX09URUxfVFJBQ0VTX1NBTVBMRVIiLCAiREVGQVVMVF9SQVRJTyIsICJsb2FkRGVmYXVsdENvbmZpZyIsICJlbnYiLCAiYnVpbGRTYW1wbGVyRnJvbUVudiIsICJlbnZpcm9ubWVudCIsICJnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52IiwgInByb2JhYmlsaXR5IiwgIm1lcmdlQ29uZmlnIiwgInVzZXJDb25maWciLCAicGVySW5zdGFuY2VEZWZhdWx0cyIsICJERUZBVUxUX0NPTkZJRyIsICJ0YXJnZXQiLCAicmVjb25maWd1cmVMaW1pdHMiLCAiX2UiLCAiX2YiLCAiX2ciLCAiX2giLCAiX2oiLCAiX2siLCAiX2wiLCAiX20iLCAic3BhbkxpbWl0cyIsICJwYXJzZWRFbnZDb25maWciLCAiQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZSIsICJfZXhwb3J0ZXIiLCAiX3NwYW4iLCAiX3BhcmVudENvbnRleHQiLCAic3BhbiIsICJyZXNvbHZlIiwgInJlamVjdCIsICJwcm9taXNlcyIsICJjb3VudCIsICJqIiwgInRpbWVyIiwgInNwYW5zIiwgImRvRXhwb3J0IiwgInJlc3VsdCIsICJwZW5kaW5nUmVzb3VyY2VzIiwgImxlbiIsICJlcnIiLCAiZmx1c2giLCAiX19leHRlbmRzIiwgImV4dGVuZFN0YXRpY3MiLCAiZCIsICJiIiwgIl9fIiwgIkJhdGNoU3BhblByb2Nlc3NvciIsICJfc3VwZXIiLCAiU1BBTl9JRF9CWVRFUyIsICJUUkFDRV9JRF9CWVRFUyIsICJSYW5kb21JZEdlbmVyYXRvciIsICJnZXRJZEdlbmVyYXRvciIsICJTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSIsICJieXRlcyIsICJUcmFjZXIiLCAiaW5zdHJ1bWVudGF0aW9uTGlicmFyeSIsICJfdHJhY2VyUHJvdmlkZXIiLCAibG9jYWxDb25maWciLCAib3B0aW9ucyIsICJjb250ZXh0JDEiLCAicGFyZW50U3BhbiIsICJub25SZWNvcmRpbmdTcGFuIiwgInBhcmVudFNwYW5Db250ZXh0IiwgInNwYW5JZCIsICJ0cmFjZVN0YXRlIiwgInNhbXBsaW5nUmVzdWx0IiwgInRyYWNlRmxhZ3MiLCAiaW5pdEF0dHJpYnV0ZXMiLCAiYXJnMiIsICJhcmczIiwgImFyZzQiLCAib3B0cyIsICJjdHgiLCAiZm4iLCAiY29udGV4dFdpdGhTcGFuU2V0IiwgIl9fdmFsdWVzJDEiLCAiTXVsdGlTcGFuUHJvY2Vzc29yIiwgIl9zcGFuUHJvY2Vzc29ycyIsICJzcGFuUHJvY2Vzc29yIiwgImVfMiIsICJlXzJfMSIsICJlXzMiLCAiZV8zXzEiLCAiZV80IiwgImVfNF8xIiwgIk5vb3BTcGFuUHJvY2Vzc29yIiwgIl9jb250ZXh0IiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkZvcmNlRmx1c2hTdGF0ZSIsICJCYXNpY1RyYWNlclByb3ZpZGVyIiwgIm1lcmdlZENvbmZpZyIsICJkZWZhdWx0RXhwb3J0ZXIiLCAiYmF0Y2hQcm9jZXNzb3IiLCAidmVyc2lvbiIsICJ0aW1lb3V0IiwgInN0YXRlIiwgInRpbWVvdXRJbnRlcnZhbCIsICJyZXN1bHRzIiwgImVycm9ycyIsICJ1bmlxdWVQcm9wYWdhdG9yTmFtZXMiLCAicHJvcGFnYXRvcnMiLCAicHJvcGFnYXRvciIsICJ2YWxpZFByb3BhZ2F0b3JzIiwgImxpc3QiLCAiaXRlbSIsICJleHBvcnRlck5hbWUiLCAiZXhwb3J0ZXIiLCAiX192YWx1ZXMiLCAiQ29uc29sZVNwYW5FeHBvcnRlciIsICJyZXN1bHRDYWxsYmFjayIsICJkb25lIiwgInNwYW5zXzEiLCAic3BhbnNfMV8xIiwgIl9fYXdhaXRlciIsICJ0aGlzQXJnIiwgIl9hcmd1bWVudHMiLCAiUCIsICJnZW5lcmF0b3IiLCAiYWRvcHQiLCAiZnVsZmlsbGVkIiwgInN0ZXAiLCAicmVqZWN0ZWQiLCAiX19nZW5lcmF0b3IiLCAiYm9keSIsICJfIiwgImYiLCAieSIsICJnIiwgInZlcmIiLCAib3AiLCAiU2ltcGxlU3BhblByb2Nlc3NvciIsICJleHBvcnRQcm9taXNlXzEiXQp9Cg==
|