@getopenpay/openpay-js 0.5.13 → 0.5.15

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.
Files changed (47) hide show
  1. package/dist/{ExportResult-B-YLKMaU.js → ExportResult-BacsqwKA.js} +1 -1
  2. package/dist/{Resource-BZeevyoh.js → Resource-Ds5bbQ3b.js} +4 -4
  3. package/dist/SimpleSpanProcessor-0bSccE1S.js +910 -0
  4. package/dist/_commonjsHelpers-CdLE1o9f.js +30 -0
  5. package/dist/detect-resources-UwRkF4Xd.js +862 -0
  6. package/dist/{diag-api-CHLb_Weo.js → diag-api-CMlZXyyv.js} +2 -2
  7. package/dist/index-1jECpTsg.js +147 -0
  8. package/dist/index-BZEpD-f0.js +6718 -0
  9. package/dist/index-BhZy-TW3.js +430 -0
  10. package/dist/index-BmKZeOoc.js +1619 -0
  11. package/dist/index-CDdbDQxQ.js +6 -0
  12. package/dist/index-CWTkU3J-.js +18 -0
  13. package/dist/index-DFO-DCsT.js +127 -0
  14. package/dist/index-DsxDp11a.js +28 -0
  15. package/dist/index-JNJd_YS1.js +1012 -0
  16. package/dist/index-j7i6AeZa.js +7005 -0
  17. package/dist/index.d.ts +29 -4
  18. package/dist/index.es.js +2 -2
  19. package/dist/index.umd.js +45 -45
  20. package/dist/lifecycle-D1BdEbZs.js +119 -0
  21. package/dist/{metrics-api-ClKmMX3Y.js → metrics-api-C9pRFfr-.js} +2 -2
  22. package/dist/sdk-info-ChuKu8zW.js +285 -0
  23. package/dist/suppress-tracing-B94rObkn.js +17 -0
  24. package/dist/url-CdPstDG9.js +798 -0
  25. package/dist/utils--M6ihaNw.js +101 -0
  26. package/dist/utils-De78ey-v.js +12 -0
  27. package/dist/utils-VJ-0MC7c.js +270 -0
  28. package/package.json +4 -4
  29. package/dist/SimpleSpanProcessor-CwJD-GjM.js +0 -957
  30. package/dist/_commonjsHelpers-f76XedMs.js +0 -25
  31. package/dist/detect-resources-BatabDmW.js +0 -854
  32. package/dist/index-ByaN1AdQ.js +0 -6685
  33. package/dist/index-CU4AI3HW.js +0 -52
  34. package/dist/index-Cb34s3AM.js +0 -1599
  35. package/dist/index-CmtkHZgE.js +0 -330
  36. package/dist/index-CtZ-xuHu.js +0 -7041
  37. package/dist/index-D5OCmVN-.js +0 -19
  38. package/dist/index-DLJd6nUV.js +0 -150
  39. package/dist/index-DjekHBls.js +0 -431
  40. package/dist/index-DoKHV9rR.js +0 -130
  41. package/dist/index-_ZTp3kCj.js +0 -830
  42. package/dist/lifecycle-BjQ-7GLm.js +0 -119
  43. package/dist/sdk-info-DYuuxEVK.js +0 -484
  44. package/dist/url-BAeEv8aD.js +0 -797
  45. package/dist/utils--qqdHZ_b.js +0 -142
  46. package/dist/utils-Bf8wDuNo.js +0 -381
  47. package/dist/utils-CX5YT7yI.js +0 -14
@@ -1,957 +0,0 @@
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-CtZ-xuHu.js";
2
- import { d } from "./diag-api-CHLb_Weo.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-BAeEv8aD.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-_ZTp3kCj.js";
5
- import { T as v, h as A, i as Pt, D as At, j as wt } from "./sdk-info-DYuuxEVK.js";
6
- import { R as Q } from "./Resource-BZeevyoh.js";
7
- import { E as w } from "./ExportResult-B-YLKMaU.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,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiU2ltcGxlU3BhblByb2Nlc3Nvci0hfnswMDJ9fi5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZiBhcyBTcGFuU3RhdHVzQ29kZSwgdCBhcyB0cmFjZSwgaSBhcyBpc1NwYW5Db250ZXh0VmFsaWQsIFQgYXMgVHJhY2VGbGFncywgZCBhcyBpc1ZhbGlkVHJhY2VJZCwgYyBhcyBjb250ZXh0LCBJIGFzIElOVkFMSURfU1BBTl9DT05URVhULCBTIGFzIFNwYW5LaW5kIH0gZnJvbSAnLi9pbmRleC0hfnswMDZ9fi5qcyc7XG5pbXBvcnQgeyBkIGFzIGRpYWcgfSBmcm9tICcuL2RpYWctYXBpLSF+ezAwNX1+LmpzJztcbmltcG9ydCB7IGwgYXMgaXNUaW1lSW5wdXQsIG4gYXMgaHJUaW1lRHVyYXRpb24sIG8gYXMgb3RwZXJmb3JtYW5jZSwgaiBhcyBoclRpbWUsIG0gYXMgbWlsbGlzVG9IclRpbWUsIHEgYXMgaXNUaW1lSW5wdXRIclRpbWUsIHIgYXMgYWRkSHJUaW1lcywgcyBhcyBTRU1BVFRSU19FWENFUFRJT05fVFlQRSwgdiBhcyBTRU1BVFRSU19FWENFUFRJT05fTUVTU0FHRSwgdyBhcyBnZXRUaW1lT3JpZ2luLCB4IGFzIFNFTUFUVFJTX0VYQ0VQVElPTl9TVEFDS1RSQUNFLCBwIGFzIHByb3BhZ2F0aW9uLCB5IGFzIGhyVGltZVRvTWljcm9zZWNvbmRzIH0gZnJvbSAnLi91cmwtIX57MDA5fX4uanMnO1xuaW1wb3J0IHsgaSBhcyBpc0F0dHJpYnV0ZVZhbHVlLCBzIGFzIHNhbml0aXplQXR0cmlidXRlcywgZyBhcyBnbG9iYWxFcnJvckhhbmRsZXIsIGEgYXMgc3VwcHJlc3NUcmFjaW5nLCB1IGFzIHVucmVmVGltZXIsIEIgYXMgQmluZE9uY2VGdXR1cmUsIGIgYXMgaXNUcmFjaW5nU3VwcHJlc3NlZCwgUyBhcyBTYW1wbGluZ0RlY2lzaW9uJDEsIEMgYXMgQ29tcG9zaXRlUHJvcGFnYXRvciwgVyBhcyBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yLCBjIGFzIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLCBtIGFzIG1lcmdlLCBkIGFzIGludGVybmFsIH0gZnJvbSAnLi9pbmRleC0hfnswMGx9fi5qcyc7XG5pbXBvcnQgeyBUIGFzIFRyYWNlc1NhbXBsZXJWYWx1ZXMsIGggYXMgZ2V0RW52LCBpIGFzIGdldEVudldpdGhvdXREZWZhdWx0cywgRCBhcyBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCwgaiBhcyBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwYn1+LmpzJztcbmltcG9ydCB7IFIgYXMgUmVzb3VyY2UgfSBmcm9tICcuL1Jlc291cmNlLSF+ezAwYX1+LmpzJztcbmltcG9ydCB7IEUgYXMgRXhwb3J0UmVzdWx0Q29kZSB9IGZyb20gJy4vRXhwb3J0UmVzdWx0LSF+ezAwZH1+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==