@microsoft/ocsdk 0.5.18-main.b444c91 → 0.5.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SDK.js +4 -4
- package/dist/SDK.min.js +3 -3
- package/lib/Model/IOCSDKLogData.d.ts +1 -0
- package/lib/SDK.js +302 -231
- package/lib/SDK.js.map +1 -1
- package/lib/Utils/TelemetryHelper.js +2 -1
- package/lib/Utils/TelemetryHelper.js.map +1 -1
- package/package.json +1 -1
package/lib/SDK.js
CHANGED
|
@@ -178,7 +178,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
178
178
|
key: "getLcwFcsDetails",
|
|
179
179
|
value: function () {
|
|
180
180
|
var _getLcwFcsDetails = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
181
|
-
var timer, requestPath, method, url, axiosInstance, requestHeaders, _this$configuration$d, response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds;
|
|
181
|
+
var timer, requestPath, method, url, axiosInstance, requestHeaders, backendTimer, _this$configuration$d, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, _httpRequestResponseTime, _elapsedTimeInMilliseconds;
|
|
182
182
|
|
|
183
183
|
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
184
184
|
while (1) {
|
|
@@ -196,33 +196,36 @@ var SDK = /*#__PURE__*/function () {
|
|
|
196
196
|
});
|
|
197
197
|
requestHeaders = {};
|
|
198
198
|
(0, _httpHeadersUtils.addOcUserAgentHeader)(this.ocUserAgent, requestHeaders);
|
|
199
|
-
|
|
200
|
-
_context.
|
|
199
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
200
|
+
_context.prev = 10;
|
|
201
|
+
_context.next = 13;
|
|
201
202
|
return axiosInstance.get(url, {
|
|
202
203
|
headers: requestHeaders,
|
|
203
204
|
timeout: (_this$configuration$d = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d !== void 0 ? _this$configuration$d : this.configuration.requestTimeoutConfig.getChatConfig
|
|
204
205
|
});
|
|
205
206
|
|
|
206
|
-
case
|
|
207
|
+
case 13:
|
|
207
208
|
response = _context.sent;
|
|
209
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
208
210
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
209
211
|
data = response.data;
|
|
210
|
-
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSSUCCEEDED, "Get LCW FCS details succeeded", "", response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
212
|
+
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSSUCCEEDED, "Get LCW FCS details succeeded", "", response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
211
213
|
return _context.abrupt("return", data);
|
|
212
214
|
|
|
213
|
-
case
|
|
214
|
-
_context.prev =
|
|
215
|
-
_context.t0 = _context["catch"](
|
|
215
|
+
case 21:
|
|
216
|
+
_context.prev = 21;
|
|
217
|
+
_context.t0 = _context["catch"](10);
|
|
218
|
+
_httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
216
219
|
_elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
217
|
-
this.logWithLogger(_LogLevel.LogLevel.
|
|
220
|
+
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSFAILED, "Get LCW FCS details failed", "", undefined, _elapsedTimeInMilliseconds, requestPath, method, _context.t0, undefined, requestHeaders, _httpRequestResponseTime);
|
|
218
221
|
throw _context.t0;
|
|
219
222
|
|
|
220
|
-
case
|
|
223
|
+
case 27:
|
|
221
224
|
case "end":
|
|
222
225
|
return _context.stop();
|
|
223
226
|
}
|
|
224
227
|
}
|
|
225
|
-
}, _callee, this, [[
|
|
228
|
+
}, _callee, this, [[10, 21]]);
|
|
226
229
|
}));
|
|
227
230
|
|
|
228
231
|
function getLcwFcsDetails() {
|
|
@@ -247,10 +250,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
247
250
|
url,
|
|
248
251
|
axiosInstance,
|
|
249
252
|
requestHeaders,
|
|
253
|
+
backendTimer,
|
|
250
254
|
_this$configuration$d2,
|
|
251
255
|
response,
|
|
256
|
+
httpRequestResponseTime,
|
|
252
257
|
elapsedTimeInMilliseconds,
|
|
253
258
|
data,
|
|
259
|
+
_httpRequestResponseTime2,
|
|
254
260
|
_elapsedTimeInMilliseconds2,
|
|
255
261
|
_args2 = arguments;
|
|
256
262
|
|
|
@@ -281,15 +287,17 @@ var SDK = /*#__PURE__*/function () {
|
|
|
281
287
|
requestHeaders = _objectSpread(_objectSpread({}, _Constants["default"].bypassCacheHeaders), requestHeaders);
|
|
282
288
|
}
|
|
283
289
|
|
|
284
|
-
|
|
285
|
-
_context2.
|
|
290
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
291
|
+
_context2.prev = 13;
|
|
292
|
+
_context2.next = 16;
|
|
286
293
|
return axiosInstance.get(url, {
|
|
287
294
|
headers: requestHeaders,
|
|
288
295
|
timeout: (_this$configuration$d2 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d2 !== void 0 ? _this$configuration$d2 : this.configuration.requestTimeoutConfig.getChatConfig
|
|
289
296
|
});
|
|
290
297
|
|
|
291
|
-
case
|
|
298
|
+
case 16:
|
|
292
299
|
response = _context2.sent;
|
|
300
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
293
301
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
294
302
|
data = response.data;
|
|
295
303
|
|
|
@@ -303,22 +311,23 @@ var SDK = /*#__PURE__*/function () {
|
|
|
303
311
|
data.headers["date"] = response.headers["date"];
|
|
304
312
|
}
|
|
305
313
|
|
|
306
|
-
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGSUCCEEDED, "Get Chat config succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
314
|
+
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGSUCCEEDED, "Get Chat config succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
307
315
|
return _context2.abrupt("return", data);
|
|
308
316
|
|
|
309
|
-
case
|
|
310
|
-
_context2.prev =
|
|
311
|
-
_context2.t0 = _context2["catch"](
|
|
317
|
+
case 27:
|
|
318
|
+
_context2.prev = 27;
|
|
319
|
+
_context2.t0 = _context2["catch"](13);
|
|
320
|
+
_httpRequestResponseTime2 = backendTimer.milliSecondsElapsed;
|
|
312
321
|
_elapsedTimeInMilliseconds2 = timer.milliSecondsElapsed;
|
|
313
|
-
this.logWithLogger(_LogLevel.LogLevel.
|
|
322
|
+
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGFAILED, "Get Chat config failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context2.t0, undefined, requestHeaders, _httpRequestResponseTime2);
|
|
314
323
|
return _context2.abrupt("return", Promise.reject(_context2.t0));
|
|
315
324
|
|
|
316
|
-
case
|
|
325
|
+
case 33:
|
|
317
326
|
case "end":
|
|
318
327
|
return _context2.stop();
|
|
319
328
|
}
|
|
320
329
|
}
|
|
321
|
-
}, _callee2, this, [[
|
|
330
|
+
}, _callee2, this, [[13, 27]]);
|
|
322
331
|
}));
|
|
323
332
|
|
|
324
333
|
function getChatConfig(_x) {
|
|
@@ -414,35 +423,38 @@ var SDK = /*#__PURE__*/function () {
|
|
|
414
423
|
};
|
|
415
424
|
return _context4.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
416
425
|
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(resolve, reject) {
|
|
417
|
-
var response, elapsedTimeInMilliseconds, data, headers, _elapsedTimeInMilliseconds3;
|
|
426
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, _httpRequestResponseTime3, _elapsedTimeInMilliseconds3;
|
|
418
427
|
|
|
419
428
|
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
420
429
|
while (1) {
|
|
421
430
|
switch (_context3.prev = _context3.next) {
|
|
422
431
|
case 0:
|
|
423
|
-
|
|
424
|
-
_context3.
|
|
432
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
433
|
+
_context3.prev = 1;
|
|
434
|
+
_context3.next = 4;
|
|
425
435
|
return axiosInstance(options);
|
|
426
436
|
|
|
427
|
-
case
|
|
437
|
+
case 4:
|
|
428
438
|
response = _context3.sent;
|
|
439
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
429
440
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
430
441
|
data = response.data, headers = response.headers;
|
|
431
442
|
|
|
432
443
|
_this2.setAuthCodeNonce(headers);
|
|
433
444
|
|
|
434
|
-
_this2.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSUCCEEDED, "Get LWI Details succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
445
|
+
_this2.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSUCCEEDED, "Get LWI Details succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
435
446
|
|
|
436
447
|
resolve(data);
|
|
437
|
-
_context3.next =
|
|
448
|
+
_context3.next = 20;
|
|
438
449
|
break;
|
|
439
450
|
|
|
440
|
-
case
|
|
441
|
-
_context3.prev =
|
|
442
|
-
_context3.t0 = _context3["catch"](
|
|
451
|
+
case 13:
|
|
452
|
+
_context3.prev = 13;
|
|
453
|
+
_context3.t0 = _context3["catch"](1);
|
|
454
|
+
_httpRequestResponseTime3 = backendTimer.milliSecondsElapsed;
|
|
443
455
|
_elapsedTimeInMilliseconds3 = timer.milliSecondsElapsed;
|
|
444
456
|
|
|
445
|
-
_this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context3.t0, undefined, requestHeaders);
|
|
457
|
+
_this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context3.t0, undefined, requestHeaders, _httpRequestResponseTime3);
|
|
446
458
|
|
|
447
459
|
if ((0, _isExpectedAxiosError["default"])(_context3.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
448
460
|
reject(new Error(_this2.HTTPTimeOutErrorMessage));
|
|
@@ -450,12 +462,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
450
462
|
|
|
451
463
|
reject(_context3.t0);
|
|
452
464
|
|
|
453
|
-
case
|
|
465
|
+
case 20:
|
|
454
466
|
case "end":
|
|
455
467
|
return _context3.stop();
|
|
456
468
|
}
|
|
457
469
|
}
|
|
458
|
-
}, _callee3, null, [[
|
|
470
|
+
}, _callee3, null, [[1, 13]]);
|
|
459
471
|
}));
|
|
460
472
|
|
|
461
473
|
return function (_x3, _x4) {
|
|
@@ -588,18 +600,20 @@ var SDK = /*#__PURE__*/function () {
|
|
|
588
600
|
});
|
|
589
601
|
return _context6.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
590
602
|
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(resolve, reject) {
|
|
591
|
-
var response, elapsedTimeInMilliseconds, data, headers, _elapsedTimeInMilliseconds4;
|
|
603
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, _httpRequestResponseTime4, _elapsedTimeInMilliseconds4;
|
|
592
604
|
|
|
593
605
|
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
594
606
|
while (1) {
|
|
595
607
|
switch (_context5.prev = _context5.next) {
|
|
596
608
|
case 0:
|
|
597
|
-
|
|
598
|
-
_context5.
|
|
609
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
610
|
+
_context5.prev = 1;
|
|
611
|
+
_context5.next = 4;
|
|
599
612
|
return axiosInstance(options);
|
|
600
613
|
|
|
601
|
-
case
|
|
614
|
+
case 4:
|
|
602
615
|
response = _context5.sent;
|
|
616
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
603
617
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
604
618
|
data = response.data, headers = response.headers;
|
|
605
619
|
|
|
@@ -613,45 +627,46 @@ var SDK = /*#__PURE__*/function () {
|
|
|
613
627
|
|
|
614
628
|
|
|
615
629
|
if (!data) {
|
|
616
|
-
_context5.next =
|
|
630
|
+
_context5.next = 18;
|
|
617
631
|
break;
|
|
618
632
|
}
|
|
619
633
|
|
|
620
634
|
if (!(Object.keys(data).length === 0)) {
|
|
621
|
-
_context5.next =
|
|
635
|
+
_context5.next = 14;
|
|
622
636
|
break;
|
|
623
637
|
}
|
|
624
638
|
|
|
625
639
|
reject(new Error("Empty data received from getChatToken"));
|
|
626
640
|
return _context5.abrupt("return");
|
|
627
641
|
|
|
628
|
-
case
|
|
642
|
+
case 14:
|
|
629
643
|
data.requestId = requestId;
|
|
630
644
|
|
|
631
|
-
_this3.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSUCCEEDED, "Get Chat Token succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
645
|
+
_this3.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSUCCEEDED, "Get Chat Token succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
632
646
|
|
|
633
647
|
resolve(data);
|
|
634
648
|
return _context5.abrupt("return");
|
|
635
649
|
|
|
636
|
-
case
|
|
650
|
+
case 18:
|
|
637
651
|
if (!(reconnectId && response.status === _Constants["default"].noContentStatusCode)) {
|
|
638
|
-
_context5.next =
|
|
652
|
+
_context5.next = 21;
|
|
639
653
|
break;
|
|
640
654
|
}
|
|
641
655
|
|
|
642
656
|
reject(response);
|
|
643
657
|
return _context5.abrupt("return");
|
|
644
658
|
|
|
645
|
-
case
|
|
646
|
-
_context5.next =
|
|
659
|
+
case 21:
|
|
660
|
+
_context5.next = 30;
|
|
647
661
|
break;
|
|
648
662
|
|
|
649
|
-
case
|
|
650
|
-
_context5.prev =
|
|
651
|
-
_context5.t0 = _context5["catch"](
|
|
663
|
+
case 23:
|
|
664
|
+
_context5.prev = 23;
|
|
665
|
+
_context5.t0 = _context5["catch"](1);
|
|
666
|
+
_httpRequestResponseTime4 = backendTimer.milliSecondsElapsed;
|
|
652
667
|
_elapsedTimeInMilliseconds4 = timer.milliSecondsElapsed;
|
|
653
668
|
|
|
654
|
-
_this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context5.t0, undefined, requestHeaders);
|
|
669
|
+
_this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context5.t0, undefined, requestHeaders, _httpRequestResponseTime4);
|
|
655
670
|
|
|
656
671
|
if ((0, _isExpectedAxiosError["default"])(_context5.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
657
672
|
reject(new Error(_this3.HTTPTimeOutErrorMessage));
|
|
@@ -659,12 +674,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
659
674
|
|
|
660
675
|
reject(_context5.t0);
|
|
661
676
|
|
|
662
|
-
case
|
|
677
|
+
case 30:
|
|
663
678
|
case "end":
|
|
664
679
|
return _context5.stop();
|
|
665
680
|
}
|
|
666
681
|
}
|
|
667
|
-
}, _callee5, null, [[
|
|
682
|
+
}, _callee5, null, [[1, 23]]);
|
|
668
683
|
}));
|
|
669
684
|
|
|
670
685
|
return function (_x6, _x7) {
|
|
@@ -723,18 +738,20 @@ var SDK = /*#__PURE__*/function () {
|
|
|
723
738
|
axiosInstance = _axios["default"].create();
|
|
724
739
|
return _context8.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
725
740
|
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(resolve, reject) {
|
|
726
|
-
var response, elapsedTimeInMilliseconds, data, headers, _elapsedTimeInMilliseconds5;
|
|
741
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, _httpRequestResponseTime5, _elapsedTimeInMilliseconds5;
|
|
727
742
|
|
|
728
743
|
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
|
729
744
|
while (1) {
|
|
730
745
|
switch (_context7.prev = _context7.next) {
|
|
731
746
|
case 0:
|
|
732
|
-
|
|
733
|
-
_context7.
|
|
747
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
748
|
+
_context7.prev = 1;
|
|
749
|
+
_context7.next = 4;
|
|
734
750
|
return axiosInstance(options);
|
|
735
751
|
|
|
736
|
-
case
|
|
752
|
+
case 4:
|
|
737
753
|
response = _context7.sent;
|
|
754
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
738
755
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
739
756
|
data = response.data, headers = response.headers;
|
|
740
757
|
|
|
@@ -742,26 +759,27 @@ var SDK = /*#__PURE__*/function () {
|
|
|
742
759
|
|
|
743
760
|
|
|
744
761
|
if (!data) {
|
|
745
|
-
_context7.next =
|
|
762
|
+
_context7.next = 13;
|
|
746
763
|
break;
|
|
747
764
|
}
|
|
748
765
|
|
|
749
|
-
_this4.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATSSUCCEEDED, "Get Reconnectable Chats Succeeded and old session returned", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
766
|
+
_this4.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATSSUCCEEDED, "Get Reconnectable Chats Succeeded and old session returned", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
750
767
|
|
|
751
768
|
resolve(data);
|
|
752
769
|
return _context7.abrupt("return");
|
|
753
770
|
|
|
754
|
-
case
|
|
771
|
+
case 13:
|
|
755
772
|
// No data found in the old sessions so returning null
|
|
756
773
|
resolve();
|
|
757
774
|
return _context7.abrupt("return");
|
|
758
775
|
|
|
759
|
-
case
|
|
760
|
-
_context7.prev =
|
|
761
|
-
_context7.t0 = _context7["catch"](
|
|
776
|
+
case 17:
|
|
777
|
+
_context7.prev = 17;
|
|
778
|
+
_context7.t0 = _context7["catch"](1);
|
|
779
|
+
_httpRequestResponseTime5 = backendTimer.milliSecondsElapsed;
|
|
762
780
|
_elapsedTimeInMilliseconds5 = timer.milliSecondsElapsed;
|
|
763
781
|
|
|
764
|
-
_this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATSFAILED, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context7.t0, undefined, requestHeaders);
|
|
782
|
+
_this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATSFAILED, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context7.t0, undefined, requestHeaders, _httpRequestResponseTime5);
|
|
765
783
|
|
|
766
784
|
if ((0, _isExpectedAxiosError["default"])(_context7.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
767
785
|
reject(new Error(_this4.HTTPTimeOutErrorMessage));
|
|
@@ -770,12 +788,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
770
788
|
reject(_context7.t0);
|
|
771
789
|
return _context7.abrupt("return");
|
|
772
790
|
|
|
773
|
-
case
|
|
791
|
+
case 25:
|
|
774
792
|
case "end":
|
|
775
793
|
return _context7.stop();
|
|
776
794
|
}
|
|
777
795
|
}
|
|
778
|
-
}, _callee7, null, [[
|
|
796
|
+
}, _callee7, null, [[1, 17]]);
|
|
779
797
|
}));
|
|
780
798
|
|
|
781
799
|
return function (_x9, _x10) {
|
|
@@ -839,44 +857,47 @@ var SDK = /*#__PURE__*/function () {
|
|
|
839
857
|
axiosInstance = _axios["default"].create();
|
|
840
858
|
return _context10.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
841
859
|
var _ref4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(resolve, reject) {
|
|
842
|
-
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds6;
|
|
860
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, _httpRequestResponseTime6, _elapsedTimeInMilliseconds6;
|
|
843
861
|
|
|
844
862
|
return _regenerator["default"].wrap(function _callee9$(_context9) {
|
|
845
863
|
while (1) {
|
|
846
864
|
switch (_context9.prev = _context9.next) {
|
|
847
865
|
case 0:
|
|
848
|
-
|
|
849
|
-
_context9.
|
|
866
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
867
|
+
_context9.prev = 1;
|
|
868
|
+
_context9.next = 4;
|
|
850
869
|
return axiosInstance(options);
|
|
851
870
|
|
|
852
|
-
case
|
|
871
|
+
case 4:
|
|
853
872
|
response = _context9.sent;
|
|
873
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
854
874
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
855
875
|
data = response.data;
|
|
856
876
|
|
|
857
877
|
if (!data) {
|
|
858
|
-
_context9.next =
|
|
878
|
+
_context9.next = 12;
|
|
859
879
|
break;
|
|
860
880
|
}
|
|
861
881
|
|
|
862
|
-
_this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability succeeded", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
882
|
+
_this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability succeeded", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
863
883
|
|
|
864
884
|
resolve(data);
|
|
865
885
|
return _context9.abrupt("return");
|
|
866
886
|
|
|
867
|
-
case
|
|
887
|
+
case 12:
|
|
868
888
|
// No data found so returning null
|
|
869
|
-
_this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability didn't send any valid data", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
889
|
+
_this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability didn't send any valid data", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
870
890
|
|
|
871
891
|
resolve();
|
|
872
892
|
return _context9.abrupt("return");
|
|
873
893
|
|
|
874
|
-
case
|
|
875
|
-
_context9.prev =
|
|
876
|
-
_context9.t0 = _context9["catch"](
|
|
894
|
+
case 17:
|
|
895
|
+
_context9.prev = 17;
|
|
896
|
+
_context9.t0 = _context9["catch"](1);
|
|
897
|
+
_httpRequestResponseTime6 = backendTimer.milliSecondsElapsed;
|
|
877
898
|
_elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
|
|
878
899
|
|
|
879
|
-
_this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYFAILED, "Get Reconnect Availability failed", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context9.t0, undefined, requestHeaders);
|
|
900
|
+
_this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYFAILED, "Get Reconnect Availability failed", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context9.t0, undefined, requestHeaders, _httpRequestResponseTime6);
|
|
880
901
|
|
|
881
902
|
if ((0, _isExpectedAxiosError["default"])(_context9.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
882
903
|
reject(new Error(_this5.HTTPTimeOutErrorMessage));
|
|
@@ -885,12 +906,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
885
906
|
reject(_context9.t0);
|
|
886
907
|
return _context9.abrupt("return");
|
|
887
908
|
|
|
888
|
-
case
|
|
909
|
+
case 25:
|
|
889
910
|
case "end":
|
|
890
911
|
return _context9.stop();
|
|
891
912
|
}
|
|
892
913
|
}
|
|
893
|
-
}, _callee9, null, [[
|
|
914
|
+
}, _callee9, null, [[1, 17]]);
|
|
894
915
|
}));
|
|
895
916
|
|
|
896
917
|
return function (_x12, _x13) {
|
|
@@ -1024,51 +1045,59 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1024
1045
|
};
|
|
1025
1046
|
return _context12.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1026
1047
|
var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(resolve, reject) {
|
|
1027
|
-
var response, elapsedTimeInMilliseconds, _data, headers, _elapsedTimeInMilliseconds7;
|
|
1048
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, _data, headers, _httpRequestResponseTime7, _elapsedTimeInMilliseconds7;
|
|
1028
1049
|
|
|
1029
1050
|
return _regenerator["default"].wrap(function _callee11$(_context11) {
|
|
1030
1051
|
while (1) {
|
|
1031
1052
|
switch (_context11.prev = _context11.next) {
|
|
1032
1053
|
case 0:
|
|
1033
|
-
|
|
1034
|
-
_context11.
|
|
1054
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
1055
|
+
_context11.prev = 1;
|
|
1056
|
+
_context11.next = 4;
|
|
1035
1057
|
return axiosInstance(options);
|
|
1036
1058
|
|
|
1037
|
-
case
|
|
1059
|
+
case 4:
|
|
1038
1060
|
response = _context11.sent;
|
|
1061
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1039
1062
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1040
1063
|
_data = response.data, headers = response.headers;
|
|
1041
1064
|
|
|
1042
1065
|
_this6.setAuthCodeNonce(headers);
|
|
1043
1066
|
|
|
1044
1067
|
if (_data) {
|
|
1045
|
-
_this6.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, "Get agent availability succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
1068
|
+
_this6.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, "Get agent availability succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1046
1069
|
|
|
1047
1070
|
resolve(_data);
|
|
1048
1071
|
}
|
|
1049
1072
|
|
|
1050
|
-
_context11.next =
|
|
1073
|
+
_context11.next = 21;
|
|
1051
1074
|
break;
|
|
1052
1075
|
|
|
1053
|
-
case
|
|
1054
|
-
_context11.prev =
|
|
1055
|
-
_context11.t0 = _context11["catch"](
|
|
1076
|
+
case 12:
|
|
1077
|
+
_context11.prev = 12;
|
|
1078
|
+
_context11.t0 = _context11["catch"](1);
|
|
1079
|
+
_httpRequestResponseTime7 = backendTimer.milliSecondsElapsed;
|
|
1056
1080
|
_elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
|
|
1057
1081
|
|
|
1058
|
-
_this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context11.t0, undefined, requestHeaders);
|
|
1082
|
+
_this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context11.t0, undefined, requestHeaders, _httpRequestResponseTime7);
|
|
1059
1083
|
|
|
1060
|
-
if ((0, _isExpectedAxiosError["default"])(_context11.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1061
|
-
|
|
1084
|
+
if (!(0, _isExpectedAxiosError["default"])(_context11.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1085
|
+
_context11.next = 20;
|
|
1086
|
+
break;
|
|
1062
1087
|
}
|
|
1063
1088
|
|
|
1089
|
+
reject(new Error(_this6.HTTPTimeOutErrorMessage));
|
|
1090
|
+
return _context11.abrupt("return");
|
|
1091
|
+
|
|
1092
|
+
case 20:
|
|
1064
1093
|
reject(_context11.t0);
|
|
1065
1094
|
|
|
1066
|
-
case
|
|
1095
|
+
case 21:
|
|
1067
1096
|
case "end":
|
|
1068
1097
|
return _context11.stop();
|
|
1069
1098
|
}
|
|
1070
1099
|
}
|
|
1071
|
-
}, _callee11, null, [[
|
|
1100
|
+
}, _callee11, null, [[1, 12]]);
|
|
1072
1101
|
}));
|
|
1073
1102
|
|
|
1074
1103
|
return function (_x15, _x16) {
|
|
@@ -1210,48 +1239,56 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1210
1239
|
};
|
|
1211
1240
|
return _context14.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1212
1241
|
var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(resolve, reject) {
|
|
1213
|
-
var response, elapsedTimeInMilliseconds, headers, _elapsedTimeInMilliseconds8;
|
|
1242
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, headers, _httpRequestResponseTime8, _elapsedTimeInMilliseconds8;
|
|
1214
1243
|
|
|
1215
1244
|
return _regenerator["default"].wrap(function _callee13$(_context13) {
|
|
1216
1245
|
while (1) {
|
|
1217
1246
|
switch (_context13.prev = _context13.next) {
|
|
1218
1247
|
case 0:
|
|
1219
|
-
|
|
1220
|
-
_context13.
|
|
1248
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
1249
|
+
_context13.prev = 1;
|
|
1250
|
+
_context13.next = 4;
|
|
1221
1251
|
return axiosInstance(options);
|
|
1222
1252
|
|
|
1223
|
-
case
|
|
1253
|
+
case 4:
|
|
1224
1254
|
response = _context13.sent;
|
|
1255
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1225
1256
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1226
1257
|
headers = response.headers;
|
|
1227
1258
|
|
|
1228
1259
|
_this7.setAuthCodeNonce(headers);
|
|
1229
1260
|
|
|
1230
|
-
_this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data, requestHeaders);
|
|
1261
|
+
_this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data, requestHeaders, httpRequestResponseTime);
|
|
1231
1262
|
|
|
1232
1263
|
resolve();
|
|
1233
|
-
_context13.next =
|
|
1264
|
+
_context13.next = 22;
|
|
1234
1265
|
break;
|
|
1235
1266
|
|
|
1236
|
-
case
|
|
1237
|
-
_context13.prev =
|
|
1238
|
-
_context13.t0 = _context13["catch"](
|
|
1267
|
+
case 13:
|
|
1268
|
+
_context13.prev = 13;
|
|
1269
|
+
_context13.t0 = _context13["catch"](1);
|
|
1270
|
+
_httpRequestResponseTime8 = backendTimer.milliSecondsElapsed;
|
|
1239
1271
|
_elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
|
|
1240
1272
|
|
|
1241
|
-
_this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context13.t0, data, requestHeaders);
|
|
1273
|
+
_this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context13.t0, data, requestHeaders, _httpRequestResponseTime8);
|
|
1242
1274
|
|
|
1243
|
-
if ((0, _isExpectedAxiosError["default"])(_context13.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1244
|
-
|
|
1275
|
+
if (!(0, _isExpectedAxiosError["default"])(_context13.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1276
|
+
_context13.next = 21;
|
|
1277
|
+
break;
|
|
1245
1278
|
}
|
|
1246
1279
|
|
|
1280
|
+
reject(new Error(_this7.HTTPTimeOutErrorMessage));
|
|
1281
|
+
return _context13.abrupt("return");
|
|
1282
|
+
|
|
1283
|
+
case 21:
|
|
1247
1284
|
reject(_context13.t0);
|
|
1248
1285
|
|
|
1249
|
-
case
|
|
1286
|
+
case 22:
|
|
1250
1287
|
case "end":
|
|
1251
1288
|
return _context13.stop();
|
|
1252
1289
|
}
|
|
1253
1290
|
}
|
|
1254
|
-
}, _callee13, null, [[
|
|
1291
|
+
}, _callee13, null, [[1, 13]]);
|
|
1255
1292
|
}));
|
|
1256
1293
|
|
|
1257
1294
|
return function (_x18, _x19) {
|
|
@@ -1295,10 +1332,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1295
1332
|
url,
|
|
1296
1333
|
method,
|
|
1297
1334
|
options,
|
|
1335
|
+
backendTimer,
|
|
1298
1336
|
response,
|
|
1337
|
+
httpRequestResponseTime,
|
|
1299
1338
|
elapsedTimeInMilliseconds,
|
|
1300
1339
|
_data2,
|
|
1301
1340
|
headers,
|
|
1341
|
+
_httpRequestResponseTime9,
|
|
1302
1342
|
_elapsedTimeInMilliseconds9,
|
|
1303
1343
|
_args15 = arguments;
|
|
1304
1344
|
|
|
@@ -1376,12 +1416,14 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1376
1416
|
url: url,
|
|
1377
1417
|
timeout: (_this$configuration$d9 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d9 !== void 0 ? _this$configuration$d9 : this.configuration.requestTimeoutConfig.sessionInit
|
|
1378
1418
|
};
|
|
1379
|
-
|
|
1380
|
-
_context15.
|
|
1419
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
1420
|
+
_context15.prev = 26;
|
|
1421
|
+
_context15.next = 29;
|
|
1381
1422
|
return axiosInstance(options);
|
|
1382
1423
|
|
|
1383
|
-
case
|
|
1424
|
+
case 29:
|
|
1384
1425
|
response = _context15.sent;
|
|
1426
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1385
1427
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1386
1428
|
_data2 = response.data, headers = response.headers;
|
|
1387
1429
|
this.setAuthCodeNonce(headers);
|
|
@@ -1394,39 +1436,40 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1394
1436
|
|
|
1395
1437
|
|
|
1396
1438
|
if (!(Object.keys(_data2).length === 0)) {
|
|
1397
|
-
_context15.next =
|
|
1439
|
+
_context15.next = 37;
|
|
1398
1440
|
break;
|
|
1399
1441
|
}
|
|
1400
1442
|
|
|
1401
1443
|
throw new Error("Empty data received from getChatToken");
|
|
1402
1444
|
|
|
1403
|
-
case
|
|
1445
|
+
case 37:
|
|
1404
1446
|
_data2.requestId = requestId;
|
|
1405
|
-
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.CREATESESSIONSUCCEEDED, "Create coversation call Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
1447
|
+
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.CREATESESSIONSUCCEEDED, "Create coversation call Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1406
1448
|
return _context15.abrupt("return", _data2);
|
|
1407
1449
|
|
|
1408
|
-
case
|
|
1409
|
-
_context15.prev =
|
|
1410
|
-
_context15.t0 = _context15["catch"](
|
|
1450
|
+
case 42:
|
|
1451
|
+
_context15.prev = 42;
|
|
1452
|
+
_context15.t0 = _context15["catch"](26);
|
|
1453
|
+
_httpRequestResponseTime9 = backendTimer.milliSecondsElapsed;
|
|
1411
1454
|
_elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
|
|
1412
|
-
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.CREATESESSIONFAILED, "Create conversation call failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context15.t0, data, requestHeaders);
|
|
1455
|
+
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.CREATESESSIONFAILED, "Create conversation call failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context15.t0, data, requestHeaders, _httpRequestResponseTime9);
|
|
1413
1456
|
|
|
1414
1457
|
if (!(0, _isExpectedAxiosError["default"])(_context15.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1415
|
-
_context15.next =
|
|
1458
|
+
_context15.next = 49;
|
|
1416
1459
|
break;
|
|
1417
1460
|
}
|
|
1418
1461
|
|
|
1419
1462
|
throw new Error(this.HTTPTimeOutErrorMessage);
|
|
1420
1463
|
|
|
1421
|
-
case
|
|
1464
|
+
case 49:
|
|
1422
1465
|
throw _context15.t0;
|
|
1423
1466
|
|
|
1424
|
-
case
|
|
1467
|
+
case 50:
|
|
1425
1468
|
case "end":
|
|
1426
1469
|
return _context15.stop();
|
|
1427
1470
|
}
|
|
1428
1471
|
}
|
|
1429
|
-
}, _callee15, this, [[
|
|
1472
|
+
}, _callee15, this, [[26, 42]]);
|
|
1430
1473
|
}));
|
|
1431
1474
|
|
|
1432
1475
|
function createConversation(_x20) {
|
|
@@ -1509,37 +1552,40 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1509
1552
|
};
|
|
1510
1553
|
return _context17.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1511
1554
|
var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
|
|
1512
|
-
var response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
|
|
1555
|
+
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime10, _elapsedTimeInMilliseconds10;
|
|
1513
1556
|
|
|
1514
1557
|
return _regenerator["default"].wrap(function _callee16$(_context16) {
|
|
1515
1558
|
while (1) {
|
|
1516
1559
|
switch (_context16.prev = _context16.next) {
|
|
1517
1560
|
case 0:
|
|
1518
|
-
|
|
1519
|
-
_context16.
|
|
1561
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
1562
|
+
_context16.prev = 1;
|
|
1563
|
+
_context16.next = 4;
|
|
1520
1564
|
return axiosInstance(options);
|
|
1521
1565
|
|
|
1522
|
-
case
|
|
1566
|
+
case 4:
|
|
1523
1567
|
response = _context16.sent;
|
|
1568
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1524
1569
|
headers = response.headers;
|
|
1525
1570
|
|
|
1526
1571
|
_this8.setAuthCodeNonce(headers);
|
|
1527
1572
|
|
|
1528
1573
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1529
1574
|
|
|
1530
|
-
_this8.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, "Session Close succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
1575
|
+
_this8.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, "Session Close succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1531
1576
|
|
|
1532
1577
|
resolve(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1533
1578
|
|
|
1534
|
-
_context16.next =
|
|
1579
|
+
_context16.next = 20;
|
|
1535
1580
|
break;
|
|
1536
1581
|
|
|
1537
|
-
case
|
|
1538
|
-
_context16.prev =
|
|
1539
|
-
_context16.t0 = _context16["catch"](
|
|
1582
|
+
case 13:
|
|
1583
|
+
_context16.prev = 13;
|
|
1584
|
+
_context16.t0 = _context16["catch"](1);
|
|
1585
|
+
_httpRequestResponseTime10 = backendTimer.milliSecondsElapsed;
|
|
1540
1586
|
_elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
|
|
1541
1587
|
|
|
1542
|
-
_this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context16.t0, undefined, requestHeaders);
|
|
1588
|
+
_this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context16.t0, undefined, requestHeaders, _httpRequestResponseTime10);
|
|
1543
1589
|
|
|
1544
1590
|
if (_context16.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1545
1591
|
reject(new Error(_this8.HTTPTimeOutErrorMessage));
|
|
@@ -1547,12 +1593,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1547
1593
|
|
|
1548
1594
|
reject(_context16.t0);
|
|
1549
1595
|
|
|
1550
|
-
case
|
|
1596
|
+
case 20:
|
|
1551
1597
|
case "end":
|
|
1552
1598
|
return _context16.stop();
|
|
1553
1599
|
}
|
|
1554
1600
|
}
|
|
1555
|
-
}, _callee16, null, [[
|
|
1601
|
+
}, _callee16, null, [[1, 13]]);
|
|
1556
1602
|
}));
|
|
1557
1603
|
|
|
1558
1604
|
return function (_x22, _x23) {
|
|
@@ -1620,18 +1666,20 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1620
1666
|
};
|
|
1621
1667
|
return _context19.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1622
1668
|
var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
|
|
1623
|
-
var _response$data, response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds11;
|
|
1669
|
+
var backendTimer, _response$data, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime11, _elapsedTimeInMilliseconds11;
|
|
1624
1670
|
|
|
1625
1671
|
return _regenerator["default"].wrap(function _callee18$(_context18) {
|
|
1626
1672
|
while (1) {
|
|
1627
1673
|
switch (_context18.prev = _context18.next) {
|
|
1628
1674
|
case 0:
|
|
1629
|
-
|
|
1630
|
-
_context18.
|
|
1675
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
1676
|
+
_context18.prev = 1;
|
|
1677
|
+
_context18.next = 4;
|
|
1631
1678
|
return axiosInstance(options);
|
|
1632
1679
|
|
|
1633
|
-
case
|
|
1680
|
+
case 4:
|
|
1634
1681
|
response = _context18.sent;
|
|
1682
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1635
1683
|
headers = response.headers;
|
|
1636
1684
|
|
|
1637
1685
|
_this9.setAuthCodeNonce(headers);
|
|
@@ -1639,25 +1687,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1639
1687
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1640
1688
|
|
|
1641
1689
|
if (((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true) {
|
|
1642
|
-
_this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSUCCEEDED, "Validate Auth Chat Record succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
1690
|
+
_this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSUCCEEDED, "Validate Auth Chat Record succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1643
1691
|
|
|
1644
1692
|
resolve(response.data);
|
|
1645
1693
|
} else {
|
|
1646
|
-
_this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record Failed. Record is not found or request is not authorized", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
1694
|
+
_this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record Failed. Record is not found or request is not authorized", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1647
1695
|
|
|
1648
1696
|
reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized"));
|
|
1649
1697
|
} // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1650
1698
|
|
|
1651
1699
|
|
|
1652
|
-
_context18.next =
|
|
1700
|
+
_context18.next = 19;
|
|
1653
1701
|
break;
|
|
1654
1702
|
|
|
1655
|
-
case
|
|
1656
|
-
_context18.prev =
|
|
1657
|
-
_context18.t0 = _context18["catch"](
|
|
1703
|
+
case 12:
|
|
1704
|
+
_context18.prev = 12;
|
|
1705
|
+
_context18.t0 = _context18["catch"](1);
|
|
1706
|
+
_httpRequestResponseTime11 = backendTimer.milliSecondsElapsed;
|
|
1658
1707
|
_elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
|
|
1659
1708
|
|
|
1660
|
-
_this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context18.t0, undefined, requestHeaders);
|
|
1709
|
+
_this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context18.t0, undefined, requestHeaders, _httpRequestResponseTime11);
|
|
1661
1710
|
|
|
1662
1711
|
if ((0, _isExpectedAxiosError["default"])(_context18.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1663
1712
|
reject(new Error(_this9.HTTPTimeOutErrorMessage));
|
|
@@ -1670,12 +1719,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1670
1719
|
reject(_context18.t0);
|
|
1671
1720
|
}
|
|
1672
1721
|
|
|
1673
|
-
case
|
|
1722
|
+
case 19:
|
|
1674
1723
|
case "end":
|
|
1675
1724
|
return _context18.stop();
|
|
1676
1725
|
}
|
|
1677
1726
|
}
|
|
1678
|
-
}, _callee18, null, [[
|
|
1727
|
+
}, _callee18, null, [[1, 12]]);
|
|
1679
1728
|
}));
|
|
1680
1729
|
|
|
1681
1730
|
return function (_x26, _x27) {
|
|
@@ -1756,36 +1805,39 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1756
1805
|
};
|
|
1757
1806
|
return _context21.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1758
1807
|
var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
|
|
1759
|
-
var response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
|
|
1808
|
+
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime12, _elapsedTimeInMilliseconds12;
|
|
1760
1809
|
|
|
1761
1810
|
return _regenerator["default"].wrap(function _callee20$(_context20) {
|
|
1762
1811
|
while (1) {
|
|
1763
1812
|
switch (_context20.prev = _context20.next) {
|
|
1764
1813
|
case 0:
|
|
1765
|
-
|
|
1766
|
-
_context20.
|
|
1814
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
1815
|
+
_context20.prev = 1;
|
|
1816
|
+
_context20.next = 4;
|
|
1767
1817
|
return axiosInstance(options);
|
|
1768
1818
|
|
|
1769
|
-
case
|
|
1819
|
+
case 4:
|
|
1770
1820
|
response = _context20.sent;
|
|
1821
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1771
1822
|
headers = response.headers;
|
|
1772
1823
|
|
|
1773
1824
|
_this10.setAuthCodeNonce(headers);
|
|
1774
1825
|
|
|
1775
1826
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1776
1827
|
|
|
1777
|
-
_this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
1828
|
+
_this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1778
1829
|
|
|
1779
1830
|
resolve();
|
|
1780
|
-
_context20.next =
|
|
1831
|
+
_context20.next = 20;
|
|
1781
1832
|
break;
|
|
1782
1833
|
|
|
1783
|
-
case
|
|
1784
|
-
_context20.prev =
|
|
1785
|
-
_context20.t0 = _context20["catch"](
|
|
1834
|
+
case 13:
|
|
1835
|
+
_context20.prev = 13;
|
|
1836
|
+
_context20.t0 = _context20["catch"](1);
|
|
1837
|
+
_httpRequestResponseTime12 = backendTimer.milliSecondsElapsed;
|
|
1786
1838
|
_elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
|
|
1787
1839
|
|
|
1788
|
-
_this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context20.t0, undefined, requestHeaders);
|
|
1840
|
+
_this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context20.t0, undefined, requestHeaders, _httpRequestResponseTime12);
|
|
1789
1841
|
|
|
1790
1842
|
if ((0, _isExpectedAxiosError["default"])(_context20.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1791
1843
|
reject(new Error(_this10.HTTPTimeOutErrorMessage));
|
|
@@ -1793,12 +1845,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1793
1845
|
|
|
1794
1846
|
reject(_context20.t0);
|
|
1795
1847
|
|
|
1796
|
-
case
|
|
1848
|
+
case 20:
|
|
1797
1849
|
case "end":
|
|
1798
1850
|
return _context20.stop();
|
|
1799
1851
|
}
|
|
1800
1852
|
}
|
|
1801
|
-
}, _callee20, null, [[
|
|
1853
|
+
}, _callee20, null, [[1, 13]]);
|
|
1802
1854
|
}));
|
|
1803
1855
|
|
|
1804
1856
|
return function (_x30, _x31) {
|
|
@@ -1892,36 +1944,39 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1892
1944
|
};
|
|
1893
1945
|
return _context23.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1894
1946
|
var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
|
|
1895
|
-
var response, data, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds13;
|
|
1947
|
+
var backendTimer, response, httpRequestResponseTime, data, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime13, _elapsedTimeInMilliseconds13;
|
|
1896
1948
|
|
|
1897
1949
|
return _regenerator["default"].wrap(function _callee22$(_context22) {
|
|
1898
1950
|
while (1) {
|
|
1899
1951
|
switch (_context22.prev = _context22.next) {
|
|
1900
1952
|
case 0:
|
|
1901
|
-
|
|
1902
|
-
_context22.
|
|
1953
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
1954
|
+
_context22.prev = 1;
|
|
1955
|
+
_context22.next = 4;
|
|
1903
1956
|
return axiosInstance(options);
|
|
1904
1957
|
|
|
1905
|
-
case
|
|
1958
|
+
case 4:
|
|
1906
1959
|
response = _context22.sent;
|
|
1960
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1907
1961
|
data = response.data, headers = response.headers;
|
|
1908
1962
|
|
|
1909
1963
|
_this11.setAuthCodeNonce(headers);
|
|
1910
1964
|
|
|
1911
1965
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1912
1966
|
|
|
1913
|
-
_this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
1967
|
+
_this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1914
1968
|
|
|
1915
1969
|
resolve(data);
|
|
1916
|
-
_context22.next =
|
|
1970
|
+
_context22.next = 20;
|
|
1917
1971
|
break;
|
|
1918
1972
|
|
|
1919
|
-
case
|
|
1920
|
-
_context22.prev =
|
|
1921
|
-
_context22.t0 = _context22["catch"](
|
|
1973
|
+
case 13:
|
|
1974
|
+
_context22.prev = 13;
|
|
1975
|
+
_context22.t0 = _context22["catch"](1);
|
|
1976
|
+
_httpRequestResponseTime13 = backendTimer.milliSecondsElapsed;
|
|
1922
1977
|
_elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
|
|
1923
1978
|
|
|
1924
|
-
_this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context22.t0, undefined, requestHeaders);
|
|
1979
|
+
_this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context22.t0, undefined, requestHeaders, _httpRequestResponseTime13);
|
|
1925
1980
|
|
|
1926
1981
|
if ((0, _isExpectedAxiosError["default"])(_context22.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1927
1982
|
reject(new Error(_this11.HTTPTimeOutErrorMessage));
|
|
@@ -1929,12 +1984,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1929
1984
|
|
|
1930
1985
|
reject(_context22.t0);
|
|
1931
1986
|
|
|
1932
|
-
case
|
|
1987
|
+
case 20:
|
|
1933
1988
|
case "end":
|
|
1934
1989
|
return _context22.stop();
|
|
1935
1990
|
}
|
|
1936
1991
|
}
|
|
1937
|
-
}, _callee22, null, [[
|
|
1992
|
+
}, _callee22, null, [[1, 13]]);
|
|
1938
1993
|
}));
|
|
1939
1994
|
|
|
1940
1995
|
return function (_x34, _x35) {
|
|
@@ -2027,35 +2082,38 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2027
2082
|
};
|
|
2028
2083
|
return _context25.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2029
2084
|
var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
|
|
2030
|
-
var response, elapsedTimeInMilliseconds, data, headers, _elapsedTimeInMilliseconds14;
|
|
2085
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, _httpRequestResponseTime14, _elapsedTimeInMilliseconds14;
|
|
2031
2086
|
|
|
2032
2087
|
return _regenerator["default"].wrap(function _callee24$(_context24) {
|
|
2033
2088
|
while (1) {
|
|
2034
2089
|
switch (_context24.prev = _context24.next) {
|
|
2035
2090
|
case 0:
|
|
2036
|
-
|
|
2037
|
-
_context24.
|
|
2091
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
2092
|
+
_context24.prev = 1;
|
|
2093
|
+
_context24.next = 4;
|
|
2038
2094
|
return axiosInstance(options);
|
|
2039
2095
|
|
|
2040
|
-
case
|
|
2096
|
+
case 4:
|
|
2041
2097
|
response = _context24.sent;
|
|
2098
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2042
2099
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2043
2100
|
data = response.data, headers = response.headers;
|
|
2044
2101
|
|
|
2045
2102
|
_this12.setAuthCodeNonce(headers);
|
|
2046
2103
|
|
|
2047
|
-
_this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
2104
|
+
_this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2048
2105
|
|
|
2049
2106
|
resolve(data);
|
|
2050
|
-
_context24.next =
|
|
2107
|
+
_context24.next = 20;
|
|
2051
2108
|
break;
|
|
2052
2109
|
|
|
2053
|
-
case
|
|
2054
|
-
_context24.prev =
|
|
2055
|
-
_context24.t0 = _context24["catch"](
|
|
2110
|
+
case 13:
|
|
2111
|
+
_context24.prev = 13;
|
|
2112
|
+
_context24.t0 = _context24["catch"](1);
|
|
2113
|
+
_httpRequestResponseTime14 = backendTimer.milliSecondsElapsed;
|
|
2056
2114
|
_elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
|
|
2057
2115
|
|
|
2058
|
-
_this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context24.t0, undefined, requestHeaders);
|
|
2116
|
+
_this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context24.t0, undefined, requestHeaders, _httpRequestResponseTime14);
|
|
2059
2117
|
|
|
2060
2118
|
if ((0, _isExpectedAxiosError["default"])(_context24.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2061
2119
|
reject(new Error(_this12.HTTPTimeOutErrorMessage));
|
|
@@ -2063,12 +2121,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2063
2121
|
|
|
2064
2122
|
reject(_context24.t0);
|
|
2065
2123
|
|
|
2066
|
-
case
|
|
2124
|
+
case 20:
|
|
2067
2125
|
case "end":
|
|
2068
2126
|
return _context24.stop();
|
|
2069
2127
|
}
|
|
2070
2128
|
}
|
|
2071
|
-
}, _callee24, null, [[
|
|
2129
|
+
}, _callee24, null, [[1, 13]]);
|
|
2072
2130
|
}));
|
|
2073
2131
|
|
|
2074
2132
|
return function (_x39, _x40) {
|
|
@@ -2153,36 +2211,39 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2153
2211
|
};
|
|
2154
2212
|
return _context27.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2155
2213
|
var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(resolve, reject) {
|
|
2156
|
-
var response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds15;
|
|
2214
|
+
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime15, _elapsedTimeInMilliseconds15;
|
|
2157
2215
|
|
|
2158
2216
|
return _regenerator["default"].wrap(function _callee26$(_context26) {
|
|
2159
2217
|
while (1) {
|
|
2160
2218
|
switch (_context26.prev = _context26.next) {
|
|
2161
2219
|
case 0:
|
|
2162
|
-
|
|
2163
|
-
_context26.
|
|
2220
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
2221
|
+
_context26.prev = 1;
|
|
2222
|
+
_context26.next = 4;
|
|
2164
2223
|
return axiosInstance(options);
|
|
2165
2224
|
|
|
2166
|
-
case
|
|
2225
|
+
case 4:
|
|
2167
2226
|
response = _context26.sent;
|
|
2227
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2168
2228
|
headers = response.headers;
|
|
2169
2229
|
|
|
2170
2230
|
_this13.setAuthCodeNonce(headers);
|
|
2171
2231
|
|
|
2172
2232
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2173
2233
|
|
|
2174
|
-
_this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
2234
|
+
_this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2175
2235
|
|
|
2176
2236
|
resolve();
|
|
2177
|
-
_context26.next =
|
|
2237
|
+
_context26.next = 20;
|
|
2178
2238
|
break;
|
|
2179
2239
|
|
|
2180
|
-
case
|
|
2181
|
-
_context26.prev =
|
|
2182
|
-
_context26.t0 = _context26["catch"](
|
|
2240
|
+
case 13:
|
|
2241
|
+
_context26.prev = 13;
|
|
2242
|
+
_context26.t0 = _context26["catch"](1);
|
|
2243
|
+
_httpRequestResponseTime15 = backendTimer.milliSecondsElapsed;
|
|
2183
2244
|
_elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
|
|
2184
2245
|
|
|
2185
|
-
_this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context26.t0, undefined, requestHeaders);
|
|
2246
|
+
_this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context26.t0, undefined, requestHeaders, _httpRequestResponseTime15);
|
|
2186
2247
|
|
|
2187
2248
|
if ((0, _isExpectedAxiosError["default"])(_context26.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2188
2249
|
reject(new Error(_this13.HTTPTimeOutErrorMessage));
|
|
@@ -2190,12 +2251,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2190
2251
|
|
|
2191
2252
|
reject(_context26.t0);
|
|
2192
2253
|
|
|
2193
|
-
case
|
|
2254
|
+
case 20:
|
|
2194
2255
|
case "end":
|
|
2195
2256
|
return _context26.stop();
|
|
2196
2257
|
}
|
|
2197
2258
|
}
|
|
2198
|
-
}, _callee26, null, [[
|
|
2259
|
+
}, _callee26, null, [[1, 13]]);
|
|
2199
2260
|
}));
|
|
2200
2261
|
|
|
2201
2262
|
return function (_x44, _x45) {
|
|
@@ -2261,33 +2322,36 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2261
2322
|
};
|
|
2262
2323
|
return _context29.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2263
2324
|
var _ref13 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(resolve, reject) {
|
|
2264
|
-
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds16;
|
|
2325
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, _httpRequestResponseTime16, _elapsedTimeInMilliseconds16;
|
|
2265
2326
|
|
|
2266
2327
|
return _regenerator["default"].wrap(function _callee28$(_context28) {
|
|
2267
2328
|
while (1) {
|
|
2268
2329
|
switch (_context28.prev = _context28.next) {
|
|
2269
2330
|
case 0:
|
|
2270
|
-
|
|
2271
|
-
_context28.
|
|
2331
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
2332
|
+
_context28.prev = 1;
|
|
2333
|
+
_context28.next = 4;
|
|
2272
2334
|
return axiosInstance(options);
|
|
2273
2335
|
|
|
2274
|
-
case
|
|
2336
|
+
case 4:
|
|
2275
2337
|
response = _context28.sent;
|
|
2338
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2276
2339
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2277
2340
|
data = response.data;
|
|
2278
2341
|
|
|
2279
|
-
_this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
2342
|
+
_this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2280
2343
|
|
|
2281
2344
|
resolve(data);
|
|
2282
|
-
_context28.next =
|
|
2345
|
+
_context28.next = 19;
|
|
2283
2346
|
break;
|
|
2284
2347
|
|
|
2285
|
-
case
|
|
2286
|
-
_context28.prev =
|
|
2287
|
-
_context28.t0 = _context28["catch"](
|
|
2348
|
+
case 12:
|
|
2349
|
+
_context28.prev = 12;
|
|
2350
|
+
_context28.t0 = _context28["catch"](1);
|
|
2351
|
+
_httpRequestResponseTime16 = backendTimer.milliSecondsElapsed;
|
|
2288
2352
|
_elapsedTimeInMilliseconds16 = timer.milliSecondsElapsed;
|
|
2289
2353
|
|
|
2290
|
-
_this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds16, requestPath, method, _context28.t0, undefined, requestHeaders);
|
|
2354
|
+
_this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds16, requestPath, method, _context28.t0, undefined, requestHeaders, _httpRequestResponseTime16);
|
|
2291
2355
|
|
|
2292
2356
|
if ((0, _isExpectedAxiosError["default"])(_context28.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2293
2357
|
reject(new Error(_this14.HTTPTimeOutErrorMessage));
|
|
@@ -2295,12 +2359,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2295
2359
|
|
|
2296
2360
|
reject(_context28.t0);
|
|
2297
2361
|
|
|
2298
|
-
case
|
|
2362
|
+
case 19:
|
|
2299
2363
|
case "end":
|
|
2300
2364
|
return _context28.stop();
|
|
2301
2365
|
}
|
|
2302
2366
|
}
|
|
2303
|
-
}, _callee28, null, [[
|
|
2367
|
+
}, _callee28, null, [[1, 12]]);
|
|
2304
2368
|
}));
|
|
2305
2369
|
|
|
2306
2370
|
return function (_x47, _x48) {
|
|
@@ -2383,36 +2447,39 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2383
2447
|
};
|
|
2384
2448
|
return _context31.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2385
2449
|
var _ref14 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee30(resolve, reject) {
|
|
2386
|
-
var response, headers, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds17;
|
|
2450
|
+
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime17, _elapsedTimeInMilliseconds17;
|
|
2387
2451
|
|
|
2388
2452
|
return _regenerator["default"].wrap(function _callee30$(_context30) {
|
|
2389
2453
|
while (1) {
|
|
2390
2454
|
switch (_context30.prev = _context30.next) {
|
|
2391
2455
|
case 0:
|
|
2392
|
-
|
|
2393
|
-
_context30.
|
|
2456
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
2457
|
+
_context30.prev = 1;
|
|
2458
|
+
_context30.next = 4;
|
|
2394
2459
|
return axiosInstance(options);
|
|
2395
2460
|
|
|
2396
|
-
case
|
|
2461
|
+
case 4:
|
|
2397
2462
|
response = _context30.sent;
|
|
2463
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2398
2464
|
headers = response.headers;
|
|
2399
2465
|
|
|
2400
2466
|
_this15.setAuthCodeNonce(headers);
|
|
2401
2467
|
|
|
2402
2468
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2403
2469
|
|
|
2404
|
-
_this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
2470
|
+
_this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2405
2471
|
|
|
2406
2472
|
resolve();
|
|
2407
|
-
_context30.next =
|
|
2473
|
+
_context30.next = 20;
|
|
2408
2474
|
break;
|
|
2409
2475
|
|
|
2410
|
-
case
|
|
2411
|
-
_context30.prev =
|
|
2412
|
-
_context30.t0 = _context30["catch"](
|
|
2476
|
+
case 13:
|
|
2477
|
+
_context30.prev = 13;
|
|
2478
|
+
_context30.t0 = _context30["catch"](1);
|
|
2479
|
+
_httpRequestResponseTime17 = backendTimer.milliSecondsElapsed;
|
|
2413
2480
|
_elapsedTimeInMilliseconds17 = timer.milliSecondsElapsed;
|
|
2414
2481
|
|
|
2415
|
-
_this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds17, requestPath, method, _context30.t0, undefined, requestHeaders);
|
|
2482
|
+
_this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds17, requestPath, method, _context30.t0, undefined, requestHeaders, _httpRequestResponseTime17);
|
|
2416
2483
|
|
|
2417
2484
|
if ((0, _isExpectedAxiosError["default"])(_context30.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2418
2485
|
reject(new Error(_this15.HTTPTimeOutErrorMessage));
|
|
@@ -2420,12 +2487,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2420
2487
|
|
|
2421
2488
|
reject(_context30.t0);
|
|
2422
2489
|
|
|
2423
|
-
case
|
|
2490
|
+
case 20:
|
|
2424
2491
|
case "end":
|
|
2425
2492
|
return _context30.stop();
|
|
2426
2493
|
}
|
|
2427
2494
|
}
|
|
2428
|
-
}, _callee30, null, [[
|
|
2495
|
+
}, _callee30, null, [[1, 13]]);
|
|
2429
2496
|
}));
|
|
2430
2497
|
|
|
2431
2498
|
return function (_x51, _x52) {
|
|
@@ -2513,32 +2580,35 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2513
2580
|
};
|
|
2514
2581
|
return _context33.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2515
2582
|
var _ref15 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee32(resolve, reject) {
|
|
2516
|
-
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds18;
|
|
2583
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, _httpRequestResponseTime18, _elapsedTimeInMilliseconds18;
|
|
2517
2584
|
|
|
2518
2585
|
return _regenerator["default"].wrap(function _callee32$(_context32) {
|
|
2519
2586
|
while (1) {
|
|
2520
2587
|
switch (_context32.prev = _context32.next) {
|
|
2521
2588
|
case 0:
|
|
2522
|
-
|
|
2523
|
-
_context32.
|
|
2589
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
2590
|
+
_context32.prev = 1;
|
|
2591
|
+
_context32.next = 4;
|
|
2524
2592
|
return axiosInstance(options);
|
|
2525
2593
|
|
|
2526
|
-
case
|
|
2594
|
+
case 4:
|
|
2527
2595
|
response = _context32.sent;
|
|
2596
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2528
2597
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2529
2598
|
|
|
2530
|
-
_this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders);
|
|
2599
|
+
_this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2531
2600
|
|
|
2532
2601
|
resolve();
|
|
2533
|
-
_context32.next =
|
|
2602
|
+
_context32.next = 18;
|
|
2534
2603
|
break;
|
|
2535
2604
|
|
|
2536
|
-
case
|
|
2537
|
-
_context32.prev =
|
|
2538
|
-
_context32.t0 = _context32["catch"](
|
|
2605
|
+
case 11:
|
|
2606
|
+
_context32.prev = 11;
|
|
2607
|
+
_context32.t0 = _context32["catch"](1);
|
|
2608
|
+
_httpRequestResponseTime18 = backendTimer.milliSecondsElapsed;
|
|
2539
2609
|
_elapsedTimeInMilliseconds18 = timer.milliSecondsElapsed;
|
|
2540
2610
|
|
|
2541
|
-
_this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds18, requestPath, method, _context32.t0, undefined, requestHeaders);
|
|
2611
|
+
_this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds18, requestPath, method, _context32.t0, undefined, requestHeaders, _httpRequestResponseTime18);
|
|
2542
2612
|
|
|
2543
2613
|
if ((0, _isExpectedAxiosError["default"])(_context32.t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2544
2614
|
reject(new Error(_this16.HTTPTimeOutErrorMessage));
|
|
@@ -2546,12 +2616,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2546
2616
|
|
|
2547
2617
|
reject(_context32.t0);
|
|
2548
2618
|
|
|
2549
|
-
case
|
|
2619
|
+
case 18:
|
|
2550
2620
|
case "end":
|
|
2551
2621
|
return _context32.stop();
|
|
2552
2622
|
}
|
|
2553
2623
|
}
|
|
2554
|
-
}, _callee32, null, [[
|
|
2624
|
+
}, _callee32, null, [[1, 11]]);
|
|
2555
2625
|
}));
|
|
2556
2626
|
|
|
2557
2627
|
return function (_x55, _x56) {
|
|
@@ -2590,7 +2660,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2590
2660
|
|
|
2591
2661
|
}, {
|
|
2592
2662
|
key: "logWithLogger",
|
|
2593
|
-
value: function logWithLogger(logLevel, telemetryEventType, description, requestId, response, elapsedTimeInMilliseconds, requestPath, method, error, requestPayload, requestHeaders) {
|
|
2663
|
+
value: function logWithLogger(logLevel, telemetryEventType, description, requestId, response, elapsedTimeInMilliseconds, requestPath, method, error, requestPayload, requestHeaders, httpRequestResponseTime) {
|
|
2594
2664
|
var _response, _response2, _response3, _response3$headers;
|
|
2595
2665
|
|
|
2596
2666
|
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
@@ -2656,6 +2726,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2656
2726
|
RequestId: requestId,
|
|
2657
2727
|
Region: response === null || response === void 0 ? void 0 : response.data.Region,
|
|
2658
2728
|
ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
|
|
2729
|
+
HttpRequestResponseTime: httpRequestResponseTime,
|
|
2659
2730
|
TransactionId: response === null || response === void 0 ? void 0 : response.headers[_Constants["default"].transactionid],
|
|
2660
2731
|
RequestPath: requestPath,
|
|
2661
2732
|
RequestMethod: method,
|
|
@@ -2714,4 +2785,4 @@ exports["default"] = SDK;
|
|
|
2714
2785
|
waitTimeBetweenRetriesConfig: _waitTimeBetweenRetriesConfigs.waitTimeBetweenRetriesConfigs,
|
|
2715
2786
|
ocUserAgent: []
|
|
2716
2787
|
});
|
|
2717
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiU0RLRXJyb3IiLCJDbGllbnRIVFRQVGltZW91dEVycm9yTmFtZSIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JNZXNzYWdlIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwicmVxdWVzdElkIiwiY29ycmVsYXRpb25JZCIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsImNoYW5uZWxJZCIsInZhbHVlcyIsIkNoYW5uZWxJZCIsImluY2x1ZGVzIiwiRXJyb3IiLCJjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIkNvbnN0YW50cyIsInJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIm9jVXNlckFnZW50IiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJ0aW1lciIsIlRpbWVyIiwiVElNRVIiLCJsb2dXaXRoTG9nZ2VyIiwiTG9nTGV2ZWwiLCJJTkZPIiwiT0NTREtUZWxlbWV0cnlFdmVudCIsIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxjd0Zjc0RldGFpbHNQYXRoIiwib3JnSWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJ3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllcyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWciLCJnZXRDaGF0Q29uZmlnIiwicmVxdWVzdEhlYWRlcnMiLCJnZXQiLCJ0aW1lb3V0IiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0IiwicmVxdWVzdFRpbWVvdXRDb25maWciLCJyZXNwb25zZSIsImVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJtaWxsaVNlY29uZHNFbGFwc2VkIiwiZGF0YSIsIkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQiLCJ1bmRlZmluZWQiLCJHRVRMQ1dGQ1NERVRBSUxTRkFJTEVEIiwiYnlwYXNzQ2FjaGUiLCJHRVRDSEFUQ09ORklHRlNUQVJURUQiLCJMaXZlQ2hhdENvbmZpZ1BhdGgiLCJ3aWRnZXRJZCIsImFkZERlZmF1bHRIZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCIsIkdFVENIQVRDT05GSUdGQUlMRUQiLCJQcm9taXNlIiwicmVqZWN0IiwiZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIiwiR0VUTFdJU1RBVFVTU1RBUlRFRCIsIkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJoZWFkZXJPdmVyd3JpdGVzIiwiZ2V0TFdJRGV0YWlscyIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJzaG91bGRVc2VTaWdRdWVyeVBhcmFtIiwidXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtIiwicGFyYW1zIiwic2lnIiwib3B0aW9ucyIsInJlc29sdmUiLCJzZXRBdXRoQ29kZU5vbmNlIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJheGlvc1RpbWVvdXRFcnJvckNvZGUiLCJIVFRQVGltZU91dEVycm9yTWVzc2FnZSIsImdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIiwiY3VycmVudFJldHJ5Q291bnQiLCJjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIiwicmVmcmVzaFRva2VuIiwiTXNPY0JvdEFwcGxpY2F0aW9uSWQiLCJtdWx0aUJvdCIsIkdFVENIQVRUT0tFTlNUQVJURUQiLCJlbmRwb2ludCIsImdldENoYXRUb2tlbiIsInJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5SZXRyeU9uNDI5IiwidG9Mb3dlckNhc2UiLCJHRVRDSEFUVE9LRU5TVUNDRUVERUQiLCJzdGF0dXMiLCJub0NvbnRlbnRTdGF0dXNDb2RlIiwiR0VUQ0hBVFRPS0VORkFJTEVEIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1RBUlRFRCIsIkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aCIsImdldFJlY29ubmVjdGFibGVDaGF0cyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NVQ0NFRURFRCIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU0ZBSUxFRCIsIm9wdGlvbmFsUGFyYW1zIiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1RBUlRFRCIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsImdldFJlY29ubmVjdEF2YWlsYWJpbGl0eSIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIldBUk4iLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRUQiLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0QWdlbnRBdmFpbGFiaWxpdHkiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwiY3VzdG9tQ29udGV4dERhdGEiLCJ0ZW1wQXJyIiwiQ3VzdG9tQ29udGV4dERhdGEiLCJzb3J0IiwiYXNzaWduIiwicG9ydGFsY29udGFjdGlkIiwiY2FjaGVLZXkiLCJKU09OIiwic3RyaW5naWZ5IiwidG9TdHJpbmciLCJIZXgiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwic2Vzc2lvbkluaXQiLCJzaG91bGRSZXRyeSIsImVycm9yIiwiYmFzZVBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsInNldFJlcXVlc3RJZEhlYWRlciIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJDUkVBVEVTRVNTSU9OU1RBUlRFRCIsIkxpdmVDaGF0Q29ubmVjdG9yQXV0aFBhdGgiLCJMaXZlQ2hhdENvbm5lY3RvclBhdGgiLCJDUkVBVEVTRVNTSU9OU1VDQ0VFREVEIiwiQ1JFQVRFU0VTU0lPTkZBSUxFRCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsInNlc3Npb25DbG9zZSIsImlzUmVjb25uZWN0Q2hhdCIsImlzUGVyc2lzdGVudENoYXQiLCJjaGF0SWQiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoIiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwiY29kZSIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEIiwiTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dCIsImF1dGhDaGF0RXhpc3QiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVEIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJMaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwibG9nIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsImdldFN1cnZleUludml0ZUxpbmsiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJ0b2tlbiIsImdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJnZXRDaGF0VHJhbnNjcmlwdHMiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJHRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCIsIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEIiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJlbWFpbFRyYW5zY3JpcHQiLCJMaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCIsIkVNQUlMVFJBTlNDUklQVEZBSUxFRCIsIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEIiwiTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgiLCJmZXRjaERhdGFNYXNraW5nSW5mbyIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEIiwiTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwibWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVEIiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsIlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRoIiwic2VuZFR5cGluZ0luZGljYXRvciIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEIiwibG9nTGV2ZWwiLCJ0ZWxlbWV0cnlFdmVudFR5cGUiLCJkZXNjcmlwdGlvbiIsInJlcXVlc3RQYXlsb2FkIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwic2FuaXRpemVkUmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwic2FuaXRpemVkUmVxdWVzdEhlYWRlcnMiLCJhdXRoVG9rZW5EZXRhaWxzIiwic3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMiLCJhdG9iIiwicGF5bG9hZCIsInNwbGl0IiwianNvbkRhdGEiLCJwYXJzZSIsImx3aUNvbnRleHRzIiwic3ViIiwiZXhwIiwibHdpQ29udGV4dHNEYXRhIiwiY3VzdG9tRGF0YSIsIlJlcXVlc3RJZCIsIlJlZ2lvbiIsIkVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJUcmFuc2FjdGlvbklkIiwidHJhbnNhY3Rpb25pZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIkV4Y2VwdGlvbkRldGFpbHMiLCJSZXF1ZXN0UGF5bG9hZCIsIlJlcXVlc3RIZWFkZXJzIiwiUmVzcG9uc2VFcnJvcmNvZGUiLCJlcnJvcmNvZGUiLCJBdXRoVG9rZW5EZXRhaWxzIiwic2V0U2Vzc2lvbklkSGVhZGVyIiwic2V0Q29ycmVsYXRpb25JZEluSGVhZGVyIiwic3Vic3RyaW5nIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsImRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIl0s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QWdCakU3RCxFQUFBQSw2QkFBNkIsRUFBRTtBQWhCa0MsQztpQ0FEaERyTSxHLDBCQW9Cc0M7QUFDdkRVLEVBQUFBLGFBQWEsRUFBRSxvQkFBU21TLFNBQVQsQ0FBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsQ0FEd0M7QUFFdkRDLEVBQUFBLHNCQUFzQixFQUFFLEVBRitCO0FBR3ZEQyxFQUFBQSx1Q0FBdUMsRUFBRSxLQUhjO0FBSXZEbE0sRUFBQUEsc0JBQXNCLEVBQUUsSUFKK0I7QUFLdkR6RCxFQUFBQSwwQkFBMEIsRUFBRSxDQUwyQjtBQU12RE8sRUFBQUEscUJBQXFCLEVBQUVPLFNBTmdDO0FBT3ZETixFQUFBQSxvQkFBb0IsRUFBRTVELEdBQUcsQ0FBQ2dULDJCQVA2QjtBQVF2RHhOLEVBQUFBLGlDQUFpQyxFQUFFLEtBUm9CO0FBU3ZEbEMsRUFBQUEsNEJBQTRCLEVBQUUyUCw0REFUeUI7QUFVdkRwUixFQUFBQSxXQUFXLEVBQUU7QUFWMEMsQyIsInNvdXJjZVJvb3QiOiJvY3NkazovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiwgT0NTREtUZWxlbWV0cnlFdmVudCwgU0RLRXJyb3IgfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCBheGlvc1JldHJ5SGFuZGxlciwgeyBheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCB9IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlIYW5kbGVyXCI7XG5cbmltcG9ydCB7IEJyb3dzZXJJbmZvIH0gZnJvbSBcIi4vVXRpbHMvQnJvd3NlckluZm9cIjtcbmltcG9ydCBDb25zdGFudHMgZnJvbSBcIi4vQ29tbW9uL0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL1V0aWxzL0RldmljZUluZm9cIjtcbmltcG9ydCBGZXRjaENoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL0ZldGNoQ2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCBIZXggZnJvbSBcImNyeXB0by1qcy9lbmMtaGV4XCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU0RLIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES1wiO1xuaW1wb3J0IElTREtDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES0NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vTW9kZWwvTG9nTGV2ZWxcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciBmcm9tIFwiLi9JbnRlcmZhY2VzL09tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXJcIjtcbmltcG9ydCBRdWV1ZUF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9RdWV1ZUF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdEF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIGZyb20gXCIuL01vZGVsL1JlY29ubmVjdE1hcHBpbmdSZWNvcmRcIjtcbmltcG9ydCB7IFJlcXVlc3RUaW1lb3V0Q29uZmlnIH0gZnJvbSBcIi4vQ29tbW9uL1JlcXVlc3RUaW1lb3V0Q29uZmlnXCI7XG5pbXBvcnQgU0hBMjU2IGZyb20gXCJjcnlwdG8tanMvc2hhMjU2XCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCB7IGFkZE9jVXNlckFnZW50SGVhZGVyIH0gZnJvbSBcIi4vVXRpbHMvaHR0cEhlYWRlcnNVdGlsc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQgfSBmcm9tIFwiLi9VdGlscy9lbmRwb2ludHNDcmVhdG9yc1wiO1xuaW1wb3J0IGlzRXhwZWN0ZWRBeGlvc0Vycm9yIGZyb20gXCIuL1V0aWxzL2lzRXhwZWN0ZWRBeGlvc0Vycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCB7IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIH0gZnJvbSBcIi4vVXRpbHMvd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMTIwMDAwLFxuICAgIGdldExXSURldGFpbHM6IDE1MDAwLFxuICAgIGdldENoYXRUb2tlbjogMTUwMDAsXG4gICAgc2Vzc2lvbkluaXQ6IDE1MDAwLFxuICAgIHNlc3Npb25DbG9zZTogMTUwMDAsXG4gICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHk6IDE1MDAwLFxuICAgIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2U6IDE1MDAwLFxuICAgIGdldFN1cnZleUludml0ZUxpbms6IDE1MDAwLFxuICAgIGdldENoYXRUcmFuc2NyaXB0czogMzAwMDAsXG4gICAgZW1haWxUcmFuc2NyaXB0OiA1MDAwLFxuICAgIGZldGNoRGF0YU1hc2tpbmdJbmZvOiA1MDAwLFxuICAgIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0OiAxNTAwMCxcbiAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc2VuZFR5cGluZ0luZGljYXRvcjogNTAwMCxcbiAgICB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dDogMTUwMDBcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgYXV0aENvZGVOb25jZTogdXVpZHY0KCkuc3Vic3RyaW5nKDAsIDgpLFxuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOTogdHJ1ZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogNSxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyxcbiAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlLFxuICAgIHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc6IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLFxuICAgIG9jVXNlckFnZW50OiBbXVxuICB9O1xuXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIG9jVXNlckFnZW50OiBzdHJpbmdbXTtcbiAgSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UgPSBgJHtTREtFcnJvci5DbGllbnRIVFRQVGltZW91dEVycm9yTmFtZX06ICR7U0RLRXJyb3IuQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2V9YDtcblxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbmRpdmlkdWFsIGVuZHBvaW50VGltZW91dCBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub2NVc2VyQWdlbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24ub2NVc2VyQWdlbnQ7XG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjI7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMQ1cgRkNTIERldGFpbHMgb2YgdGhlIE9yZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMY3dGY3NEZXRhaWxzKCk6IFByb21pc2U8b2JqZWN0IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTU1RBUlRFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN0YXJ0ZWRcIiwgXCJcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MY3dGY3NEZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0ge307XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQodXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBzdWNjZWVkZWRcIiwgXCJcIiwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTRkFJTEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgZmFpbGVkXCIsIFwiXCIsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY2hhdCBjb25maWcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdENvbmZpZyhyZXF1ZXN0SWQ6IHN0cmluZywgYnlwYXNzQ2FjaGUgPSBmYWxzZSk6IFByb21pc2U8b2JqZWN0IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHRlNUQVJURUQsIFwiR2V0IENoYXQgY29uZmlnIHN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcblxuICAgIGxldCByZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzID0geyAuLi5Db25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzLCAuLi5yZXF1ZXN0SGVhZGVycyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbikge1xuICAgICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzICYmIHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdKSB7XG4gICAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRUVERUQsIFwiR2V0IENoYXQgY29uZmlnIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHRkFJTEVELCBcIkdldCBDaGF0IGNvbmZpZyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgTFdJIGRldGFpbHMuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBMV0kgRGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMV0lEZXRhaWxzKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgYSBlbmRwb2ludCBmb3IgYW5vbnltb3VzIGNoYXRzIHRvIGdldCBMV0kgRGV0YWlsc1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZChheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRMV0lEZXRhaWxzLFxuICAgIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgLy8gdXBkYXRlZCBhdXRoIGVuZHBvaW50IGZvciBhdXRoZW50aWNhdGVkIGNoYXRzIGFuZCBhZGQgYXV0aCB0b2tlbiBpbiBoZWFkZXJcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgLy8gSWYgc2hvdWxkIG9ubHkgYmUgYXBwbGljYWJsZSBvbiB1bmF1dGggY2hhdCAmIHRoZSBmbGFnIGVuYWJsZWRcbiAgICBjb25zdCBzaG91bGRVc2VTaWdRdWVyeVBhcmFtID0gIWF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gJiYgdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSA9PT0gdHJ1ZTtcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGlmICghc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH07XG5cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGlmIChzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1VDQ0VFREVELCBcIkdldCBMV0kgRGV0YWlscyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGNoYXQgdG9rZW4gZnJvbSBPbW5pY2hhbm5lbCB0byBqb2luIFQxIHRocmVhZC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3IgZ2V0Y2hhdHRva2VuIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdG9rZW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zID0ge30sIGN1cnJlbnRSZXRyeUNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiwgcmVmcmVzaFRva2VuLCBNc09jQm90QXBwbGljYXRpb25JZCB9ID0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgbXVsdGlCb3QgPSAoTXNPY0JvdEFwcGxpY2F0aW9uSWQgJiYgTXNPY0JvdEFwcGxpY2F0aW9uSWQubGVuZ3RoID4gMCk/IHRydWU6IGZhbHNlO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsIFwiR2V0IENoYXQgVG9rZW4gU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGN1cnJlbnRSZXRyeUNvdW50YCk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQoY3VycmVudExpdmVDaGF0VmVyc2lvbiBhcyBMaXZlQ2hhdFZlcnNpb24gfHwgdGhpcy5saXZlQ2hhdFZlcnNpb24sIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPyB0cnVlIDogZmFsc2UsIG11bHRpQm90KTtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7ZW5kcG9pbnR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgXG4gICAgLy8gSWYgc2hvdWxkIG9ubHkgYmUgYXBwbGljYWJsZSBvbiB1bmF1dGggY2hhdCAmIHRoZSBmbGFnIGVuYWJsZWRcbiAgICBjb25zdCBzaG91bGRVc2VTaWdRdWVyeVBhcmFtID0gIWF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gJiYgdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSA9PT0gdHJ1ZTtcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGlmICghc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH1cbiAgICBpZiAoTXNPY0JvdEFwcGxpY2F0aW9uSWQgJiYgTXNPY0JvdEFwcGxpY2F0aW9uSWQubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zWydNcy1PYy1Cb3QtQXBwbGljYXRpb24tSWQnXSA9IE1zT2NCb3RBcHBsaWNhdGlvbklkO1xuICAgIH1cblxuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHBhcmFtcy5yZWZyZXNoVG9rZW4gPSAndHJ1ZSdcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGlmIChzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogKGN1cnJlbnRSZXRyeUNvdW50ID4gdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlKSA/IGN1cnJlbnRSZXRyeUNvdW50IDogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjksXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkVtcHR5IGRhdGEgcmVjZWl2ZWQgZnJvbSBnZXRDaGF0VG9rZW5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsIFwiR2V0IENoYXQgVG9rZW4gZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NUQVJURUQsIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcz8ucmVxdWVzdElkO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0YWJsZUNoYXRzXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUU0ZBSUxFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZywgb3B0aW9uYWxQYXJhbXM6IElSZWNvbm5lY3RBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxSZWNvbm5lY3RBdmFpbGFiaWxpdHkgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IFJlY29ubmVjdGFibGUgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVjb25uZWN0SWR9YDtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhvcHRpb25hbFBhcmFtcz8ucmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgb3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5XQVJOLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YVwiLCBvcHRpb25hbFBhcmFtcz8ucmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IGZhaWxlZFwiLCBvcHRpb25hbFBhcmFtcz8ucmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgY29uc3QgY2FjaE9iaiA9IHtcbiAgICAgIFwib3JnSWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgY29uc3QgdGVtcEFyciA9IEN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJjdXN0b21Db250ZXh0XCI6IHRlbXBBcnIgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJwb3J0YWxjb250YWN0aWRcIjogZGF0YS5wb3J0YWxjb250YWN0aWQgfSk7XG4gICAgfVxuXG4gICAgLy9kYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcbiAgICBkYXRhLmNhY2hlS2V5ID0gU0hBMjU2KEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS50b1N0cmluZyhIZXgpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqJ1xuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHJldHJ5T240MjkgPSB0cnVlO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyKGVycm9yLCByZXRyeU9uNDI5KSxcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBhdXRoZW50aWNhdGVkVXNlclRva2VuXG4gICAgICA/IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aFxuICAgICAgOiBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aDtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtiYXNlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7ICAgICBcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdEhlYWRlcnMsIHtcbiAgICAgICAgW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl06IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sXG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdOiB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRSZXF1ZXN0SWRIZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cblxuICAgIC8vIElmIHNob3VsZCBvbmx5IGJlIGFwcGxpY2FibGUgb24gdW5hdXRoIGNoYXQgJiB0aGUgZmxhZyBlbmFibGVkXG4gICAgY29uc3Qgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0SWQgJiYgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ29udmVyc2F0aW9uKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05TVEFSVEVELCBcIkNyZWF0ZSBjb252ZXJzYXRpb24gY2FsbCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHJldHJ5T240MjkgPSB0cnVlO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyKGVycm9yLCByZXRyeU9uNDI5KSxcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBhdXRoZW50aWNhdGVkVXNlclRva2VuXG4gICAgICA/IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29ubmVjdG9yQXV0aFBhdGhcbiAgICAgIDogT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JQYXRoO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7YmFzZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9L3dpZGdldEFwcC8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS9jb252ZXJzYXRpb25gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHsgICAgIFxuICAgICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0SGVhZGVycywge1xuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXTogYXV0aGVudGljYXRlZFVzZXJUb2tlbixcbiAgICAgICAgW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV06IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICB0aGlzLnNldFJlcXVlc3RJZEhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZGF0YS5yZWNvbm5lY3RJZCA9IHJlY29ubmVjdElkO1xuICAgIH1cblxuICAgIGRhdGEuY2hhbm5lbElkID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uSW5pdFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgZGF0YSByZWNlaXZlZCBmcm9tIGdldENoYXRUb2tlblwiKTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5DUkVBVEVTRVNTSU9OU1VDQ0VFREVELCBcIkNyZWF0ZSBjb3ZlcnNhdGlvbiBjYWxsIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05GQUlMRUQsIFwiQ3JlYXRlIGNvbnZlcnNhdGlvbiBjYWxsIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIGRhdGEsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgIFxuICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELCBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWQgfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsIFwiU2Vzc2lvbiBDbG9zZSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGF1dGggY2hhdCByZWNvcmQgZXhpc3RzIGluIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkKHJlcXVlc3RJZDogc3RyaW5nLCB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY2hhdElkIH0gPSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELCBcIlN1Ym1pdCBQb3N0IENoYXQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFURkFJTEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcblxuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkVtYWlsIFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELCBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyBFbGFwc2VkIHRpbWUgaW4gbXNcbiAgICogQHBhcmFtIHJlcXVlc3RQYXRoIFJlcXVlc3QgcGF0aFxuICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZFxuICAgKiBAcGFyYW0gZXJyb3IgRXJyb3JcbiAgICogQHBhcmFtIGRhdGEgRGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dXaXRoTG9nZ2VyKGxvZ0xldmVsOiBMb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlOiBPQ1NES1RlbGVtZXRyeUV2ZW50LCBkZXNjcmlwdGlvbjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsIHJlc3BvbnNlPzogQXhpb3NSZXNwb25zZTxhbnk+LCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyLCByZXF1ZXN0UGF0aD86IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIHJlcXVlc3RQYXlsb2FkPzogYW55LCByZXF1ZXN0SGVhZGVycz86IGFueSk6IHZvaWQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1ZXN0UGF5bG9hZCkge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB7IC4uLnJlcXVlc3RQYXlsb2FkIH07XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkKTtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGF1dGhUb2tlbkRldGFpbHM6IGFueSA9IHVuZGVmaW5lZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKHJlcXVlc3RIZWFkZXJzKSB7XG4gICAgICBzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyA9IHsgLi4ucmVxdWVzdEhlYWRlcnMgfTtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMoc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICBpZiAocmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSkge1xuICAgICAgICBpZiAod2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5hdG9iKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0b2tlbi5zcGxpdChcIi5cIilbMV07XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gd2luZG93LmF0b2IocGF5bG9hZCk7XG4gICAgICAgICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICBjb25zdCBsd2lDb250ZXh0cyA9IGpzb25EYXRhW1wibHdpY29udGV4dHNcIl07XG4gICAgICAgICAgICBhdXRoVG9rZW5EZXRhaWxzID0ge1xuICAgICAgICAgICAgICBzdWI6IGpzb25EYXRhW1wic3ViXCJdLFxuICAgICAgICAgICAgICBleHA6IGpzb25EYXRhW1wiZXhwXCJdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAobHdpQ29udGV4dHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgbHdpQ29udGV4dHNEYXRhID0gSlNPTi5wYXJzZShsd2lDb250ZXh0cyk7XG4gICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhsd2lDb250ZXh0c0RhdGEpO1xuICAgICAgICAgICAgICBhdXRoVG9rZW5EZXRhaWxzLmx3aUNvbnRleHRzID0gbHdpQ29udGV4dHNEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgIFJlZ2lvbjogcmVzcG9uc2U/LmRhdGEuUmVnaW9uLFxuICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlPy5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSxcbiAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uZGF0YSB8fCBlcnJvciA6IHVuZGVmaW5lZCwgXG4gICAgICBSZXF1ZXN0UGF5bG9hZDogc2FuaXRpemVkUmVxdWVzdFBheWxvYWQsXG4gICAgICBSZXF1ZXN0SGVhZGVyczogc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMsXG4gICAgICBSZXNwb25zZUVycm9yY29kZTogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uaGVhZGVycz8uZXJyb3Jjb2RlIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEF1dGhUb2tlbkRldGFpbHM6IGF1dGhUb2tlbkRldGFpbHNcbiAgICB9O1xuICAgIHRoaXMubG9nZ2VyLmxvZyhsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldEF1dGhDb2RlTm9uY2UgPSAoaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2UpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlID0gaGVhZGVycz8uYXV0aGNvZGVub25jZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldFNlc3Npb25JZEhlYWRlciA9IChzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkXSA9IHNlc3Npb25JZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFJlcXVlc3RJZEhlYWRlciA9IChyZXF1ZXN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogU3RyaW5nTWFwKSA9PiB7XG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIgPSAoY29ycmVsYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBoZWFkZXJzOiBTdHJpbmdNYXApID0+IHtcbiAgICBpZiAoY29ycmVsYXRpb25JZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmNvcnJlbGF0aW9uSWRdID0gY29ycmVsYXRpb25JZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
2788
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiU0RLRXJyb3IiLCJDbGllbnRIVFRQVGltZW91dEVycm9yTmFtZSIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JNZXNzYWdlIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwicmVxdWVzdElkIiwiY29ycmVsYXRpb25JZCIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsImNoYW5uZWxJZCIsInZhbHVlcyIsIkNoYW5uZWxJZCIsImluY2x1ZGVzIiwiRXJyb3IiLCJjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIkNvbnN0YW50cyIsInJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIm9jVXNlckFnZW50IiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJ0aW1lciIsIlRpbWVyIiwiVElNRVIiLCJsb2dXaXRoTG9nZ2VyIiwiTG9nTGV2ZWwiLCJJTkZPIiwiT0NTREtUZWxlbWV0cnlFdmVudCIsIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxjd0Zjc0RldGFpbHNQYXRoIiwib3JnSWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJ3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllcyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWciLCJnZXRDaGF0Q29uZmlnIiwicmVxdWVzdEhlYWRlcnMiLCJiYWNrZW5kVGltZXIiLCJnZXQiLCJ0aW1lb3V0IiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0IiwicmVxdWVzdFRpbWVvdXRDb25maWciLCJyZXNwb25zZSIsImh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJkYXRhIiwiR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCIsInVuZGVmaW5lZCIsIkVSUk9SIiwiR0VUTENXRkNTREVUQUlMU0ZBSUxFRCIsImJ5cGFzc0NhY2hlIiwiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEIiwiTGl2ZUNoYXRDb25maWdQYXRoIiwid2lkZ2V0SWQiLCJhZGREZWZhdWx0SGVhZGVycyIsImJ5cGFzc0NhY2hlSGVhZGVycyIsIkdFVENIQVRDT05GSUdTVUNDRUVERUQiLCJHRVRDSEFUQ09ORklHRkFJTEVEIiwiUHJvbWlzZSIsInJlamVjdCIsImdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyIsIkdFVExXSVNUQVRVU1NUQVJURUQiLCJMaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiaGVhZGVyT3ZlcndyaXRlcyIsImdldExXSURldGFpbHMiLCJhdXRoZW50aWNhdGVkVXNlclRva2VuIiwicmVjb25uZWN0SWQiLCJkZWZhdWx0SGVhZGVycyIsIkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwic2hvdWxkVXNlU2lnUXVlcnlQYXJhbSIsInVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSIsInBhcmFtcyIsInNpZyIsIm9wdGlvbnMiLCJyZXNvbHZlIiwic2V0QXV0aENvZGVOb25jZSIsIkdFVExXSVNUQVRVU1NVQ0NFRURFRCIsIkdFVExXSVNUQVRVU0ZBSUxFRCIsImF4aW9zVGltZW91dEVycm9yQ29kZSIsIkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJyZWZyZXNoVG9rZW4iLCJNc09jQm90QXBwbGljYXRpb25JZCIsIm11bHRpQm90IiwiR0VUQ0hBVFRPS0VOU1RBUlRFRCIsImVuZHBvaW50IiwiZ2V0Q2hhdFRva2VuIiwicmV0cnlPbjQyOSIsImdldENoYXRUb2tlblJldHJ5T240MjkiLCJ0b0xvd2VyQ2FzZSIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJHRVRDSEFUVE9LRU5GQUlMRUQiLCJyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFNTVEFSVEVEIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwiZ2V0UmVjb25uZWN0YWJsZUNoYXRzIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVEIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTRkFJTEVEIiwib3B0aW9uYWxQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVEFSVEVEIiwiTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5IiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiV0FSTiIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWUZBSUxFRCIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQiLCJHZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsImluaXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImNhY2hPYmoiLCJjdXN0b21Db250ZXh0RGF0YSIsInRlbXBBcnIiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b1N0cmluZyIsIkhleCIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJHRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCIsInNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OSU5JVFNUQVJURUQiLCJzZXNzaW9uSW5pdCIsInNob3VsZFJldHJ5IiwiZXJyb3IiLCJiYXNlUGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwic2V0UmVxdWVzdElkSGVhZGVyIiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsIkNSRUFURVNFU1NJT05TVEFSVEVEIiwiTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aCIsIkxpdmVDaGF0Q29ubmVjdG9yUGF0aCIsIkNSRUFURVNFU1NJT05TVUNDRUVERUQiLCJDUkVBVEVTRVNTSU9ORkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwic2Vzc2lvbkNsb3NlIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJjb2RlIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0IiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwicG9zdENoYXRSZXNwb25zZSIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJsb2ciLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiZ2V0U3VydmV5SW52aXRlTGluayIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsImVtYWlsVHJhbnNjcmlwdCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyIsImF1dGhUb2tlbkRldGFpbHMiLCJzdHJpcFJlcXVlc3RIZWFkZXJzU2Vuc2l0aXZlUHJvcGVydGllcyIsImF0b2IiLCJwYXlsb2FkIiwic3BsaXQiLCJqc29uRGF0YSIsInBhcnNlIiwibHdpQ29udGV4dHMiLCJzdWIiLCJleHAiLCJsd2lDb250ZXh0c0RhdGEiLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIkh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwiVHJhbnNhY3Rpb25JZCIsInRyYW5zYWN0aW9uaWQiLCJSZXF1ZXN0UGF0aCIsIlJlcXVlc3RNZXRob2QiLCJSZXNwb25zZVN0YXR1c0NvZGUiLCJFeGNlcHRpb25EZXRhaWxzIiwiUmVxdWVzdFBheWxvYWQiLCJSZXF1ZXN0SGVhZGVycyIsIlJlc3BvbnNlRXJyb3Jjb2RlIiwiZXJyb3Jjb2RlIiwiQXV0aFRva2VuRGV0YWlscyIsInNldFNlc3Npb25JZEhlYWRlciIsInNldENvcnJlbGF0aW9uSWRJbkhlYWRlciIsInN1YnN0cmluZyIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWciLCJ3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBTUE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFcUJBLEc7QUF1Q25CLGVBQTJCQyx3QkFBM0IsRUFBbUw7QUFBQTs7QUFBQSxRQUEzRkMsYUFBMkYsdUVBQXhERixHQUFHLENBQUNHLG9CQUFvRDtBQUFBLFFBQXRCQyxNQUFzQjtBQUFBO0FBQUEsU0FBeEpILHdCQUF3SixHQUF4SkEsd0JBQXdKO0FBQUEsU0FBM0ZDLGFBQTJGLEdBQTNGQSxhQUEyRjtBQUFBLFNBQXRCRSxNQUFzQixHQUF0QkEsTUFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxnRkFIdEpDLGdCQUFTQywwQkFHNkksZUFIOUdELGdCQUFTRSw2QkFHcUc7QUFBQSwrREEyNkN4SixVQUFDQyxPQUFELEVBQWtCO0FBQzNDLFVBQUlBLE9BQUosYUFBSUEsT0FBSixlQUFJQSxPQUFPLENBQUVDLGFBQWIsRUFBNEI7QUFDMUIsUUFBQSxLQUFJLENBQUNQLGFBQUwsQ0FBbUJRLGFBQW5CLEdBQW1DRixPQUFuQyxhQUFtQ0EsT0FBbkMsdUJBQW1DQSxPQUFPLENBQUVDLGFBQTVDO0FBQ0Q7QUFDRixLQS82Q2tMO0FBQUEsaUVBdzdDdEosVUFBQ0UsU0FBRCxFQUFnQ0gsT0FBaEMsRUFBaUQ7QUFDNUUsVUFBSUcsU0FBSixFQUFlO0FBQ2JILFFBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCQyxXQUF4QixDQUFQLEdBQThDRixTQUE5QztBQUNEO0FBQ0YsS0E1N0NrTDtBQUFBLGlFQTg3Q3RKLFVBQUNHLFNBQUQsRUFBZ0NOLE9BQWhDLEVBQXVEO0FBQ2xG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IExpdmVDaGF0VmVyc2lvbiwgT0NTREtUZWxlbWV0cnlFdmVudCwgU0RLRXJyb3IgfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCBheGlvc1JldHJ5SGFuZGxlciwgeyBheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCB9IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlIYW5kbGVyXCI7XG5cbmltcG9ydCB7IEJyb3dzZXJJbmZvIH0gZnJvbSBcIi4vVXRpbHMvQnJvd3NlckluZm9cIjtcbmltcG9ydCBDb25zdGFudHMgZnJvbSBcIi4vQ29tbW9uL0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL1V0aWxzL0RldmljZUluZm9cIjtcbmltcG9ydCBGZXRjaENoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL0ZldGNoQ2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCBIZXggZnJvbSBcImNyeXB0by1qcy9lbmMtaGV4XCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU0RLIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES1wiO1xuaW1wb3J0IElTREtDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES0NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vTW9kZWwvTG9nTGV2ZWxcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciBmcm9tIFwiLi9JbnRlcmZhY2VzL09tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXJcIjtcbmltcG9ydCBRdWV1ZUF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9RdWV1ZUF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdEF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIGZyb20gXCIuL01vZGVsL1JlY29ubmVjdE1hcHBpbmdSZWNvcmRcIjtcbmltcG9ydCB7IFJlcXVlc3RUaW1lb3V0Q29uZmlnIH0gZnJvbSBcIi4vQ29tbW9uL1JlcXVlc3RUaW1lb3V0Q29uZmlnXCI7XG5pbXBvcnQgU0hBMjU2IGZyb20gXCJjcnlwdG8tanMvc2hhMjU2XCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCB7IGFkZE9jVXNlckFnZW50SGVhZGVyIH0gZnJvbSBcIi4vVXRpbHMvaHR0cEhlYWRlcnNVdGlsc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQgfSBmcm9tIFwiLi9VdGlscy9lbmRwb2ludHNDcmVhdG9yc1wiO1xuaW1wb3J0IGlzRXhwZWN0ZWRBeGlvc0Vycm9yIGZyb20gXCIuL1V0aWxzL2lzRXhwZWN0ZWRBeGlvc0Vycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCB7IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIH0gZnJvbSBcIi4vVXRpbHMvd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMTIwMDAwLFxuICAgIGdldExXSURldGFpbHM6IDE1MDAwLFxuICAgIGdldENoYXRUb2tlbjogMTUwMDAsXG4gICAgc2Vzc2lvbkluaXQ6IDE1MDAwLFxuICAgIHNlc3Npb25DbG9zZTogMTUwMDAsXG4gICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHk6IDE1MDAwLFxuICAgIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2U6IDE1MDAwLFxuICAgIGdldFN1cnZleUludml0ZUxpbms6IDE1MDAwLFxuICAgIGdldENoYXRUcmFuc2NyaXB0czogMzAwMDAsXG4gICAgZW1haWxUcmFuc2NyaXB0OiA1MDAwLFxuICAgIGZldGNoRGF0YU1hc2tpbmdJbmZvOiA1MDAwLFxuICAgIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0OiAxNTAwMCxcbiAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc2VuZFR5cGluZ0luZGljYXRvcjogNTAwMCxcbiAgICB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dDogMTUwMDBcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgYXV0aENvZGVOb25jZTogdXVpZHY0KCkuc3Vic3RyaW5nKDAsIDgpLFxuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOTogdHJ1ZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogNSxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyxcbiAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlLFxuICAgIHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc6IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLFxuICAgIG9jVXNlckFnZW50OiBbXVxuICB9O1xuXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIG9jVXNlckFnZW50OiBzdHJpbmdbXTtcbiAgSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UgPSBgJHtTREtFcnJvci5DbGllbnRIVFRQVGltZW91dEVycm9yTmFtZX06ICR7U0RLRXJyb3IuQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2V9YDtcblxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbmRpdmlkdWFsIGVuZHBvaW50VGltZW91dCBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub2NVc2VyQWdlbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24ub2NVc2VyQWdlbnQ7XG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjI7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMQ1cgRkNTIERldGFpbHMgb2YgdGhlIE9yZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMY3dGY3NEZXRhaWxzKCk6IFByb21pc2U8b2JqZWN0IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTU1RBUlRFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN0YXJ0ZWRcIiwgXCJcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MY3dGY3NEZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0ge307XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBzdWNjZWVkZWRcIiwgXCJcIiwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTRkFJTEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgZmFpbGVkXCIsIFwiXCIsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZTVEFSVEVELCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgfSk7XG5cbiAgICBsZXQgcmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICByZXF1ZXN0SGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4ucmVxdWVzdEhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VFREVELCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZBSUxFRCwgXCJHZXQgQ2hhdCBjb25maWcgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyV2l0aE5vdEZvdW5kKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldExXSURldGFpbHMsXG4gICAgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfTtcblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1VDQ0VFREVELCBcIkdldCBMV0kgRGV0YWlscyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCByZWZyZXNoVG9rZW4sIE1zT2NCb3RBcHBsaWNhdGlvbklkIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBtdWx0aUJvdCA9IChNc09jQm90QXBwbGljYXRpb25JZCAmJiBNc09jQm90QXBwbGljYXRpb25JZC5sZW5ndGggPiAwKT8gdHJ1ZTogZmFsc2U7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCwgXCJHZXQgQ2hhdCBUb2tlbiBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY3VycmVudFJldHJ5Q291bnRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIGFzIExpdmVDaGF0VmVyc2lvbiB8fCB0aGlzLmxpdmVDaGF0VmVyc2lvbiwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA/IHRydWUgOiBmYWxzZSwgbXVsdGlCb3QpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtlbmRwb2ludH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBcbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuICAgIGlmIChNc09jQm90QXBwbGljYXRpb25JZCAmJiBNc09jQm90QXBwbGljYXRpb25JZC5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbXNbJ01zLU9jLUJvdC1BcHBsaWNhdGlvbi1JZCddID0gTXNPY0JvdEFwcGxpY2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlZnJlc2hUb2tlbikge1xuICAgICAgcGFyYW1zLnJlZnJlc2hUb2tlbiA9ICd0cnVlJ1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiAoY3VycmVudFJldHJ5Q291bnQgPiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUpID8gY3VycmVudFJldHJ5Q291bnQgOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICByZXRyeU9uNDI5OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkVtcHR5IGRhdGEgcmVjZWl2ZWQgZnJvbSBnZXRDaGF0VG9rZW5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0YWJsZUNoYXRzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtczogSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyk6IFByb21pc2U8UmVjb25uZWN0TWFwcGluZ1JlY29yZCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1RBUlRFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG4gICAgY29uc3QgcmVxdWVzdElkID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zPy5yZXF1ZXN0SWQ7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RhYmxlQ2hhdHNcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNGQUlMRUQsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eShyZWNvbm5lY3RJZDogc3RyaW5nLCBvcHRpb25hbFBhcmFtczogSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eSB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgb3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuV0FSTiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGFcIiwgb3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRUQsIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgZmFpbGVkXCIsIG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgY29uc3QgY2FjaE9iaiA9IHtcbiAgICAgIFwib3JnSWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgY29uc3QgdGVtcEFyciA9IEN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJjdXN0b21Db250ZXh0XCI6IHRlbXBBcnIgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJwb3J0YWxjb250YWN0aWRcIjogZGF0YS5wb3J0YWxjb250YWN0aWQgfSk7XG4gICAgfVxuXG4gICAgLy9kYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcbiAgICBkYXRhLmNhY2hlS2V5ID0gU0hBMjU2KEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS50b1N0cmluZyhIZXgpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKidcbiAgICogU3RhcnRzIGEgc2Vzc2lvbiB0byBvbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25Jbml0KHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCwgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBjb25zdCByZXRyeU9uNDI5ID0gdHJ1ZTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkluaXQsXG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlcihlcnJvciwgcmV0cnlPbjQyOSksXG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gYXV0aGVudGljYXRlZFVzZXJUb2tlblxuICAgICAgPyBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGhcbiAgICAgIDogT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGg7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7YmFzZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikgeyAgICAgXG4gICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3RIZWFkZXJzLCB7XG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dOiBhdXRoZW50aWNhdGVkVXNlclRva2VuLFxuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXTogdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIHRoaXMuc2V0UmVxdWVzdElkSGVhZGVyKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG5cbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkICYmIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELCBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDb252ZXJzYXRpb24ocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuQ1JFQVRFU0VTU0lPTlNUQVJURUQsIFwiQ3JlYXRlIGNvbnZlcnNhdGlvbiBjYWxsIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgY29uc3QgcmV0cnlPbjQyOSA9IHRydWU7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25Jbml0LFxuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIoZXJyb3IsIHJldHJ5T240MjkpLFxuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV1cbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IHsgLi4uQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzIH07XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5cbiAgICAgID8gT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aFxuICAgICAgOiBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbm5lY3RvclBhdGg7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtiYXNlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vd2lkZ2V0QXBwLyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9L2NvbnZlcnNhdGlvbmA7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikgeyAgICAgXG4gICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3RIZWFkZXJzLCB7XG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dOiBhdXRoZW50aWNhdGVkVXNlclRva2VuLFxuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXTogdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIHRoaXMuc2V0UmVxdWVzdElkSGVhZGVyKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBkYXRhLnJlY29ubmVjdElkID0gcmVjb25uZWN0SWQ7XG4gICAgfVxuXG4gICAgZGF0YS5jaGFubmVsSWQgPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQ7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBjaGVjayBpZiBkYXRhIGlzIGVtcHR5LCBpZiBzbywgdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSBkYXRhIHJlY2VpdmVkIGZyb20gZ2V0Q2hhdFRva2VuXCIpO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05TVUNDRUVERUQsIFwiQ3JlYXRlIGNvdmVyc2F0aW9uIGNhbGwgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5DUkVBVEVTRVNTSU9ORkFJTEVELCBcIkNyZWF0ZSBjb252ZXJzYXRpb24gY2FsbCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgXG4gICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsIFwiU2Vzc2lvbiBDbG9zZSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZCB9ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNQZXJzaXN0ZW50Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsIFwiU2Vzc2lvbiBDbG9zZSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRUZBSUxFRCwgXCJTZXNzaW9uIGNsb3NlIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcblxuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRGQUlMRUQsIFwiRW1haWwgVHJhbnNjcmlwdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELCBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyBFbGFwc2VkIHRpbWUgaW4gbXNcbiAgICogQHBhcmFtIHJlcXVlc3RQYXRoIFJlcXVlc3QgcGF0aFxuICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZFxuICAgKiBAcGFyYW0gZXJyb3IgRXJyb3JcbiAgICogQHBhcmFtIGRhdGEgRGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dXaXRoTG9nZ2VyKGxvZ0xldmVsOiBMb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlOiBPQ1NES1RlbGVtZXRyeUV2ZW50LCBkZXNjcmlwdGlvbjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsIHJlc3BvbnNlPzogQXhpb3NSZXNwb25zZTxhbnk+LCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyLCByZXF1ZXN0UGF0aD86IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIHJlcXVlc3RQYXlsb2FkPzogYW55LCByZXF1ZXN0SGVhZGVycz86IGFueSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWU/OiBudW1iZXIpOiB2b2lkIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0geyAuLi5yZXF1ZXN0UGF5bG9hZCB9O1xuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2Uoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCk7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzID0gdW5kZWZpbmVkO1xuICAgIGxldCBhdXRoVG9rZW5EZXRhaWxzOiBhbnkgPSB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmIChyZXF1ZXN0SGVhZGVycykge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSB7IC4uLnJlcXVlc3RIZWFkZXJzIH07XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUmVxdWVzdEhlYWRlcnNTZW5zaXRpdmVQcm9wZXJ0aWVzKHNhbml0aXplZFJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgaWYgKHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0pIHtcbiAgICAgICAgaWYgKHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuYXRvYikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl07XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gdG9rZW4uc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5hdG9iKHBheWxvYWQpO1xuICAgICAgICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgY29uc3QgbHdpQ29udGV4dHMgPSBqc29uRGF0YVtcImx3aWNvbnRleHRzXCJdO1xuICAgICAgICAgICAgYXV0aFRva2VuRGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgc3ViOiBqc29uRGF0YVtcInN1YlwiXSxcbiAgICAgICAgICAgICAgZXhwOiBqc29uRGF0YVtcImV4cFwiXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGx3aUNvbnRleHRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGx3aUNvbnRleHRzRGF0YSA9IEpTT04ucGFyc2UobHdpQ29udGV4dHMpO1xuICAgICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMobHdpQ29udGV4dHNEYXRhKTtcbiAgICAgICAgICAgICAgYXV0aFRva2VuRGV0YWlscy5sd2lDb250ZXh0cyA9IGx3aUNvbnRleHRzRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICBSZWdpb246IHJlc3BvbnNlPy5kYXRhLlJlZ2lvbixcbiAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICBIdHRwUmVxdWVzdFJlc3BvbnNlVGltZTogaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsXG4gICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZT8uaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0sXG4gICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LmRhdGEgfHwgZXJyb3IgOiB1bmRlZmluZWQsIFxuICAgICAgUmVxdWVzdFBheWxvYWQ6IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLFxuICAgICAgUmVxdWVzdEhlYWRlcnM6IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzLFxuICAgICAgUmVzcG9uc2VFcnJvcmNvZGU6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LmhlYWRlcnM/LmVycm9yY29kZSA6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBBdXRoVG9rZW5EZXRhaWxzOiBhdXRoVG9rZW5EZXRhaWxzXG4gICAgfTtcbiAgICB0aGlzLmxvZ2dlci5sb2cobG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZSwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRBdXRoQ29kZU5vbmNlID0gKGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChoZWFkZXJzPy5hdXRoY29kZW5vbmNlKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSA9IGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCk6IHZvaWQge1xuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIHRoaXMuc2V0Q29ycmVsYXRpb25JZEluSGVhZGVyKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRTZXNzaW9uSWRIZWFkZXIgPSAoc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZF0gPSBzZXNzaW9uSWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRSZXF1ZXN0SWRIZWFkZXIgPSAocmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IFN0cmluZ01hcCkgPT4ge1xuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29ycmVsYXRpb25JZEluSGVhZGVyID0gKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogU3RyaW5nTWFwKSA9PiB7XG4gICAgaWYgKGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5jb3JyZWxhdGlvbklkXSA9IGNvcnJlbGF0aW9uSWQ7XG4gICAgfVxuICB9XG59XG4iXX0=
|