@getopenpay/openpay-js 0.3.4 → 0.3.5

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.
@@ -0,0 +1,957 @@
1
+ import { f as nt, t as _, i as it, T as L, d as ot, c as T, I as at, S as st } from "./index-DUAfQijD.js";
2
+ import { d } from "./diag-api-Ck_l5qgD.js";
3
+ import { l as V, n as ut, o as M, j as lt, m as C, q as pt, r as dt, s as N, v as B, w as ft, x as ct, p as ht, y as k } from "./url-BwiN4sTR.js";
4
+ import { i as _t, s as R, g as h, a as mt, u as vt, B as Z, b as St, S as H, C as yt, W as Et, c as Tt, m as gt, d as Lt } from "./index-BDf1_xy1.js";
5
+ import { T as v, h as A, i as Pt, D as At, j as wt } from "./sdk-info-SNq483aR.js";
6
+ import { R as Q } from "./Resource-An2TTXLX.js";
7
+ import { E as w } from "./ExportResult-Bo1QOwfo.js";
8
+ var bt = "exception", U = function() {
9
+ return U = Object.assign || function(e) {
10
+ for (var t, r = 1, n = arguments.length; r < n; r++) {
11
+ t = arguments[r];
12
+ for (var o in t) Object.prototype.hasOwnProperty.call(t, o) && (e[o] = t[o]);
13
+ }
14
+ return e;
15
+ }, U.apply(this, arguments);
16
+ }, Ct = function(e) {
17
+ var t = typeof Symbol == "function" && Symbol.iterator, r = t && e[t], n = 0;
18
+ if (r) return r.call(e);
19
+ if (e && typeof e.length == "number") return {
20
+ next: function() {
21
+ return e && n >= e.length && (e = void 0), { value: e && e[n++], done: !e };
22
+ }
23
+ };
24
+ throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
25
+ }, X = function(e, t) {
26
+ var r = typeof Symbol == "function" && e[Symbol.iterator];
27
+ if (!r) return e;
28
+ var n = r.call(e), o, i = [], a;
29
+ try {
30
+ for (; (t === void 0 || t-- > 0) && !(o = n.next()).done; ) i.push(o.value);
31
+ } catch (s) {
32
+ a = { error: s };
33
+ } finally {
34
+ try {
35
+ o && !o.done && (r = n.return) && r.call(n);
36
+ } finally {
37
+ if (a) throw a.error;
38
+ }
39
+ }
40
+ return i;
41
+ }, xt = function(e, t, r) {
42
+ if (r || arguments.length === 2) for (var n = 0, o = t.length, i; n < o; n++)
43
+ (i || !(n in t)) && (i || (i = Array.prototype.slice.call(t, 0, n)), i[n] = t[n]);
44
+ return e.concat(i || Array.prototype.slice.call(t));
45
+ }, Ot = (
46
+ /** @class */
47
+ function() {
48
+ function e(t, r, n, o, i, a, s, l, u, p) {
49
+ s === void 0 && (s = []), this.attributes = {}, this.links = [], this.events = [], this._droppedAttributesCount = 0, this._droppedEventsCount = 0, this._droppedLinksCount = 0, this.status = {
50
+ code: nt.UNSET
51
+ }, this.endTime = [0, 0], this._ended = !1, this._duration = [-1, -1], this.name = n, this._spanContext = o, this.parentSpanId = a, this.kind = i, this.links = s;
52
+ var f = Date.now();
53
+ this._performanceStartTime = M.now(), this._performanceOffset = f - (this._performanceStartTime + ft()), this._startTimeProvided = l != null, this.startTime = this._getTime(l ?? f), this.resource = t.resource, this.instrumentationLibrary = t.instrumentationLibrary, this._spanLimits = t.getSpanLimits(), this._attributeValueLengthLimit = this._spanLimits.attributeValueLengthLimit || 0, p != null && this.setAttributes(p), this._spanProcessor = t.getActiveSpanProcessor(), this._spanProcessor.onStart(this, r);
54
+ }
55
+ return e.prototype.spanContext = function() {
56
+ return this._spanContext;
57
+ }, e.prototype.setAttribute = function(t, r) {
58
+ return r == null || this._isSpanEnded() ? this : t.length === 0 ? (d.warn("Invalid attribute key: " + t), this) : _t(r) ? Object.keys(this.attributes).length >= this._spanLimits.attributeCountLimit && !Object.prototype.hasOwnProperty.call(this.attributes, t) ? (this._droppedAttributesCount++, this) : (this.attributes[t] = this._truncateToSize(r), this) : (d.warn("Invalid attribute value set for key: " + t), this);
59
+ }, e.prototype.setAttributes = function(t) {
60
+ var r, n;
61
+ try {
62
+ for (var o = Ct(Object.entries(t)), i = o.next(); !i.done; i = o.next()) {
63
+ var a = X(i.value, 2), s = a[0], l = a[1];
64
+ this.setAttribute(s, l);
65
+ }
66
+ } catch (u) {
67
+ r = { error: u };
68
+ } finally {
69
+ try {
70
+ i && !i.done && (n = o.return) && n.call(o);
71
+ } finally {
72
+ if (r) throw r.error;
73
+ }
74
+ }
75
+ return this;
76
+ }, e.prototype.addEvent = function(t, r, n) {
77
+ if (this._isSpanEnded())
78
+ return this;
79
+ if (this._spanLimits.eventCountLimit === 0)
80
+ return d.warn("No events allowed."), this._droppedEventsCount++, this;
81
+ this.events.length >= this._spanLimits.eventCountLimit && (this._droppedEventsCount === 0 && d.debug("Dropping extra events."), this.events.shift(), this._droppedEventsCount++), V(r) && (V(n) || (n = r), r = void 0);
82
+ var o = R(r);
83
+ return this.events.push({
84
+ name: t,
85
+ attributes: o,
86
+ time: this._getTime(n),
87
+ droppedAttributesCount: 0
88
+ }), this;
89
+ }, e.prototype.addLink = function(t) {
90
+ return this.links.push(t), this;
91
+ }, e.prototype.addLinks = function(t) {
92
+ var r;
93
+ return (r = this.links).push.apply(r, xt([], X(t), !1)), this;
94
+ }, e.prototype.setStatus = function(t) {
95
+ return this._isSpanEnded() ? this : (this.status = U({}, t), this.status.message != null && typeof t.message != "string" && (d.warn("Dropping invalid status.message of type '" + typeof t.message + "', expected 'string'"), delete this.status.message), this);
96
+ }, e.prototype.updateName = function(t) {
97
+ return this._isSpanEnded() ? this : (this.name = t, this);
98
+ }, e.prototype.end = function(t) {
99
+ if (this._isSpanEnded()) {
100
+ d.error(this.name + " " + this._spanContext.traceId + "-" + this._spanContext.spanId + " - You can only call end() on a span once.");
101
+ return;
102
+ }
103
+ this._ended = !0, this.endTime = this._getTime(t), this._duration = ut(this.startTime, this.endTime), this._duration[0] < 0 && (d.warn("Inconsistent start and end time, startTime > endTime. Setting span duration to 0ms.", this.startTime, this.endTime), this.endTime = this.startTime.slice(), this._duration = [0, 0]), this._droppedEventsCount > 0 && d.warn("Dropped " + this._droppedEventsCount + " events because eventCountLimit reached"), this._spanProcessor.onEnd(this);
104
+ }, e.prototype._getTime = function(t) {
105
+ if (typeof t == "number" && t <= M.now())
106
+ return lt(t + this._performanceOffset);
107
+ if (typeof t == "number")
108
+ return C(t);
109
+ if (t instanceof Date)
110
+ return C(t.getTime());
111
+ if (pt(t))
112
+ return t;
113
+ if (this._startTimeProvided)
114
+ return C(Date.now());
115
+ var r = M.now() - this._performanceStartTime;
116
+ return dt(this.startTime, C(r));
117
+ }, e.prototype.isRecording = function() {
118
+ return this._ended === !1;
119
+ }, e.prototype.recordException = function(t, r) {
120
+ var n = {};
121
+ typeof t == "string" ? n[B] = t : t && (t.code ? n[N] = t.code.toString() : t.name && (n[N] = t.name), t.message && (n[B] = t.message), t.stack && (n[ct] = t.stack)), n[N] || n[B] ? this.addEvent(bt, n, r) : d.warn("Failed to record an exception " + t);
122
+ }, Object.defineProperty(e.prototype, "duration", {
123
+ get: function() {
124
+ return this._duration;
125
+ },
126
+ enumerable: !1,
127
+ configurable: !0
128
+ }), Object.defineProperty(e.prototype, "ended", {
129
+ get: function() {
130
+ return this._ended;
131
+ },
132
+ enumerable: !1,
133
+ configurable: !0
134
+ }), Object.defineProperty(e.prototype, "droppedAttributesCount", {
135
+ get: function() {
136
+ return this._droppedAttributesCount;
137
+ },
138
+ enumerable: !1,
139
+ configurable: !0
140
+ }), Object.defineProperty(e.prototype, "droppedEventsCount", {
141
+ get: function() {
142
+ return this._droppedEventsCount;
143
+ },
144
+ enumerable: !1,
145
+ configurable: !0
146
+ }), Object.defineProperty(e.prototype, "droppedLinksCount", {
147
+ get: function() {
148
+ return this._droppedLinksCount;
149
+ },
150
+ enumerable: !1,
151
+ configurable: !0
152
+ }), e.prototype._isSpanEnded = function() {
153
+ return this._ended && d.warn("Can not execute the operation on ended Span {traceId: " + this._spanContext.traceId + ", spanId: " + this._spanContext.spanId + "}"), this._ended;
154
+ }, e.prototype._truncateToLimitUtil = function(t, r) {
155
+ return t.length <= r ? t : t.substring(0, r);
156
+ }, e.prototype._truncateToSize = function(t) {
157
+ var r = this, n = this._attributeValueLengthLimit;
158
+ return n <= 0 ? (d.warn("Attribute value limit must be positive, got " + n), t) : typeof t == "string" ? this._truncateToLimitUtil(t, n) : Array.isArray(t) ? t.map(function(o) {
159
+ return typeof o == "string" ? r._truncateToLimitUtil(o, n) : o;
160
+ }) : t;
161
+ }, e;
162
+ }()
163
+ ), P;
164
+ (function(e) {
165
+ e[e.NOT_RECORD = 0] = "NOT_RECORD", e[e.RECORD = 1] = "RECORD", e[e.RECORD_AND_SAMPLED = 2] = "RECORD_AND_SAMPLED";
166
+ })(P || (P = {}));
167
+ var I = (
168
+ /** @class */
169
+ function() {
170
+ function e() {
171
+ }
172
+ return e.prototype.shouldSample = function() {
173
+ return {
174
+ decision: P.NOT_RECORD
175
+ };
176
+ }, e.prototype.toString = function() {
177
+ return "AlwaysOffSampler";
178
+ }, e;
179
+ }()
180
+ ), g = (
181
+ /** @class */
182
+ function() {
183
+ function e() {
184
+ }
185
+ return e.prototype.shouldSample = function() {
186
+ return {
187
+ decision: P.RECORD_AND_SAMPLED
188
+ };
189
+ }, e.prototype.toString = function() {
190
+ return "AlwaysOnSampler";
191
+ }, e;
192
+ }()
193
+ ), D = (
194
+ /** @class */
195
+ function() {
196
+ function e(t) {
197
+ var r, n, o, i;
198
+ this._root = t.root, this._root || (h(new Error("ParentBasedSampler must have a root sampler configured")), this._root = new g()), this._remoteParentSampled = (r = t.remoteParentSampled) !== null && r !== void 0 ? r : new g(), this._remoteParentNotSampled = (n = t.remoteParentNotSampled) !== null && n !== void 0 ? n : new I(), this._localParentSampled = (o = t.localParentSampled) !== null && o !== void 0 ? o : new g(), this._localParentNotSampled = (i = t.localParentNotSampled) !== null && i !== void 0 ? i : new I();
199
+ }
200
+ return e.prototype.shouldSample = function(t, r, n, o, i, a) {
201
+ var s = _.getSpanContext(t);
202
+ return !s || !it(s) ? this._root.shouldSample(t, r, n, o, i, a) : s.isRemote ? s.traceFlags & L.SAMPLED ? this._remoteParentSampled.shouldSample(t, r, n, o, i, a) : this._remoteParentNotSampled.shouldSample(t, r, n, o, i, a) : s.traceFlags & L.SAMPLED ? this._localParentSampled.shouldSample(t, r, n, o, i, a) : this._localParentNotSampled.shouldSample(t, r, n, o, i, a);
203
+ }, e.prototype.toString = function() {
204
+ return "ParentBased{root=" + this._root.toString() + ", remoteParentSampled=" + this._remoteParentSampled.toString() + ", remoteParentNotSampled=" + this._remoteParentNotSampled.toString() + ", localParentSampled=" + this._localParentSampled.toString() + ", localParentNotSampled=" + this._localParentNotSampled.toString() + "}";
205
+ }, e;
206
+ }()
207
+ ), W = (
208
+ /** @class */
209
+ function() {
210
+ function e(t) {
211
+ t === void 0 && (t = 0), this._ratio = t, this._ratio = this._normalize(t), this._upperBound = Math.floor(this._ratio * 4294967295);
212
+ }
213
+ return e.prototype.shouldSample = function(t, r) {
214
+ return {
215
+ decision: ot(r) && this._accumulate(r) < this._upperBound ? P.RECORD_AND_SAMPLED : P.NOT_RECORD
216
+ };
217
+ }, e.prototype.toString = function() {
218
+ return "TraceIdRatioBased{" + this._ratio + "}";
219
+ }, e.prototype._normalize = function(t) {
220
+ return typeof t != "number" || isNaN(t) ? 0 : t >= 1 ? 1 : t <= 0 ? 0 : t;
221
+ }, e.prototype._accumulate = function(t) {
222
+ for (var r = 0, n = 0; n < t.length / 8; n++) {
223
+ var o = n * 8, i = parseInt(t.slice(o, o + 8), 16);
224
+ r = (r ^ i) >>> 0;
225
+ }
226
+ return r;
227
+ }, e;
228
+ }()
229
+ ), Rt = v.AlwaysOn, E = 1;
230
+ function J() {
231
+ var e = A();
232
+ return {
233
+ sampler: $(e),
234
+ forceFlushTimeoutMillis: 3e4,
235
+ generalLimits: {
236
+ attributeValueLengthLimit: e.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT,
237
+ attributeCountLimit: e.OTEL_ATTRIBUTE_COUNT_LIMIT
238
+ },
239
+ spanLimits: {
240
+ attributeValueLengthLimit: e.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT,
241
+ attributeCountLimit: e.OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT,
242
+ linkCountLimit: e.OTEL_SPAN_LINK_COUNT_LIMIT,
243
+ eventCountLimit: e.OTEL_SPAN_EVENT_COUNT_LIMIT,
244
+ attributePerEventCountLimit: e.OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,
245
+ attributePerLinkCountLimit: e.OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT
246
+ },
247
+ mergeResourceWithDefaults: !0
248
+ };
249
+ }
250
+ function $(e) {
251
+ switch (e === void 0 && (e = A()), e.OTEL_TRACES_SAMPLER) {
252
+ case v.AlwaysOn:
253
+ return new g();
254
+ case v.AlwaysOff:
255
+ return new I();
256
+ case v.ParentBasedAlwaysOn:
257
+ return new D({
258
+ root: new g()
259
+ });
260
+ case v.ParentBasedAlwaysOff:
261
+ return new D({
262
+ root: new I()
263
+ });
264
+ case v.TraceIdRatio:
265
+ return new W(Y(e));
266
+ case v.ParentBasedTraceIdRatio:
267
+ return new D({
268
+ root: new W(Y(e))
269
+ });
270
+ default:
271
+ return d.error('OTEL_TRACES_SAMPLER value "' + e.OTEL_TRACES_SAMPLER + " invalid, defaulting to " + Rt + '".'), new g();
272
+ }
273
+ }
274
+ function Y(e) {
275
+ if (e.OTEL_TRACES_SAMPLER_ARG === void 0 || e.OTEL_TRACES_SAMPLER_ARG === "")
276
+ return d.error("OTEL_TRACES_SAMPLER_ARG is blank, defaulting to " + E + "."), E;
277
+ var t = Number(e.OTEL_TRACES_SAMPLER_ARG);
278
+ return isNaN(t) ? (d.error("OTEL_TRACES_SAMPLER_ARG=" + e.OTEL_TRACES_SAMPLER_ARG + " was given, but it is invalid, defaulting to " + E + "."), E) : t < 0 || t > 1 ? (d.error("OTEL_TRACES_SAMPLER_ARG=" + e.OTEL_TRACES_SAMPLER_ARG + " was given, but it is out of range ([0..1]), defaulting to " + E + "."), E) : t;
279
+ }
280
+ function It(e) {
281
+ var t = {
282
+ sampler: $()
283
+ }, r = J(), n = Object.assign({}, r, t, e);
284
+ return n.generalLimits = Object.assign({}, r.generalLimits, e.generalLimits || {}), n.spanLimits = Object.assign({}, r.spanLimits, e.spanLimits || {}), n;
285
+ }
286
+ function Mt(e) {
287
+ var t, r, n, o, i, a, s, l, u, p, f, c, y = Object.assign({}, e.spanLimits), m = Pt();
288
+ return y.attributeCountLimit = (a = (i = (o = (r = (t = e.spanLimits) === null || t === void 0 ? void 0 : t.attributeCountLimit) !== null && r !== void 0 ? r : (n = e.generalLimits) === null || n === void 0 ? void 0 : n.attributeCountLimit) !== null && o !== void 0 ? o : m.OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT) !== null && i !== void 0 ? i : m.OTEL_ATTRIBUTE_COUNT_LIMIT) !== null && a !== void 0 ? a : At, y.attributeValueLengthLimit = (c = (f = (p = (l = (s = e.spanLimits) === null || s === void 0 ? void 0 : s.attributeValueLengthLimit) !== null && l !== void 0 ? l : (u = e.generalLimits) === null || u === void 0 ? void 0 : u.attributeValueLengthLimit) !== null && p !== void 0 ? p : m.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT) !== null && f !== void 0 ? f : m.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT) !== null && c !== void 0 ? c : wt, Object.assign({}, e, { spanLimits: y });
289
+ }
290
+ var Nt = (
291
+ /** @class */
292
+ function() {
293
+ function e(t, r) {
294
+ this._exporter = t, this._isExporting = !1, this._finishedSpans = [], this._droppedSpansCount = 0;
295
+ var n = A();
296
+ this._maxExportBatchSize = typeof (r == null ? void 0 : r.maxExportBatchSize) == "number" ? r.maxExportBatchSize : n.OTEL_BSP_MAX_EXPORT_BATCH_SIZE, this._maxQueueSize = typeof (r == null ? void 0 : r.maxQueueSize) == "number" ? r.maxQueueSize : n.OTEL_BSP_MAX_QUEUE_SIZE, this._scheduledDelayMillis = typeof (r == null ? void 0 : r.scheduledDelayMillis) == "number" ? r.scheduledDelayMillis : n.OTEL_BSP_SCHEDULE_DELAY, this._exportTimeoutMillis = typeof (r == null ? void 0 : r.exportTimeoutMillis) == "number" ? r.exportTimeoutMillis : n.OTEL_BSP_EXPORT_TIMEOUT, this._shutdownOnce = new Z(this._shutdown, this), this._maxExportBatchSize > this._maxQueueSize && (d.warn("BatchSpanProcessor: maxExportBatchSize must be smaller or equal to maxQueueSize, setting maxExportBatchSize to match maxQueueSize"), this._maxExportBatchSize = this._maxQueueSize);
297
+ }
298
+ return e.prototype.forceFlush = function() {
299
+ return this._shutdownOnce.isCalled ? this._shutdownOnce.promise : this._flushAll();
300
+ }, e.prototype.onStart = function(t, r) {
301
+ }, e.prototype.onEnd = function(t) {
302
+ this._shutdownOnce.isCalled || t.spanContext().traceFlags & L.SAMPLED && this._addToBuffer(t);
303
+ }, e.prototype.shutdown = function() {
304
+ return this._shutdownOnce.call();
305
+ }, e.prototype._shutdown = function() {
306
+ var t = this;
307
+ return Promise.resolve().then(function() {
308
+ return t.onShutdown();
309
+ }).then(function() {
310
+ return t._flushAll();
311
+ }).then(function() {
312
+ return t._exporter.shutdown();
313
+ });
314
+ }, e.prototype._addToBuffer = function(t) {
315
+ if (this._finishedSpans.length >= this._maxQueueSize) {
316
+ this._droppedSpansCount === 0 && d.debug("maxQueueSize reached, dropping spans"), this._droppedSpansCount++;
317
+ return;
318
+ }
319
+ this._droppedSpansCount > 0 && (d.warn("Dropped " + this._droppedSpansCount + " spans because maxQueueSize reached"), this._droppedSpansCount = 0), this._finishedSpans.push(t), this._maybeStartTimer();
320
+ }, e.prototype._flushAll = function() {
321
+ var t = this;
322
+ return new Promise(function(r, n) {
323
+ for (var o = [], i = Math.ceil(t._finishedSpans.length / t._maxExportBatchSize), a = 0, s = i; a < s; a++)
324
+ o.push(t._flushOneBatch());
325
+ Promise.all(o).then(function() {
326
+ r();
327
+ }).catch(n);
328
+ });
329
+ }, e.prototype._flushOneBatch = function() {
330
+ var t = this;
331
+ return this._clearTimer(), this._finishedSpans.length === 0 ? Promise.resolve() : new Promise(function(r, n) {
332
+ var o = setTimeout(function() {
333
+ n(new Error("Timeout"));
334
+ }, t._exportTimeoutMillis);
335
+ T.with(mt(T.active()), function() {
336
+ var i;
337
+ t._finishedSpans.length <= t._maxExportBatchSize ? (i = t._finishedSpans, t._finishedSpans = []) : i = t._finishedSpans.splice(0, t._maxExportBatchSize);
338
+ for (var a = function() {
339
+ return t._exporter.export(i, function(f) {
340
+ var c;
341
+ clearTimeout(o), f.code === w.SUCCESS ? r() : n((c = f.error) !== null && c !== void 0 ? c : new Error("BatchSpanProcessor: span export failed"));
342
+ });
343
+ }, s = null, l = 0, u = i.length; l < u; l++) {
344
+ var p = i[l];
345
+ p.resource.asyncAttributesPending && p.resource.waitForAsyncAttributes && (s ?? (s = []), s.push(p.resource.waitForAsyncAttributes()));
346
+ }
347
+ s === null ? a() : Promise.all(s).then(a, function(f) {
348
+ h(f), n(f);
349
+ });
350
+ });
351
+ });
352
+ }, e.prototype._maybeStartTimer = function() {
353
+ var t = this;
354
+ if (!this._isExporting) {
355
+ var r = function() {
356
+ t._isExporting = !0, t._flushOneBatch().finally(function() {
357
+ t._isExporting = !1, t._finishedSpans.length > 0 && (t._clearTimer(), t._maybeStartTimer());
358
+ }).catch(function(n) {
359
+ t._isExporting = !1, h(n);
360
+ });
361
+ };
362
+ if (this._finishedSpans.length >= this._maxExportBatchSize)
363
+ return r();
364
+ this._timer === void 0 && (this._timer = setTimeout(function() {
365
+ return r();
366
+ }, this._scheduledDelayMillis), vt(this._timer));
367
+ }
368
+ }, e.prototype._clearTimer = function() {
369
+ this._timer !== void 0 && (clearTimeout(this._timer), this._timer = void 0);
370
+ }, e;
371
+ }()
372
+ ), Bt = /* @__PURE__ */ function() {
373
+ var e = function(t, r) {
374
+ return e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, o) {
375
+ n.__proto__ = o;
376
+ } || function(n, o) {
377
+ for (var i in o) Object.prototype.hasOwnProperty.call(o, i) && (n[i] = o[i]);
378
+ }, e(t, r);
379
+ };
380
+ return function(t, r) {
381
+ if (typeof r != "function" && r !== null)
382
+ throw new TypeError("Class extends value " + String(r) + " is not a constructor or null");
383
+ e(t, r);
384
+ function n() {
385
+ this.constructor = t;
386
+ }
387
+ t.prototype = r === null ? Object.create(r) : (n.prototype = r.prototype, new n());
388
+ };
389
+ }(), Dt = (
390
+ /** @class */
391
+ function(e) {
392
+ Bt(t, e);
393
+ function t(r, n) {
394
+ var o = e.call(this, r, n) || this;
395
+ return o.onInit(n), o;
396
+ }
397
+ return t.prototype.onInit = function(r) {
398
+ var n = this;
399
+ (r == null ? void 0 : r.disableAutoFlushOnDocumentHide) !== !0 && typeof document < "u" && (this._visibilityChangeListener = function() {
400
+ document.visibilityState === "hidden" && n.forceFlush().catch(function(o) {
401
+ h(o);
402
+ });
403
+ }, this._pageHideListener = function() {
404
+ n.forceFlush().catch(function(o) {
405
+ h(o);
406
+ });
407
+ }, document.addEventListener("visibilitychange", this._visibilityChangeListener), document.addEventListener("pagehide", this._pageHideListener));
408
+ }, t.prototype.onShutdown = function() {
409
+ typeof document < "u" && (this._visibilityChangeListener && document.removeEventListener("visibilitychange", this._visibilityChangeListener), this._pageHideListener && document.removeEventListener("pagehide", this._pageHideListener));
410
+ }, t;
411
+ }(Nt)
412
+ ), Ut = 8, Ft = 16, Gt = (
413
+ /** @class */
414
+ /* @__PURE__ */ function() {
415
+ function e() {
416
+ this.generateTraceId = q(Ft), this.generateSpanId = q(Ut);
417
+ }
418
+ return e;
419
+ }()
420
+ ), x = Array(32);
421
+ function q(e) {
422
+ return function() {
423
+ for (var r = 0; r < e * 2; r++)
424
+ x[r] = Math.floor(Math.random() * 16) + 48, x[r] >= 58 && (x[r] += 39);
425
+ return String.fromCharCode.apply(null, x.slice(0, e * 2));
426
+ };
427
+ }
428
+ var zt = (
429
+ /** @class */
430
+ function() {
431
+ function e(t, r, n) {
432
+ this._tracerProvider = n;
433
+ var o = It(r);
434
+ this._sampler = o.sampler, this._generalLimits = o.generalLimits, this._spanLimits = o.spanLimits, this._idGenerator = r.idGenerator || new Gt(), this.resource = n.resource, this.instrumentationLibrary = t;
435
+ }
436
+ return e.prototype.startSpan = function(t, r, n) {
437
+ var o, i, a;
438
+ r === void 0 && (r = {}), n === void 0 && (n = T.active()), r.root && (n = _.deleteSpan(n));
439
+ var s = _.getSpan(n);
440
+ if (St(n)) {
441
+ d.debug("Instrumentation suppressed, returning Noop Span");
442
+ var l = _.wrapSpanContext(at);
443
+ return l;
444
+ }
445
+ var u = s == null ? void 0 : s.spanContext(), p = this._idGenerator.generateSpanId(), f, c, y;
446
+ !u || !_.isSpanContextValid(u) ? f = this._idGenerator.generateTraceId() : (f = u.traceId, c = u.traceState, y = u.spanId);
447
+ var m = (o = r.kind) !== null && o !== void 0 ? o : st.INTERNAL, F = ((i = r.links) !== null && i !== void 0 ? i : []).map(function(j) {
448
+ return {
449
+ context: j.context,
450
+ attributes: R(j.attributes)
451
+ };
452
+ }), G = R(r.attributes), b = this._sampler.shouldSample(n, f, t, m, G, F);
453
+ c = (a = b.traceState) !== null && a !== void 0 ? a : c;
454
+ var tt = b.decision === H.RECORD_AND_SAMPLED ? L.SAMPLED : L.NONE, z = { traceId: f, spanId: p, traceFlags: tt, traceState: c };
455
+ if (b.decision === H.NOT_RECORD) {
456
+ d.debug("Recording is off, propagating context in a non-recording span");
457
+ var l = _.wrapSpanContext(z);
458
+ return l;
459
+ }
460
+ var et = R(Object.assign(G, b.attributes)), rt = new Ot(this, n, t, z, m, y, F, r.startTime, void 0, et);
461
+ return rt;
462
+ }, e.prototype.startActiveSpan = function(t, r, n, o) {
463
+ var i, a, s;
464
+ if (!(arguments.length < 2)) {
465
+ arguments.length === 2 ? s = r : arguments.length === 3 ? (i = r, s = n) : (i = r, a = n, s = o);
466
+ var l = a ?? T.active(), u = this.startSpan(t, i, l), p = _.setSpan(l, u);
467
+ return T.with(p, s, void 0, u);
468
+ }
469
+ }, e.prototype.getGeneralLimits = function() {
470
+ return this._generalLimits;
471
+ }, e.prototype.getSpanLimits = function() {
472
+ return this._spanLimits;
473
+ }, e.prototype.getActiveSpanProcessor = function() {
474
+ return this._tracerProvider.getActiveSpanProcessor();
475
+ }, e;
476
+ }()
477
+ ), O = function(e) {
478
+ var t = typeof Symbol == "function" && Symbol.iterator, r = t && e[t], n = 0;
479
+ if (r) return r.call(e);
480
+ if (e && typeof e.length == "number") return {
481
+ next: function() {
482
+ return e && n >= e.length && (e = void 0), { value: e && e[n++], done: !e };
483
+ }
484
+ };
485
+ throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
486
+ }, K = (
487
+ /** @class */
488
+ function() {
489
+ function e(t) {
490
+ this._spanProcessors = t;
491
+ }
492
+ return e.prototype.forceFlush = function() {
493
+ var t, r, n = [];
494
+ try {
495
+ for (var o = O(this._spanProcessors), i = o.next(); !i.done; i = o.next()) {
496
+ var a = i.value;
497
+ n.push(a.forceFlush());
498
+ }
499
+ } catch (s) {
500
+ t = { error: s };
501
+ } finally {
502
+ try {
503
+ i && !i.done && (r = o.return) && r.call(o);
504
+ } finally {
505
+ if (t) throw t.error;
506
+ }
507
+ }
508
+ return new Promise(function(s) {
509
+ Promise.all(n).then(function() {
510
+ s();
511
+ }).catch(function(l) {
512
+ h(l || new Error("MultiSpanProcessor: forceFlush failed")), s();
513
+ });
514
+ });
515
+ }, e.prototype.onStart = function(t, r) {
516
+ var n, o;
517
+ try {
518
+ for (var i = O(this._spanProcessors), a = i.next(); !a.done; a = i.next()) {
519
+ var s = a.value;
520
+ s.onStart(t, r);
521
+ }
522
+ } catch (l) {
523
+ n = { error: l };
524
+ } finally {
525
+ try {
526
+ a && !a.done && (o = i.return) && o.call(i);
527
+ } finally {
528
+ if (n) throw n.error;
529
+ }
530
+ }
531
+ }, e.prototype.onEnd = function(t) {
532
+ var r, n;
533
+ try {
534
+ for (var o = O(this._spanProcessors), i = o.next(); !i.done; i = o.next()) {
535
+ var a = i.value;
536
+ a.onEnd(t);
537
+ }
538
+ } catch (s) {
539
+ r = { error: s };
540
+ } finally {
541
+ try {
542
+ i && !i.done && (n = o.return) && n.call(o);
543
+ } finally {
544
+ if (r) throw r.error;
545
+ }
546
+ }
547
+ }, e.prototype.shutdown = function() {
548
+ var t, r, n = [];
549
+ try {
550
+ for (var o = O(this._spanProcessors), i = o.next(); !i.done; i = o.next()) {
551
+ var a = i.value;
552
+ n.push(a.shutdown());
553
+ }
554
+ } catch (s) {
555
+ t = { error: s };
556
+ } finally {
557
+ try {
558
+ i && !i.done && (r = o.return) && r.call(o);
559
+ } finally {
560
+ if (t) throw t.error;
561
+ }
562
+ }
563
+ return new Promise(function(s, l) {
564
+ Promise.all(n).then(function() {
565
+ s();
566
+ }, l);
567
+ });
568
+ }, e;
569
+ }()
570
+ ), jt = (
571
+ /** @class */
572
+ function() {
573
+ function e() {
574
+ }
575
+ return e.prototype.onStart = function(t, r) {
576
+ }, e.prototype.onEnd = function(t) {
577
+ }, e.prototype.shutdown = function() {
578
+ return Promise.resolve();
579
+ }, e.prototype.forceFlush = function() {
580
+ return Promise.resolve();
581
+ }, e;
582
+ }()
583
+ ), Vt = function(e, t) {
584
+ var r = typeof Symbol == "function" && e[Symbol.iterator];
585
+ if (!r) return e;
586
+ var n = r.call(e), o, i = [], a;
587
+ try {
588
+ for (; (t === void 0 || t-- > 0) && !(o = n.next()).done; ) i.push(o.value);
589
+ } catch (s) {
590
+ a = { error: s };
591
+ } finally {
592
+ try {
593
+ o && !o.done && (r = n.return) && r.call(n);
594
+ } finally {
595
+ if (a) throw a.error;
596
+ }
597
+ }
598
+ return i;
599
+ }, kt = function(e, t, r) {
600
+ if (r || arguments.length === 2) for (var n = 0, o = t.length, i; n < o; n++)
601
+ (i || !(n in t)) && (i || (i = Array.prototype.slice.call(t, 0, n)), i[n] = t[n]);
602
+ return e.concat(i || Array.prototype.slice.call(t));
603
+ }, S;
604
+ (function(e) {
605
+ e[e.resolved = 0] = "resolved", e[e.timeout = 1] = "timeout", e[e.error = 2] = "error", e[e.unresolved = 3] = "unresolved";
606
+ })(S || (S = {}));
607
+ var re = (
608
+ /** @class */
609
+ function() {
610
+ function e(t) {
611
+ t === void 0 && (t = {});
612
+ var r, n;
613
+ this._registeredSpanProcessors = [], this._tracers = /* @__PURE__ */ new Map();
614
+ var o = gt({}, J(), Mt(t));
615
+ if (this.resource = (r = o.resource) !== null && r !== void 0 ? r : Q.empty(), o.mergeResourceWithDefaults && (this.resource = Q.default().merge(this.resource)), this._config = Object.assign({}, o, {
616
+ resource: this.resource
617
+ }), !((n = t.spanProcessors) === null || n === void 0) && n.length)
618
+ this._registeredSpanProcessors = kt([], Vt(t.spanProcessors), !1), this.activeSpanProcessor = new K(this._registeredSpanProcessors);
619
+ else {
620
+ var i = this._buildExporterFromEnv();
621
+ if (i !== void 0) {
622
+ var a = new Dt(i);
623
+ this.activeSpanProcessor = a;
624
+ } else
625
+ this.activeSpanProcessor = new jt();
626
+ }
627
+ }
628
+ return e.prototype.getTracer = function(t, r, n) {
629
+ var o = t + "@" + (r || "") + ":" + ((n == null ? void 0 : n.schemaUrl) || "");
630
+ return this._tracers.has(o) || this._tracers.set(o, new zt({ name: t, version: r, schemaUrl: n == null ? void 0 : n.schemaUrl }, this._config, this)), this._tracers.get(o);
631
+ }, e.prototype.addSpanProcessor = function(t) {
632
+ this._registeredSpanProcessors.length === 0 && this.activeSpanProcessor.shutdown().catch(function(r) {
633
+ return d.error("Error while trying to shutdown current span processor", r);
634
+ }), this._registeredSpanProcessors.push(t), this.activeSpanProcessor = new K(this._registeredSpanProcessors);
635
+ }, e.prototype.getActiveSpanProcessor = function() {
636
+ return this.activeSpanProcessor;
637
+ }, e.prototype.register = function(t) {
638
+ t === void 0 && (t = {}), _.setGlobalTracerProvider(this), t.propagator === void 0 && (t.propagator = this._buildPropagatorFromEnv()), t.contextManager && T.setGlobalContextManager(t.contextManager), t.propagator && ht.setGlobalPropagator(t.propagator);
639
+ }, e.prototype.forceFlush = function() {
640
+ var t = this._config.forceFlushTimeoutMillis, r = this._registeredSpanProcessors.map(function(n) {
641
+ return new Promise(function(o) {
642
+ var i, a = setTimeout(function() {
643
+ o(new Error("Span processor did not completed within timeout period of " + t + " ms")), i = S.timeout;
644
+ }, t);
645
+ n.forceFlush().then(function() {
646
+ clearTimeout(a), i !== S.timeout && (i = S.resolved, o(i));
647
+ }).catch(function(s) {
648
+ clearTimeout(a), i = S.error, o(s);
649
+ });
650
+ });
651
+ });
652
+ return new Promise(function(n, o) {
653
+ Promise.all(r).then(function(i) {
654
+ var a = i.filter(function(s) {
655
+ return s !== S.resolved;
656
+ });
657
+ a.length > 0 ? o(a) : n();
658
+ }).catch(function(i) {
659
+ return o([i]);
660
+ });
661
+ });
662
+ }, e.prototype.shutdown = function() {
663
+ return this.activeSpanProcessor.shutdown();
664
+ }, e.prototype._getPropagator = function(t) {
665
+ var r;
666
+ return (r = this.constructor._registeredPropagators.get(t)) === null || r === void 0 ? void 0 : r();
667
+ }, e.prototype._getSpanExporter = function(t) {
668
+ var r;
669
+ return (r = this.constructor._registeredExporters.get(t)) === null || r === void 0 ? void 0 : r();
670
+ }, e.prototype._buildPropagatorFromEnv = function() {
671
+ var t = this, r = Array.from(new Set(A().OTEL_PROPAGATORS)), n = r.map(function(i) {
672
+ var a = t._getPropagator(i);
673
+ return a || d.warn('Propagator "' + i + '" requested through environment variable is unavailable.'), a;
674
+ }), o = n.reduce(function(i, a) {
675
+ return a && i.push(a), i;
676
+ }, []);
677
+ if (o.length !== 0)
678
+ return r.length === 1 ? o[0] : new yt({
679
+ propagators: o
680
+ });
681
+ }, e.prototype._buildExporterFromEnv = function() {
682
+ var t = A().OTEL_TRACES_EXPORTER;
683
+ if (!(t === "none" || t === "")) {
684
+ var r = this._getSpanExporter(t);
685
+ return r || d.error('Exporter "' + t + '" requested through environment variable is unavailable.'), r;
686
+ }
687
+ }, e._registeredPropagators = /* @__PURE__ */ new Map([
688
+ ["tracecontext", function() {
689
+ return new Et();
690
+ }],
691
+ ["baggage", function() {
692
+ return new Tt();
693
+ }]
694
+ ]), e._registeredExporters = /* @__PURE__ */ new Map(), e;
695
+ }()
696
+ ), Ht = function(e) {
697
+ var t = typeof Symbol == "function" && Symbol.iterator, r = t && e[t], n = 0;
698
+ if (r) return r.call(e);
699
+ if (e && typeof e.length == "number") return {
700
+ next: function() {
701
+ return e && n >= e.length && (e = void 0), { value: e && e[n++], done: !e };
702
+ }
703
+ };
704
+ throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
705
+ }, ne = (
706
+ /** @class */
707
+ function() {
708
+ function e() {
709
+ }
710
+ return e.prototype.export = function(t, r) {
711
+ return this._sendSpans(t, r);
712
+ }, e.prototype.shutdown = function() {
713
+ return this._sendSpans([]), this.forceFlush();
714
+ }, e.prototype.forceFlush = function() {
715
+ return Promise.resolve();
716
+ }, e.prototype._exportInfo = function(t) {
717
+ var r;
718
+ return {
719
+ resource: {
720
+ attributes: t.resource.attributes
721
+ },
722
+ instrumentationScope: t.instrumentationLibrary,
723
+ traceId: t.spanContext().traceId,
724
+ parentId: t.parentSpanId,
725
+ traceState: (r = t.spanContext().traceState) === null || r === void 0 ? void 0 : r.serialize(),
726
+ name: t.name,
727
+ id: t.spanContext().spanId,
728
+ kind: t.kind,
729
+ timestamp: k(t.startTime),
730
+ duration: k(t.duration),
731
+ attributes: t.attributes,
732
+ status: t.status,
733
+ events: t.events,
734
+ links: t.links
735
+ };
736
+ }, e.prototype._sendSpans = function(t, r) {
737
+ var n, o;
738
+ try {
739
+ for (var i = Ht(t), a = i.next(); !a.done; a = i.next()) {
740
+ var s = a.value;
741
+ console.dir(this._exportInfo(s), { depth: 3 });
742
+ }
743
+ } catch (l) {
744
+ n = { error: l };
745
+ } finally {
746
+ try {
747
+ a && !a.done && (o = i.return) && o.call(i);
748
+ } finally {
749
+ if (n) throw n.error;
750
+ }
751
+ }
752
+ if (r)
753
+ return r({ code: w.SUCCESS });
754
+ }, e;
755
+ }()
756
+ ), Qt = function(e, t) {
757
+ var r = typeof Symbol == "function" && e[Symbol.iterator];
758
+ if (!r) return e;
759
+ var n = r.call(e), o, i = [], a;
760
+ try {
761
+ for (; (t === void 0 || t-- > 0) && !(o = n.next()).done; ) i.push(o.value);
762
+ } catch (s) {
763
+ a = { error: s };
764
+ } finally {
765
+ try {
766
+ o && !o.done && (r = n.return) && r.call(n);
767
+ } finally {
768
+ if (a) throw a.error;
769
+ }
770
+ }
771
+ return i;
772
+ }, Xt = function(e, t, r) {
773
+ if (r || arguments.length === 2) for (var n = 0, o = t.length, i; n < o; n++)
774
+ (i || !(n in t)) && (i || (i = Array.prototype.slice.call(t, 0, n)), i[n] = t[n]);
775
+ return e.concat(i || Array.prototype.slice.call(t));
776
+ }, ie = (
777
+ /** @class */
778
+ function() {
779
+ function e() {
780
+ this._finishedSpans = [], this._stopped = !1;
781
+ }
782
+ return e.prototype.export = function(t, r) {
783
+ var n;
784
+ if (this._stopped)
785
+ return r({
786
+ code: w.FAILED,
787
+ error: new Error("Exporter has been stopped")
788
+ });
789
+ (n = this._finishedSpans).push.apply(n, Xt([], Qt(t), !1)), setTimeout(function() {
790
+ return r({ code: w.SUCCESS });
791
+ }, 0);
792
+ }, e.prototype.shutdown = function() {
793
+ return this._stopped = !0, this._finishedSpans = [], this.forceFlush();
794
+ }, e.prototype.forceFlush = function() {
795
+ return Promise.resolve();
796
+ }, e.prototype.reset = function() {
797
+ this._finishedSpans = [];
798
+ }, e.prototype.getFinishedSpans = function() {
799
+ return this._finishedSpans;
800
+ }, e;
801
+ }()
802
+ ), Wt = function(e, t, r, n) {
803
+ function o(i) {
804
+ return i instanceof r ? i : new r(function(a) {
805
+ a(i);
806
+ });
807
+ }
808
+ return new (r || (r = Promise))(function(i, a) {
809
+ function s(p) {
810
+ try {
811
+ u(n.next(p));
812
+ } catch (f) {
813
+ a(f);
814
+ }
815
+ }
816
+ function l(p) {
817
+ try {
818
+ u(n.throw(p));
819
+ } catch (f) {
820
+ a(f);
821
+ }
822
+ }
823
+ function u(p) {
824
+ p.done ? i(p.value) : o(p.value).then(s, l);
825
+ }
826
+ u((n = n.apply(e, t || [])).next());
827
+ });
828
+ }, Yt = function(e, t) {
829
+ var r = { label: 0, sent: function() {
830
+ if (i[0] & 1) throw i[1];
831
+ return i[1];
832
+ }, trys: [], ops: [] }, n, o, i, a;
833
+ return a = { next: s(0), throw: s(1), return: s(2) }, typeof Symbol == "function" && (a[Symbol.iterator] = function() {
834
+ return this;
835
+ }), a;
836
+ function s(u) {
837
+ return function(p) {
838
+ return l([u, p]);
839
+ };
840
+ }
841
+ function l(u) {
842
+ if (n) throw new TypeError("Generator is already executing.");
843
+ for (; r; ) try {
844
+ if (n = 1, o && (i = u[0] & 2 ? o.return : u[0] ? o.throw || ((i = o.return) && i.call(o), 0) : o.next) && !(i = i.call(o, u[1])).done) return i;
845
+ switch (o = 0, i && (u = [u[0] & 2, i.value]), u[0]) {
846
+ case 0:
847
+ case 1:
848
+ i = u;
849
+ break;
850
+ case 4:
851
+ return r.label++, { value: u[1], done: !1 };
852
+ case 5:
853
+ r.label++, o = u[1], u = [0];
854
+ continue;
855
+ case 7:
856
+ u = r.ops.pop(), r.trys.pop();
857
+ continue;
858
+ default:
859
+ if (i = r.trys, !(i = i.length > 0 && i[i.length - 1]) && (u[0] === 6 || u[0] === 2)) {
860
+ r = 0;
861
+ continue;
862
+ }
863
+ if (u[0] === 3 && (!i || u[1] > i[0] && u[1] < i[3])) {
864
+ r.label = u[1];
865
+ break;
866
+ }
867
+ if (u[0] === 6 && r.label < i[1]) {
868
+ r.label = i[1], i = u;
869
+ break;
870
+ }
871
+ if (i && r.label < i[2]) {
872
+ r.label = i[2], r.ops.push(u);
873
+ break;
874
+ }
875
+ i[2] && r.ops.pop(), r.trys.pop();
876
+ continue;
877
+ }
878
+ u = t.call(e, r);
879
+ } catch (p) {
880
+ u = [6, p], o = 0;
881
+ } finally {
882
+ n = i = 0;
883
+ }
884
+ if (u[0] & 5) throw u[1];
885
+ return { value: u[0] ? u[1] : void 0, done: !0 };
886
+ }
887
+ }, oe = (
888
+ /** @class */
889
+ function() {
890
+ function e(t) {
891
+ this._exporter = t, this._shutdownOnce = new Z(this._shutdown, this), this._unresolvedExports = /* @__PURE__ */ new Set();
892
+ }
893
+ return e.prototype.forceFlush = function() {
894
+ return Wt(this, void 0, void 0, function() {
895
+ return Yt(this, function(t) {
896
+ switch (t.label) {
897
+ case 0:
898
+ return [4, Promise.all(Array.from(this._unresolvedExports))];
899
+ case 1:
900
+ return t.sent(), this._exporter.forceFlush ? [4, this._exporter.forceFlush()] : [3, 3];
901
+ case 2:
902
+ t.sent(), t.label = 3;
903
+ case 3:
904
+ return [
905
+ 2
906
+ /*return*/
907
+ ];
908
+ }
909
+ });
910
+ });
911
+ }, e.prototype.onStart = function(t, r) {
912
+ }, e.prototype.onEnd = function(t) {
913
+ var r = this, n, o;
914
+ if (!this._shutdownOnce.isCalled && t.spanContext().traceFlags & L.SAMPLED) {
915
+ var i = function() {
916
+ return Lt._export(r._exporter, [t]).then(function(s) {
917
+ var l;
918
+ s.code !== w.SUCCESS && h((l = s.error) !== null && l !== void 0 ? l : new Error("SimpleSpanProcessor: span export failed (status " + s + ")"));
919
+ }).catch(function(s) {
920
+ h(s);
921
+ });
922
+ };
923
+ if (t.resource.asyncAttributesPending) {
924
+ var a = (o = (n = t.resource).waitForAsyncAttributes) === null || o === void 0 ? void 0 : o.call(n).then(function() {
925
+ return a != null && r._unresolvedExports.delete(a), i();
926
+ }, function(s) {
927
+ return h(s);
928
+ });
929
+ a != null && this._unresolvedExports.add(a);
930
+ } else
931
+ i();
932
+ }
933
+ }, e.prototype.shutdown = function() {
934
+ return this._shutdownOnce.call();
935
+ }, e.prototype._shutdown = function() {
936
+ return this._exporter.shutdown();
937
+ }, e;
938
+ }()
939
+ );
940
+ export {
941
+ I as A,
942
+ re as B,
943
+ ne as C,
944
+ S as F,
945
+ ie as I,
946
+ jt as N,
947
+ D as P,
948
+ Gt as R,
949
+ oe as S,
950
+ zt as T,
951
+ Dt as a,
952
+ g as b,
953
+ W as c,
954
+ P as d,
955
+ Ot as e
956
+ };
957
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiU2ltcGxlU3BhblByb2Nlc3Nvci0hfnswMDJ9fi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZiBhcyBTcGFuU3RhdHVzQ29kZSwgdCBhcyB0cmFjZSwgaSBhcyBpc1NwYW5Db250ZXh0VmFsaWQsIFQgYXMgVHJhY2VGbGFncywgZCBhcyBpc1ZhbGlkVHJhY2VJZCwgYyBhcyBjb250ZXh0LCBJIGFzIElOVkFMSURfU1BBTl9DT05URVhULCBTIGFzIFNwYW5LaW5kIH0gZnJvbSAnLi9pbmRleC0hfnswMDV9fi5qcyc7XG5pbXBvcnQgeyBkIGFzIGRpYWcgfSBmcm9tICcuL2RpYWctYXBpLSF+ezAwNH1+LmpzJztcbmltcG9ydCB7IGwgYXMgaXNUaW1lSW5wdXQsIG4gYXMgaHJUaW1lRHVyYXRpb24sIG8gYXMgb3RwZXJmb3JtYW5jZSwgaiBhcyBoclRpbWUsIG0gYXMgbWlsbGlzVG9IclRpbWUsIHEgYXMgaXNUaW1lSW5wdXRIclRpbWUsIHIgYXMgYWRkSHJUaW1lcywgcyBhcyBTRU1BVFRSU19FWENFUFRJT05fVFlQRSwgdiBhcyBTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRSwgdyBhcyBnZXRUaW1lT3JpZ2luLCB4IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFLCBwIGFzIHByb3BhZ2F0aW9uLCB5IGFzIGhyVGltZVRvTWljcm9zZWNvbmRzIH0gZnJvbSAnLi91cmwtIX57MDA4fX4uanMnO1xuaW1wb3J0IHsgaSBhcyBpc0F0dHJpYnV0ZVZhbHVlLCBzIGFzIHNhbml0aXplQXR0cmlidXRlcywgZyBhcyBnbG9iYWxFcnJvckhhbmRsZXIsIGEgYXMgc3VwcHJlc3NUcmFjaW5nLCB1IGFzIHVucmVmVGltZXIsIEIgYXMgQmluZE9uY2VGdXR1cmUsIGIgYXMgaXNUcmFjaW5nU3VwcHJlc3NlZCwgUyBhcyBTYW1wbGluZ0RlY2lzaW9uJDEsIEMgYXMgQ29tcG9zaXRlUHJvcGFnYXRvciwgVyBhcyBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yLCBjIGFzIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLCBtIGFzIG1lcmdlLCBkIGFzIGludGVybmFsIH0gZnJvbSAnLi9pbmRleC0hfnswMGt9fi5qcyc7XG5pbXBvcnQgeyBUIGFzIFRyYWNlc1NhbXBsZXJWYWx1ZXMsIGggYXMgZ2V0RW52LCBpIGFzIGdldEVudldpdGhvdXREZWZhdWx0cywgRCBhcyBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCwgaiBhcyBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwYX1+LmpzJztcbmltcG9ydCB7IFIgYXMgUmVzb3VyY2UgfSBmcm9tICcuL1Jlc291cmNlLSF+ezAwOX1+LmpzJztcbmltcG9ydCB7IEUgYXMgRXhwb3J0UmVzdWx0Q29kZSB9IGZyb20gJy4vRXhwb3J0UmVzdWx0LSF+ezAwY31+LmpzJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8vIEV2ZW50IG5hbWUgZGVmaW5pdGlvbnNcbnZhciBFeGNlcHRpb25FdmVudE5hbWUgPSAnZXhjZXB0aW9uJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX2Fzc2lnbiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fdmFsdWVzJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xudmFyIF9fcmVhZCQyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkkMiA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzcGFuLlxuICovXG52YXIgU3BhbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFNwYW4gaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBjYWxsaW5nIFNwYW4gY29uc3RydWN0b3IgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVzZSB0cmFjZXIuc3RhcnRTcGFuLlxuICAgICAqICovXG4gICAgZnVuY3Rpb24gU3BhbihwYXJlbnRUcmFjZXIsIGNvbnRleHQsIHNwYW5OYW1lLCBzcGFuQ29udGV4dCwga2luZCwgcGFyZW50U3BhbklkLCBsaW5rcywgc3RhcnRUaW1lLCBfZGVwcmVjYXRlZENsb2NrLCAvLyBrZWVwaW5nIHRoaXMgYXJndW1lbnQgZXZlbiB0aG91Z2ggaXQgaXMgdW51c2VkIHRvIGVuc3VyZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgaWYgKGxpbmtzID09PSB2b2lkIDApIHsgbGlua3MgPSBbXTsgfVxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5saW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmV2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLl9kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5fZHJvcHBlZExpbmtzQ291bnQgPSAwO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHtcbiAgICAgICAgICAgIGNvZGU6IFNwYW5TdGF0dXNDb2RlLlVOU0VULFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVuZFRpbWUgPSBbMCwgMF07XG4gICAgICAgIHRoaXMuX2VuZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gWy0xLCAtMV07XG4gICAgICAgIHRoaXMubmFtZSA9IHNwYW5OYW1lO1xuICAgICAgICB0aGlzLl9zcGFuQ29udGV4dCA9IHNwYW5Db250ZXh0O1xuICAgICAgICB0aGlzLnBhcmVudFNwYW5JZCA9IHBhcmVudFNwYW5JZDtcbiAgICAgICAgdGhpcy5raW5kID0ga2luZDtcbiAgICAgICAgdGhpcy5saW5rcyA9IGxpbmtzO1xuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5fcGVyZm9ybWFuY2VTdGFydFRpbWUgPSBvdHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICB0aGlzLl9wZXJmb3JtYW5jZU9mZnNldCA9XG4gICAgICAgICAgICBub3cgLSAodGhpcy5fcGVyZm9ybWFuY2VTdGFydFRpbWUgKyBnZXRUaW1lT3JpZ2luKCkpO1xuICAgICAgICB0aGlzLl9zdGFydFRpbWVQcm92aWRlZCA9IHN0YXJ0VGltZSAhPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IHRoaXMuX2dldFRpbWUoc3RhcnRUaW1lICE9PSBudWxsICYmIHN0YXJ0VGltZSAhPT0gdm9pZCAwID8gc3RhcnRUaW1lIDogbm93KTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHBhcmVudFRyYWNlci5yZXNvdXJjZTtcbiAgICAgICAgdGhpcy5pbnN0cnVtZW50YXRpb25MaWJyYXJ5ID0gcGFyZW50VHJhY2VyLmluc3RydW1lbnRhdGlvbkxpYnJhcnk7XG4gICAgICAgIHRoaXMuX3NwYW5MaW1pdHMgPSBwYXJlbnRUcmFjZXIuZ2V0U3BhbkxpbWl0cygpO1xuICAgICAgICB0aGlzLl9hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0ID1cbiAgICAgICAgICAgIHRoaXMuX3NwYW5MaW1pdHMuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCB8fCAwO1xuICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3BhblByb2Nlc3NvciA9IHBhcmVudFRyYWNlci5nZXRBY3RpdmVTcGFuUHJvY2Vzc29yKCk7XG4gICAgICAgIHRoaXMuX3NwYW5Qcm9jZXNzb3Iub25TdGFydCh0aGlzLCBjb250ZXh0KTtcbiAgICB9XG4gICAgU3Bhbi5wcm90b3R5cGUuc3BhbkNvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGFuQ29udGV4dDtcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLnNldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHRoaXMuX2lzU3BhbkVuZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkludmFsaWQgYXR0cmlidXRlIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0F0dHJpYnV0ZVZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiSW52YWxpZCBhdHRyaWJ1dGUgdmFsdWUgc2V0IGZvciBrZXk6IFwiICsga2V5KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmF0dHJpYnV0ZXMpLmxlbmd0aCA+PVxuICAgICAgICAgICAgdGhpcy5fc3BhbkxpbWl0cy5hdHRyaWJ1dGVDb3VudExpbWl0ICYmXG4gICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuYXR0cmlidXRlcywga2V5KSkge1xuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzW2tleV0gPSB0aGlzLl90cnVuY2F0ZVRvU2l6ZSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVzKSB7XG4gICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyQyKE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBfZCA9IF9fcmVhZCQyKF9jLnZhbHVlLCAyKSwgayA9IF9kWzBdLCB2ID0gX2RbMV07XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgU3BhbiBOYW1lXG4gICAgICogQHBhcmFtIFthdHRyaWJ1dGVzT3JTdGFydFRpbWVdIFNwYW4gYXR0cmlidXRlcyBvciBzdGFydCB0aW1lXG4gICAgICogICAgIGlmIHR5cGUgaXMge0B0eXBlIFRpbWVJbnB1dH0gYW5kIDNyZCBwYXJhbSBpcyB1bmRlZmluZWRcbiAgICAgKiBAcGFyYW0gW3RpbWVTdGFtcF0gU3BlY2lmaWVkIHRpbWUgc3RhbXAgZm9yIHRoZSBldmVudFxuICAgICAqL1xuICAgIFNwYW4ucHJvdG90eXBlLmFkZEV2ZW50ID0gZnVuY3Rpb24gKG5hbWUsIGF0dHJpYnV0ZXNPclN0YXJ0VGltZSwgdGltZVN0YW1wKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NwYW5FbmRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIGlmICh0aGlzLl9zcGFuTGltaXRzLmV2ZW50Q291bnRMaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKCdObyBldmVudHMgYWxsb3dlZC4nKTtcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzLmxlbmd0aCA+PSB0aGlzLl9zcGFuTGltaXRzLmV2ZW50Q291bnRMaW1pdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRpYWcuZGVidWcoJ0Ryb3BwaW5nIGV4dHJhIGV2ZW50cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNUaW1lSW5wdXQoYXR0cmlidXRlc09yU3RhcnRUaW1lKSkge1xuICAgICAgICAgICAgaWYgKCFpc1RpbWVJbnB1dCh0aW1lU3RhbXApKSB7XG4gICAgICAgICAgICAgICAgdGltZVN0YW1wID0gYXR0cmlidXRlc09yU3RhcnRUaW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXR0cmlidXRlc09yU3RhcnRUaW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gc2FuaXRpemVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNPclN0YXJ0VGltZSk7XG4gICAgICAgIHRoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICB0aW1lOiB0aGlzLl9nZXRUaW1lKHRpbWVTdGFtcCksXG4gICAgICAgICAgICBkcm9wcGVkQXR0cmlidXRlc0NvdW50OiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5hZGRMaW5rID0gZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgICAgdGhpcy5saW5rcy5wdXNoKGxpbmspO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLmFkZExpbmtzID0gZnVuY3Rpb24gKGxpbmtzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5saW5rcykucHVzaC5hcHBseShfYSwgX19zcHJlYWRBcnJheSQyKFtdLCBfX3JlYWQkMihsaW5rcyksIGZhbHNlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0U3RhdHVzID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAgICAgICBpZiAodGhpcy5faXNTcGFuRW5kZWQoKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IF9fYXNzaWduKHt9LCBzdGF0dXMpO1xuICAgICAgICAvLyBXaGVuIHVzaW5nIHRyeS1jYXRjaCwgdGhlIGNhdWdodCBcImVycm9yXCIgaXMgb2YgdHlwZSBgYW55YC4gV2hlbiB0aGVuIGFzc2lnbmluZyBgYW55YCB0byBgc3RhdHVzLm1lc3NhZ2VgLFxuICAgICAgICAvLyBUeXBlU2NyaXB0IHdpbGwgbm90IGVycm9yLiBXaGlsZSB0aGlzIGNhbiBoYXBwZW4gZHVyaW5nIHVzZSBvZiBhbnkgQVBJLCBpdCBpcyBtb3JlIGNvbW1vbiBvbiBTcGFuI3NldFN0YXR1cygpXG4gICAgICAgIC8vIGFzIGl0J3MgbGlrZWx5IHVzZWQgaW4gYSBjYXRjaC1ibG9jay4gVGhlcmVmb3JlLCB3ZSB2YWxpZGF0ZSBpZiBgc3RhdHVzLm1lc3NhZ2VgIGlzIGFjdHVhbGx5IGEgc3RyaW5nLCBudWxsLCBvclxuICAgICAgICAvLyB1bmRlZmluZWQgdG8gYXZvaWQgYW4gaW5jb3JyZWN0IHR5cGUgY2F1c2luZyBpc3N1ZXMgZG93bnN0cmVhbS5cbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzLm1lc3NhZ2UgIT0gbnVsbCAmJiB0eXBlb2Ygc3RhdHVzLm1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJEcm9wcGluZyBpbnZhbGlkIHN0YXR1cy5tZXNzYWdlIG9mIHR5cGUgJ1wiICsgdHlwZW9mIHN0YXR1cy5tZXNzYWdlICsgXCInLCBleHBlY3RlZCAnc3RyaW5nJ1wiKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0YXR1cy5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUudXBkYXRlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1NwYW5FbmRlZCgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGVuZFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzU3BhbkVuZGVkKCkpIHtcbiAgICAgICAgICAgIGRpYWcuZXJyb3IodGhpcy5uYW1lICsgXCIgXCIgKyB0aGlzLl9zcGFuQ29udGV4dC50cmFjZUlkICsgXCItXCIgKyB0aGlzLl9zcGFuQ29udGV4dC5zcGFuSWQgKyBcIiAtIFlvdSBjYW4gb25seSBjYWxsIGVuZCgpIG9uIGEgc3BhbiBvbmNlLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbmRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZW5kVGltZSA9IHRoaXMuX2dldFRpbWUoZW5kVGltZSk7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gaHJUaW1lRHVyYXRpb24odGhpcy5zdGFydFRpbWUsIHRoaXMuZW5kVGltZSk7XG4gICAgICAgIGlmICh0aGlzLl9kdXJhdGlvblswXSA8IDApIHtcbiAgICAgICAgICAgIGRpYWcud2FybignSW5jb25zaXN0ZW50IHN0YXJ0IGFuZCBlbmQgdGltZSwgc3RhcnRUaW1lID4gZW5kVGltZS4gU2V0dGluZyBzcGFuIGR1cmF0aW9uIHRvIDBtcy4nLCB0aGlzLnN0YXJ0VGltZSwgdGhpcy5lbmRUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuZW5kVGltZSA9IHRoaXMuc3RhcnRUaW1lLnNsaWNlKCk7XG4gICAgICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IFswLCAwXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZHJvcHBlZEV2ZW50c0NvdW50ID4gMCkge1xuICAgICAgICAgICAgZGlhZy53YXJuKFwiRHJvcHBlZCBcIiArIHRoaXMuX2Ryb3BwZWRFdmVudHNDb3VudCArIFwiIGV2ZW50cyBiZWNhdXNlIGV2ZW50Q291bnRMaW1pdCByZWFjaGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NwYW5Qcm9jZXNzb3Iub25FbmQodGhpcyk7XG4gICAgfTtcbiAgICBTcGFuLnByb3RvdHlwZS5fZ2V0VGltZSA9IGZ1bmN0aW9uIChpbnApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnAgPT09ICdudW1iZXInICYmIGlucCA8PSBvdHBlcmZvcm1hbmNlLm5vdygpKSB7XG4gICAgICAgICAgICAvLyBtdXN0IGJlIGEgcGVyZm9ybWFuY2UgdGltZXN0YW1wXG4gICAgICAgICAgICAvLyBhcHBseSBjb3JyZWN0aW9uIGFuZCBjb252ZXJ0IHRvIGhydGltZVxuICAgICAgICAgICAgcmV0dXJuIGhyVGltZShpbnAgKyB0aGlzLl9wZXJmb3JtYW5jZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpbnAgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gbWlsbGlzVG9IclRpbWUoaW5wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbGxpc1RvSHJUaW1lKGlucC5nZXRUaW1lKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1RpbWVJbnB1dEhyVGltZShpbnApKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdGFydFRpbWVQcm92aWRlZCkge1xuICAgICAgICAgICAgLy8gaWYgdXNlciBwcm92aWRlZCBhIHRpbWUgZm9yIHRoZSBzdGFydCBtYW51YWxseVxuICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdXNlIGR1cmF0aW9uIHRvIGNhbGN1bGF0ZSBldmVudC9lbmQgdGltZXNcbiAgICAgICAgICAgIHJldHVybiBtaWxsaXNUb0hyVGltZShEYXRlLm5vdygpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbXNEdXJhdGlvbiA9IG90cGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLl9wZXJmb3JtYW5jZVN0YXJ0VGltZTtcbiAgICAgICAgcmV0dXJuIGFkZEhyVGltZXModGhpcy5zdGFydFRpbWUsIG1pbGxpc1RvSHJUaW1lKG1zRHVyYXRpb24pKTtcbiAgICB9O1xuICAgIFNwYW4ucHJvdG90eXBlLmlzUmVjb3JkaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5kZWQgPT09IGZhbHNlO1xuICAgIH07XG4gICAgU3Bhbi5wcm90b3R5cGUucmVjb3JkRXhjZXB0aW9uID0gZnVuY3Rpb24gKGV4Y2VwdGlvbiwgdGltZSkge1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGV4Y2VwdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXNbU0VNQVRUUlNfRVhDRVBUSU9OX01FU1NBR0VdID0gZXhjZXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5jb2RlKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fVFlQRV0gPSBleGNlcHRpb24uY29kZS50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXhjZXB0aW9uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9UWVBFXSA9IGV4Y2VwdGlvbi5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRV0gPSBleGNlcHRpb24ubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChleGNlcHRpb24uc3RhY2spIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFXSA9IGV4Y2VwdGlvbi5zdGFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aGVzZSBhcmUgbWluaW11bSByZXF1aXJlbWVudHMgZnJvbSBzcGVjXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzW1NFTUFUVFJTX0VYQ0VQVElPTl9UWVBFXSB8fFxuICAgICAgICAgICAgYXR0cmlidXRlc1tTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRV0pIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnQoRXhjZXB0aW9uRXZlbnROYW1lLCBhdHRyaWJ1dGVzLCB0aW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRpYWcud2FybihcIkZhaWxlZCB0byByZWNvcmQgYW4gZXhjZXB0aW9uIFwiICsgZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNwYW4ucHJvdG90eXBlLCBcImR1cmF0aW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZHVyYXRpb247XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3Bhbi5wcm90b3R5cGUsIFwiZW5kZWRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmRlZDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTcGFuLnByb3RvdHlwZSwgXCJkcm9wcGVkRXZlbnRzQ291bnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcm9wcGVkRXZlbnRzQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3Bhbi5wcm90b3R5cGUsIFwiZHJvcHBlZExpbmtzQ291bnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcm9wcGVkTGlua3NDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIFNwYW4ucHJvdG90eXBlLl9pc1NwYW5FbmRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2VuZGVkKSB7XG4gICAgICAgICAgICBkaWFnLndhcm4oXCJDYW4gbm90IGV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBvbiBlbmRlZCBTcGFuIHt0cmFjZUlkOiBcIiArIHRoaXMuX3NwYW5Db250ZXh0LnRyYWNlSWQgKyBcIiwgc3BhbklkOiBcIiArIHRoaXMuX3NwYW5Db250ZXh0LnNwYW5JZCArIFwifVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZW5kZWQ7XG4gICAgfTtcbiAgICAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIHRydW5jYXRlIGdpdmVuIHZhbHVlIHdpdGhpbiBzaXplXG4gICAgLy8gZm9yIHZhbHVlIHR5cGUgb2Ygc3RyaW5nLCB3aWxsIHRydW5jYXRlIHRvIGdpdmVuIGxpbWl0XG4gICAgLy8gZm9yIHR5cGUgb2Ygbm9uLXN0cmluZywgd2lsbCByZXR1cm4gc2FtZSB2YWx1ZVxuICAgIFNwYW4ucHJvdG90eXBlLl90cnVuY2F0ZVRvTGltaXRVdGlsID0gZnVuY3Rpb24gKHZhbHVlLCBsaW1pdCkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDw9IGxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygwLCBsaW1pdCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlIGlzIG9mIHR5cGUgc3RyaW5nIGFuZCBoYXMgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gZ2l2ZW4ge0Bjb2RlIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR9IHRoZW5cbiAgICAgKiByZXR1cm4gc3RyaW5nIHdpdGggdHJ1bmNhdGVkIHRvIHtAY29kZSBhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0fSBjaGFyYWN0ZXJzXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlIGlzIGFycmF5IG9mIHN0cmluZ3MgdGhlblxuICAgICAqIHJldHVybiBuZXcgYXJyYXkgb2Ygc3RyaW5ncyB3aXRoIGVhY2ggZWxlbWVudCB0cnVuY2F0ZWQgdG8ge0Bjb2RlIGF0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXR9IGNoYXJhY3RlcnNcbiAgICAgKlxuICAgICAqIE90aGVyd2lzZSByZXR1cm4gc2FtZSBBdHRyaWJ1dGUge0Bjb2RlIHZhbHVlfVxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIHRydW5jYXRlZCBhdHRyaWJ1dGUgdmFsdWUgaWYgcmVxdWlyZWQsIG90aGVyd2lzZSBzYW1lIHZhbHVlXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuX3RydW5jYXRlVG9TaXplID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBsaW1pdCA9IHRoaXMuX2F0dHJpYnV0ZVZhbHVlTGVuZ3RoTGltaXQ7XG4gICAgICAgIC8vIENoZWNrIGxpbWl0XG4gICAgICAgIGlmIChsaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICAvLyBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGludmFsaWQsIHNvIGRvIG5vdCB0cnVuY2F0ZVxuICAgICAgICAgICAgZGlhZy53YXJuKFwiQXR0cmlidXRlIHZhbHVlIGxpbWl0IG11c3QgYmUgcG9zaXRpdmUsIGdvdCBcIiArIGxpbWl0KTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpbmdcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cnVuY2F0ZVRvTGltaXRVdGlsKHZhbHVlLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IF90aGlzLl90cnVuY2F0ZVRvTGltaXRVdGlsKHZhbCwgbGltaXQpIDogdmFsO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXIgdHlwZXMsIG5vIG5lZWQgdG8gYXBwbHkgdmFsdWUgbGVuZ3RoIGxpbWl0XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIHJldHVybiBTcGFuO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBzYW1wbGluZyBkZWNpc2lvbiB0aGF0IGRldGVybWluZXMgaG93IGEge0BsaW5rIFNwYW59IHdpbGwgYmUgcmVjb3JkZWRcbiAqIGFuZCBjb2xsZWN0ZWQuXG4gKi9cbnZhciBTYW1wbGluZ0RlY2lzaW9uO1xuKGZ1bmN0aW9uIChTYW1wbGluZ0RlY2lzaW9uKSB7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gZmFsc2VgLCBzcGFuIHdpbGwgbm90IGJlIHJlY29yZGVkIGFuZCBhbGwgZXZlbnRzXG4gICAgICogYW5kIGF0dHJpYnV0ZXMgd2lsbCBiZSBkcm9wcGVkLlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIk5PVF9SRUNPUkRcIl0gPSAwXSA9IFwiTk9UX1JFQ09SRFwiO1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IHRydWVgLCBidXQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBOT1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRFwiXSA9IDFdID0gXCJSRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCBBTkQgYFNhbXBsZWRgIGZsYWcgaW4ge0BsaW5rIFRyYWNlRmxhZ3N9XG4gICAgICogTVVTVCBiZSBzZXQuXG4gICAgICovXG4gICAgU2FtcGxpbmdEZWNpc2lvbltTYW1wbGluZ0RlY2lzaW9uW1wiUkVDT1JEX0FORF9TQU1QTEVEXCJdID0gMl0gPSBcIlJFQ09SRF9BTkRfU0FNUExFRFwiO1xufSkoU2FtcGxpbmdEZWNpc2lvbiB8fCAoU2FtcGxpbmdEZWNpc2lvbiA9IHt9KSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2FtcGxlciB0aGF0IHNhbXBsZXMgbm8gdHJhY2VzLiAqL1xudmFyIEFsd2F5c09mZlNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT2ZmU2FtcGxlcigpIHtcbiAgICB9XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IFNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09mZlNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ0Fsd2F5c09mZlNhbXBsZXInO1xuICAgIH07XG4gICAgcmV0dXJuIEFsd2F5c09mZlNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqIFNhbXBsZXIgdGhhdCBzYW1wbGVzIGFsbCB0cmFjZXMuICovXG52YXIgQWx3YXlzT25TYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFsd2F5c09uU2FtcGxlcigpIHtcbiAgICB9XG4gICAgQWx3YXlzT25TYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5SRUNPUkRfQU5EX1NBTVBMRUQsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ0Fsd2F5c09uU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT25TYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSBjb21wb3NpdGUgc2FtcGxlciB0aGF0IGVpdGhlciByZXNwZWN0cyB0aGUgcGFyZW50IHNwYW4ncyBzYW1wbGluZyBkZWNpc2lvblxuICogb3IgZGVsZWdhdGVzIHRvIGBkZWxlZ2F0ZVNhbXBsZXJgIGZvciByb290IHNwYW5zLlxuICovXG52YXIgUGFyZW50QmFzZWRTYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhcmVudEJhc2VkU2FtcGxlcihjb25maWcpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICB0aGlzLl9yb290ID0gY29uZmlnLnJvb3Q7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdCkge1xuICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKG5ldyBFcnJvcignUGFyZW50QmFzZWRTYW1wbGVyIG11c3QgaGF2ZSBhIHJvb3Qgc2FtcGxlciBjb25maWd1cmVkJykpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYSA9IGNvbmZpZy5yZW1vdGVQYXJlbnRTYW1wbGVkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9iID0gY29uZmlnLnJlbW90ZVBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2MgPSBjb25maWcubG9jYWxQYXJlbnRTYW1wbGVkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2QgPSBjb25maWcubG9jYWxQYXJlbnROb3RTYW1wbGVkKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBuZXcgQWx3YXlzT2ZmU2FtcGxlcigpO1xuICAgIH1cbiAgICBQYXJlbnRCYXNlZFNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKSB7XG4gICAgICAgIHZhciBwYXJlbnRDb250ZXh0ID0gdHJhY2UuZ2V0U3BhbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIGlmICghcGFyZW50Q29udGV4dCB8fCAhaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudENvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm9vdC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuaXNSZW1vdGUpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb250ZXh0LnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgfTtcbiAgICBQYXJlbnRCYXNlZFNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJQYXJlbnRCYXNlZHtyb290PVwiICsgdGhpcy5fcm9vdC50b1N0cmluZygpICsgXCIsIHJlbW90ZVBhcmVudFNhbXBsZWQ9XCIgKyB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCBsb2NhbFBhcmVudFNhbXBsZWQ9XCIgKyB0aGlzLl9sb2NhbFBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCBsb2NhbFBhcmVudE5vdFNhbXBsZWQ9XCIgKyB0aGlzLl9sb2NhbFBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKSArIFwifVwiO1xuICAgIH07XG4gICAgcmV0dXJuIFBhcmVudEJhc2VkU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiogU2FtcGxlciB0aGF0IHNhbXBsZXMgYSBnaXZlbiBmcmFjdGlvbiBvZiB0cmFjZXMgYmFzZWQgb2YgdHJhY2UgaWQgZGV0ZXJtaW5pc3RpY2FsbHkuICovXG52YXIgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihfcmF0aW8pIHtcbiAgICAgICAgaWYgKF9yYXRpbyA9PT0gdm9pZCAwKSB7IF9yYXRpbyA9IDA7IH1cbiAgICAgICAgdGhpcy5fcmF0aW8gPSBfcmF0aW87XG4gICAgICAgIHRoaXMuX3JhdGlvID0gdGhpcy5fbm9ybWFsaXplKF9yYXRpbyk7XG4gICAgICAgIHRoaXMuX3VwcGVyQm91bmQgPSBNYXRoLmZsb29yKHRoaXMuX3JhdGlvICogMHhmZmZmZmZmZik7XG4gICAgfVxuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBpc1ZhbGlkVHJhY2VJZCh0cmFjZUlkKSAmJiB0aGlzLl9hY2N1bXVsYXRlKHRyYWNlSWQpIDwgdGhpcy5fdXBwZXJCb3VuZFxuICAgICAgICAgICAgICAgID8gU2FtcGxpbmdEZWNpc2lvbi5SRUNPUkRfQU5EX1NBTVBMRURcbiAgICAgICAgICAgICAgICA6IFNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlRyYWNlSWRSYXRpb0Jhc2Vke1wiICsgdGhpcy5fcmF0aW8gKyBcIn1cIjtcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuX25vcm1hbGl6ZSA9IGZ1bmN0aW9uIChyYXRpbykge1xuICAgICAgICBpZiAodHlwZW9mIHJhdGlvICE9PSAnbnVtYmVyJyB8fCBpc05hTihyYXRpbykpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHJhdGlvID49IDEgPyAxIDogcmF0aW8gPD0gMCA/IDAgOiByYXRpbztcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuX2FjY3VtdWxhdGUgPSBmdW5jdGlvbiAodHJhY2VJZCkge1xuICAgICAgICB2YXIgYWNjdW11bGF0aW9uID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFjZUlkLmxlbmd0aCAvIDg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBvcyA9IGkgKiA4O1xuICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJzZUludCh0cmFjZUlkLnNsaWNlKHBvcywgcG9zICsgOCksIDE2KTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGlvbiA9IChhY2N1bXVsYXRpb24gXiBwYXJ0KSA+Pj4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW11bGF0aW9uO1xuICAgIH07XG4gICAgcmV0dXJuIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgRkFMTEJBQ0tfT1RFTF9UUkFDRVNfU0FNUExFUiA9IFRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT247XG52YXIgREVGQVVMVF9SQVRJTyA9IDE7XG4vKipcbiAqIExvYWQgZGVmYXVsdCBjb25maWd1cmF0aW9uLiBGb3IgZmllbGRzIHdpdGggcHJpbWl0aXZlIHZhbHVlcywgYW55IHVzZXItcHJvdmlkZWRcbiAqIHZhbHVlIHdpbGwgb3ZlcnJpZGUgdGhlIGNvcnJlc3BvbmRpbmcgZGVmYXVsdCB2YWx1ZS4gRm9yIGZpZWxkcyB3aXRoXG4gKiBub24tcHJpbWl0aXZlIHZhbHVlcyAobGlrZSBgc3BhbkxpbWl0c2ApLCB0aGUgdXNlci1wcm92aWRlZCB2YWx1ZSB3aWxsIGJlXG4gKiB1c2VkIHRvIGV4dGVuZCB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqL1xuLy8gb2JqZWN0IG5lZWRzIHRvIGJlIHdyYXBwZWQgaW4gdGhpcyBmdW5jdGlvbiBhbmQgY2FsbGVkIHdoZW4gbmVlZGVkIG90aGVyd2lzZVxuLy8gZW52cyBhcmUgcGFyc2VkIGJlZm9yZSB0ZXN0cyBhcmUgcmFuIC0gY2F1c2VzIHRlc3RzIHVzaW5nIHRoZXNlIGVudnMgdG8gZmFpbFxuZnVuY3Rpb24gbG9hZERlZmF1bHRDb25maWcoKSB7XG4gICAgdmFyIGVudiA9IGdldEVudigpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNhbXBsZXI6IGJ1aWxkU2FtcGxlckZyb21FbnYoZW52KSxcbiAgICAgICAgZm9yY2VGbHVzaFRpbWVvdXRNaWxsaXM6IDMwMDAwLFxuICAgICAgICBnZW5lcmFsTGltaXRzOiB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0OiBlbnYuT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgICAgICAgICAgYXR0cmlidXRlQ291bnRMaW1pdDogZW52Lk9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgICAgICB9LFxuICAgICAgICBzcGFuTGltaXRzOiB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0OiBlbnYuT1RFTF9TUEFOX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVDb3VudExpbWl0OiBlbnYuT1RFTF9TUEFOX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGxpbmtDb3VudExpbWl0OiBlbnYuT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQsXG4gICAgICAgICAgICBldmVudENvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fRVZFTlRfQ09VTlRfTElNSVQsXG4gICAgICAgICAgICBhdHRyaWJ1dGVQZXJFdmVudENvdW50TGltaXQ6IGVudi5PVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICAgICAgICAgIGF0dHJpYnV0ZVBlckxpbmtDb3VudExpbWl0OiBlbnYuT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVyZ2VSZXNvdXJjZVdpdGhEZWZhdWx0czogdHJ1ZSxcbiAgICB9O1xufVxuLyoqXG4gKiBCYXNlZCBvbiBlbnZpcm9ubWVudCwgYnVpbGRzIGEgc2FtcGxlciwgY29tcGxpZXMgd2l0aCBzcGVjaWZpY2F0aW9uLlxuICogQHBhcmFtIGVudmlyb25tZW50IG9wdGlvbmFsLCBieSBkZWZhdWx0IHVzZXMgZ2V0RW52KCksIGJ1dCBhbGxvd3MgcGFzc2luZyBhIHZhbHVlIHRvIHJldXNlIHBhcnNlZCBlbnZpcm9ubWVudFxuICovXG5mdW5jdGlvbiBidWlsZFNhbXBsZXJGcm9tRW52KGVudmlyb25tZW50KSB7XG4gICAgaWYgKGVudmlyb25tZW50ID09PSB2b2lkIDApIHsgZW52aXJvbm1lbnQgPSBnZXRFbnYoKTsgfVxuICAgIHN3aXRjaCAoZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUikge1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT246XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuQWx3YXlzT2ZmOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgICAgIGNhc2UgVHJhY2VzU2FtcGxlclZhbHVlcy5QYXJlbnRCYXNlZEFsd2F5c09uOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJlbnRCYXNlZFNhbXBsZXIoe1xuICAgICAgICAgICAgICAgIHJvb3Q6IG5ldyBBbHdheXNPblNhbXBsZXIoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPZmY6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhcmVudEJhc2VkU2FtcGxlcih7XG4gICAgICAgICAgICAgICAgcm9vdDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuVHJhY2VJZFJhdGlvOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIoZ2V0U2FtcGxlclByb2JhYmlsaXR5RnJvbUVudihlbnZpcm9ubWVudCkpO1xuICAgICAgICBjYXNlIFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRUcmFjZUlkUmF0aW86XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBhcmVudEJhc2VkU2FtcGxlcih7XG4gICAgICAgICAgICAgICAgcm9vdDogbmV3IFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihnZXRTYW1wbGVyUHJvYmFiaWxpdHlGcm9tRW52KGVudmlyb25tZW50KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGRpYWcuZXJyb3IoXCJPVEVMX1RSQUNFU19TQU1QTEVSIHZhbHVlIFxcXCJcIiArIGVudmlyb25tZW50Lk9URUxfVFJBQ0VTX1NBTVBMRVIgKyBcIiBpbnZhbGlkLCBkZWZhdWx0aW5nIHRvIFwiICsgRkFMTEJBQ0tfT1RFTF9UUkFDRVNfU0FNUExFUiArIFwiXFxcIi5cIik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFNhbXBsZXJQcm9iYWJpbGl0eUZyb21FbnYoZW52aXJvbm1lbnQpIHtcbiAgICBpZiAoZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyA9PT0gJycpIHtcbiAgICAgICAgZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHIGlzIGJsYW5rLCBkZWZhdWx0aW5nIHRvIFwiICsgREVGQVVMVF9SQVRJTyArIFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfUkFUSU87XG4gICAgfVxuICAgIHZhciBwcm9iYWJpbGl0eSA9IE51bWJlcihlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyk7XG4gICAgaWYgKGlzTmFOKHByb2JhYmlsaXR5KSkge1xuICAgICAgICBkaWFnLmVycm9yKFwiT1RFTF9UUkFDRVNfU0FNUExFUl9BUkc9XCIgKyBlbnZpcm9ubWVudC5PVEVMX1RSQUNFU19TQU1QTEVSX0FSRyArIFwiIHdhcyBnaXZlbiwgYnV0IGl0IGlzIGludmFsaWQsIGRlZmF1bHRpbmcgdG8gXCIgKyBERUZBVUxUX1JBVElPICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SQVRJTztcbiAgICB9XG4gICAgaWYgKHByb2JhYmlsaXR5IDwgMCB8fCBwcm9iYWJpbGl0eSA+IDEpIHtcbiAgICAgICAgZGlhZy5lcnJvcihcIk9URUxfVFJBQ0VTX1NBTVBMRVJfQVJHPVwiICsgZW52aXJvbm1lbnQuT1RFTF9UUkFDRVNfU0FNUExFUl9BUkcgKyBcIiB3YXMgZ2l2ZW4sIGJ1dCBpdCBpcyBvdXQgb2YgcmFuZ2UgKFswLi4xXSksIGRlZmF1bHRpbmcgdG8gXCIgKyBERUZBVUxUX1JBVElPICsgXCIuXCIpO1xuICAgICAgICByZXR1cm4gREVGQVVMVF9SQVRJTztcbiAgICB9XG4gICAgcmV0dXJuIHByb2JhYmlsaXR5O1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBGdW5jdGlvbiB0byBtZXJnZSBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gKGFzIHNwZWNpZmllZCBpbiAnLi9jb25maWcnKSB3aXRoXG4gKiB1c2VyIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25zLlxuICovXG5mdW5jdGlvbiBtZXJnZUNvbmZpZyh1c2VyQ29uZmlnKSB7XG4gICAgdmFyIHBlckluc3RhbmNlRGVmYXVsdHMgPSB7XG4gICAgICAgIHNhbXBsZXI6IGJ1aWxkU2FtcGxlckZyb21FbnYoKSxcbiAgICB9O1xuICAgIHZhciBERUZBVUxUX0NPTkZJRyA9IGxvYWREZWZhdWx0Q29uZmlnKCk7XG4gICAgdmFyIHRhcmdldCA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLCBwZXJJbnN0YW5jZURlZmF1bHRzLCB1c2VyQ29uZmlnKTtcbiAgICB0YXJnZXQuZ2VuZXJhbExpbWl0cyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfQ09ORklHLmdlbmVyYWxMaW1pdHMsIHVzZXJDb25maWcuZ2VuZXJhbExpbWl0cyB8fCB7fSk7XG4gICAgdGFyZ2V0LnNwYW5MaW1pdHMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX0NPTkZJRy5zcGFuTGltaXRzLCB1c2VyQ29uZmlnLnNwYW5MaW1pdHMgfHwge30pO1xuICAgIHJldHVybiB0YXJnZXQ7XG59XG4vKipcbiAqIFdoZW4gZ2VuZXJhbCBsaW1pdHMgYXJlIHByb3ZpZGVkIGFuZCBtb2RlbCBzcGVjaWZpYyBsaW1pdHMgYXJlIG5vdCxcbiAqIGNvbmZpZ3VyZXMgdGhlIG1vZGVsIHNwZWNpZmljIGxpbWl0cyBieSB1c2luZyB0aGUgdmFsdWVzIGZyb20gdGhlIGdlbmVyYWwgb25lcy5cbiAqIEBwYXJhbSB1c2VyQ29uZmlnIFVzZXIgcHJvdmlkZWQgdHJhY2VyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZnVuY3Rpb24gcmVjb25maWd1cmVMaW1pdHModXNlckNvbmZpZykge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZywgX2gsIF9qLCBfaywgX2wsIF9tO1xuICAgIHZhciBzcGFuTGltaXRzID0gT2JqZWN0LmFzc2lnbih7fSwgdXNlckNvbmZpZy5zcGFuTGltaXRzKTtcbiAgICB2YXIgcGFyc2VkRW52Q29uZmlnID0gZ2V0RW52V2l0aG91dERlZmF1bHRzKCk7XG4gICAgLyoqXG4gICAgICogUmVhc3NpZ24gc3BhbiBhdHRyaWJ1dGUgY291bnQgbGltaXQgdG8gdXNlIGZpcnN0IG5vbiBudWxsIHZhbHVlIGRlZmluZWQgYnkgdXNlciBvciB1c2UgZGVmYXVsdCB2YWx1ZVxuICAgICAqL1xuICAgIHNwYW5MaW1pdHMuYXR0cmlidXRlQ291bnRMaW1pdCA9XG4gICAgICAgIChfZiA9IChfZSA9IChfZCA9IChfYiA9IChfYSA9IHVzZXJDb25maWcuc3BhbkxpbWl0cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmF0dHJpYnV0ZUNvdW50TGltaXQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IChfYyA9IHVzZXJDb25maWcuZ2VuZXJhbExpbWl0cykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmF0dHJpYnV0ZUNvdW50TGltaXQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IHBhcnNlZEVudkNvbmZpZy5PVEVMX1NQQU5fQVRUUklCVVRFX0NPVU5UX0xJTUlUKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBwYXJzZWRFbnZDb25maWcuT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUO1xuICAgIC8qKlxuICAgICAqIFJlYXNzaWduIHNwYW4gYXR0cmlidXRlIHZhbHVlIGxlbmd0aCBsaW1pdCB0byB1c2UgZmlyc3Qgbm9uIG51bGwgdmFsdWUgZGVmaW5lZCBieSB1c2VyIG9yIHVzZSBkZWZhdWx0IHZhbHVlXG4gICAgICovXG4gICAgc3BhbkxpbWl0cy5hdHRyaWJ1dGVWYWx1ZUxlbmd0aExpbWl0ID1cbiAgICAgICAgKF9tID0gKF9sID0gKF9rID0gKF9oID0gKF9nID0gdXNlckNvbmZpZy5zcGFuTGltaXRzKSA9PT0gbnVsbCB8fCBfZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2cuYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkgIT09IG51bGwgJiYgX2ggIT09IHZvaWQgMCA/IF9oIDogKF9qID0gdXNlckNvbmZpZy5nZW5lcmFsTGltaXRzKSA9PT0gbnVsbCB8fCBfaiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2ouYXR0cmlidXRlVmFsdWVMZW5ndGhMaW1pdCkgIT09IG51bGwgJiYgX2sgIT09IHZvaWQgMCA/IF9rIDogcGFyc2VkRW52Q29uZmlnLk9URUxfU1BBTl9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiBwYXJzZWRFbnZDb25maWcuT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQ7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHVzZXJDb25maWcsIHsgc3BhbkxpbWl0czogc3BhbkxpbWl0cyB9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTcGFuUHJvY2Vzc29yfSB0aGF0IGJhdGNoZXMgc3BhbnMgZXhwb3J0ZWQgYnlcbiAqIHRoZSBTREsgdGhlbiBwdXNoZXMgdGhlbSB0byB0aGUgZXhwb3J0ZXIgcGlwZWxpbmUuXG4gKi9cbnZhciBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJhdGNoU3BhblByb2Nlc3NvckJhc2UoX2V4cG9ydGVyLCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5fZXhwb3J0ZXIgPSBfZXhwb3J0ZXI7XG4gICAgICAgIHRoaXMuX2lzRXhwb3J0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkU3BhbnMgPSBbXTtcbiAgICAgICAgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgPSAwO1xuICAgICAgICB2YXIgZW52ID0gZ2V0RW52KCk7XG4gICAgICAgIHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSA9XG4gICAgICAgICAgICB0eXBlb2YgKGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5tYXhFeHBvcnRCYXRjaFNpemUpID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgID8gY29uZmlnLm1heEV4cG9ydEJhdGNoU2l6ZVxuICAgICAgICAgICAgICAgIDogZW52Lk9URUxfQlNQX01BWF9FWFBPUlRfQkFUQ0hfU0laRTtcbiAgICAgICAgdGhpcy5fbWF4UXVldWVTaXplID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLm1heFF1ZXVlU2l6ZSkgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgICAgPyBjb25maWcubWF4UXVldWVTaXplXG4gICAgICAgICAgICAgICAgOiBlbnYuT1RFTF9CU1BfTUFYX1FVRVVFX1NJWkU7XG4gICAgICAgIHRoaXMuX3NjaGVkdWxlZERlbGF5TWlsbGlzID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLnNjaGVkdWxlZERlbGF5TWlsbGlzKSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgICA/IGNvbmZpZy5zY2hlZHVsZWREZWxheU1pbGxpc1xuICAgICAgICAgICAgICAgIDogZW52Lk9URUxfQlNQX1NDSEVEVUxFX0RFTEFZO1xuICAgICAgICB0aGlzLl9leHBvcnRUaW1lb3V0TWlsbGlzID1cbiAgICAgICAgICAgIHR5cGVvZiAoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLmV4cG9ydFRpbWVvdXRNaWxsaXMpID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgICAgID8gY29uZmlnLmV4cG9ydFRpbWVvdXRNaWxsaXNcbiAgICAgICAgICAgICAgICA6IGVudi5PVEVMX0JTUF9FWFBPUlRfVElNRU9VVDtcbiAgICAgICAgdGhpcy5fc2h1dGRvd25PbmNlID0gbmV3IEJpbmRPbmNlRnV0dXJlKHRoaXMuX3NodXRkb3duLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSA+IHRoaXMuX21heFF1ZXVlU2l6ZSkge1xuICAgICAgICAgICAgZGlhZy53YXJuKCdCYXRjaFNwYW5Qcm9jZXNzb3I6IG1heEV4cG9ydEJhdGNoU2l6ZSBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8gbWF4UXVldWVTaXplLCBzZXR0aW5nIG1heEV4cG9ydEJhdGNoU2l6ZSB0byBtYXRjaCBtYXhRdWV1ZVNpemUnKTtcbiAgICAgICAgICAgIHRoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSA9IHRoaXMuX21heFF1ZXVlU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fc2h1dGRvd25PbmNlLmlzQ2FsbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2h1dGRvd25PbmNlLnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZsdXNoQWxsKCk7XG4gICAgfTtcbiAgICAvLyBkb2VzIG5vdGhpbmcuXG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChfc3BhbiwgX3BhcmVudENvbnRleHQpIHsgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FkZFRvQnVmZmVyKHNwYW4pO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaHV0ZG93bk9uY2UuY2FsbCgpO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX3NodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5vblNodXRkb3duKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2ZsdXNoQWxsKCk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX2V4cG9ydGVyLnNodXRkb3duKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgLyoqIEFkZCBhIHNwYW4gaW4gdGhlIGJ1ZmZlci4gKi9cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fYWRkVG9CdWZmZXIgPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICBpZiAodGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPj0gdGhpcy5fbWF4UXVldWVTaXplKSB7XG4gICAgICAgICAgICAvLyBsaW1pdCByZWFjaGVkLCBkcm9wIHNwYW5cbiAgICAgICAgICAgIGlmICh0aGlzLl9kcm9wcGVkU3BhbnNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRpYWcuZGVidWcoJ21heFF1ZXVlU2l6ZSByZWFjaGVkLCBkcm9wcGluZyBzcGFucycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQrKztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBzb21lIHNwYW5zIHdlcmUgZHJvcHBlZCwgbG9nIG9uY2Ugd2l0aCBjb3VudCBvZiBzcGFucyBkcm9wcGVkXG4gICAgICAgICAgICBkaWFnLndhcm4oXCJEcm9wcGVkIFwiICsgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgKyBcIiBzcGFucyBiZWNhdXNlIG1heFF1ZXVlU2l6ZSByZWFjaGVkXCIpO1xuICAgICAgICAgICAgdGhpcy5fZHJvcHBlZFNwYW5zQ291bnQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkU3BhbnMucHVzaChzcGFuKTtcbiAgICAgICAgdGhpcy5fbWF5YmVTdGFydFRpbWVyKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZW5kIGFsbCBzcGFucyB0byB0aGUgZXhwb3J0ZXIgcmVzcGVjdGluZyB0aGUgYmF0Y2ggc2l6ZSBsaW1pdFxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IG9uIGZvcmNlRmx1c2ggb3Igc2h1dGRvd24sXG4gICAgICogZm9yIGFsbCBvdGhlciBjYXNlcyBfZmx1c2ggc2hvdWxkIGJlIHVzZWRcbiAgICAgKiAqL1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9mbHVzaEFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHZhciBwcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIG51bWJlciBvZiBiYXRjaGVzXG4gICAgICAgICAgICB2YXIgY291bnQgPSBNYXRoLmNlaWwoX3RoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoIC8gX3RoaXMuX21heEV4cG9ydEJhdGNoU2l6ZSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGNvdW50OyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChfdGhpcy5fZmx1c2hPbmVCYXRjaCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3NvckJhc2UucHJvdG90eXBlLl9mbHVzaE9uZUJhdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9jbGVhclRpbWVyKCk7XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZFNwYW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBkb24ndCB3YWl0IGFueW1vcmUgZm9yIGV4cG9ydCwgdGhpcyB3YXkgdGhlIG5leHQgYmF0Y2ggY2FuIHN0YXJ0XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVGltZW91dCcpKTtcbiAgICAgICAgICAgIH0sIF90aGlzLl9leHBvcnRUaW1lb3V0TWlsbGlzKTtcbiAgICAgICAgICAgIC8vIHByZXZlbnQgZG93bnN0cmVhbSBleHBvcnRlciBjYWxscyBmcm9tIGdlbmVyYXRpbmcgc3BhbnNcbiAgICAgICAgICAgIGNvbnRleHQud2l0aChzdXBwcmVzc1RyYWNpbmcoY29udGV4dC5hY3RpdmUoKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZmluaXNoZWQgc3BhbnMgYnVmZmVyIGhlcmUgYmVjYXVzZSB0aGUgbmV4dCBpbnZvY2F0aW9ucyBvZiB0aGUgX2ZsdXNoIG1ldGhvZFxuICAgICAgICAgICAgICAgIC8vIGNvdWxkIHBhc3MgdGhlIHNhbWUgZmluaXNoZWQgc3BhbnMgdG8gdGhlIGV4cG9ydGVyIGlmIHRoZSBidWZmZXIgaXMgY2xlYXJlZFxuICAgICAgICAgICAgICAgIC8vIG91dHNpZGUgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGxiYWNrLlxuICAgICAgICAgICAgICAgIHZhciBzcGFucztcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoIDw9IF90aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhbnMgPSBfdGhpcy5fZmluaXNoZWRTcGFucztcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2ZpbmlzaGVkU3BhbnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNwYW5zID0gX3RoaXMuX2ZpbmlzaGVkU3BhbnMuc3BsaWNlKDAsIF90aGlzLl9tYXhFeHBvcnRCYXRjaFNpemUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZG9FeHBvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZXhwb3J0ZXIuZXhwb3J0KHNwYW5zLCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb2RlID09PSBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKF9hID0gcmVzdWx0LmVycm9yKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgRXJyb3IoJ0JhdGNoU3BhblByb2Nlc3Nvcjogc3BhbiBleHBvcnQgZmFpbGVkJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciBwZW5kaW5nUmVzb3VyY2VzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3BhbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwYW4ucmVzb3VyY2UuYXN5bmNBdHRyaWJ1dGVzUGVuZGluZyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi5yZXNvdXJjZS53YWl0Rm9yQXN5bmNBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVzb3VyY2VzICE9PSBudWxsICYmIHBlbmRpbmdSZXNvdXJjZXMgIT09IHZvaWQgMCA/IHBlbmRpbmdSZXNvdXJjZXMgOiAocGVuZGluZ1Jlc291cmNlcyA9IFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXNvdXJjZXMucHVzaChzcGFuLnJlc291cmNlLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgc2NoZWR1bGluZyBhIHByb21pc2UgdG8gbWFrZSB0aGUgYmVoYXZpb3IgbW9yZSBwcmVkaWN0YWJsZSBhbmQgZWFzaWVyIHRvIHRlc3RcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZ1Jlc291cmNlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkb0V4cG9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwocGVuZGluZ1Jlc291cmNlcykudGhlbihkb0V4cG9ydCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZS5wcm90b3R5cGUuX21heWJlU3RhcnRUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuX2lzRXhwb3J0aW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5faXNFeHBvcnRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgX3RoaXMuX2ZsdXNoT25lQmF0Y2goKVxuICAgICAgICAgICAgICAgIC5maW5hbGx5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5faXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2ZpbmlzaGVkU3BhbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fY2xlYXJUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fbWF5YmVTdGFydFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5faXNFeHBvcnRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gd2Ugb25seSB3YWl0IGlmIHRoZSBxdWV1ZSBkb2Vzbid0IGhhdmUgZW5vdWdoIGVsZW1lbnRzIHlldFxuICAgICAgICBpZiAodGhpcy5fZmluaXNoZWRTcGFucy5sZW5ndGggPj0gdGhpcy5fbWF4RXhwb3J0QmF0Y2hTaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gZmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGltZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZsdXNoKCk7IH0sIHRoaXMuX3NjaGVkdWxlZERlbGF5TWlsbGlzKTtcbiAgICAgICAgdW5yZWZUaW1lcih0aGlzLl90aW1lcik7XG4gICAgfTtcbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlLnByb3RvdHlwZS5fY2xlYXJUaW1lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgICAgICAgICB0aGlzLl90aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEJhdGNoU3BhblByb2Nlc3NvckJhc2U7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fZXh0ZW5kcyA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG52YXIgQmF0Y2hTcGFuUHJvY2Vzc29yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhCYXRjaFNwYW5Qcm9jZXNzb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQmF0Y2hTcGFuUHJvY2Vzc29yKF9leHBvcnRlciwgY29uZmlnKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIF9leHBvcnRlciwgY29uZmlnKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5vbkluaXQoY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBCYXRjaFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uSW5pdCA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuZGlzYWJsZUF1dG9GbHVzaE9uRG9jdW1lbnRIaWRlKSAhPT0gdHJ1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmZvcmNlRmx1c2goKS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEVycm9ySGFuZGxlcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9wYWdlSGlkZUxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLmZvcmNlRmx1c2goKS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIC8vIHVzZSAncGFnZWhpZGUnIGV2ZW50IGFzIGEgZmFsbGJhY2sgZm9yIFNhZmFyaTsgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTY3NjlcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgdGhpcy5fcGFnZUhpZGVMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEJhdGNoU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25TaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl92aXNpYmlsaXR5Q2hhbmdlTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5fdmlzaWJpbGl0eUNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9wYWdlSGlkZUxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCB0aGlzLl9wYWdlSGlkZUxpc3RlbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEJhdGNoU3BhblByb2Nlc3Nvcjtcbn0oQmF0Y2hTcGFuUHJvY2Vzc29yQmFzZSkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIFNQQU5fSURfQllURVMgPSA4O1xudmFyIFRSQUNFX0lEX0JZVEVTID0gMTY7XG52YXIgUmFuZG9tSWRHZW5lcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmFuZG9tSWRHZW5lcmF0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDE2LWJ5dGUgdHJhY2UgSUQgZm9ybWF0dGVkL2VuY29kZWQgYXMgYSAzMiBsb3dlcmNhc2UgaGV4XG4gICAgICAgICAqIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byAxMjggYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUcmFjZUlkID0gZ2V0SWRHZW5lcmF0b3IoVFJBQ0VfSURfQllURVMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHJhbmRvbSA4LWJ5dGUgc3BhbiBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDE2IGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDY0IGJpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlbmVyYXRlU3BhbklkID0gZ2V0SWRHZW5lcmF0b3IoU1BBTl9JRF9CWVRFUyk7XG4gICAgfVxuICAgIHJldHVybiBSYW5kb21JZEdlbmVyYXRvcjtcbn0oKSk7XG52YXIgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkgPSBBcnJheSgzMik7XG5mdW5jdGlvbiBnZXRJZEdlbmVyYXRvcihieXRlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZUlkKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzICogMjsgaSsrKSB7XG4gICAgICAgICAgICBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KSArIDQ4O1xuICAgICAgICAgICAgLy8gdmFsaWQgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDQ4LTU3IGFuZCA5Ny0xMDJcbiAgICAgICAgICAgIGlmIChTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA+PSA1OCkge1xuICAgICAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldICs9IDM5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZLnNsaWNlKDAsIGJ5dGVzICogMikpO1xuICAgIH07XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGJhc2ljIHRyYWNlci5cbiAqL1xudmFyIFRyYWNlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRyYWNlciBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBUcmFjZXIoaW5zdHJ1bWVudGF0aW9uTGlicmFyeSwgY29uZmlnLCBfdHJhY2VyUHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5fdHJhY2VyUHJvdmlkZXIgPSBfdHJhY2VyUHJvdmlkZXI7XG4gICAgICAgIHZhciBsb2NhbENvbmZpZyA9IG1lcmdlQ29uZmlnKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX3NhbXBsZXIgPSBsb2NhbENvbmZpZy5zYW1wbGVyO1xuICAgICAgICB0aGlzLl9nZW5lcmFsTGltaXRzID0gbG9jYWxDb25maWcuZ2VuZXJhbExpbWl0cztcbiAgICAgICAgdGhpcy5fc3BhbkxpbWl0cyA9IGxvY2FsQ29uZmlnLnNwYW5MaW1pdHM7XG4gICAgICAgIHRoaXMuX2lkR2VuZXJhdG9yID0gY29uZmlnLmlkR2VuZXJhdG9yIHx8IG5ldyBSYW5kb21JZEdlbmVyYXRvcigpO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gX3RyYWNlclByb3ZpZGVyLnJlc291cmNlO1xuICAgICAgICB0aGlzLmluc3RydW1lbnRhdGlvbkxpYnJhcnkgPSBpbnN0cnVtZW50YXRpb25MaWJyYXJ5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydHMgYSBuZXcgU3BhbiBvciByZXR1cm5zIHRoZSBkZWZhdWx0IE5vb3BTcGFuIGJhc2VkIG9uIHRoZSBzYW1wbGluZ1xuICAgICAqIGRlY2lzaW9uLlxuICAgICAqL1xuICAgIFRyYWNlci5wcm90b3R5cGUuc3RhcnRTcGFuID0gZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMsIGNvbnRleHQkMSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgaWYgKGNvbnRleHQkMSA9PT0gdm9pZCAwKSB7IGNvbnRleHQkMSA9IGNvbnRleHQuYWN0aXZlKCk7IH1cbiAgICAgICAgLy8gcmVtb3ZlIHNwYW4gZnJvbSBjb250ZXh0IGluIGNhc2UgYSByb290IHNwYW4gaXMgcmVxdWVzdGVkIHZpYSBvcHRpb25zXG4gICAgICAgIGlmIChvcHRpb25zLnJvb3QpIHtcbiAgICAgICAgICAgIGNvbnRleHQkMSA9IHRyYWNlLmRlbGV0ZVNwYW4oY29udGV4dCQxKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50U3BhbiA9IHRyYWNlLmdldFNwYW4oY29udGV4dCQxKTtcbiAgICAgICAgaWYgKGlzVHJhY2luZ1N1cHByZXNzZWQoY29udGV4dCQxKSkge1xuICAgICAgICAgICAgZGlhZy5kZWJ1ZygnSW5zdHJ1bWVudGF0aW9uIHN1cHByZXNzZWQsIHJldHVybmluZyBOb29wIFNwYW4nKTtcbiAgICAgICAgICAgIHZhciBub25SZWNvcmRpbmdTcGFuID0gdHJhY2Uud3JhcFNwYW5Db250ZXh0KElOVkFMSURfU1BBTl9DT05URVhUKTtcbiAgICAgICAgICAgIHJldHVybiBub25SZWNvcmRpbmdTcGFuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnRTcGFuQ29udGV4dCA9IHBhcmVudFNwYW4gPT09IG51bGwgfHwgcGFyZW50U3BhbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFyZW50U3Bhbi5zcGFuQ29udGV4dCgpO1xuICAgICAgICB2YXIgc3BhbklkID0gdGhpcy5faWRHZW5lcmF0b3IuZ2VuZXJhdGVTcGFuSWQoKTtcbiAgICAgICAgdmFyIHRyYWNlSWQ7XG4gICAgICAgIHZhciB0cmFjZVN0YXRlO1xuICAgICAgICB2YXIgcGFyZW50U3BhbklkO1xuICAgICAgICBpZiAoIXBhcmVudFNwYW5Db250ZXh0IHx8XG4gICAgICAgICAgICAhdHJhY2UuaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudFNwYW5Db250ZXh0KSkge1xuICAgICAgICAgICAgLy8gTmV3IHJvb3Qgc3Bhbi5cbiAgICAgICAgICAgIHRyYWNlSWQgPSB0aGlzLl9pZEdlbmVyYXRvci5nZW5lcmF0ZVRyYWNlSWQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5ldyBjaGlsZCBzcGFuLlxuICAgICAgICAgICAgdHJhY2VJZCA9IHBhcmVudFNwYW5Db250ZXh0LnRyYWNlSWQ7XG4gICAgICAgICAgICB0cmFjZVN0YXRlID0gcGFyZW50U3BhbkNvbnRleHQudHJhY2VTdGF0ZTtcbiAgICAgICAgICAgIHBhcmVudFNwYW5JZCA9IHBhcmVudFNwYW5Db250ZXh0LnNwYW5JZDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3BhbktpbmQgPSAoX2EgPSBvcHRpb25zLmtpbmQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFNwYW5LaW5kLklOVEVSTkFMO1xuICAgICAgICB2YXIgbGlua3MgPSAoKF9iID0gb3B0aW9ucy5saW5rcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10pLm1hcChmdW5jdGlvbiAobGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsaW5rLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogc2FuaXRpemVBdHRyaWJ1dGVzKGxpbmsuYXR0cmlidXRlcyksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBzYW5pdGl6ZUF0dHJpYnV0ZXMob3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgICAgICAgLy8gbWFrZSBzYW1wbGluZyBkZWNpc2lvblxuICAgICAgICB2YXIgc2FtcGxpbmdSZXN1bHQgPSB0aGlzLl9zYW1wbGVyLnNob3VsZFNhbXBsZShjb250ZXh0JDEsIHRyYWNlSWQsIG5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIHRyYWNlU3RhdGUgPSAoX2MgPSBzYW1wbGluZ1Jlc3VsdC50cmFjZVN0YXRlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB0cmFjZVN0YXRlO1xuICAgICAgICB2YXIgdHJhY2VGbGFncyA9IHNhbXBsaW5nUmVzdWx0LmRlY2lzaW9uID09PSBTYW1wbGluZ0RlY2lzaW9uJDEuUkVDT1JEX0FORF9TQU1QTEVEXG4gICAgICAgICAgICA/IFRyYWNlRmxhZ3MuU0FNUExFRFxuICAgICAgICAgICAgOiBUcmFjZUZsYWdzLk5PTkU7XG4gICAgICAgIHZhciBzcGFuQ29udGV4dCA9IHsgdHJhY2VJZDogdHJhY2VJZCwgc3BhbklkOiBzcGFuSWQsIHRyYWNlRmxhZ3M6IHRyYWNlRmxhZ3MsIHRyYWNlU3RhdGU6IHRyYWNlU3RhdGUgfTtcbiAgICAgICAgaWYgKHNhbXBsaW5nUmVzdWx0LmRlY2lzaW9uID09PSBTYW1wbGluZ0RlY2lzaW9uJDEuTk9UX1JFQ09SRCkge1xuICAgICAgICAgICAgZGlhZy5kZWJ1ZygnUmVjb3JkaW5nIGlzIG9mZiwgcHJvcGFnYXRpbmcgY29udGV4dCBpbiBhIG5vbi1yZWNvcmRpbmcgc3BhbicpO1xuICAgICAgICAgICAgdmFyIG5vblJlY29yZGluZ1NwYW4gPSB0cmFjZS53cmFwU3BhbkNvbnRleHQoc3BhbkNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vblJlY29yZGluZ1NwYW47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IGluaXRpYWwgc3BhbiBhdHRyaWJ1dGVzLiBUaGUgYXR0cmlidXRlcyBvYmplY3QgbWF5IGhhdmUgYmVlbiBtdXRhdGVkXG4gICAgICAgIC8vIGJ5IHRoZSBzYW1wbGVyLCBzbyB3ZSBzYW5pdGl6ZSB0aGUgbWVyZ2VkIGF0dHJpYnV0ZXMgYmVmb3JlIHNldHRpbmcgdGhlbS5cbiAgICAgICAgdmFyIGluaXRBdHRyaWJ1dGVzID0gc2FuaXRpemVBdHRyaWJ1dGVzKE9iamVjdC5hc3NpZ24oYXR0cmlidXRlcywgc2FtcGxpbmdSZXN1bHQuYXR0cmlidXRlcykpO1xuICAgICAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKHRoaXMsIGNvbnRleHQkMSwgbmFtZSwgc3BhbkNvbnRleHQsIHNwYW5LaW5kLCBwYXJlbnRTcGFuSWQsIGxpbmtzLCBvcHRpb25zLnN0YXJ0VGltZSwgdW5kZWZpbmVkLCBpbml0QXR0cmlidXRlcyk7XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH07XG4gICAgVHJhY2VyLnByb3RvdHlwZS5zdGFydEFjdGl2ZVNwYW4gPSBmdW5jdGlvbiAobmFtZSwgYXJnMiwgYXJnMywgYXJnNCkge1xuICAgICAgICB2YXIgb3B0cztcbiAgICAgICAgdmFyIGN0eDtcbiAgICAgICAgdmFyIGZuO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICBmbiA9IGFyZzI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgb3B0cyA9IGFyZzI7XG4gICAgICAgICAgICBmbiA9IGFyZzM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRzID0gYXJnMjtcbiAgICAgICAgICAgIGN0eCA9IGFyZzM7XG4gICAgICAgICAgICBmbiA9IGFyZzQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSBjdHggIT09IG51bGwgJiYgY3R4ICE9PSB2b2lkIDAgPyBjdHggOiBjb250ZXh0LmFjdGl2ZSgpO1xuICAgICAgICB2YXIgc3BhbiA9IHRoaXMuc3RhcnRTcGFuKG5hbWUsIG9wdHMsIHBhcmVudENvbnRleHQpO1xuICAgICAgICB2YXIgY29udGV4dFdpdGhTcGFuU2V0ID0gdHJhY2Uuc2V0U3BhbihwYXJlbnRDb250ZXh0LCBzcGFuKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQud2l0aChjb250ZXh0V2l0aFNwYW5TZXQsIGZuLCB1bmRlZmluZWQsIHNwYW4pO1xuICAgIH07XG4gICAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSB7QGxpbmsgR2VuZXJhbExpbWl0c30uICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5nZXRHZW5lcmFsTGltaXRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2VuZXJhbExpbWl0cztcbiAgICB9O1xuICAgIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUge0BsaW5rIFNwYW5MaW1pdHN9LiAqL1xuICAgIFRyYWNlci5wcm90b3R5cGUuZ2V0U3BhbkxpbWl0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwYW5MaW1pdHM7XG4gICAgfTtcbiAgICBUcmFjZXIucHJvdG90eXBlLmdldEFjdGl2ZVNwYW5Qcm9jZXNzb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90cmFjZXJQcm92aWRlci5nZXRBY3RpdmVTcGFuUHJvY2Vzc29yKCk7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3ZhbHVlcyQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTcGFuUHJvY2Vzc29yfSB0aGF0IHNpbXBseSBmb3J3YXJkcyBhbGxcbiAqIHJlY2VpdmVkIGV2ZW50cyB0byBhIGxpc3Qgb2Yge0BsaW5rIFNwYW5Qcm9jZXNzb3J9cy5cbiAqL1xudmFyIE11bHRpU3BhblByb2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBNdWx0aVNwYW5Qcm9jZXNzb3IoX3NwYW5Qcm9jZXNzb3JzKSB7XG4gICAgICAgIHRoaXMuX3NwYW5Qcm9jZXNzb3JzID0gX3NwYW5Qcm9jZXNzb3JzO1xuICAgIH1cbiAgICBNdWx0aVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlXzEsIF9hO1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goc3BhblByb2Nlc3Nvci5mb3JjZUZsdXNoKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKGVycm9yIHx8IG5ldyBFcnJvcignTXVsdGlTcGFuUHJvY2Vzc29yOiBmb3JjZUZsdXNoIGZhaWxlZCcpKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBNdWx0aVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uU3RhcnQgPSBmdW5jdGlvbiAoc3BhbiwgY29udGV4dCkge1xuICAgICAgICB2YXIgZV8yLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3Iub25TdGFydChzcGFuLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBNdWx0aVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgICAgdmFyIGVfMywgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDEodGhpcy5fc3BhblByb2Nlc3NvcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwYW5Qcm9jZXNzb3IgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICBzcGFuUHJvY2Vzc29yLm9uRW5kKHNwYW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIE11bHRpU3BhblByb2Nlc3Nvci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBlXzQsIF9hO1xuICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXMkMSh0aGlzLl9zcGFuUHJvY2Vzc29ycyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3BhblByb2Nlc3NvciA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goc3BhblByb2Nlc3Nvci5zaHV0ZG93bigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV80XzEpIHsgZV80ID0geyBlcnJvcjogZV80XzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzQpIHRocm93IGVfNC5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gTXVsdGlTcGFuUHJvY2Vzc29yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBOby1vcCBpbXBsZW1lbnRhdGlvbiBvZiBTcGFuUHJvY2Vzc29yICovXG52YXIgTm9vcFNwYW5Qcm9jZXNzb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTm9vcFNwYW5Qcm9jZXNzb3IoKSB7XG4gICAgfVxuICAgIE5vb3BTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vblN0YXJ0ID0gZnVuY3Rpb24gKF9zcGFuLCBfY29udGV4dCkgeyB9O1xuICAgIE5vb3BTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChfc3BhbikgeyB9O1xuICAgIE5vb3BTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH07XG4gICAgTm9vcFNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9O1xuICAgIHJldHVybiBOb29wU3BhblByb2Nlc3Nvcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19yZWFkJDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG52YXIgRm9yY2VGbHVzaFN0YXRlO1xuKGZ1bmN0aW9uIChGb3JjZUZsdXNoU3RhdGUpIHtcbiAgICBGb3JjZUZsdXNoU3RhdGVbRm9yY2VGbHVzaFN0YXRlW1wicmVzb2x2ZWRcIl0gPSAwXSA9IFwicmVzb2x2ZWRcIjtcbiAgICBGb3JjZUZsdXNoU3RhdGVbRm9yY2VGbHVzaFN0YXRlW1widGltZW91dFwiXSA9IDFdID0gXCJ0aW1lb3V0XCI7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcImVycm9yXCJdID0gMl0gPSBcImVycm9yXCI7XG4gICAgRm9yY2VGbHVzaFN0YXRlW0ZvcmNlRmx1c2hTdGF0ZVtcInVucmVzb2x2ZWRcIl0gPSAzXSA9IFwidW5yZXNvbHZlZFwiO1xufSkoRm9yY2VGbHVzaFN0YXRlIHx8IChGb3JjZUZsdXNoU3RhdGUgPSB7fSkpO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBiYXNpYyB0cmFjZXIgcHJvdmlkZXIgd2hpY2ggcGxhdGZvcm0gbGlicmFyaWVzIGNhbiBleHRlbmRcbiAqL1xudmFyIEJhc2ljVHJhY2VyUHJvdmlkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmFzaWNUcmFjZXJQcm92aWRlcihjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycyA9IFtdO1xuICAgICAgICB0aGlzLl90cmFjZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICB2YXIgbWVyZ2VkQ29uZmlnID0gbWVyZ2Uoe30sIGxvYWREZWZhdWx0Q29uZmlnKCksIHJlY29uZmlndXJlTGltaXRzKGNvbmZpZykpO1xuICAgICAgICB0aGlzLnJlc291cmNlID0gKF9hID0gbWVyZ2VkQ29uZmlnLnJlc291cmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBSZXNvdXJjZS5lbXB0eSgpO1xuICAgICAgICBpZiAobWVyZ2VkQ29uZmlnLm1lcmdlUmVzb3VyY2VXaXRoRGVmYXVsdHMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb3VyY2UgPSBSZXNvdXJjZS5kZWZhdWx0KCkubWVyZ2UodGhpcy5yZXNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgbWVyZ2VkQ29uZmlnLCB7XG4gICAgICAgICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICgoX2IgPSBjb25maWcuc3BhblByb2Nlc3NvcnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRTcGFuUHJvY2Vzc29ycyA9IF9fc3ByZWFkQXJyYXkkMShbXSwgX19yZWFkJDEoY29uZmlnLnNwYW5Qcm9jZXNzb3JzKSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGRlZmF1bHRFeHBvcnRlciA9IHRoaXMuX2J1aWxkRXhwb3J0ZXJGcm9tRW52KCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEV4cG9ydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmF0Y2hQcm9jZXNzb3IgPSBuZXcgQmF0Y2hTcGFuUHJvY2Vzc29yKGRlZmF1bHRFeHBvcnRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gYmF0Y2hQcm9jZXNzb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3IgPSBuZXcgTm9vcFNwYW5Qcm9jZXNzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5nZXRUcmFjZXIgPSBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgb3B0aW9ucykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZSArIFwiQFwiICsgKHZlcnNpb24gfHwgJycpICsgXCI6XCIgKyAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwpIHx8ICcnKTtcbiAgICAgICAgaWYgKCF0aGlzLl90cmFjZXJzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFjZXJzLnNldChrZXksIG5ldyBUcmFjZXIoeyBuYW1lOiBuYW1lLCB2ZXJzaW9uOiB2ZXJzaW9uLCBzY2hlbWFVcmw6IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5zY2hlbWFVcmwgfSwgdGhpcy5fY29uZmlnLCB0aGlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlcnMuZ2V0KGtleSk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIHtAbGluayBUcmFjZXJDb25maWd9IHNwYW5Qcm9jZXNzb3JzIHByb3BlcnR5XG4gICAgICogQWRkcyBhIG5ldyB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gdG8gdGhpcyB0cmFjZXIuXG4gICAgICogQHBhcmFtIHNwYW5Qcm9jZXNzb3IgdGhlIG5ldyBTcGFuUHJvY2Vzc29yIHRvIGJlIGFkZGVkLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLmFkZFNwYW5Qcm9jZXNzb3IgPSBmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICBpZiAodGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gc2luY2Ugd2UgbWlnaHQgaGF2ZSBlbmFibGVkIGJ5IGRlZmF1bHQgYSBiYXRjaFByb2Nlc3Nvciwgd2UgZGlzYWJsZSBpdFxuICAgICAgICAgICAgLy8gYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZVxuICAgICAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yXG4gICAgICAgICAgICAgICAgLnNodXRkb3duKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWFnLmVycm9yKCdFcnJvciB3aGlsZSB0cnlpbmcgdG8gc2h1dGRvd24gY3VycmVudCBzcGFuIHByb2Nlc3NvcicsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMucHVzaChzcGFuUHJvY2Vzc29yKTtcbiAgICAgICAgdGhpcy5hY3RpdmVTcGFuUHJvY2Vzc29yID0gbmV3IE11bHRpU3BhblByb2Nlc3Nvcih0aGlzLl9yZWdpc3RlcmVkU3BhblByb2Nlc3NvcnMpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuZ2V0QWN0aXZlU3BhblByb2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlU3BhblByb2Nlc3NvcjtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHRoaXMgVHJhY2VyUHJvdmlkZXIgZm9yIHVzZSB3aXRoIHRoZSBPcGVuVGVsZW1ldHJ5IEFQSS5cbiAgICAgKiBVbmRlZmluZWQgdmFsdWVzIG1heSBiZSByZXBsYWNlZCB3aXRoIGRlZmF1bHRzLCBhbmRcbiAgICAgKiBudWxsIHZhbHVlcyB3aWxsIGJlIHNraXBwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBTREsgcmVnaXN0cmF0aW9uXG4gICAgICovXG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB0cmFjZS5zZXRHbG9iYWxUcmFjZXJQcm92aWRlcih0aGlzKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm9wYWdhdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbmZpZy5wcm9wYWdhdG9yID0gdGhpcy5fYnVpbGRQcm9wYWdhdG9yRnJvbUVudigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuY29udGV4dE1hbmFnZXIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuc2V0R2xvYmFsQ29udGV4dE1hbmFnZXIoY29uZmlnLmNvbnRleHRNYW5hZ2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLnByb3BhZ2F0b3IpIHtcbiAgICAgICAgICAgIHByb3BhZ2F0aW9uLnNldEdsb2JhbFByb3BhZ2F0b3IoY29uZmlnLnByb3BhZ2F0b3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGltZW91dCA9IHRoaXMuX2NvbmZpZy5mb3JjZUZsdXNoVGltZW91dE1pbGxpcztcbiAgICAgICAgdmFyIHByb21pc2VzID0gdGhpcy5fcmVnaXN0ZXJlZFNwYW5Qcm9jZXNzb3JzLm1hcChmdW5jdGlvbiAoc3BhblByb2Nlc3Nvcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlO1xuICAgICAgICAgICAgICAgIHZhciB0aW1lb3V0SW50ZXJ2YWwgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgRXJyb3IoXCJTcGFuIHByb2Nlc3NvciBkaWQgbm90IGNvbXBsZXRlZCB3aXRoaW4gdGltZW91dCBwZXJpb2Qgb2YgXCIgKyB0aW1lb3V0ICsgXCIgbXNcIikpO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0O1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgICAgIHNwYW5Qcm9jZXNzb3JcbiAgICAgICAgICAgICAgICAgICAgLmZvcmNlRmx1c2goKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT09IEZvcmNlRmx1c2hTdGF0ZS50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZvcmNlRmx1c2hTdGF0ZS5yZXNvbHZlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBGb3JjZUZsdXNoU3RhdGUuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3JzID0gcmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24gKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0ICE9PSBGb3JjZUZsdXNoU3RhdGUucmVzb2x2ZWQ7IH0pO1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsgcmV0dXJuIHJlamVjdChbZXJyb3JdKTsgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVNwYW5Qcm9jZXNzb3Iuc2h1dGRvd24oKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFRTIGNhbm5vdCB5ZXQgaW5mZXIgdGhlIHR5cGUgb2YgdGhpcy5jb25zdHJ1Y3RvcjpcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzM4NDEjaXNzdWVjb21tZW50LTMzNzU2MDE0NlxuICAgICAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZSBnZXR0ZXJzIGluIHlvdXIgY2hpbGQgY2xhc3MuXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHJlZ2lzdGVyZWQgY29tcG9uZW50IG1hcHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFjcm9zcyBhbGxcbiAgICAgKiBjbGFzc2VzIGluIHRoZSBpbmhlcml0YW5jZSB0cmVlLlxuICAgICAqL1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIucHJvdG90eXBlLl9nZXRQcm9wYWdhdG9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZFByb3BhZ2F0b3JzLmdldChuYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKCk7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fZ2V0U3BhbkV4cG9ydGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5jb25zdHJ1Y3Rvci5fcmVnaXN0ZXJlZEV4cG9ydGVycy5nZXQobmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYSgpO1xuICAgIH07XG4gICAgQmFzaWNUcmFjZXJQcm92aWRlci5wcm90b3R5cGUuX2J1aWxkUHJvcGFnYXRvckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIC8vIHBlciBzcGVjLCBwcm9wYWdhdG9ycyBmcm9tIGVudiBtdXN0IGJlIGRlZHVwbGljYXRlZFxuICAgICAgICB2YXIgdW5pcXVlUHJvcGFnYXRvck5hbWVzID0gQXJyYXkuZnJvbShuZXcgU2V0KGdldEVudigpLk9URUxfUFJPUEFHQVRPUlMpKTtcbiAgICAgICAgdmFyIHByb3BhZ2F0b3JzID0gdW5pcXVlUHJvcGFnYXRvck5hbWVzLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfdGhpcy5fZ2V0UHJvcGFnYXRvcihuYW1lKTtcbiAgICAgICAgICAgIGlmICghcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIlByb3BhZ2F0b3IgXFxcIlwiICsgbmFtZSArIFwiXFxcIiByZXF1ZXN0ZWQgdGhyb3VnaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmF2YWlsYWJsZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB2YWxpZFByb3BhZ2F0b3JzID0gcHJvcGFnYXRvcnMucmVkdWNlKGZ1bmN0aW9uIChsaXN0LCBpdGVtKSB7XG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9LCBbXSk7XG4gICAgICAgIGlmICh2YWxpZFByb3BhZ2F0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaXF1ZVByb3BhZ2F0b3JOYW1lcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWxpZFByb3BhZ2F0b3JzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVQcm9wYWdhdG9yKHtcbiAgICAgICAgICAgICAgICBwcm9wYWdhdG9yczogdmFsaWRQcm9wYWdhdG9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLnByb3RvdHlwZS5fYnVpbGRFeHBvcnRlckZyb21FbnYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBleHBvcnRlck5hbWUgPSBnZXRFbnYoKS5PVEVMX1RSQUNFU19FWFBPUlRFUjtcbiAgICAgICAgaWYgKGV4cG9ydGVyTmFtZSA9PT0gJ25vbmUnIHx8IGV4cG9ydGVyTmFtZSA9PT0gJycpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBleHBvcnRlciA9IHRoaXMuX2dldFNwYW5FeHBvcnRlcihleHBvcnRlck5hbWUpO1xuICAgICAgICBpZiAoIWV4cG9ydGVyKSB7XG4gICAgICAgICAgICBkaWFnLmVycm9yKFwiRXhwb3J0ZXIgXFxcIlwiICsgZXhwb3J0ZXJOYW1lICsgXCJcXFwiIHJlcXVlc3RlZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVuYXZhaWxhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwb3J0ZXI7XG4gICAgfTtcbiAgICBCYXNpY1RyYWNlclByb3ZpZGVyLl9yZWdpc3RlcmVkUHJvcGFnYXRvcnMgPSBuZXcgTWFwKFtcbiAgICAgICAgWyd0cmFjZWNvbnRleHQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpOyB9XSxcbiAgICAgICAgWydiYWdnYWdlJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFczQ0JhZ2dhZ2VQcm9wYWdhdG9yKCk7IH1dLFxuICAgIF0pO1xuICAgIEJhc2ljVHJhY2VyUHJvdmlkZXIuX3JlZ2lzdGVyZWRFeHBvcnRlcnMgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIEJhc2ljVHJhY2VyUHJvdmlkZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKlxuICogVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3BhbkV4cG9ydGVyfSB0aGF0IHByaW50cyBzcGFucyB0byB0aGVcbiAqIGNvbnNvbGUuIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuXG4gKlxuICogTk9URTogVGhpcyB7QGxpbmsgU3BhbkV4cG9ydGVyfSBpcyBpbnRlbmRlZCBmb3IgZGlhZ25vc3RpY3MgdXNlIG9ubHksIG91dHB1dCByZW5kZXJlZCB0byB0aGUgY29uc29sZSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG52YXIgQ29uc29sZVNwYW5FeHBvcnRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb25zb2xlU3BhbkV4cG9ydGVyKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHBvcnQgc3BhbnMuXG4gICAgICogQHBhcmFtIHNwYW5zXG4gICAgICogQHBhcmFtIHJlc3VsdENhbGxiYWNrXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuZXhwb3J0ID0gZnVuY3Rpb24gKHNwYW5zLCByZXN1bHRDYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VuZFNwYW5zKHNwYW5zLCByZXN1bHRDYWxsYmFjayk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaHV0ZG93biB0aGUgZXhwb3J0ZXIuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NlbmRTcGFucyhbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcmNlRmx1c2goKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEV4cG9ydHMgYW55IHBlbmRpbmcgc3BhbnMgaW4gZXhwb3J0ZXJcbiAgICAgKi9cbiAgICBDb25zb2xlU3BhbkV4cG9ydGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBjb252ZXJ0cyBzcGFuIGluZm8gaW50byBtb3JlIHJlYWRhYmxlIGZvcm1hdFxuICAgICAqIEBwYXJhbSBzcGFuXG4gICAgICovXG4gICAgQ29uc29sZVNwYW5FeHBvcnRlci5wcm90b3R5cGUuX2V4cG9ydEluZm8gPSBmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXNvdXJjZToge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4ucmVzb3VyY2UuYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnN0cnVtZW50YXRpb25TY29wZTogc3Bhbi5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LFxuICAgICAgICAgICAgdHJhY2VJZDogc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQsXG4gICAgICAgICAgICBwYXJlbnRJZDogc3Bhbi5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICB0cmFjZVN0YXRlOiAoX2EgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VTdGF0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgbmFtZTogc3Bhbi5uYW1lLFxuICAgICAgICAgICAgaWQ6IHNwYW4uc3BhbkNvbnRleHQoKS5zcGFuSWQsXG4gICAgICAgICAgICBraW5kOiBzcGFuLmtpbmQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGhyVGltZVRvTWljcm9zZWNvbmRzKHNwYW4uc3RhcnRUaW1lKSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiBoclRpbWVUb01pY3Jvc2Vjb25kcyhzcGFuLmR1cmF0aW9uKSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHNwYW4uYXR0cmlidXRlcyxcbiAgICAgICAgICAgIHN0YXR1czogc3Bhbi5zdGF0dXMsXG4gICAgICAgICAgICBldmVudHM6IHNwYW4uZXZlbnRzLFxuICAgICAgICAgICAgbGlua3M6IHNwYW4ubGlua3MsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTaG93aW5nIHNwYW5zIGluIGNvbnNvbGVcbiAgICAgKiBAcGFyYW0gc3BhbnNcbiAgICAgKiBAcGFyYW0gZG9uZVxuICAgICAqL1xuICAgIENvbnNvbGVTcGFuRXhwb3J0ZXIucHJvdG90eXBlLl9zZW5kU3BhbnMgPSBmdW5jdGlvbiAoc3BhbnMsIGRvbmUpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBzcGFuc18xID0gX192YWx1ZXMoc3BhbnMpLCBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKTsgIXNwYW5zXzFfMS5kb25lOyBzcGFuc18xXzEgPSBzcGFuc18xLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBzcGFuID0gc3BhbnNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKHRoaXMuX2V4cG9ydEluZm8oc3BhbiksIHsgZGVwdGg6IDMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChzcGFuc18xXzEgJiYgIXNwYW5zXzFfMS5kb25lICYmIChfYSA9IHNwYW5zXzEucmV0dXJuKSkgX2EuY2FsbChzcGFuc18xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvbmUoeyBjb2RlOiBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb25zb2xlU3BhbkV4cG9ydGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuLyoqXG4gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLiBJdCBzdG9yZXMgdGhlIGV4cG9ydGVkIHNwYW5zXG4gKiBpbiBhIGxpc3QgaW4gbWVtb3J5IHRoYXQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgYGdldEZpbmlzaGVkU3BhbnMoKWBcbiAqIG1ldGhvZC5cbiAqL1xudmFyIEluTWVtb3J5U3BhbkV4cG9ydGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEluTWVtb3J5U3BhbkV4cG9ydGVyKCkge1xuICAgICAgICB0aGlzLl9maW5pc2hlZFNwYW5zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGV4cG9ydGVyIGhhcyBiZWVuIFwic2h1dGRvd24uXCJcbiAgICAgICAgICogV2hlbiBmYWxzZSwgZXhwb3J0ZWQgc3BhbnMgd2lsbCBub3QgYmUgc3RvcmVkIGluLW1lbW9yeS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuX3N0b3BwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgSW5NZW1vcnlTcGFuRXhwb3J0ZXIucHJvdG90eXBlLmV4cG9ydCA9IGZ1bmN0aW9uIChzcGFucywgcmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5fc3RvcHBlZClcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRDYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgY29kZTogRXhwb3J0UmVzdWx0Q29kZS5GQUlMRUQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcignRXhwb3J0ZXIgaGFzIGJlZW4gc3RvcHBlZCcpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIChfYSA9IHRoaXMuX2ZpbmlzaGVkU3BhbnMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChzcGFucyksIGZhbHNlKSk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzdWx0Q2FsbGJhY2soeyBjb2RlOiBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MgfSk7IH0sIDApO1xuICAgIH07XG4gICAgSW5NZW1vcnlTcGFuRXhwb3J0ZXIucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZmluaXNoZWRTcGFucyA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JjZUZsdXNoKCk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBFeHBvcnRzIGFueSBwZW5kaW5nIHNwYW5zIGluIHRoZSBleHBvcnRlclxuICAgICAqL1xuICAgIEluTWVtb3J5U3BhbkV4cG9ydGVyLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfTtcbiAgICBJbk1lbW9yeVNwYW5FeHBvcnRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaGVkU3BhbnMgPSBbXTtcbiAgICB9O1xuICAgIEluTWVtb3J5U3BhbkV4cG9ydGVyLnByb3RvdHlwZS5nZXRGaW5pc2hlZFNwYW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmluaXNoZWRTcGFucztcbiAgICB9O1xuICAgIHJldHVybiBJbk1lbW9yeVNwYW5FeHBvcnRlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19hd2FpdGVyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3BhblByb2Nlc3Nvcn0gdGhhdCBjb252ZXJ0cyB0aGUge0BsaW5rIFNwYW59XG4gKiB0byB7QGxpbmsgUmVhZGFibGVTcGFufSBhbmQgcGFzc2VzIGl0IHRvIHRoZSBjb25maWd1cmVkIGV4cG9ydGVyLlxuICpcbiAqIE9ubHkgc3BhbnMgdGhhdCBhcmUgc2FtcGxlZCBhcmUgY29udmVydGVkLlxuICpcbiAqIE5PVEU6IFRoaXMge0BsaW5rIFNwYW5Qcm9jZXNzb3J9IGV4cG9ydHMgZXZlcnkgZW5kZWQgc3BhbiBpbmRpdmlkdWFsbHkgaW5zdGVhZCBvZiBiYXRjaGluZyBzcGFucyB0b2dldGhlciwgd2hpY2ggY2F1c2VzIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIG92ZXJoZWFkIHdpdGggbW9zdCBleHBvcnRlcnMuIEZvciBwcm9kdWN0aW9uIHVzZSwgcGxlYXNlIGNvbnNpZGVyIHVzaW5nIHRoZSB7QGxpbmsgQmF0Y2hTcGFuUHJvY2Vzc29yfSBpbnN0ZWFkLlxuICovXG52YXIgU2ltcGxlU3BhblByb2Nlc3NvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaW1wbGVTcGFuUHJvY2Vzc29yKF9leHBvcnRlcikge1xuICAgICAgICB0aGlzLl9leHBvcnRlciA9IF9leHBvcnRlcjtcbiAgICAgICAgdGhpcy5fc2h1dGRvd25PbmNlID0gbmV3IEJpbmRPbmNlRnV0dXJlKHRoaXMuX3NodXRkb3duLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fdW5yZXNvbHZlZEV4cG9ydHMgPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIFNpbXBsZVNwYW5Qcm9jZXNzb3IucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogXG4gICAgICAgICAgICAgICAgICAgIC8vIGF3YWl0IHVucmVzb2x2ZWQgcmVzb3VyY2VzIGJlZm9yZSByZXNvbHZpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbSh0aGlzLl91bnJlc29sdmVkRXhwb3J0cykpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXdhaXQgdW5yZXNvbHZlZCByZXNvdXJjZXMgYmVmb3JlIHJlc29sdmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9leHBvcnRlci5mb3JjZUZsdXNoKSByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHRoaXMuX2V4cG9ydGVyLmZvcmNlRmx1c2goKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgU2ltcGxlU3BhblByb2Nlc3Nvci5wcm90b3R5cGUub25TdGFydCA9IGZ1bmN0aW9uIChfc3BhbiwgX3BhcmVudENvbnRleHQpIHsgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICh0aGlzLl9zaHV0ZG93bk9uY2UuaXNDYWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkb0V4cG9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbFxuICAgICAgICAgICAgICAgIC5fZXhwb3J0KF90aGlzLl9leHBvcnRlciwgW3NwYW5dKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb2RlICE9PSBFeHBvcnRSZXN1bHRDb2RlLlNVQ0NFU1MpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKChfYSA9IHJlc3VsdC5lcnJvcikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbmV3IEVycm9yKFwiU2ltcGxlU3BhblByb2Nlc3Nvcjogc3BhbiBleHBvcnQgZmFpbGVkIChzdGF0dXMgXCIgKyByZXN1bHQgKyBcIilcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGdsb2JhbEVycm9ySGFuZGxlcihlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gQXZvaWQgc2NoZWR1bGluZyBhIHByb21pc2UgdG8gbWFrZSB0aGUgYmVoYXZpb3IgbW9yZSBwcmVkaWN0YWJsZSBhbmQgZWFzaWVyIHRvIHRlc3RcbiAgICAgICAgaWYgKHNwYW4ucmVzb3VyY2UuYXN5bmNBdHRyaWJ1dGVzUGVuZGluZykge1xuICAgICAgICAgICAgdmFyIGV4cG9ydFByb21pc2VfMSA9IChfYiA9IChfYSA9IHNwYW4ucmVzb3VyY2UpLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwb3J0UHJvbWlzZV8xICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3VucmVzb2x2ZWRFeHBvcnRzLmRlbGV0ZShleHBvcnRQcm9taXNlXzEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZG9FeHBvcnQoKTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHsgcmV0dXJuIGdsb2JhbEVycm9ySGFuZGxlcihlcnIpOyB9KTtcbiAgICAgICAgICAgIC8vIHN0b3JlIHRoZSB1bnJlc29sdmVkIGV4cG9ydHNcbiAgICAgICAgICAgIGlmIChleHBvcnRQcm9taXNlXzEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3VucmVzb2x2ZWRFeHBvcnRzLmFkZChleHBvcnRQcm9taXNlXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdm9pZCBkb0V4cG9ydCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NodXRkb3duT25jZS5jYWxsKCk7XG4gICAgfTtcbiAgICBTaW1wbGVTcGFuUHJvY2Vzc29yLnByb3RvdHlwZS5fc2h1dGRvd24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHBvcnRlci5zaHV0ZG93bigpO1xuICAgIH07XG4gICAgcmV0dXJuIFNpbXBsZVNwYW5Qcm9jZXNzb3I7XG59KCkpO1xuXG5leHBvcnQgeyBBbHdheXNPZmZTYW1wbGVyIGFzIEEsIEJhc2ljVHJhY2VyUHJvdmlkZXIgYXMgQiwgQ29uc29sZVNwYW5FeHBvcnRlciBhcyBDLCBGb3JjZUZsdXNoU3RhdGUgYXMgRiwgSW5NZW1vcnlTcGFuRXhwb3J0ZXIgYXMgSSwgTm9vcFNwYW5Qcm9jZXNzb3IgYXMgTiwgUGFyZW50QmFzZWRTYW1wbGVyIGFzIFAsIFJhbmRvbUlkR2VuZXJhdG9yIGFzIFIsIFNpbXBsZVNwYW5Qcm9jZXNzb3IgYXMgUywgVHJhY2VyIGFzIFQsIEJhdGNoU3BhblByb2Nlc3NvciBhcyBhLCBBbHdheXNPblNhbXBsZXIgYXMgYiwgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyIGFzIGMsIFNhbXBsaW5nRGVjaXNpb24gYXMgZCwgU3BhbiBhcyBlIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxJQUFnQixLQUFLQyxHQUFPLEtBQUtDLElBQW9CLEtBQUtDLEdBQVksS0FBS0MsSUFBZ0IsS0FBS0MsR0FBUyxLQUFLQyxJQUFzQixLQUFLQyxVQUFnQjtBQUN2SyxTQUFTLFNBQWlCO0FBQzFCLFNBQVMsS0FBS0MsR0FBYSxLQUFLQyxJQUFnQixLQUFLQyxHQUFlLEtBQUtDLElBQVEsS0FBS0MsR0FBZ0IsS0FBS0MsSUFBbUIsS0FBS0MsSUFBWSxLQUFLQyxHQUF5QixLQUFLQyxHQUE0QixLQUFLQyxJQUFlLEtBQUtDLElBQStCLEtBQUtDLElBQWEsS0FBS0MsU0FBNEI7QUFDelQsU0FBUyxLQUFLQyxJQUFrQixLQUFLQyxHQUFvQixLQUFLQyxHQUFvQixLQUFLQyxJQUFpQixLQUFLQyxJQUFZLEtBQUtDLEdBQWdCLEtB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LE9BQU93SixDQUFlLEdBRTVDcEcsRUFBUztBQUFBLFVBQ3BCLEdBQUcsU0FBVUksR0FBSztBQUFFLG1CQUFPL0gsRUFBbUIrSCxDQUFHO0FBQUEsVUFBRyxDQUFDO0FBRXJELFVBQUlnRyxLQUFtQixRQUNuQixLQUFLLG1CQUFtQixJQUFJQSxDQUFlO0FBQUEsUUFFbkQ7QUFFSSxVQUFLcEcsRUFBUztBQUFBO0FBQUEsSUFFdEIsR0FDQW1HLEVBQW9CLFVBQVUsV0FBVyxXQUFZO0FBQ2pELGFBQU8sS0FBSyxjQUFjLEtBQUs7QUFBQSxJQUNuQyxHQUNBQSxFQUFvQixVQUFVLFlBQVksV0FBWTtBQUNsRCxhQUFPLEtBQUssVUFBVSxTQUFTO0FBQUEsSUFDbkMsR0FDT0E7QUFBQSxFQUNYLEVBQUU7QUFBQTsiLAogICJuYW1lcyI6IFsiU3BhblN0YXR1c0NvZGUiLCAidHJhY2UiLCAiaXNTcGFuQ29udGV4dFZhbGlkIiwgIlRyYWNlRmxhZ3MiLCAiaXNWYWxpZFRyYWNlSWQiLCAiY29udGV4dCIsICJJTlZBTElEX1NQQU5fQ09OVEVYVCIsICJTcGFuS2luZCIsICJpc1RpbWVJbnB1dCIsICJoclRpbWVEdXJhdGlvbiIsICJvdHBlcmZvcm1hbmNlIiwgImhyVGltZSIsICJtaWxsaXNUb0hyVGltZSIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJhZGRIclRpbWVzIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9UWVBFIiwgIlNFTUFUVFJTX0VYQ0VQVElPTl9NRVNTQUdFIiwgImdldFRpbWVPcmlnaW4iLCAiU0VNQVRUUlNfRVhDRVBUSU9OX1NUQUNLVFJBQ0UiLCAicHJvcGFnYXRpb24iLCAiaHJUaW1lVG9NaWNyb3NlY29uZHMiLCAiaXNBdHRyaWJ1dGVWYWx1ZSIsICJzYW5pdGl6ZUF0dHJpYnV0ZXMiLCAiZ2xvYmFsRXJyb3JIYW5kbGVyIiwgInN1cHByZXNzVHJhY2luZyIsICJ1bnJlZlRpbWVyIiwgIkJpbmRPbmNlRnV0dXJlIiwgImlzVHJhY2luZ1N1cHByZXNzZWQiLCAiU2FtcGxpbmdEZWNpc2lvbiQxIiwgIkNvbXBvc2l0ZVByb3BhZ2F0b3IiLCAiVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvciIsICJXM0NCYWdnYWdlUHJvcGFnYXRvciIsICJtZXJnZSIsICJpbnRlcm5hbCIsICJUcmFjZXNTYW1wbGVyVmFsdWVzIiwgImdldEVudiIsICJnZXRFbnZXaXRob3V0RGVmYXVsdHMiLCAiREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgIlJlc291cmNlIiwgIkV4cG9ydFJlc3VsdENvZGUiLCAiRXhjZXB0aW9uRXZlbnROYW1lIiwgIl9fYXNzaWduIiwgInQiLCAicyIsICJpIiwgInAiLCAiX192YWx1ZXMkMiIsICJvIiwgIm0iLCAiX19yZWFkJDIiLCAibiIsICJyIiwgImFyIiwgImUiLCAiZXJyb3IiLCAiX19zcHJlYWRBcnJheSQyIiwgInRvIiwgImZyb20iLCAicGFjayIsICJsIiwgIlNwYW4iLCAicGFyZW50VHJhY2VyIiwgInNwYW5OYW1lIiwgInNwYW5Db250ZXh0IiwgImtpbmQiLCAicGFyZW50U3BhbklkIiwgImxpbmtzIiwgInN0YXJ0VGltZSIsICJfZGVwcmVjYXRlZENsb2NrIiwgImF0dHJpYnV0ZXMiLCAibm93IiwgImtleSIsICJ2YWx1ZSIsICJkaWFnIiwgImVfMSIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJrIiwgInYiLCAiZV8xXzEiLCAibmFtZSIsICJhdHRyaWJ1dGVzT3JTdGFydFRpbWUiLCAidGltZVN0YW1wIiwgImxpbmsiLCAic3RhdHVzIiwgImVuZFRpbWUiLCAiaW5wIiwgIm1zRHVyYXRpb24iLCAiZXhjZXB0aW9uIiwgInRpbWUiLCAibGltaXQiLCAiX3RoaXMiLCAidmFsIiwgIlNhbXBsaW5nRGVjaXNpb24iLCAiQWx3YXlzT2ZmU2FtcGxlciIsICJBbHdheXNPblNhbXBsZXIiLCAiUGFyZW50QmFzZWRTYW1wbGVyIiwgImNvbmZpZyIsICJ0cmFjZUlkIiwgInNwYW5LaW5kIiwgInBhcmVudENvbnRleHQiLCAiVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyIiwgIl9yYXRpbyIsICJyYXRpbyIsICJhY2N1bXVsYXRpb24iLCAicG9zIiwgInBhcnQiLCAiRkFMTEJBQ0tfT1RFTF9UUkFDRVNfU0FNUExFUiIsICJERUZBVUxUX1JBVElPIiwgImxvYWREZWZhdWx0Q29uZmlnIiwgImVudiIsICJidWlsZFNhbXBsZXJGcm9tRW52IiwgImVudmlyb25tZW50IiwgImdldFNhbXBsZXJQcm9iYWJpbGl0eUZyb21FbnYiLCAicHJvYmFiaWxpdHkiLCAibWVyZ2VDb25maWciLCAidXNlckNvbmZpZyIsICJwZXJJbnN0YW5jZURlZmF1bHRzIiwgIkRFRkFVTFRfQ09ORklHIiwgInRhcmdldCIsICJyZWNvbmZpZ3VyZUxpbWl0cyIsICJfZSIsICJfZiIsICJfZyIsICJfaCIsICJfaiIsICJfayIsICJfbCIsICJfbSIsICJzcGFuTGltaXRzIiwgInBhcnNlZEVudkNvbmZpZyIsICJCYXRjaFNwYW5Qcm9jZXNzb3JCYXNlIiwgIl9leHBvcnRlciIsICJfc3BhbiIsICJfcGFyZW50Q29udGV4dCIsICJzcGFuIiwgInJlc29sdmUiLCAicmVqZWN0IiwgInByb21pc2VzIiwgImNvdW50IiwgImoiLCAidGltZXIiLCAic3BhbnMiLCAiZG9FeHBvcnQiLCAicmVzdWx0IiwgInBlbmRpbmdSZXNvdXJjZXMiLCAibGVuIiwgImVyciIsICJmbHVzaCIsICJfX2V4dGVuZHMiLCAiZXh0ZW5kU3RhdGljcyIsICJkIiwgImIiLCAiX18iLCAiQmF0Y2hTcGFuUHJvY2Vzc29yIiwgIl9zdXBlciIsICJTUEFOX0lEX0JZVEVTIiwgIlRSQUNFX0lEX0JZVEVTIiwgIlJhbmRvbUlkR2VuZXJhdG9yIiwgImdldElkR2VuZXJhdG9yIiwgIlNIQVJFRF9DSEFSX0NPREVTX0FSUkFZIiwgImJ5dGVzIiwgIlRyYWNlciIsICJpbnN0cnVtZW50YXRpb25MaWJyYXJ5IiwgIl90cmFjZXJQcm92aWRlciIsICJsb2NhbENvbmZpZyIsICJvcHRpb25zIiwgImNvbnRleHQkMSIsICJwYXJlbnRTcGFuIiwgIm5vblJlY29yZGluZ1NwYW4iLCAicGFyZW50U3BhbkNvbnRleHQiLCAic3BhbklkIiwgInRyYWNlU3RhdGUiLCAic2FtcGxpbmdSZXN1bHQiLCAidHJhY2VGbGFncyIsICJpbml0QXR0cmlidXRlcyIsICJhcmcyIiwgImFyZzMiLCAiYXJnNCIsICJvcHRzIiwgImN0eCIsICJmbiIsICJjb250ZXh0V2l0aFNwYW5TZXQiLCAiX192YWx1ZXMkMSIsICJNdWx0aVNwYW5Qcm9jZXNzb3IiLCAiX3NwYW5Qcm9jZXNzb3JzIiwgInNwYW5Qcm9jZXNzb3IiLCAiZV8yIiwgImVfMl8xIiwgImVfMyIsICJlXzNfMSIsICJlXzQiLCAiZV80XzEiLCAiTm9vcFNwYW5Qcm9jZXNzb3IiLCAiX2NvbnRleHQiLCAiX19yZWFkJDEiLCAiX19zcHJlYWRBcnJheSQxIiwgIkZvcmNlRmx1c2hTdGF0ZSIsICJCYXNpY1RyYWNlclByb3ZpZGVyIiwgIm1lcmdlZENvbmZpZyIsICJkZWZhdWx0RXhwb3J0ZXIiLCAiYmF0Y2hQcm9jZXNzb3IiLCAidmVyc2lvbiIsICJ0aW1lb3V0IiwgInN0YXRlIiwgInRpbWVvdXRJbnRlcnZhbCIsICJyZXN1bHRzIiwgImVycm9ycyIsICJ1bmlxdWVQcm9wYWdhdG9yTmFtZXMiLCAicHJvcGFnYXRvcnMiLCAicHJvcGFnYXRvciIsICJ2YWxpZFByb3BhZ2F0b3JzIiwgImxpc3QiLCAiaXRlbSIsICJleHBvcnRlck5hbWUiLCAiZXhwb3J0ZXIiLCAiX192YWx1ZXMiLCAiQ29uc29sZVNwYW5FeHBvcnRlciIsICJyZXN1bHRDYWxsYmFjayIsICJkb25lIiwgInNwYW5zXzEiLCAic3BhbnNfMV8xIiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkluTWVtb3J5U3BhbkV4cG9ydGVyIiwgIl9fYXdhaXRlciIsICJ0aGlzQXJnIiwgIl9hcmd1bWVudHMiLCAiUCIsICJnZW5lcmF0b3IiLCAiYWRvcHQiLCAiZnVsZmlsbGVkIiwgInN0ZXAiLCAicmVqZWN0ZWQiLCAiX19nZW5lcmF0b3IiLCAiYm9keSIsICJfIiwgImYiLCAieSIsICJnIiwgInZlcmIiLCAib3AiLCAiU2ltcGxlU3BhblByb2Nlc3NvciIsICJleHBvcnRQcm9taXNlXzEiXQp9Cg==