@microsoft/ocsdk 0.3.4-main.097f56a → 0.3.4-main.97f192b
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/CHANGELOG.md +2 -0
- package/dist/SDK.js +4 -4
- package/dist/SDK.min.js +3 -3
- package/lib/Common/OmnichannelHTTPHeaders.d.ts +1 -0
- package/lib/Common/OmnichannelHTTPHeaders.js +2 -1
- package/lib/Common/OmnichannelHTTPHeaders.js.map +1 -1
- package/lib/Interfaces/IAxiosRetryOptions.d.ts +4 -0
- package/lib/Interfaces/ISDKConfiguration.d.ts +4 -0
- package/lib/SDK.d.ts +1 -0
- package/lib/SDK.js +530 -396
- package/lib/SDK.js.map +1 -1
- package/lib/Utils/axiosRetry.js +31 -2
- package/lib/Utils/axiosRetry.js.map +1 -1
- package/lib/Utils/setAuthCodeNonce.d.ts +0 -0
- package/lib/Utils/setAuthCodeNonce.js +2 -0
- package/lib/Utils/setAuthCodeNonce.js.map +1 -0
- package/package.json +1 -1
package/lib/SDK.js
CHANGED
|
@@ -75,6 +75,8 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
|
|
|
75
75
|
|
|
76
76
|
var SDK = /*#__PURE__*/function () {
|
|
77
77
|
function SDK(omnichannelConfiguration) {
|
|
78
|
+
var _this = this;
|
|
79
|
+
|
|
78
80
|
var configuration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SDK.defaultConfiguration;
|
|
79
81
|
var logger = arguments.length > 2 ? arguments[2] : undefined;
|
|
80
82
|
(0, _classCallCheck2["default"])(this, SDK);
|
|
@@ -82,6 +84,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
82
84
|
this.configuration = configuration;
|
|
83
85
|
this.logger = logger;
|
|
84
86
|
(0, _defineProperty2["default"])(this, "liveChatVersion", void 0);
|
|
87
|
+
(0, _defineProperty2["default"])(this, "setAuthCodeNonce", function (headers) {
|
|
88
|
+
if (headers !== null && headers !== void 0 && headers.authcodenonce) {
|
|
89
|
+
_this.configuration.authCodeNonce = headers === null || headers === void 0 ? void 0 : headers.authcodenonce;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
85
92
|
|
|
86
93
|
// Sets to default configuration if passed configuration is empty or is not an object
|
|
87
94
|
if (!Object.keys(this.configuration).length || (0, _typeof2["default"])(configuration) !== "object") {
|
|
@@ -234,7 +241,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
234
241
|
value: function () {
|
|
235
242
|
var _getLWIDetails = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(requestId) {
|
|
236
243
|
var _this$configuration$d2,
|
|
237
|
-
|
|
244
|
+
_this2 = this;
|
|
238
245
|
|
|
239
246
|
var getLWIDetailsOptionalParams,
|
|
240
247
|
timer,
|
|
@@ -263,6 +270,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
263
270
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatLiveWorkItemDetailsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
264
271
|
axiosInstance = _axios["default"].create();
|
|
265
272
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
273
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
266
274
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
267
275
|
}); // Extract auth token and reconnect id from optional param
|
|
268
276
|
|
|
@@ -272,6 +280,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
272
280
|
if (authenticatedUserToken) {
|
|
273
281
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthLiveWorkItemDetailsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
274
282
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
283
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
275
284
|
} // Append reconnect id on the endpoint if vailable
|
|
276
285
|
|
|
277
286
|
|
|
@@ -290,7 +299,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
290
299
|
};
|
|
291
300
|
return _context3.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
292
301
|
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(resolve, reject) {
|
|
293
|
-
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds;
|
|
302
|
+
var response, elapsedTimeInMilliseconds, data, _headers, _elapsedTimeInMilliseconds;
|
|
294
303
|
|
|
295
304
|
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
296
305
|
while (1) {
|
|
@@ -303,33 +312,35 @@ var SDK = /*#__PURE__*/function () {
|
|
|
303
312
|
case 3:
|
|
304
313
|
response = _context2.sent;
|
|
305
314
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
306
|
-
data = response.data;
|
|
315
|
+
data = response.data, _headers = response.headers;
|
|
316
|
+
|
|
317
|
+
_this2.setAuthCodeNonce(_headers);
|
|
307
318
|
|
|
308
|
-
|
|
319
|
+
_this2.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSUCCEEDED, "Get LWI Details succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
309
320
|
|
|
310
321
|
resolve(data);
|
|
311
|
-
_context2.next =
|
|
322
|
+
_context2.next = 17;
|
|
312
323
|
break;
|
|
313
324
|
|
|
314
|
-
case
|
|
315
|
-
_context2.prev =
|
|
325
|
+
case 11:
|
|
326
|
+
_context2.prev = 11;
|
|
316
327
|
_context2.t0 = _context2["catch"](0);
|
|
317
328
|
_elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
318
329
|
|
|
319
|
-
|
|
330
|
+
_this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds, requestPath, method, _context2.t0);
|
|
320
331
|
|
|
321
332
|
if (_context2.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
322
333
|
(0, _throwClientHTTPError["default"])();
|
|
323
334
|
}
|
|
324
335
|
|
|
325
|
-
reject();
|
|
336
|
+
reject(_context2.t0);
|
|
326
337
|
|
|
327
|
-
case
|
|
338
|
+
case 17:
|
|
328
339
|
case "end":
|
|
329
340
|
return _context2.stop();
|
|
330
341
|
}
|
|
331
342
|
}
|
|
332
|
-
}, _callee2, null, [[0,
|
|
343
|
+
}, _callee2, null, [[0, 11]]);
|
|
333
344
|
}));
|
|
334
345
|
|
|
335
346
|
return function (_x3, _x4) {
|
|
@@ -362,7 +373,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
362
373
|
value: function () {
|
|
363
374
|
var _getChatToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(requestId) {
|
|
364
375
|
var _this$configuration$d3,
|
|
365
|
-
|
|
376
|
+
_this3 = this;
|
|
366
377
|
|
|
367
378
|
var getChatTokenOptionalParams,
|
|
368
379
|
currentRetryCount,
|
|
@@ -407,6 +418,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
407
418
|
|
|
408
419
|
if (authenticatedUserToken) {
|
|
409
420
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
421
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
410
422
|
}
|
|
411
423
|
|
|
412
424
|
requestPath = "/".concat(endpoint, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
@@ -427,12 +439,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
427
439
|
};
|
|
428
440
|
axiosInstance = _axios["default"].create();
|
|
429
441
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
442
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
430
443
|
retries: this.configuration.maxRequestRetriesOnFailure,
|
|
431
444
|
retryOn429: this.configuration.getChatTokenRetryOn429
|
|
432
445
|
});
|
|
433
446
|
return _context5.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
434
447
|
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(resolve, reject) {
|
|
435
|
-
var getChatTokenError, response, elapsedTimeInMilliseconds, data, _response, _elapsedTimeInMilliseconds2;
|
|
448
|
+
var getChatTokenError, response, elapsedTimeInMilliseconds, data, _headers2, _response, _elapsedTimeInMilliseconds2;
|
|
436
449
|
|
|
437
450
|
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
438
451
|
while (1) {
|
|
@@ -446,44 +459,47 @@ var SDK = /*#__PURE__*/function () {
|
|
|
446
459
|
case 4:
|
|
447
460
|
response = _context4.sent;
|
|
448
461
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
449
|
-
data = response.data
|
|
462
|
+
data = response.data, _headers2 = response.headers;
|
|
463
|
+
|
|
464
|
+
_this3.setAuthCodeNonce(_headers2); // Resolves only if it contains chat token response which only happens on status 200
|
|
465
|
+
|
|
450
466
|
|
|
451
467
|
if (!data) {
|
|
452
|
-
_context4.next =
|
|
468
|
+
_context4.next = 13;
|
|
453
469
|
break;
|
|
454
470
|
}
|
|
455
471
|
|
|
456
472
|
data.requestId = requestId;
|
|
457
473
|
|
|
458
|
-
|
|
474
|
+
_this3.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSUCCEEDED, "Get Chat Token succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
459
475
|
|
|
460
476
|
resolve(data);
|
|
461
477
|
return _context4.abrupt("return");
|
|
462
478
|
|
|
463
|
-
case
|
|
479
|
+
case 13:
|
|
464
480
|
if (!(reconnectId && response.status === _Constants["default"].noContentStatusCode)) {
|
|
465
|
-
_context4.next =
|
|
481
|
+
_context4.next = 16;
|
|
466
482
|
break;
|
|
467
483
|
}
|
|
468
484
|
|
|
469
485
|
reject(response);
|
|
470
486
|
return _context4.abrupt("return");
|
|
471
487
|
|
|
472
|
-
case
|
|
473
|
-
_context4.next =
|
|
488
|
+
case 16:
|
|
489
|
+
_context4.next = 26;
|
|
474
490
|
break;
|
|
475
491
|
|
|
476
|
-
case
|
|
477
|
-
_context4.prev =
|
|
492
|
+
case 18:
|
|
493
|
+
_context4.prev = 18;
|
|
478
494
|
_context4.t0 = _context4["catch"](1);
|
|
479
495
|
_elapsedTimeInMilliseconds2 = timer.milliSecondsElapsed;
|
|
480
496
|
|
|
481
|
-
|
|
497
|
+
_this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context4.t0);
|
|
482
498
|
|
|
483
499
|
getChatTokenError = _context4.t0; // Stop retry on 429
|
|
484
500
|
|
|
485
|
-
if (!(((_response = _context4.t0.response) === null || _response === void 0 ? void 0 : _response.status) === _Constants["default"].tooManyRequestsStatusCode && !
|
|
486
|
-
_context4.next =
|
|
501
|
+
if (!(((_response = _context4.t0.response) === null || _response === void 0 ? void 0 : _response.status) === _Constants["default"].tooManyRequestsStatusCode && !_this3.configuration.getChatTokenRetryOn429)) {
|
|
502
|
+
_context4.next = 26;
|
|
487
503
|
break;
|
|
488
504
|
}
|
|
489
505
|
|
|
@@ -491,36 +507,36 @@ var SDK = /*#__PURE__*/function () {
|
|
|
491
507
|
reject(_context4.t0);
|
|
492
508
|
return _context4.abrupt("return");
|
|
493
509
|
|
|
494
|
-
case
|
|
495
|
-
if (!(currentRetryCount + 1 >=
|
|
496
|
-
_context4.next =
|
|
510
|
+
case 26:
|
|
511
|
+
if (!(currentRetryCount + 1 >= _this3.configuration.getChatTokenRetryCount)) {
|
|
512
|
+
_context4.next = 29;
|
|
497
513
|
break;
|
|
498
514
|
}
|
|
499
515
|
|
|
500
516
|
if (getChatTokenError && getChatTokenError.code == _Constants["default"].axiosTimeoutErrorCode) {
|
|
501
517
|
(0, _throwClientHTTPError["default"])();
|
|
502
518
|
} else {
|
|
503
|
-
reject(
|
|
519
|
+
reject(getChatTokenError);
|
|
504
520
|
}
|
|
505
521
|
|
|
506
522
|
return _context4.abrupt("return");
|
|
507
523
|
|
|
508
|
-
case
|
|
524
|
+
case 29:
|
|
509
525
|
// Retries until it reaches its limit
|
|
510
526
|
setTimeout(function () {
|
|
511
|
-
|
|
527
|
+
_this3.getChatToken(requestId, getChatTokenOptionalParams, currentRetryCount + 1).then(function (response) {
|
|
512
528
|
return resolve(response);
|
|
513
529
|
})["catch"](function (error) {
|
|
514
530
|
return reject(error);
|
|
515
531
|
});
|
|
516
|
-
},
|
|
532
|
+
}, _this3.configuration.getChatTokenTimeBetweenRetriesOnFailure);
|
|
517
533
|
|
|
518
|
-
case
|
|
534
|
+
case 30:
|
|
519
535
|
case "end":
|
|
520
536
|
return _context4.stop();
|
|
521
537
|
}
|
|
522
538
|
}
|
|
523
|
-
}, _callee4, null, [[1,
|
|
539
|
+
}, _callee4, null, [[1, 18]]);
|
|
524
540
|
}));
|
|
525
541
|
|
|
526
542
|
return function (_x6, _x7) {
|
|
@@ -552,7 +568,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
552
568
|
value: function () {
|
|
553
569
|
var _getReconnectableChats = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(reconnectableChatsParams) {
|
|
554
570
|
var _this$configuration$d4,
|
|
555
|
-
|
|
571
|
+
_this4 = this;
|
|
556
572
|
|
|
557
573
|
var timer, authenticatedUserToken, requestPath, headers, url, method, options, axiosInstance, requestId;
|
|
558
574
|
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
|
@@ -565,6 +581,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
565
581
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetReconnectableChatsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(this.omnichannelConfiguration.orgId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
566
582
|
headers = _Constants["default"].defaultHeaders;
|
|
567
583
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
584
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
568
585
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
569
586
|
method = "GET";
|
|
570
587
|
options = {
|
|
@@ -577,7 +594,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
577
594
|
requestId = this.omnichannelConfiguration.orgId;
|
|
578
595
|
return _context7.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
579
596
|
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(resolve, reject) {
|
|
580
|
-
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds3;
|
|
597
|
+
var response, elapsedTimeInMilliseconds, data, _headers3, _elapsedTimeInMilliseconds3;
|
|
581
598
|
|
|
582
599
|
return _regenerator["default"].wrap(function _callee6$(_context6) {
|
|
583
600
|
while (1) {
|
|
@@ -590,29 +607,32 @@ var SDK = /*#__PURE__*/function () {
|
|
|
590
607
|
case 3:
|
|
591
608
|
response = _context6.sent;
|
|
592
609
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
593
|
-
data = response.data
|
|
610
|
+
data = response.data, _headers3 = response.headers;
|
|
611
|
+
|
|
612
|
+
_this4.setAuthCodeNonce(_headers3); // Resolves only if it contains reconnectable chats response which only happens on status 200
|
|
613
|
+
|
|
594
614
|
|
|
595
615
|
if (!data) {
|
|
596
|
-
_context6.next =
|
|
616
|
+
_context6.next = 11;
|
|
597
617
|
break;
|
|
598
618
|
}
|
|
599
619
|
|
|
600
|
-
|
|
620
|
+
_this4.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats Succeeded and old session returned", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
601
621
|
|
|
602
622
|
resolve(data);
|
|
603
623
|
return _context6.abrupt("return");
|
|
604
624
|
|
|
605
|
-
case
|
|
625
|
+
case 11:
|
|
606
626
|
// No data found in the old sessions so returning null
|
|
607
627
|
resolve();
|
|
608
628
|
return _context6.abrupt("return");
|
|
609
629
|
|
|
610
|
-
case
|
|
611
|
-
_context6.prev =
|
|
630
|
+
case 15:
|
|
631
|
+
_context6.prev = 15;
|
|
612
632
|
_context6.t0 = _context6["catch"](0);
|
|
613
633
|
_elapsedTimeInMilliseconds3 = timer.milliSecondsElapsed;
|
|
614
634
|
|
|
615
|
-
|
|
635
|
+
_this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context6.t0);
|
|
616
636
|
|
|
617
637
|
if (_context6.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
618
638
|
(0, _throwClientHTTPError["default"])();
|
|
@@ -621,12 +641,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
621
641
|
reject(_context6.t0);
|
|
622
642
|
return _context6.abrupt("return");
|
|
623
643
|
|
|
624
|
-
case
|
|
644
|
+
case 22:
|
|
625
645
|
case "end":
|
|
626
646
|
return _context6.stop();
|
|
627
647
|
}
|
|
628
648
|
}
|
|
629
|
-
}, _callee6, null, [[0,
|
|
649
|
+
}, _callee6, null, [[0, 15]]);
|
|
630
650
|
}));
|
|
631
651
|
|
|
632
652
|
return function (_x9, _x10) {
|
|
@@ -634,7 +654,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
634
654
|
};
|
|
635
655
|
}()));
|
|
636
656
|
|
|
637
|
-
case
|
|
657
|
+
case 13:
|
|
638
658
|
case "end":
|
|
639
659
|
return _context7.stop();
|
|
640
660
|
}
|
|
@@ -658,7 +678,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
658
678
|
value: function () {
|
|
659
679
|
var _getReconnectAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(reconnectId) {
|
|
660
680
|
var _this$configuration$d5,
|
|
661
|
-
|
|
681
|
+
_this5 = this;
|
|
662
682
|
|
|
663
683
|
var timer, requestPath, headers, url, method, options, axiosInstance;
|
|
664
684
|
return _regenerator["default"].wrap(function _callee9$(_context9) {
|
|
@@ -700,14 +720,14 @@ var SDK = /*#__PURE__*/function () {
|
|
|
700
720
|
break;
|
|
701
721
|
}
|
|
702
722
|
|
|
703
|
-
|
|
723
|
+
_this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability succeeded", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
704
724
|
|
|
705
725
|
resolve(data);
|
|
706
726
|
return _context8.abrupt("return");
|
|
707
727
|
|
|
708
728
|
case 10:
|
|
709
729
|
// No data found so returning null
|
|
710
|
-
|
|
730
|
+
_this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability didn't send any valid data", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
711
731
|
|
|
712
732
|
resolve();
|
|
713
733
|
return _context8.abrupt("return");
|
|
@@ -717,7 +737,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
717
737
|
_context8.t0 = _context8["catch"](0);
|
|
718
738
|
_elapsedTimeInMilliseconds4 = timer.milliSecondsElapsed;
|
|
719
739
|
|
|
720
|
-
|
|
740
|
+
_this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect Availability failed", undefined, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context8.t0);
|
|
721
741
|
|
|
722
742
|
if (_context8.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
723
743
|
(0, _throwClientHTTPError["default"])();
|
|
@@ -764,7 +784,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
764
784
|
value: function () {
|
|
765
785
|
var _getAgentAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(requestId) {
|
|
766
786
|
var _this$configuration$d6,
|
|
767
|
-
|
|
787
|
+
_this6 = this;
|
|
768
788
|
|
|
769
789
|
var queueAvailabilityOptionalParams,
|
|
770
790
|
timer,
|
|
@@ -791,6 +811,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
791
811
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].GetAgentAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=lcw");
|
|
792
812
|
axiosInstance = _axios["default"].create();
|
|
793
813
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
814
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
794
815
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
795
816
|
});
|
|
796
817
|
authenticatedUserToken = queueAvailabilityOptionalParams.authenticatedUserToken, initContext = queueAvailabilityOptionalParams.initContext, getContext = queueAvailabilityOptionalParams.getContext;
|
|
@@ -798,6 +819,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
798
819
|
|
|
799
820
|
if (authenticatedUserToken) {
|
|
800
821
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
822
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
801
823
|
}
|
|
802
824
|
|
|
803
825
|
data = initContext || {};
|
|
@@ -860,7 +882,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
860
882
|
};
|
|
861
883
|
return _context11.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
862
884
|
var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(resolve, reject) {
|
|
863
|
-
var response, elapsedTimeInMilliseconds, _data, _elapsedTimeInMilliseconds5;
|
|
885
|
+
var response, elapsedTimeInMilliseconds, _data, _headers4, _elapsedTimeInMilliseconds5;
|
|
864
886
|
|
|
865
887
|
return _regenerator["default"].wrap(function _callee10$(_context10) {
|
|
866
888
|
while (1) {
|
|
@@ -873,23 +895,25 @@ var SDK = /*#__PURE__*/function () {
|
|
|
873
895
|
case 3:
|
|
874
896
|
response = _context10.sent;
|
|
875
897
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
876
|
-
_data = response.data;
|
|
898
|
+
_data = response.data, _headers4 = response.headers;
|
|
899
|
+
|
|
900
|
+
_this6.setAuthCodeNonce(_headers4);
|
|
877
901
|
|
|
878
902
|
if (_data) {
|
|
879
|
-
|
|
903
|
+
_this6.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, "Get agent availability succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
880
904
|
|
|
881
905
|
resolve(_data);
|
|
882
906
|
}
|
|
883
907
|
|
|
884
|
-
_context10.next =
|
|
908
|
+
_context10.next = 16;
|
|
885
909
|
break;
|
|
886
910
|
|
|
887
|
-
case
|
|
888
|
-
_context10.prev =
|
|
911
|
+
case 10:
|
|
912
|
+
_context10.prev = 10;
|
|
889
913
|
_context10.t0 = _context10["catch"](0);
|
|
890
914
|
_elapsedTimeInMilliseconds5 = timer.milliSecondsElapsed;
|
|
891
915
|
|
|
892
|
-
|
|
916
|
+
_this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context10.t0);
|
|
893
917
|
|
|
894
918
|
if (_context10.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
895
919
|
(0, _throwClientHTTPError["default"])();
|
|
@@ -897,12 +921,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
897
921
|
|
|
898
922
|
reject(_context10.t0);
|
|
899
923
|
|
|
900
|
-
case
|
|
924
|
+
case 16:
|
|
901
925
|
case "end":
|
|
902
926
|
return _context10.stop();
|
|
903
927
|
}
|
|
904
928
|
}
|
|
905
|
-
}, _callee10, null, [[0,
|
|
929
|
+
}, _callee10, null, [[0, 10]]);
|
|
906
930
|
}));
|
|
907
931
|
|
|
908
932
|
return function (_x15, _x16) {
|
|
@@ -933,8 +957,9 @@ var SDK = /*#__PURE__*/function () {
|
|
|
933
957
|
}, {
|
|
934
958
|
key: "sessionInit",
|
|
935
959
|
value: function () {
|
|
936
|
-
var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
937
|
-
var _this$configuration$d7
|
|
960
|
+
var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(requestId) {
|
|
961
|
+
var _this$configuration$d7,
|
|
962
|
+
_this7 = this;
|
|
938
963
|
|
|
939
964
|
var sessionInitOptionalParams,
|
|
940
965
|
timer,
|
|
@@ -950,22 +975,19 @@ var SDK = /*#__PURE__*/function () {
|
|
|
950
975
|
url,
|
|
951
976
|
method,
|
|
952
977
|
options,
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
_elapsedTimeInMilliseconds6,
|
|
956
|
-
_args12 = arguments;
|
|
957
|
-
|
|
958
|
-
return _regenerator["default"].wrap(function _callee12$(_context12) {
|
|
978
|
+
_args13 = arguments;
|
|
979
|
+
return _regenerator["default"].wrap(function _callee13$(_context13) {
|
|
959
980
|
while (1) {
|
|
960
|
-
switch (
|
|
981
|
+
switch (_context13.prev = _context13.next) {
|
|
961
982
|
case 0:
|
|
962
|
-
sessionInitOptionalParams =
|
|
983
|
+
sessionInitOptionalParams = _args13.length > 1 && _args13[1] !== undefined ? _args13[1] : {};
|
|
963
984
|
timer = _Timer.Timer.TIMER();
|
|
964
985
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSTARTED, "Session Init Started", requestId);
|
|
965
986
|
axiosInstance = _axios["default"].create();
|
|
966
987
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
967
988
|
retries: this.configuration.maxRequestRetriesOnFailure,
|
|
968
|
-
shouldRetry: _SessionInitRetryHandler["default"]
|
|
989
|
+
shouldRetry: _SessionInitRetryHandler["default"],
|
|
990
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce]
|
|
969
991
|
});
|
|
970
992
|
reconnectId = sessionInitOptionalParams.reconnectId, authenticatedUserToken = sessionInitOptionalParams.authenticatedUserToken, initContext = sessionInitOptionalParams.initContext, getContext = sessionInitOptionalParams.getContext;
|
|
971
993
|
headers = _Constants["default"].defaultHeaders;
|
|
@@ -974,6 +996,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
974
996
|
if (authenticatedUserToken) {
|
|
975
997
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
976
998
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
999
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
977
1000
|
}
|
|
978
1001
|
|
|
979
1002
|
if (reconnectId) {
|
|
@@ -985,11 +1008,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
985
1008
|
data = initContext || {};
|
|
986
1009
|
|
|
987
1010
|
if (!(getContext && !window.document)) {
|
|
988
|
-
|
|
1011
|
+
_context13.next = 15;
|
|
989
1012
|
break;
|
|
990
1013
|
}
|
|
991
1014
|
|
|
992
|
-
return
|
|
1015
|
+
return _context13.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
993
1016
|
|
|
994
1017
|
case 15:
|
|
995
1018
|
if (getContext) {
|
|
@@ -1006,11 +1029,11 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1006
1029
|
|
|
1007
1030
|
|
|
1008
1031
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
1009
|
-
|
|
1032
|
+
_context13.next = 19;
|
|
1010
1033
|
break;
|
|
1011
1034
|
}
|
|
1012
1035
|
|
|
1013
|
-
return
|
|
1036
|
+
return _context13.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
1014
1037
|
|
|
1015
1038
|
case 19:
|
|
1016
1039
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
@@ -1022,35 +1045,63 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1022
1045
|
url: url,
|
|
1023
1046
|
timeout: (_this$configuration$d7 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d7 !== void 0 ? _this$configuration$d7 : this.configuration.requestTimeoutConfig.sessionInit
|
|
1024
1047
|
};
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1048
|
+
return _context13.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1049
|
+
var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(resolve, reject) {
|
|
1050
|
+
var response, elapsedTimeInMilliseconds, _headers5, _elapsedTimeInMilliseconds6;
|
|
1028
1051
|
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1052
|
+
return _regenerator["default"].wrap(function _callee12$(_context12) {
|
|
1053
|
+
while (1) {
|
|
1054
|
+
switch (_context12.prev = _context12.next) {
|
|
1055
|
+
case 0:
|
|
1056
|
+
_context12.prev = 0;
|
|
1057
|
+
_context12.next = 3;
|
|
1058
|
+
return axiosInstance(options);
|
|
1059
|
+
|
|
1060
|
+
case 3:
|
|
1061
|
+
response = _context12.sent;
|
|
1062
|
+
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1063
|
+
_headers5 = response.headers;
|
|
1064
|
+
|
|
1065
|
+
_this7.setAuthCodeNonce(_headers5);
|
|
1066
|
+
|
|
1067
|
+
_this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data);
|
|
1068
|
+
|
|
1069
|
+
resolve();
|
|
1070
|
+
_context12.next = 17;
|
|
1071
|
+
break;
|
|
1072
|
+
|
|
1073
|
+
case 11:
|
|
1074
|
+
_context12.prev = 11;
|
|
1075
|
+
_context12.t0 = _context12["catch"](0);
|
|
1076
|
+
_elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
|
|
1077
|
+
|
|
1078
|
+
_this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context12.t0, data);
|
|
1079
|
+
|
|
1080
|
+
if (_context12.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1081
|
+
(0, _throwClientHTTPError["default"])();
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
reject(_context12.t0);
|
|
1085
|
+
|
|
1086
|
+
case 17:
|
|
1087
|
+
case "end":
|
|
1088
|
+
return _context12.stop();
|
|
1089
|
+
}
|
|
1090
|
+
}
|
|
1091
|
+
}, _callee12, null, [[0, 11]]);
|
|
1092
|
+
}));
|
|
1045
1093
|
|
|
1046
|
-
|
|
1094
|
+
return function (_x18, _x19) {
|
|
1095
|
+
return _ref6.apply(this, arguments);
|
|
1096
|
+
};
|
|
1097
|
+
}()));
|
|
1047
1098
|
|
|
1048
|
-
case
|
|
1099
|
+
case 23:
|
|
1049
1100
|
case "end":
|
|
1050
|
-
return
|
|
1101
|
+
return _context13.stop();
|
|
1051
1102
|
}
|
|
1052
1103
|
}
|
|
1053
|
-
},
|
|
1104
|
+
}, _callee13, this);
|
|
1054
1105
|
}));
|
|
1055
1106
|
|
|
1056
1107
|
function sessionInit(_x17) {
|
|
@@ -1068,9 +1119,9 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1068
1119
|
}, {
|
|
1069
1120
|
key: "sessionClose",
|
|
1070
1121
|
value: function () {
|
|
1071
|
-
var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1122
|
+
var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId) {
|
|
1072
1123
|
var _this$configuration$d8,
|
|
1073
|
-
|
|
1124
|
+
_this8 = this;
|
|
1074
1125
|
|
|
1075
1126
|
var sessionCloseOptionalParams,
|
|
1076
1127
|
timer,
|
|
@@ -1085,17 +1136,18 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1085
1136
|
url,
|
|
1086
1137
|
method,
|
|
1087
1138
|
options,
|
|
1088
|
-
|
|
1089
|
-
return _regenerator["default"].wrap(function
|
|
1139
|
+
_args15 = arguments;
|
|
1140
|
+
return _regenerator["default"].wrap(function _callee15$(_context15) {
|
|
1090
1141
|
while (1) {
|
|
1091
|
-
switch (
|
|
1142
|
+
switch (_context15.prev = _context15.next) {
|
|
1092
1143
|
case 0:
|
|
1093
|
-
sessionCloseOptionalParams =
|
|
1144
|
+
sessionCloseOptionalParams = _args15.length > 1 && _args15[1] !== undefined ? _args15[1] : {};
|
|
1094
1145
|
timer = _Timer.Timer.TIMER();
|
|
1095
1146
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESTARTED, "Session Close Started", requestId);
|
|
1096
1147
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSessionClosePath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1097
1148
|
axiosInstance = _axios["default"].create();
|
|
1098
1149
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
1150
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
1099
1151
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
1100
1152
|
});
|
|
1101
1153
|
authenticatedUserToken = sessionCloseOptionalParams.authenticatedUserToken, isReconnectChat = sessionCloseOptionalParams.isReconnectChat, isPersistentChat = sessionCloseOptionalParams.isPersistentChat, chatId = sessionCloseOptionalParams.chatId;
|
|
@@ -1107,6 +1159,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1107
1159
|
if (authenticatedUserToken) {
|
|
1108
1160
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionClosePath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1109
1161
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1162
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1110
1163
|
}
|
|
1111
1164
|
|
|
1112
1165
|
if (isReconnectChat) {
|
|
@@ -1126,63 +1179,67 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1126
1179
|
url: url,
|
|
1127
1180
|
timeout: (_this$configuration$d8 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d8 !== void 0 ? _this$configuration$d8 : this.configuration.requestTimeoutConfig.sessionClose
|
|
1128
1181
|
};
|
|
1129
|
-
return
|
|
1130
|
-
var
|
|
1131
|
-
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds7;
|
|
1182
|
+
return _context15.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1183
|
+
var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(resolve, reject) {
|
|
1184
|
+
var response, _headers6, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds7;
|
|
1132
1185
|
|
|
1133
|
-
return _regenerator["default"].wrap(function
|
|
1186
|
+
return _regenerator["default"].wrap(function _callee14$(_context14) {
|
|
1134
1187
|
while (1) {
|
|
1135
|
-
switch (
|
|
1188
|
+
switch (_context14.prev = _context14.next) {
|
|
1136
1189
|
case 0:
|
|
1137
|
-
|
|
1138
|
-
|
|
1190
|
+
_context14.prev = 0;
|
|
1191
|
+
_context14.next = 3;
|
|
1139
1192
|
return axiosInstance(options);
|
|
1140
1193
|
|
|
1141
1194
|
case 3:
|
|
1142
|
-
response =
|
|
1195
|
+
response = _context14.sent;
|
|
1196
|
+
_headers6 = response.headers;
|
|
1197
|
+
|
|
1198
|
+
_this8.setAuthCodeNonce(_headers6);
|
|
1199
|
+
|
|
1143
1200
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1144
1201
|
|
|
1145
|
-
|
|
1202
|
+
_this8.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, "Session Close succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
1146
1203
|
|
|
1147
1204
|
resolve();
|
|
1148
|
-
|
|
1205
|
+
_context14.next = 17;
|
|
1149
1206
|
break;
|
|
1150
1207
|
|
|
1151
|
-
case
|
|
1152
|
-
|
|
1153
|
-
|
|
1208
|
+
case 11:
|
|
1209
|
+
_context14.prev = 11;
|
|
1210
|
+
_context14.t0 = _context14["catch"](0);
|
|
1154
1211
|
_elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
|
|
1155
1212
|
|
|
1156
|
-
|
|
1213
|
+
_this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context14.t0);
|
|
1157
1214
|
|
|
1158
|
-
if (
|
|
1215
|
+
if (_context14.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1159
1216
|
(0, _throwClientHTTPError["default"])();
|
|
1160
1217
|
}
|
|
1161
1218
|
|
|
1162
|
-
reject();
|
|
1219
|
+
reject(_context14.t0);
|
|
1163
1220
|
|
|
1164
|
-
case
|
|
1221
|
+
case 17:
|
|
1165
1222
|
case "end":
|
|
1166
|
-
return
|
|
1223
|
+
return _context14.stop();
|
|
1167
1224
|
}
|
|
1168
1225
|
}
|
|
1169
|
-
},
|
|
1226
|
+
}, _callee14, null, [[0, 11]]);
|
|
1170
1227
|
}));
|
|
1171
1228
|
|
|
1172
|
-
return function (
|
|
1173
|
-
return
|
|
1229
|
+
return function (_x21, _x22) {
|
|
1230
|
+
return _ref7.apply(this, arguments);
|
|
1174
1231
|
};
|
|
1175
1232
|
}()));
|
|
1176
1233
|
|
|
1177
1234
|
case 17:
|
|
1178
1235
|
case "end":
|
|
1179
|
-
return
|
|
1236
|
+
return _context15.stop();
|
|
1180
1237
|
}
|
|
1181
1238
|
}
|
|
1182
|
-
},
|
|
1239
|
+
}, _callee15, this);
|
|
1183
1240
|
}));
|
|
1184
1241
|
|
|
1185
|
-
function sessionClose(
|
|
1242
|
+
function sessionClose(_x20) {
|
|
1186
1243
|
return _sessionClose.apply(this, arguments);
|
|
1187
1244
|
}
|
|
1188
1245
|
|
|
@@ -1197,14 +1254,14 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1197
1254
|
}, {
|
|
1198
1255
|
key: "validateAuthChatRecord",
|
|
1199
1256
|
value: function () {
|
|
1200
|
-
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1201
|
-
var _this$configuration$d9
|
|
1202
|
-
|
|
1203
|
-
var timer, authenticatedUserToken, chatId, requestPath, axiosInstance, headers, url, method, options, _response$data, response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds8;
|
|
1257
|
+
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(requestId, validateAuthChatRecordOptionalParams) {
|
|
1258
|
+
var _this$configuration$d9,
|
|
1259
|
+
_this9 = this;
|
|
1204
1260
|
|
|
1205
|
-
|
|
1261
|
+
var timer, authenticatedUserToken, chatId, requestPath, axiosInstance, headers, url, method, options;
|
|
1262
|
+
return _regenerator["default"].wrap(function _callee17$(_context17) {
|
|
1206
1263
|
while (1) {
|
|
1207
|
-
switch (
|
|
1264
|
+
switch (_context17.prev = _context17.next) {
|
|
1208
1265
|
case 0:
|
|
1209
1266
|
timer = _Timer.Timer.TIMER();
|
|
1210
1267
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSTARTED, "Validate Auth Chat Record Started", requestId);
|
|
@@ -1212,12 +1269,14 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1212
1269
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatValidateAuthChatMapRecordPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1213
1270
|
axiosInstance = _axios["default"].create();
|
|
1214
1271
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
1272
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
1215
1273
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
1216
1274
|
});
|
|
1217
1275
|
headers = _Constants["default"].defaultHeaders;
|
|
1218
1276
|
|
|
1219
1277
|
if (authenticatedUserToken) {
|
|
1220
1278
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1279
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1221
1280
|
}
|
|
1222
1281
|
|
|
1223
1282
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
@@ -1228,59 +1287,79 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1228
1287
|
url: url,
|
|
1229
1288
|
timeout: (_this$configuration$d9 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d9 !== void 0 ? _this$configuration$d9 : this.configuration.requestTimeoutConfig.validateAuthChatRecordTimeout
|
|
1230
1289
|
};
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1290
|
+
return _context17.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1291
|
+
var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
|
|
1292
|
+
var _response$data, response, _headers7, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds8;
|
|
1234
1293
|
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1294
|
+
return _regenerator["default"].wrap(function _callee16$(_context16) {
|
|
1295
|
+
while (1) {
|
|
1296
|
+
switch (_context16.prev = _context16.next) {
|
|
1297
|
+
case 0:
|
|
1298
|
+
_context16.prev = 0;
|
|
1299
|
+
_context16.next = 3;
|
|
1300
|
+
return axiosInstance(options);
|
|
1238
1301
|
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
}
|
|
1302
|
+
case 3:
|
|
1303
|
+
response = _context16.sent;
|
|
1304
|
+
_headers7 = response.headers;
|
|
1243
1305
|
|
|
1244
|
-
|
|
1245
|
-
return _context15.abrupt("return", Promise.resolve(response.data));
|
|
1306
|
+
_this9.setAuthCodeNonce(_headers7);
|
|
1246
1307
|
|
|
1247
|
-
|
|
1248
|
-
this.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);
|
|
1249
|
-
return _context15.abrupt("return", Promise.reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized")));
|
|
1308
|
+
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1250
1309
|
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
break;
|
|
1310
|
+
if (((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true) {
|
|
1311
|
+
_this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSUCCEEDED, "Validate Auth Chat Record succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
1254
1312
|
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
_elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
|
|
1259
|
-
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context15.t0);
|
|
1313
|
+
resolve(response.data);
|
|
1314
|
+
} else {
|
|
1315
|
+
_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);
|
|
1260
1316
|
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
}
|
|
1317
|
+
reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized"));
|
|
1318
|
+
}
|
|
1264
1319
|
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1320
|
+
_context16.next = 16;
|
|
1321
|
+
break;
|
|
1322
|
+
|
|
1323
|
+
case 10:
|
|
1324
|
+
_context16.prev = 10;
|
|
1325
|
+
_context16.t0 = _context16["catch"](0);
|
|
1326
|
+
_elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
|
|
1269
1327
|
|
|
1270
|
-
|
|
1328
|
+
_this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context16.t0);
|
|
1271
1329
|
|
|
1272
|
-
|
|
1273
|
-
|
|
1330
|
+
if (_context16.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1331
|
+
(0, _throwClientHTTPError["default"])();
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
if (_context16.t0.toString() === "Error: Request failed with status code 404") {
|
|
1335
|
+
// backward compatibility
|
|
1336
|
+
resolve({});
|
|
1337
|
+
} else {
|
|
1338
|
+
reject(_context16.t0);
|
|
1339
|
+
}
|
|
1274
1340
|
|
|
1275
|
-
|
|
1341
|
+
case 16:
|
|
1342
|
+
case "end":
|
|
1343
|
+
return _context16.stop();
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
}, _callee16, null, [[0, 10]]);
|
|
1347
|
+
}));
|
|
1348
|
+
|
|
1349
|
+
return function (_x25, _x26) {
|
|
1350
|
+
return _ref8.apply(this, arguments);
|
|
1351
|
+
};
|
|
1352
|
+
}()));
|
|
1353
|
+
|
|
1354
|
+
case 12:
|
|
1276
1355
|
case "end":
|
|
1277
|
-
return
|
|
1356
|
+
return _context17.stop();
|
|
1278
1357
|
}
|
|
1279
1358
|
}
|
|
1280
|
-
},
|
|
1359
|
+
}, _callee17, this);
|
|
1281
1360
|
}));
|
|
1282
1361
|
|
|
1283
|
-
function validateAuthChatRecord(
|
|
1362
|
+
function validateAuthChatRecord(_x23, _x24) {
|
|
1284
1363
|
return _validateAuthChatRecord.apply(this, arguments);
|
|
1285
1364
|
}
|
|
1286
1365
|
|
|
@@ -1296,9 +1375,9 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1296
1375
|
}, {
|
|
1297
1376
|
key: "submitPostChatResponse",
|
|
1298
1377
|
value: function () {
|
|
1299
|
-
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1378
|
+
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(requestId, postChatResponse) {
|
|
1300
1379
|
var _this$configuration$d10,
|
|
1301
|
-
|
|
1380
|
+
_this10 = this;
|
|
1302
1381
|
|
|
1303
1382
|
var submitPostChatResponseOptionalParams,
|
|
1304
1383
|
timer,
|
|
@@ -1309,17 +1388,18 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1309
1388
|
url,
|
|
1310
1389
|
method,
|
|
1311
1390
|
options,
|
|
1312
|
-
|
|
1313
|
-
return _regenerator["default"].wrap(function
|
|
1391
|
+
_args19 = arguments;
|
|
1392
|
+
return _regenerator["default"].wrap(function _callee19$(_context19) {
|
|
1314
1393
|
while (1) {
|
|
1315
|
-
switch (
|
|
1394
|
+
switch (_context19.prev = _context19.next) {
|
|
1316
1395
|
case 0:
|
|
1317
|
-
submitPostChatResponseOptionalParams =
|
|
1396
|
+
submitPostChatResponseOptionalParams = _args19.length > 2 && _args19[2] !== undefined ? _args19[2] : {};
|
|
1318
1397
|
timer = _Timer.Timer.TIMER();
|
|
1319
1398
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSTARTED, "Submit Post Chat Started", requestId);
|
|
1320
1399
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSubmitPostChatPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1321
1400
|
axiosInstance = _axios["default"].create();
|
|
1322
1401
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
1402
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
1323
1403
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
1324
1404
|
});
|
|
1325
1405
|
authenticatedUserToken = submitPostChatResponseOptionalParams.authenticatedUserToken;
|
|
@@ -1328,6 +1408,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1328
1408
|
if (authenticatedUserToken) {
|
|
1329
1409
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSubmitPostChatPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1330
1410
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1411
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1331
1412
|
}
|
|
1332
1413
|
|
|
1333
1414
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
@@ -1339,63 +1420,67 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1339
1420
|
url: url,
|
|
1340
1421
|
timeout: (_this$configuration$d10 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d10 !== void 0 ? _this$configuration$d10 : this.configuration.requestTimeoutConfig.submitPostChatResponse
|
|
1341
1422
|
};
|
|
1342
|
-
return
|
|
1343
|
-
var
|
|
1344
|
-
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
|
|
1423
|
+
return _context19.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1424
|
+
var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
|
|
1425
|
+
var response, _headers8, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
|
|
1345
1426
|
|
|
1346
|
-
return _regenerator["default"].wrap(function
|
|
1427
|
+
return _regenerator["default"].wrap(function _callee18$(_context18) {
|
|
1347
1428
|
while (1) {
|
|
1348
|
-
switch (
|
|
1429
|
+
switch (_context18.prev = _context18.next) {
|
|
1349
1430
|
case 0:
|
|
1350
|
-
|
|
1351
|
-
|
|
1431
|
+
_context18.prev = 0;
|
|
1432
|
+
_context18.next = 3;
|
|
1352
1433
|
return axiosInstance(options);
|
|
1353
1434
|
|
|
1354
1435
|
case 3:
|
|
1355
|
-
response =
|
|
1436
|
+
response = _context18.sent;
|
|
1437
|
+
_headers8 = response.headers;
|
|
1438
|
+
|
|
1439
|
+
_this10.setAuthCodeNonce(_headers8);
|
|
1440
|
+
|
|
1356
1441
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1357
1442
|
|
|
1358
|
-
|
|
1443
|
+
_this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
1359
1444
|
|
|
1360
1445
|
resolve();
|
|
1361
|
-
|
|
1446
|
+
_context18.next = 17;
|
|
1362
1447
|
break;
|
|
1363
1448
|
|
|
1364
|
-
case
|
|
1365
|
-
|
|
1366
|
-
|
|
1449
|
+
case 11:
|
|
1450
|
+
_context18.prev = 11;
|
|
1451
|
+
_context18.t0 = _context18["catch"](0);
|
|
1367
1452
|
_elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
|
|
1368
1453
|
|
|
1369
|
-
|
|
1454
|
+
_this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context18.t0);
|
|
1370
1455
|
|
|
1371
|
-
if (
|
|
1456
|
+
if (_context18.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1372
1457
|
(0, _throwClientHTTPError["default"])();
|
|
1373
1458
|
}
|
|
1374
1459
|
|
|
1375
|
-
reject();
|
|
1460
|
+
reject(_context18.t0);
|
|
1376
1461
|
|
|
1377
|
-
case
|
|
1462
|
+
case 17:
|
|
1378
1463
|
case "end":
|
|
1379
|
-
return
|
|
1464
|
+
return _context18.stop();
|
|
1380
1465
|
}
|
|
1381
1466
|
}
|
|
1382
|
-
},
|
|
1467
|
+
}, _callee18, null, [[0, 11]]);
|
|
1383
1468
|
}));
|
|
1384
1469
|
|
|
1385
|
-
return function (
|
|
1386
|
-
return
|
|
1470
|
+
return function (_x29, _x30) {
|
|
1471
|
+
return _ref9.apply(this, arguments);
|
|
1387
1472
|
};
|
|
1388
1473
|
}()));
|
|
1389
1474
|
|
|
1390
1475
|
case 13:
|
|
1391
1476
|
case "end":
|
|
1392
|
-
return
|
|
1477
|
+
return _context19.stop();
|
|
1393
1478
|
}
|
|
1394
1479
|
}
|
|
1395
|
-
},
|
|
1480
|
+
}, _callee19, this);
|
|
1396
1481
|
}));
|
|
1397
1482
|
|
|
1398
|
-
function submitPostChatResponse(
|
|
1483
|
+
function submitPostChatResponse(_x27, _x28) {
|
|
1399
1484
|
return _submitPostChatResponse.apply(this, arguments);
|
|
1400
1485
|
}
|
|
1401
1486
|
|
|
@@ -1411,9 +1496,9 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1411
1496
|
}, {
|
|
1412
1497
|
key: "getSurveyInviteLink",
|
|
1413
1498
|
value: function () {
|
|
1414
|
-
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1499
|
+
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(surveyOwnerId, surveyInviteAPIRequestBody) {
|
|
1415
1500
|
var _this$configuration$d11,
|
|
1416
|
-
|
|
1501
|
+
_this11 = this;
|
|
1417
1502
|
|
|
1418
1503
|
var getsurveyInviteLinkOptionalParams,
|
|
1419
1504
|
timer,
|
|
@@ -1425,12 +1510,12 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1425
1510
|
url,
|
|
1426
1511
|
method,
|
|
1427
1512
|
options,
|
|
1428
|
-
|
|
1429
|
-
return _regenerator["default"].wrap(function
|
|
1513
|
+
_args21 = arguments;
|
|
1514
|
+
return _regenerator["default"].wrap(function _callee21$(_context21) {
|
|
1430
1515
|
while (1) {
|
|
1431
|
-
switch (
|
|
1516
|
+
switch (_context21.prev = _context21.next) {
|
|
1432
1517
|
case 0:
|
|
1433
|
-
getsurveyInviteLinkOptionalParams =
|
|
1518
|
+
getsurveyInviteLinkOptionalParams = _args21.length > 2 && _args21[2] !== undefined ? _args21[2] : {};
|
|
1434
1519
|
timer = _Timer.Timer.TIMER();
|
|
1435
1520
|
|
|
1436
1521
|
if (this.logger) {
|
|
@@ -1442,6 +1527,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1442
1527
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetSurveyInviteLinkPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(surveyOwnerId);
|
|
1443
1528
|
axiosInstance = _axios["default"].create();
|
|
1444
1529
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
1530
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
1445
1531
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
1446
1532
|
});
|
|
1447
1533
|
authenticatedUserToken = getsurveyInviteLinkOptionalParams.authenticatedUserToken, requestId = getsurveyInviteLinkOptionalParams.requestId;
|
|
@@ -1450,6 +1536,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1450
1536
|
if (authenticatedUserToken) {
|
|
1451
1537
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetSurveyInviteLinkPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(surveyOwnerId);
|
|
1452
1538
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1539
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1453
1540
|
headers[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
|
|
1454
1541
|
}
|
|
1455
1542
|
|
|
@@ -1466,64 +1553,67 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1466
1553
|
url: url,
|
|
1467
1554
|
timeout: (_this$configuration$d11 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d11 !== void 0 ? _this$configuration$d11 : this.configuration.requestTimeoutConfig.getSurveyInviteLink
|
|
1468
1555
|
};
|
|
1469
|
-
return
|
|
1470
|
-
var
|
|
1471
|
-
var response, data, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
|
|
1556
|
+
return _context21.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1557
|
+
var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
|
|
1558
|
+
var response, data, _headers9, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
|
|
1472
1559
|
|
|
1473
|
-
return _regenerator["default"].wrap(function
|
|
1560
|
+
return _regenerator["default"].wrap(function _callee20$(_context20) {
|
|
1474
1561
|
while (1) {
|
|
1475
|
-
switch (
|
|
1562
|
+
switch (_context20.prev = _context20.next) {
|
|
1476
1563
|
case 0:
|
|
1477
|
-
|
|
1478
|
-
|
|
1564
|
+
_context20.prev = 0;
|
|
1565
|
+
_context20.next = 3;
|
|
1479
1566
|
return axiosInstance(options);
|
|
1480
1567
|
|
|
1481
1568
|
case 3:
|
|
1482
|
-
response =
|
|
1483
|
-
data = response.data;
|
|
1569
|
+
response = _context20.sent;
|
|
1570
|
+
data = response.data, _headers9 = response.headers;
|
|
1571
|
+
|
|
1572
|
+
_this11.setAuthCodeNonce(_headers9);
|
|
1573
|
+
|
|
1484
1574
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1485
1575
|
|
|
1486
|
-
|
|
1576
|
+
_this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
1487
1577
|
|
|
1488
1578
|
resolve(data);
|
|
1489
|
-
|
|
1579
|
+
_context20.next = 17;
|
|
1490
1580
|
break;
|
|
1491
1581
|
|
|
1492
|
-
case
|
|
1493
|
-
|
|
1494
|
-
|
|
1582
|
+
case 11:
|
|
1583
|
+
_context20.prev = 11;
|
|
1584
|
+
_context20.t0 = _context20["catch"](0);
|
|
1495
1585
|
_elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
|
|
1496
1586
|
|
|
1497
|
-
|
|
1587
|
+
_this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context20.t0);
|
|
1498
1588
|
|
|
1499
|
-
if (
|
|
1589
|
+
if (_context20.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1500
1590
|
(0, _throwClientHTTPError["default"])();
|
|
1501
1591
|
}
|
|
1502
1592
|
|
|
1503
|
-
reject();
|
|
1593
|
+
reject(_context20.t0);
|
|
1504
1594
|
|
|
1505
|
-
case
|
|
1595
|
+
case 17:
|
|
1506
1596
|
case "end":
|
|
1507
|
-
return
|
|
1597
|
+
return _context20.stop();
|
|
1508
1598
|
}
|
|
1509
1599
|
}
|
|
1510
|
-
},
|
|
1600
|
+
}, _callee20, null, [[0, 11]]);
|
|
1511
1601
|
}));
|
|
1512
1602
|
|
|
1513
|
-
return function (
|
|
1514
|
-
return
|
|
1603
|
+
return function (_x33, _x34) {
|
|
1604
|
+
return _ref10.apply(this, arguments);
|
|
1515
1605
|
};
|
|
1516
1606
|
}()));
|
|
1517
1607
|
|
|
1518
1608
|
case 14:
|
|
1519
1609
|
case "end":
|
|
1520
|
-
return
|
|
1610
|
+
return _context21.stop();
|
|
1521
1611
|
}
|
|
1522
1612
|
}
|
|
1523
|
-
},
|
|
1613
|
+
}, _callee21, this);
|
|
1524
1614
|
}));
|
|
1525
1615
|
|
|
1526
|
-
function getSurveyInviteLink(
|
|
1616
|
+
function getSurveyInviteLink(_x31, _x32) {
|
|
1527
1617
|
return _getSurveyInviteLink.apply(this, arguments);
|
|
1528
1618
|
}
|
|
1529
1619
|
|
|
@@ -1540,9 +1630,9 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1540
1630
|
}, {
|
|
1541
1631
|
key: "getChatTranscripts",
|
|
1542
1632
|
value: function () {
|
|
1543
|
-
var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1633
|
+
var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(requestId, chatId, token) {
|
|
1544
1634
|
var _this$configuration$d12,
|
|
1545
|
-
|
|
1635
|
+
_this12 = this;
|
|
1546
1636
|
|
|
1547
1637
|
var getChatTranscriptsOptionalParams,
|
|
1548
1638
|
timer,
|
|
@@ -1554,17 +1644,18 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1554
1644
|
url,
|
|
1555
1645
|
method,
|
|
1556
1646
|
options,
|
|
1557
|
-
|
|
1558
|
-
return _regenerator["default"].wrap(function
|
|
1647
|
+
_args23 = arguments;
|
|
1648
|
+
return _regenerator["default"].wrap(function _callee23$(_context23) {
|
|
1559
1649
|
while (1) {
|
|
1560
|
-
switch (
|
|
1650
|
+
switch (_context23.prev = _context23.next) {
|
|
1561
1651
|
case 0:
|
|
1562
|
-
getChatTranscriptsOptionalParams =
|
|
1652
|
+
getChatTranscriptsOptionalParams = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {};
|
|
1563
1653
|
timer = _Timer.Timer.TIMER();
|
|
1564
1654
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSTARTED, "Get Chat Transcript Started", requestId);
|
|
1565
1655
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1566
1656
|
axiosInstance = _axios["default"].create();
|
|
1567
1657
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
1658
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
1568
1659
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
1569
1660
|
});
|
|
1570
1661
|
authenticatedUserToken = getChatTranscriptsOptionalParams.authenticatedUserToken, currentLiveChatVersion = getChatTranscriptsOptionalParams.currentLiveChatVersion;
|
|
@@ -1577,9 +1668,13 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1577
1668
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2GetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1578
1669
|
|
|
1579
1670
|
if (authenticatedUserToken) {
|
|
1671
|
+
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1672
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1580
1673
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2AuthGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1581
1674
|
}
|
|
1582
1675
|
} else if (authenticatedUserToken) {
|
|
1676
|
+
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1677
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1583
1678
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1584
1679
|
}
|
|
1585
1680
|
|
|
@@ -1591,64 +1686,66 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1591
1686
|
url: url,
|
|
1592
1687
|
timeout: (_this$configuration$d12 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d12 !== void 0 ? _this$configuration$d12 : this.configuration.requestTimeoutConfig.getChatTranscripts
|
|
1593
1688
|
};
|
|
1594
|
-
return
|
|
1595
|
-
var
|
|
1596
|
-
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds11;
|
|
1689
|
+
return _context23.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1690
|
+
var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
|
|
1691
|
+
var response, elapsedTimeInMilliseconds, data, _headers10, _elapsedTimeInMilliseconds11;
|
|
1597
1692
|
|
|
1598
|
-
return _regenerator["default"].wrap(function
|
|
1693
|
+
return _regenerator["default"].wrap(function _callee22$(_context22) {
|
|
1599
1694
|
while (1) {
|
|
1600
|
-
switch (
|
|
1695
|
+
switch (_context22.prev = _context22.next) {
|
|
1601
1696
|
case 0:
|
|
1602
|
-
|
|
1603
|
-
|
|
1697
|
+
_context22.prev = 0;
|
|
1698
|
+
_context22.next = 3;
|
|
1604
1699
|
return axiosInstance(options);
|
|
1605
1700
|
|
|
1606
1701
|
case 3:
|
|
1607
|
-
response =
|
|
1702
|
+
response = _context22.sent;
|
|
1608
1703
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1609
|
-
data = response.data;
|
|
1704
|
+
data = response.data, _headers10 = response.headers;
|
|
1610
1705
|
|
|
1611
|
-
|
|
1706
|
+
_this12.setAuthCodeNonce(_headers10);
|
|
1707
|
+
|
|
1708
|
+
_this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
1612
1709
|
|
|
1613
1710
|
resolve(data);
|
|
1614
|
-
|
|
1711
|
+
_context22.next = 17;
|
|
1615
1712
|
break;
|
|
1616
1713
|
|
|
1617
|
-
case
|
|
1618
|
-
|
|
1619
|
-
|
|
1714
|
+
case 11:
|
|
1715
|
+
_context22.prev = 11;
|
|
1716
|
+
_context22.t0 = _context22["catch"](0);
|
|
1620
1717
|
_elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
|
|
1621
1718
|
|
|
1622
|
-
|
|
1719
|
+
_this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context22.t0);
|
|
1623
1720
|
|
|
1624
|
-
if (
|
|
1721
|
+
if (_context22.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1625
1722
|
(0, _throwClientHTTPError["default"])();
|
|
1626
1723
|
}
|
|
1627
1724
|
|
|
1628
|
-
reject(
|
|
1725
|
+
reject(_context22.t0);
|
|
1629
1726
|
|
|
1630
|
-
case
|
|
1727
|
+
case 17:
|
|
1631
1728
|
case "end":
|
|
1632
|
-
return
|
|
1729
|
+
return _context22.stop();
|
|
1633
1730
|
}
|
|
1634
1731
|
}
|
|
1635
|
-
},
|
|
1732
|
+
}, _callee22, null, [[0, 11]]);
|
|
1636
1733
|
}));
|
|
1637
1734
|
|
|
1638
|
-
return function (
|
|
1639
|
-
return
|
|
1735
|
+
return function (_x38, _x39) {
|
|
1736
|
+
return _ref11.apply(this, arguments);
|
|
1640
1737
|
};
|
|
1641
1738
|
}()));
|
|
1642
1739
|
|
|
1643
1740
|
case 16:
|
|
1644
1741
|
case "end":
|
|
1645
|
-
return
|
|
1742
|
+
return _context23.stop();
|
|
1646
1743
|
}
|
|
1647
1744
|
}
|
|
1648
|
-
},
|
|
1745
|
+
}, _callee23, this);
|
|
1649
1746
|
}));
|
|
1650
1747
|
|
|
1651
|
-
function getChatTranscripts(
|
|
1748
|
+
function getChatTranscripts(_x35, _x36, _x37) {
|
|
1652
1749
|
return _getChatTranscripts.apply(this, arguments);
|
|
1653
1750
|
}
|
|
1654
1751
|
|
|
@@ -1665,9 +1762,9 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1665
1762
|
}, {
|
|
1666
1763
|
key: "emailTranscript",
|
|
1667
1764
|
value: function () {
|
|
1668
|
-
var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1765
|
+
var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(requestId, token, emailRequestBody) {
|
|
1669
1766
|
var _this$configuration$d13,
|
|
1670
|
-
|
|
1767
|
+
_this13 = this;
|
|
1671
1768
|
|
|
1672
1769
|
var emailTranscriptOptionalParams,
|
|
1673
1770
|
timer,
|
|
@@ -1678,17 +1775,18 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1678
1775
|
url,
|
|
1679
1776
|
method,
|
|
1680
1777
|
options,
|
|
1681
|
-
|
|
1682
|
-
return _regenerator["default"].wrap(function
|
|
1778
|
+
_args25 = arguments;
|
|
1779
|
+
return _regenerator["default"].wrap(function _callee25$(_context25) {
|
|
1683
1780
|
while (1) {
|
|
1684
|
-
switch (
|
|
1781
|
+
switch (_context25.prev = _context25.next) {
|
|
1685
1782
|
case 0:
|
|
1686
|
-
emailTranscriptOptionalParams =
|
|
1783
|
+
emailTranscriptOptionalParams = _args25.length > 3 && _args25[3] !== undefined ? _args25[3] : {};
|
|
1687
1784
|
timer = _Timer.Timer.TIMER();
|
|
1688
1785
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSTARTED, "Email Transcript Started", requestId);
|
|
1689
1786
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1690
1787
|
axiosInstance = _axios["default"].create();
|
|
1691
1788
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
1789
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
1692
1790
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
1693
1791
|
});
|
|
1694
1792
|
authenticatedUserToken = emailTranscriptOptionalParams.authenticatedUserToken;
|
|
@@ -1698,6 +1796,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1698
1796
|
headers[_OmnichannelHTTPHeaders["default"].authorization] = token;
|
|
1699
1797
|
|
|
1700
1798
|
if (authenticatedUserToken) {
|
|
1799
|
+
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1800
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1701
1801
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
1702
1802
|
}
|
|
1703
1803
|
|
|
@@ -1710,63 +1810,67 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1710
1810
|
url: url,
|
|
1711
1811
|
timeout: (_this$configuration$d13 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d13 !== void 0 ? _this$configuration$d13 : this.configuration.requestTimeoutConfig.emailTranscript
|
|
1712
1812
|
};
|
|
1713
|
-
return
|
|
1714
|
-
var
|
|
1715
|
-
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
|
|
1813
|
+
return _context25.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1814
|
+
var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
|
|
1815
|
+
var response, _headers11, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
|
|
1716
1816
|
|
|
1717
|
-
return _regenerator["default"].wrap(function
|
|
1817
|
+
return _regenerator["default"].wrap(function _callee24$(_context24) {
|
|
1718
1818
|
while (1) {
|
|
1719
|
-
switch (
|
|
1819
|
+
switch (_context24.prev = _context24.next) {
|
|
1720
1820
|
case 0:
|
|
1721
|
-
|
|
1722
|
-
|
|
1821
|
+
_context24.prev = 0;
|
|
1822
|
+
_context24.next = 3;
|
|
1723
1823
|
return axiosInstance(options);
|
|
1724
1824
|
|
|
1725
1825
|
case 3:
|
|
1726
|
-
response =
|
|
1826
|
+
response = _context24.sent;
|
|
1827
|
+
_headers11 = response.headers;
|
|
1828
|
+
|
|
1829
|
+
_this13.setAuthCodeNonce(_headers11);
|
|
1830
|
+
|
|
1727
1831
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1728
1832
|
|
|
1729
|
-
|
|
1833
|
+
_this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
1730
1834
|
|
|
1731
1835
|
resolve();
|
|
1732
|
-
|
|
1836
|
+
_context24.next = 17;
|
|
1733
1837
|
break;
|
|
1734
1838
|
|
|
1735
|
-
case
|
|
1736
|
-
|
|
1737
|
-
|
|
1839
|
+
case 11:
|
|
1840
|
+
_context24.prev = 11;
|
|
1841
|
+
_context24.t0 = _context24["catch"](0);
|
|
1738
1842
|
_elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
|
|
1739
1843
|
|
|
1740
|
-
|
|
1844
|
+
_this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context24.t0);
|
|
1741
1845
|
|
|
1742
|
-
if (
|
|
1846
|
+
if (_context24.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1743
1847
|
(0, _throwClientHTTPError["default"])();
|
|
1744
1848
|
}
|
|
1745
1849
|
|
|
1746
|
-
reject();
|
|
1850
|
+
reject(_context24.t0);
|
|
1747
1851
|
|
|
1748
|
-
case
|
|
1852
|
+
case 17:
|
|
1749
1853
|
case "end":
|
|
1750
|
-
return
|
|
1854
|
+
return _context24.stop();
|
|
1751
1855
|
}
|
|
1752
1856
|
}
|
|
1753
|
-
},
|
|
1857
|
+
}, _callee24, null, [[0, 11]]);
|
|
1754
1858
|
}));
|
|
1755
1859
|
|
|
1756
|
-
return function (
|
|
1757
|
-
return
|
|
1860
|
+
return function (_x43, _x44) {
|
|
1861
|
+
return _ref12.apply(this, arguments);
|
|
1758
1862
|
};
|
|
1759
1863
|
}()));
|
|
1760
1864
|
|
|
1761
1865
|
case 16:
|
|
1762
1866
|
case "end":
|
|
1763
|
-
return
|
|
1867
|
+
return _context25.stop();
|
|
1764
1868
|
}
|
|
1765
1869
|
}
|
|
1766
|
-
},
|
|
1870
|
+
}, _callee25, this);
|
|
1767
1871
|
}));
|
|
1768
1872
|
|
|
1769
|
-
function emailTranscript(
|
|
1873
|
+
function emailTranscript(_x40, _x41, _x42) {
|
|
1770
1874
|
return _emailTranscript.apply(this, arguments);
|
|
1771
1875
|
}
|
|
1772
1876
|
|
|
@@ -1780,14 +1884,14 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1780
1884
|
}, {
|
|
1781
1885
|
key: "fetchDataMaskingInfo",
|
|
1782
1886
|
value: function () {
|
|
1783
|
-
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1887
|
+
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(requestId) {
|
|
1784
1888
|
var _this$configuration$d14,
|
|
1785
|
-
|
|
1889
|
+
_this14 = this;
|
|
1786
1890
|
|
|
1787
1891
|
var timer, requestPath, axiosInstance, headers, url, method, options;
|
|
1788
|
-
return _regenerator["default"].wrap(function
|
|
1892
|
+
return _regenerator["default"].wrap(function _callee27$(_context27) {
|
|
1789
1893
|
while (1) {
|
|
1790
|
-
switch (
|
|
1894
|
+
switch (_context27.prev = _context27.next) {
|
|
1791
1895
|
case 0:
|
|
1792
1896
|
timer = _Timer.Timer.TIMER();
|
|
1793
1897
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSTARTED, "Fetch Data Masking Started", requestId);
|
|
@@ -1812,64 +1916,64 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1812
1916
|
url: url,
|
|
1813
1917
|
timeout: (_this$configuration$d14 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d14 !== void 0 ? _this$configuration$d14 : this.configuration.requestTimeoutConfig.fetchDataMaskingInfo
|
|
1814
1918
|
};
|
|
1815
|
-
return
|
|
1816
|
-
var
|
|
1919
|
+
return _context27.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
1920
|
+
var _ref13 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(resolve, reject) {
|
|
1817
1921
|
var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds13;
|
|
1818
1922
|
|
|
1819
|
-
return _regenerator["default"].wrap(function
|
|
1923
|
+
return _regenerator["default"].wrap(function _callee26$(_context26) {
|
|
1820
1924
|
while (1) {
|
|
1821
|
-
switch (
|
|
1925
|
+
switch (_context26.prev = _context26.next) {
|
|
1822
1926
|
case 0:
|
|
1823
|
-
|
|
1824
|
-
|
|
1927
|
+
_context26.prev = 0;
|
|
1928
|
+
_context26.next = 3;
|
|
1825
1929
|
return axiosInstance(options);
|
|
1826
1930
|
|
|
1827
1931
|
case 3:
|
|
1828
|
-
response =
|
|
1932
|
+
response = _context26.sent;
|
|
1829
1933
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1830
1934
|
data = response.data;
|
|
1831
1935
|
|
|
1832
|
-
|
|
1936
|
+
_this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
1833
1937
|
|
|
1834
1938
|
resolve(data);
|
|
1835
|
-
|
|
1939
|
+
_context26.next = 16;
|
|
1836
1940
|
break;
|
|
1837
1941
|
|
|
1838
1942
|
case 10:
|
|
1839
|
-
|
|
1840
|
-
|
|
1943
|
+
_context26.prev = 10;
|
|
1944
|
+
_context26.t0 = _context26["catch"](0);
|
|
1841
1945
|
_elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
|
|
1842
1946
|
|
|
1843
|
-
|
|
1947
|
+
_this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context26.t0);
|
|
1844
1948
|
|
|
1845
|
-
if (
|
|
1949
|
+
if (_context26.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1846
1950
|
(0, _throwClientHTTPError["default"])();
|
|
1847
1951
|
}
|
|
1848
1952
|
|
|
1849
|
-
reject();
|
|
1953
|
+
reject(_context26.t0);
|
|
1850
1954
|
|
|
1851
1955
|
case 16:
|
|
1852
1956
|
case "end":
|
|
1853
|
-
return
|
|
1957
|
+
return _context26.stop();
|
|
1854
1958
|
}
|
|
1855
1959
|
}
|
|
1856
|
-
},
|
|
1960
|
+
}, _callee26, null, [[0, 10]]);
|
|
1857
1961
|
}));
|
|
1858
1962
|
|
|
1859
|
-
return function (
|
|
1860
|
-
return
|
|
1963
|
+
return function (_x46, _x47) {
|
|
1964
|
+
return _ref13.apply(this, arguments);
|
|
1861
1965
|
};
|
|
1862
1966
|
}()));
|
|
1863
1967
|
|
|
1864
1968
|
case 13:
|
|
1865
1969
|
case "end":
|
|
1866
|
-
return
|
|
1970
|
+
return _context27.stop();
|
|
1867
1971
|
}
|
|
1868
1972
|
}
|
|
1869
|
-
},
|
|
1973
|
+
}, _callee27, this);
|
|
1870
1974
|
}));
|
|
1871
1975
|
|
|
1872
|
-
function fetchDataMaskingInfo(
|
|
1976
|
+
function fetchDataMaskingInfo(_x45) {
|
|
1873
1977
|
return _fetchDataMaskingInfo.apply(this, arguments);
|
|
1874
1978
|
}
|
|
1875
1979
|
|
|
@@ -1885,8 +1989,9 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1885
1989
|
}, {
|
|
1886
1990
|
key: "makeSecondaryChannelEventRequest",
|
|
1887
1991
|
value: function () {
|
|
1888
|
-
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
1889
|
-
var _this$configuration$d15
|
|
1992
|
+
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee29(requestId, secondaryChannelEventRequestBody) {
|
|
1993
|
+
var _this$configuration$d15,
|
|
1994
|
+
_this15 = this;
|
|
1890
1995
|
|
|
1891
1996
|
var secondaryChannelEventOptionalParams,
|
|
1892
1997
|
timer,
|
|
@@ -1897,21 +2002,18 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1897
2002
|
url,
|
|
1898
2003
|
method,
|
|
1899
2004
|
options,
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
_elapsedTimeInMilliseconds14,
|
|
1903
|
-
_args26 = arguments;
|
|
1904
|
-
|
|
1905
|
-
return _regenerator["default"].wrap(function _callee26$(_context26) {
|
|
2005
|
+
_args29 = arguments;
|
|
2006
|
+
return _regenerator["default"].wrap(function _callee29$(_context29) {
|
|
1906
2007
|
while (1) {
|
|
1907
|
-
switch (
|
|
2008
|
+
switch (_context29.prev = _context29.next) {
|
|
1908
2009
|
case 0:
|
|
1909
|
-
secondaryChannelEventOptionalParams =
|
|
2010
|
+
secondaryChannelEventOptionalParams = _args29.length > 2 && _args29[2] !== undefined ? _args29[2] : {};
|
|
1910
2011
|
timer = _Timer.Timer.TIMER();
|
|
1911
2012
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSTARTED, "Secondary Channel Event Request Started", requestId);
|
|
1912
2013
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
1913
2014
|
axiosInstance = _axios["default"].create();
|
|
1914
2015
|
(0, _axiosRetry["default"])(axiosInstance, {
|
|
2016
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
1915
2017
|
retries: this.configuration.maxRequestRetriesOnFailure
|
|
1916
2018
|
});
|
|
1917
2019
|
authenticatedUserToken = secondaryChannelEventOptionalParams.authenticatedUserToken;
|
|
@@ -1920,6 +2022,7 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1920
2022
|
|
|
1921
2023
|
if (authenticatedUserToken) {
|
|
1922
2024
|
headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
2025
|
+
headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
1923
2026
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
1924
2027
|
}
|
|
1925
2028
|
|
|
@@ -1933,38 +2036,67 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1933
2036
|
url: url,
|
|
1934
2037
|
timeout: (_this$configuration$d15 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d15 !== void 0 ? _this$configuration$d15 : this.configuration.requestTimeoutConfig.makeSecondaryChannelEventRequest
|
|
1935
2038
|
};
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
2039
|
+
return _context29.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2040
|
+
var _ref14 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(resolve, reject) {
|
|
2041
|
+
var response, _headers12, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds14;
|
|
1939
2042
|
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
2043
|
+
return _regenerator["default"].wrap(function _callee28$(_context28) {
|
|
2044
|
+
while (1) {
|
|
2045
|
+
switch (_context28.prev = _context28.next) {
|
|
2046
|
+
case 0:
|
|
2047
|
+
_context28.prev = 0;
|
|
2048
|
+
_context28.next = 3;
|
|
2049
|
+
return axiosInstance(options);
|
|
2050
|
+
|
|
2051
|
+
case 3:
|
|
2052
|
+
response = _context28.sent;
|
|
2053
|
+
_headers12 = response.headers;
|
|
2054
|
+
|
|
2055
|
+
_this15.setAuthCodeNonce(_headers12);
|
|
2056
|
+
|
|
2057
|
+
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2058
|
+
|
|
2059
|
+
_this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
2060
|
+
|
|
2061
|
+
resolve();
|
|
2062
|
+
_context28.next = 17;
|
|
2063
|
+
break;
|
|
2064
|
+
|
|
2065
|
+
case 11:
|
|
2066
|
+
_context28.prev = 11;
|
|
2067
|
+
_context28.t0 = _context28["catch"](0);
|
|
2068
|
+
_elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
|
|
1956
2069
|
|
|
1957
|
-
|
|
2070
|
+
_this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context28.t0);
|
|
2071
|
+
|
|
2072
|
+
if (_context28.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
2073
|
+
(0, _throwClientHTTPError["default"])();
|
|
2074
|
+
}
|
|
1958
2075
|
|
|
1959
|
-
|
|
2076
|
+
reject(_context28.t0);
|
|
2077
|
+
|
|
2078
|
+
case 17:
|
|
2079
|
+
case "end":
|
|
2080
|
+
return _context28.stop();
|
|
2081
|
+
}
|
|
2082
|
+
}
|
|
2083
|
+
}, _callee28, null, [[0, 11]]);
|
|
2084
|
+
}));
|
|
2085
|
+
|
|
2086
|
+
return function (_x50, _x51) {
|
|
2087
|
+
return _ref14.apply(this, arguments);
|
|
2088
|
+
};
|
|
2089
|
+
}()));
|
|
2090
|
+
|
|
2091
|
+
case 15:
|
|
1960
2092
|
case "end":
|
|
1961
|
-
return
|
|
2093
|
+
return _context29.stop();
|
|
1962
2094
|
}
|
|
1963
2095
|
}
|
|
1964
|
-
},
|
|
2096
|
+
}, _callee29, this);
|
|
1965
2097
|
}));
|
|
1966
2098
|
|
|
1967
|
-
function makeSecondaryChannelEventRequest(
|
|
2099
|
+
function makeSecondaryChannelEventRequest(_x48, _x49) {
|
|
1968
2100
|
return _makeSecondaryChannelEventRequest.apply(this, arguments);
|
|
1969
2101
|
}
|
|
1970
2102
|
|
|
@@ -1977,9 +2109,9 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1977
2109
|
}, {
|
|
1978
2110
|
key: "sendTypingIndicator",
|
|
1979
2111
|
value: function () {
|
|
1980
|
-
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
2112
|
+
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee31(requestId, currentLiveChatVersion) {
|
|
1981
2113
|
var _this$configuration$d16,
|
|
1982
|
-
|
|
2114
|
+
_this16 = this;
|
|
1983
2115
|
|
|
1984
2116
|
var sendTypingIndicatorOptionalParams,
|
|
1985
2117
|
timer,
|
|
@@ -1990,26 +2122,26 @@ var SDK = /*#__PURE__*/function () {
|
|
|
1990
2122
|
url,
|
|
1991
2123
|
method,
|
|
1992
2124
|
options,
|
|
1993
|
-
|
|
1994
|
-
return _regenerator["default"].wrap(function
|
|
2125
|
+
_args31 = arguments;
|
|
2126
|
+
return _regenerator["default"].wrap(function _callee31$(_context31) {
|
|
1995
2127
|
while (1) {
|
|
1996
|
-
switch (
|
|
2128
|
+
switch (_context31.prev = _context31.next) {
|
|
1997
2129
|
case 0:
|
|
1998
|
-
sendTypingIndicatorOptionalParams =
|
|
2130
|
+
sendTypingIndicatorOptionalParams = _args31.length > 2 && _args31[2] !== undefined ? _args31[2] : {};
|
|
1999
2131
|
|
|
2000
2132
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2001
|
-
|
|
2133
|
+
_context31.next = 3;
|
|
2002
2134
|
break;
|
|
2003
2135
|
}
|
|
2004
2136
|
|
|
2005
|
-
return
|
|
2137
|
+
return _context31.abrupt("return", Promise.resolve());
|
|
2006
2138
|
|
|
2007
2139
|
case 3:
|
|
2008
2140
|
timer = _Timer.Timer.TIMER();
|
|
2009
2141
|
customerDisplayName = sendTypingIndicatorOptionalParams.customerDisplayName;
|
|
2010
2142
|
|
|
2011
2143
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2012
|
-
|
|
2144
|
+
_context31.next = 7;
|
|
2013
2145
|
break;
|
|
2014
2146
|
}
|
|
2015
2147
|
|
|
@@ -2033,63 +2165,63 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2033
2165
|
url: url,
|
|
2034
2166
|
timeout: (_this$configuration$d16 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d16 !== void 0 ? _this$configuration$d16 : this.configuration.requestTimeoutConfig.sendTypingIndicator
|
|
2035
2167
|
};
|
|
2036
|
-
return
|
|
2037
|
-
var
|
|
2168
|
+
return _context31.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
2169
|
+
var _ref15 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee30(resolve, reject) {
|
|
2038
2170
|
var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds15;
|
|
2039
2171
|
|
|
2040
|
-
return _regenerator["default"].wrap(function
|
|
2172
|
+
return _regenerator["default"].wrap(function _callee30$(_context30) {
|
|
2041
2173
|
while (1) {
|
|
2042
|
-
switch (
|
|
2174
|
+
switch (_context30.prev = _context30.next) {
|
|
2043
2175
|
case 0:
|
|
2044
|
-
|
|
2045
|
-
|
|
2176
|
+
_context30.prev = 0;
|
|
2177
|
+
_context30.next = 3;
|
|
2046
2178
|
return axiosInstance(options);
|
|
2047
2179
|
|
|
2048
2180
|
case 3:
|
|
2049
|
-
response =
|
|
2181
|
+
response = _context30.sent;
|
|
2050
2182
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2051
2183
|
|
|
2052
|
-
|
|
2184
|
+
_this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
|
|
2053
2185
|
|
|
2054
2186
|
resolve();
|
|
2055
|
-
|
|
2187
|
+
_context30.next = 15;
|
|
2056
2188
|
break;
|
|
2057
2189
|
|
|
2058
2190
|
case 9:
|
|
2059
|
-
|
|
2060
|
-
|
|
2191
|
+
_context30.prev = 9;
|
|
2192
|
+
_context30.t0 = _context30["catch"](0);
|
|
2061
2193
|
_elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
|
|
2062
2194
|
|
|
2063
|
-
|
|
2195
|
+
_this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context30.t0);
|
|
2064
2196
|
|
|
2065
|
-
if (
|
|
2197
|
+
if (_context30.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
2066
2198
|
(0, _throwClientHTTPError["default"])();
|
|
2067
2199
|
}
|
|
2068
2200
|
|
|
2069
|
-
reject(
|
|
2201
|
+
reject(_context30.t0);
|
|
2070
2202
|
|
|
2071
2203
|
case 15:
|
|
2072
2204
|
case "end":
|
|
2073
|
-
return
|
|
2205
|
+
return _context30.stop();
|
|
2074
2206
|
}
|
|
2075
2207
|
}
|
|
2076
|
-
},
|
|
2208
|
+
}, _callee30, null, [[0, 9]]);
|
|
2077
2209
|
}));
|
|
2078
2210
|
|
|
2079
|
-
return function (
|
|
2080
|
-
return
|
|
2211
|
+
return function (_x54, _x55) {
|
|
2212
|
+
return _ref15.apply(this, arguments);
|
|
2081
2213
|
};
|
|
2082
2214
|
}()));
|
|
2083
2215
|
|
|
2084
2216
|
case 16:
|
|
2085
2217
|
case "end":
|
|
2086
|
-
return
|
|
2218
|
+
return _context31.stop();
|
|
2087
2219
|
}
|
|
2088
2220
|
}
|
|
2089
|
-
},
|
|
2221
|
+
}, _callee31, this);
|
|
2090
2222
|
}));
|
|
2091
2223
|
|
|
2092
|
-
function sendTypingIndicator(
|
|
2224
|
+
function sendTypingIndicator(_x52, _x53) {
|
|
2093
2225
|
return _sendTypingIndicator.apply(this, arguments);
|
|
2094
2226
|
}
|
|
2095
2227
|
|
|
@@ -2153,7 +2285,8 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2153
2285
|
RequestPayload: sanitizedRequestPayload
|
|
2154
2286
|
};
|
|
2155
2287
|
this.logger.log(logLevel, telemetryEventType, customData, description);
|
|
2156
|
-
}
|
|
2288
|
+
} // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2289
|
+
|
|
2157
2290
|
}]);
|
|
2158
2291
|
return SDK;
|
|
2159
2292
|
}();
|
|
@@ -2161,23 +2294,24 @@ var SDK = /*#__PURE__*/function () {
|
|
|
2161
2294
|
exports["default"] = SDK;
|
|
2162
2295
|
(0, _defineProperty2["default"])(SDK, "defaultRequestTimeoutConfig", {
|
|
2163
2296
|
getChatConfig: 30000,
|
|
2164
|
-
getLWIDetails:
|
|
2165
|
-
getChatToken:
|
|
2166
|
-
sessionInit:
|
|
2167
|
-
sessionClose:
|
|
2168
|
-
getReconnectableChats:
|
|
2169
|
-
getReconnectAvailability:
|
|
2170
|
-
submitPostChatResponse:
|
|
2171
|
-
getSurveyInviteLink:
|
|
2297
|
+
getLWIDetails: 15000,
|
|
2298
|
+
getChatToken: 15000,
|
|
2299
|
+
sessionInit: 15000,
|
|
2300
|
+
sessionClose: 15000,
|
|
2301
|
+
getReconnectableChats: 15000,
|
|
2302
|
+
getReconnectAvailability: 15000,
|
|
2303
|
+
submitPostChatResponse: 15000,
|
|
2304
|
+
getSurveyInviteLink: 15000,
|
|
2172
2305
|
getChatTranscripts: 30000,
|
|
2173
2306
|
emailTranscript: 5000,
|
|
2174
|
-
fetchDataMaskingInfo:
|
|
2175
|
-
makeSecondaryChannelEventRequest:
|
|
2176
|
-
getAgentAvailability:
|
|
2307
|
+
fetchDataMaskingInfo: 5000,
|
|
2308
|
+
makeSecondaryChannelEventRequest: 15000,
|
|
2309
|
+
getAgentAvailability: 15000,
|
|
2177
2310
|
sendTypingIndicator: 5000,
|
|
2178
|
-
validateAuthChatRecordTimeout:
|
|
2311
|
+
validateAuthChatRecordTimeout: 15000
|
|
2179
2312
|
});
|
|
2180
2313
|
(0, _defineProperty2["default"])(SDK, "defaultConfiguration", {
|
|
2314
|
+
authCodeNonce: (0, _uuid.uuidv4)().substring(0, 8),
|
|
2181
2315
|
getChatTokenRetryCount: 10,
|
|
2182
2316
|
getChatTokenTimeBetweenRetriesOnFailure: 10000,
|
|
2183
2317
|
getChatTokenRetryOn429: false,
|
|
@@ -2185,4 +2319,4 @@ exports["default"] = SDK;
|
|
|
2185
2319
|
defaultRequestTimeout: undefined,
|
|
2186
2320
|
requestTimeoutConfig: SDK.defaultRequestTimeoutConfig
|
|
2187
2321
|
});
|
|
2188
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUQ0hBVENPTkZJRyIsInJlcXVlc3RQYXRoIiwiT21uaWNoYW5uZWxFbmRwb2ludHMiLCJMaXZlQ2hhdENvbmZpZ1BhdGgiLCJvcmdJZCIsIndpZGdldElkIiwibWV0aG9kIiwidXJsIiwib3JnVXJsIiwiYXhpb3NJbnN0YW5jZSIsImF4aW9zIiwiY3JlYXRlIiwicmV0cmllcyIsIm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIiwiaGVhZGVycyIsImJ5cGFzc0NhY2hlSGVhZGVycyIsImdldCIsInRpbWVvdXQiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXQiLCJyZXF1ZXN0VGltZW91dENvbmZpZyIsImdldENoYXRDb25maWciLCJyZXNwb25zZSIsImVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJtaWxsaVNlY29uZHNFbGFwc2VkIiwiZGF0YSIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIiwiR0VUTFdJU1RBVFVTU1RBUlRFRCIsIkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJhdXRoZW50aWNhdGVkVXNlclRva2VuIiwicmVjb25uZWN0SWQiLCJkZWZhdWx0SGVhZGVycyIsIkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9wdGlvbnMiLCJnZXRMV0lEZXRhaWxzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJHRVRMV0lTVEFUVVNTVUNDRUVERUQiLCJFUlJPUiIsIkdFVExXSVNUQVRVU0ZBSUxFRCIsInVuZGVmaW5lZCIsImNvZGUiLCJheGlvc1RpbWVvdXRFcnJvckNvZGUiLCJnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyIsImN1cnJlbnRSZXRyeUNvdW50IiwiY3VycmVudExpdmVDaGF0VmVyc2lvbiIsIkdFVENIQVRUT0tFTlNUQVJURUQiLCJlbmRwb2ludCIsInF1ZXJ5UGFyYW1zIiwiZ2V0Q2hhdFRva2VuIiwicmV0cnlPbjQyOSIsImdldENoYXRUb2tlblJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5FcnJvciIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJHRVRDSEFUVE9LRU5GQUlMRUQiLCJ0b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsInNldFRpbWVvdXQiLCJ0aGVuIiwiZXJyb3IiLCJnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUiLCJyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFMiLCJMaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGgiLCJnZXRSZWNvbm5lY3RhYmxlQ2hhdHMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFkiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkiLCJXQVJOIiwicXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsIkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aCIsImluaXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImNhY2hPYmoiLCJjdXN0b21Db250ZXh0RGF0YSIsInRlbXBBcnIiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsImhhc2giLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpZ2VzdCIsInRvU3RyaW5nIiwid2luZG93IiwiZG9jdW1lbnQiLCJicm93c2VyIiwiQnJvd3NlckluZm8iLCJnZXRCcm93c2VyTmFtZSIsImRldmljZSIsIkRldmljZUluZm8iLCJnZXREZXZpY2VUeXBlIiwib3JpZ2ludXJsIiwibG9jYXRpb24iLCJocmVmIiwib3MiLCJPU0luZm8iLCJnZXRPc1R5cGUiLCJsb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiTG9jYWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwic2hvdWxkUmV0cnkiLCJzZXNzaW9uSW5pdFJldHJ5SGFuZGxlciIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRoIiwic2Vzc2lvbkluaXQiLCJTRVNTSU9OSU5JVFNVQ0NFRURFRCIsIlNFU1NJT05JTklURkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJzZXNzaW9uQ2xvc2UiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCIsIkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dCIsImF1dGhDaGF0RXhpc3QiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVEIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJMaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwibG9nIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJnZXRTdXJ2ZXlJbnZpdGVMaW5rIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJ0b2tlbiIsImdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJWMiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiZW1haWxUcmFuc2NyaXB0IiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0IiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJ0cmFuc2FjdGlvbmlkIiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwiRXhjZXB0aW9uRGV0YWlscyIsIlJlcXVlc3RQYXlsb2FkIiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztJQUVxQkEsRztBQStCbkIsZUFBMkJDLHdCQUEzQixFQUFtTDtBQUFBLFFBQTNGQyxhQUEyRix1RUFB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RUFBQUEsc0JBQXNCLEVBQUUsS0FIK0I7QUFJdkR4QyxFQUFBQSwwQkFBMEIsRUFBRSxDQUoyQjtBQUt2REssRUFBQUEscUJBQXFCLEVBQUV3QixTQUxnQztBQU12RHZCLEVBQUFBLG9CQUFvQixFQUFFakQsR0FBRyxDQUFDNlA7QUFONkIsQyIsInNvdXJjZVJvb3QiOiJvY3NkazovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCB9IGZyb20gXCIuL1V0aWxzL2VuZHBvaW50c0NyZWF0b3JzXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT0NTREtUZWxlbWV0cnlFdmVudCB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5XCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5pbXBvcnQgKiBhcyBoYXNoIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IEN1c3RvbUNvbnRleHREYXRhIH0gZnJvbSBcIi4vVXRpbHMvQ3VzdG9tQ29udGV4dERhdGFcIjtcbmltcG9ydCB7IFJlcXVlc3RUaW1lb3V0Q29uZmlnIH0gZnJvbSBcIi4vQ29tbW9uL1JlcXVlc3RUaW1lb3V0Q29uZmlnXCI7XG5pbXBvcnQgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yIGZyb20gXCIuL1V0aWxzL3Rocm93Q2xpZW50SFRUUEVycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMzAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogNTAwMCxcbiAgICBnZXRDaGF0VG9rZW46IDEwMDAwLFxuICAgIHNlc3Npb25Jbml0OiA1MDAwLFxuICAgIHNlc3Npb25DbG9zZTogMTAwMDAsXG4gICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiA1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogNTAwMCxcbiAgICBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlOiAxMDAwMCxcbiAgICBnZXRTdXJ2ZXlJbnZpdGVMaW5rOiAxMDAwMCxcbiAgICBnZXRDaGF0VHJhbnNjcmlwdHM6IDMwMDAwLFxuICAgIGVtYWlsVHJhbnNjcmlwdDogNTAwMCxcbiAgICBmZXRjaERhdGFNYXNraW5nSW5mbzogMTAwMCxcbiAgICBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdDogNTAwMCxcbiAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiA1MDAwXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOTogZmFsc2UsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDMsXG4gICAgZGVmYXVsdFJlcXVlc3RUaW1lb3V0OiB1bmRlZmluZWQsXG4gICAgcmVxdWVzdFRpbWVvdXRDb25maWc6IFNESy5kZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWdcbiAgfTtcblxuICBsaXZlQ2hhdFZlcnNpb246IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHLCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBsZXQgaGVhZGVycyA9IHt9O1xuICAgIGlmIChieXBhc3NDYWNoZSkge1xuICAgICAgaGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4uaGVhZGVycyB9O1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgaGVhZGVycyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uKSB7XG4gICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgIH1cblxuICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgIGlmIChyZXNwb25zZS5oZWFkZXJzICYmIHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdKSB7XG4gICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgfVxuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRVNTLCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcmVjb25uZWN0IGlkIG9uIHRoZSBlbmRwb2ludCBpZiB2YWlsYWJsZVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIHJlcXVlc3RQYXRoICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCwgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBjaGF0IHRva2VuIGZyb20gT21uaWNoYW5uZWwgdG8gam9pbiBUMSB0aHJlYWQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUb2tlbihyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9LCBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsIFwiR2V0IENoYXQgVG9rZW4gU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGN1cnJlbnRSZXRyeUNvdW50YCk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQoY3VycmVudExpdmVDaGF0VmVyc2lvbiBhcyBMaXZlQ2hhdFZlcnNpb24gfHwgdGhpcy5saXZlQ2hhdFZlcnNpb24sIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPyB0cnVlIDogZmFsc2UpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2VuZHBvaW50fS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGBjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICByZXF1ZXN0UGF0aCArPSBgPyR7cXVlcnlQYXJhbXN9YDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLCByZXRyeU9uNDI5OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgZ2V0Q2hhdFRva2VuRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgY2hhdCB0b2tlbiByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuXG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1VDQ0VFREVELCBcIkdldCBDaGF0IFRva2VuIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gY29udGVudCBmb3IgcmVjb25uZWN0IGNoYXQgY2FzZSBzaG91bGRuJ3QgYmUgcmV0cmllZC5cbiAgICAgICAgaWYgKHJlY29ubmVjdElkICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gQ29uc3RhbnRzLm5vQ29udGVudFN0YXR1c0NvZGUpIHtcbiAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCwgXCJHZXQgQ2hhdCBUb2tlbiBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgZ2V0Q2hhdFRva2VuRXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAvLyBTdG9wIHJldHJ5IG9uIDQyOVxuICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LnN0YXR1cyA9PT0gQ29uc3RhbnRzLnRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gcmV0dXJuL3JlamVjdCB0byByZWN1cnNpdmVseSByZXRyeSBvbiBmYWlsdXJlcyB1cCB0byBjaGF0IHRva2VuIHJldHJ5IGNvdW50IGxpbWl0XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICBpZiAoZ2V0Q2hhdFRva2VuRXJyb3IgJiYgZ2V0Q2hhdFRva2VuRXJyb3IuY29kZSA9PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGhlIHJldHJ5IGZvciBnZXRjaGF0dG9rZW4gaGFzIGV4Y2VlZGVkIGl0cyBtYXggdmFsdWUgb2YgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudH1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIGNoYXQgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdGFibGVDaGF0c1xuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgcmVjb25uZWN0YWJsZSBjaGF0cyByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdGFibGUgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVjb25uZWN0SWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgdW5kZWZpbmVkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5XQVJOLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YVwiLCB1bmRlZmluZWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IGZhaWxlZFwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0QWdlbnRBdmFpbGFiaWxpdHkocmVxdWVzdElkOiBzdHJpbmcsIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFF1ZXVlQXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD1sY3dgO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcImN1c3RvbUNvbnRleHRcIjogdGVtcEFyciB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wb3J0YWxjb250YWN0aWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZCB9KTtcbiAgICB9XG5cbiAgICBkYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICBzaG91bGRSZXRyeTogc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGBjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICByZXF1ZXN0UGF0aCArPSBgPyR7cXVlcnlQYXJhbXN9YDtcbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uSW5pdFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhKTtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBjbG9zZSAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkNsb3NlKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCwgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWQgfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELCBcIlNlc3Npb24gQ2xvc2Ugc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBhdXRoIGNoYXQgcmVjb3JkIGV4aXN0cyBpbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZChyZXF1ZXN0SWQ6IHN0cmluZywgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3IudG9TdHJpbmcoKSA9PT0gXCJFcnJvcjogUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSA0MDRcIikgeyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlKHJlcXVlc3RJZDogc3RyaW5nLCBwb3N0Q2hhdFJlc3BvbnNlOiBvYmplY3QsIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1RBUlRFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdENoYXRSZXNwb25zZSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH07XG5cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFURkFJTEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQgfSA9IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiB9ID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRyYW5zY3JpcHRzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVEZBSUxFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELCBcIkZldGNoIERhdGEgTWFza2luZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICByZXF1ZXN0UGF0aCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKiogU2VuZCB0eXBpbmcgaW5kaWNhdG9yXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUeXBpbmdJbmRpY2F0b3IocmVxdWVzdElkOiBzdHJpbmcsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb246IG51bWJlciwgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zOiBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGN1c3RvbWVyRGlzcGxheU5hbWUgfSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcztcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7IHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpIH1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICBoZWFkZXJzW0NvbnN0YW50cy5jdXN0b21lckRpc3BsYXlOYW1lXSA9IGN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcblxuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBsb2dnaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gbG9nTGV2ZWwgTG9nIGxldmVsIGZvciBsb2dnaW5nLlxuICAgKiBAcGFyYW0gdGVsZW1ldHJ5RXZlbnRUeXBlIFRlbGVtZXRyeSBldmVudCB0eXBlIGluIHdoaWNoIGV2ZW50IHdpbGwgYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3QgSURcbiAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlXG4gICAqIEBwYXJhbSBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIEVsYXBzZWQgdGltZSBpbiBtc1xuICAgKiBAcGFyYW0gcmVxdWVzdFBhdGggUmVxdWVzdCBwYXRoXG4gICAqIEBwYXJhbSBtZXRob2QgTWV0aG9kXG4gICAqIEBwYXJhbSBlcnJvciBFcnJvclxuICAgKiBAcGFyYW0gZGF0YSBEYXRhXG4gICAqL1xuICBwcml2YXRlIGxvZ1dpdGhMb2dnZXIobG9nTGV2ZWw6IExvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGU6IE9DU0RLVGVsZW1ldHJ5RXZlbnQsIGRlc2NyaXB0aW9uOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZywgcmVzcG9uc2U/OiBBeGlvc1Jlc3BvbnNlPGFueT4sIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM/OiBudW1iZXIsIHJlcXVlc3RQYXRoPzogc3RyaW5nLCBtZXRob2Q/OiBzdHJpbmcsIGVycm9yPzogdW5rbm93biwgcmVxdWVzdFBheWxvYWQ/OiBhbnkpOiB2b2lkIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICAgIFxuICAgIGlmICghdGhpcy5sb2dnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHsgLi4ucmVxdWVzdFBheWxvYWQgfTtcbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUHJlQ2hhdFJlc3BvbnNlKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwR2VvbG9jYXRpb24oc2FuaXRpemVkUmVxdWVzdFBheWxvYWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgIFJlZ2lvbjogcmVzcG9uc2U/LmRhdGEuUmVnaW9uLFxuICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlPy5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSxcbiAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsXG4gICAgICBSZXF1ZXN0UGF5bG9hZDogc2FuaXRpemVkUmVxdWVzdFBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMubG9nZ2VyLmxvZyhsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gIH1cbn0iXX0=
|
|
2322
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUQ0hBVENPTkZJRyIsInJlcXVlc3RQYXRoIiwiT21uaWNoYW5uZWxFbmRwb2ludHMiLCJMaXZlQ2hhdENvbmZpZ1BhdGgiLCJvcmdJZCIsIndpZGdldElkIiwibWV0aG9kIiwidXJsIiwib3JnVXJsIiwiYXhpb3NJbnN0YW5jZSIsImF4aW9zIiwiY3JlYXRlIiwicmV0cmllcyIsIm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwidGltZW91dCIsImRlZmF1bHRSZXF1ZXN0VGltZW91dCIsInJlcXVlc3RUaW1lb3V0Q29uZmlnIiwiZ2V0Q2hhdENvbmZpZyIsInJlc3BvbnNlIiwiZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIm1pbGxpU2Vjb25kc0VsYXBzZWQiLCJkYXRhIiwiR0VUQ0hBVENPTkZJR1NVQ0NFU1MiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImhlYWRlck92ZXJ3cml0ZXMiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwiYXV0aGVudGljYXRlZFVzZXJUb2tlbiIsInJlY29ubmVjdElkIiwiZGVmYXVsdEhlYWRlcnMiLCJMaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsIm9wdGlvbnMiLCJnZXRMV0lEZXRhaWxzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRBdXRoQ29kZU5vbmNlIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJ1bmRlZmluZWQiLCJjb2RlIiwiYXhpb3NUaW1lb3V0RXJyb3JDb2RlIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiZW5kcG9pbnQiLCJxdWVyeVBhcmFtcyIsImdldENoYXRUb2tlbiIsInJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5SZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuRXJyb3IiLCJHRVRDSEFUVE9LRU5TVUNDRUVERUQiLCJzdGF0dXMiLCJub0NvbnRlbnRTdGF0dXNDb2RlIiwiR0VUQ0hBVFRPS0VORkFJTEVEIiwidG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwiZ2V0UmVjb25uZWN0YWJsZUNoYXRzIiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZIiwiTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5IiwiV0FSTiIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQiLCJHZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGgiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwiY3VzdG9tQ29udGV4dERhdGEiLCJ0ZW1wQXJyIiwiQ3VzdG9tQ29udGV4dERhdGEiLCJzb3J0IiwiYXNzaWduIiwicG9ydGFsY29udGFjdGlkIiwiY2FjaGVLZXkiLCJoYXNoIiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaWdlc3QiLCJ0b1N0cmluZyIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiZ2V0QWdlbnRBdmFpbGFiaWxpdHkiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05JTklUU1RBUlRFRCIsInNob3VsZFJldHJ5Iiwic2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsInNlc3Npb25Jbml0IiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsImlzUmVjb25uZWN0Q2hhdCIsImlzUGVyc2lzdGVudENoYXQiLCJjaGF0SWQiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoIiwic2Vzc2lvbkNsb3NlIiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlIiwiU1VCTUlUUE9TVENIQVRTVUNDRUVERUQiLCJTVUJNSVRQT1NUQ0hBVEZBSUxFRCIsInN1cnZleU93bmVySWQiLCJzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSIsImdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyIsImxvZyIsIkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVEIiwiU3VydmV5T3duZXJJZCIsIkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiZ2V0U3VydmV5SW52aXRlTGluayIsIkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVEIiwidG9rZW4iLCJnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyIsIkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwib3JnYW5pemF0aW9uSWQiLCJhdXRob3JpemF0aW9uIiwiVjIiLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJnZXRDaGF0VHJhbnNjcmlwdHMiLCJHRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCIsIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEIiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJMaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsImVtYWlsVHJhbnNjcmlwdCIsIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCIsIkVNQUlMVFJBTlNDUklQVEZBSUxFRCIsIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEIiwiTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgiLCJmZXRjaERhdGFNYXNraW5nSW5mbyIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEIiwiTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsImRlZmF1bHRDaGFubmVsSWQiLCJtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVEIiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsIlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRoIiwic2VuZFR5cGluZ0luZGljYXRvciIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEIiwibG9nTGV2ZWwiLCJ0ZWxlbWV0cnlFdmVudFR5cGUiLCJkZXNjcmlwdGlvbiIsInJlcXVlc3RQYXlsb2FkIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwic2FuaXRpemVkUmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwiY3VzdG9tRGF0YSIsIlJlcXVlc3RJZCIsIlJlZ2lvbiIsIkVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJUcmFuc2FjdGlvbklkIiwidHJhbnNhY3Rpb25pZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIkV4Y2VwdGlvbkRldGFpbHMiLCJSZXF1ZXN0UGF5bG9hZCIsInN1YnN0cmluZyIsImRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FB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QVQsQ0FBbUIsQ0FBbkIsRUFBc0IsQ0FBdEIsQ0FEd0M7QUFFdkRuSyxFQUFBQSxzQkFBc0IsRUFBRSxFQUYrQjtBQUd2REksRUFBQUEsdUNBQXVDLEVBQUUsS0FIYztBQUl2RFgsRUFBQUEsc0JBQXNCLEVBQUUsS0FKK0I7QUFLdkR6QyxFQUFBQSwwQkFBMEIsRUFBRSxDQUwyQjtBQU12REksRUFBQUEscUJBQXFCLEVBQUUwQixTQU5nQztBQU92RHpCLEVBQUFBLG9CQUFvQixFQUFFbkQsR0FBRyxDQUFDa1E7QUFQNkIsQyIsInNvdXJjZVJvb3QiOiJvY3NkazovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCB9IGZyb20gXCIuL1V0aWxzL2VuZHBvaW50c0NyZWF0b3JzXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT0NTREtUZWxlbWV0cnlFdmVudCB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5XCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5pbXBvcnQgKiBhcyBoYXNoIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IEN1c3RvbUNvbnRleHREYXRhIH0gZnJvbSBcIi4vVXRpbHMvQ3VzdG9tQ29udGV4dERhdGFcIjtcbmltcG9ydCB7IFJlcXVlc3RUaW1lb3V0Q29uZmlnIH0gZnJvbSBcIi4vQ29tbW9uL1JlcXVlc3RUaW1lb3V0Q29uZmlnXCI7XG5pbXBvcnQgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yIGZyb20gXCIuL1V0aWxzL3Rocm93Q2xpZW50SFRUUEVycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMzAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogMTUwMDAsXG4gICAgZ2V0Q2hhdFRva2VuOiAxNTAwMCxcbiAgICBzZXNzaW9uSW5pdDogMTUwMDAsXG4gICAgc2Vzc2lvbkNsb3NlOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RhYmxlQ2hhdHM6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc3VibWl0UG9zdENoYXRSZXNwb25zZTogMTUwMDAsXG4gICAgZ2V0U3VydmV5SW52aXRlTGluazogMTUwMDAsXG4gICAgZ2V0Q2hhdFRyYW5zY3JpcHRzOiAzMDAwMCxcbiAgICBlbWFpbFRyYW5zY3JpcHQ6IDUwMDAsXG4gICAgZmV0Y2hEYXRhTWFza2luZ0luZm86IDUwMDAsXG4gICAgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3Q6IDE1MDAwLFxuICAgIGdldEFnZW50QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiAxNTAwMFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRDb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IHtcbiAgICBhdXRoQ29kZU5vbmNlOiB1dWlkdjQoKS5zdWJzdHJpbmcoMCwgOCksXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMTAsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeU9uNDI5OiBmYWxzZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogMyxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZ1xuICB9O1xuXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbmRpdmlkdWFsIGVuZHBvaW50VGltZW91dCBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gTGl2ZUNoYXRWZXJzaW9uLlYxO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY2hhdCBjb25maWcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdENvbmZpZyhyZXF1ZXN0SWQ6IHN0cmluZywgYnlwYXNzQ2FjaGUgPSBmYWxzZSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUcsIFwiR2V0IENoYXQgY29uZmlnIHN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGxldCBoZWFkZXJzID0ge307XG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICBoZWFkZXJzID0geyAuLi5Db25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzLCAuLi5oZWFkZXJzIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQodXJsLCB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgIH0pO1xuICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24pIHtcbiAgICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gZGF0YS5MaXZlQ2hhdFZlcnNpb247XG4gICAgfVxuXG4gICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl0pIHtcbiAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICB9XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR1NVQ0NFU1MsIFwiR2V0IENoYXQgY29uZmlnIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELCBcIkdldCBMV0kgRGV0YWlscyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGEgZW5kcG9pbnQgZm9yIGFub255bW91cyBjaGF0cyB0byBnZXQgTFdJIERldGFpbHNcbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIC8vIEFwcGVuZCByZWNvbm5lY3QgaWQgb24gdGhlIGVuZHBvaW50IGlmIHZhaWxhYmxlXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG4gICAgcmVxdWVzdFBhdGggKz0gYD9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0TFdJRGV0YWlsc1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCwgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVEFSVEVELCBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50KGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gYXMgTGl2ZUNoYXRWZXJzaW9uIHx8IHRoaXMubGl2ZUNoYXRWZXJzaW9uLCBhdXRoZW50aWNhdGVkVXNlclRva2VuID8gdHJ1ZSA6IGZhbHNlKTtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2VuZHBvaW50fS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGBjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICByZXF1ZXN0UGF0aCArPSBgPyR7cXVlcnlQYXJhbXN9YDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSwgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjkgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IGdldENoYXRUb2tlbkVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgY2hhdCB0b2tlbiByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuXG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1VDQ0VFREVELCBcIkdldCBDaGF0IFRva2VuIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gY29udGVudCBmb3IgcmVjb25uZWN0IGNoYXQgY2FzZSBzaG91bGRuJ3QgYmUgcmV0cmllZC5cbiAgICAgICAgaWYgKHJlY29ubmVjdElkICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gQ29uc3RhbnRzLm5vQ29udGVudFN0YXR1c0NvZGUpIHtcbiAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCwgXCJHZXQgQ2hhdCBUb2tlbiBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgZ2V0Q2hhdFRva2VuRXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAvLyBTdG9wIHJldHJ5IG9uIDQyOVxuICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LnN0YXR1cyA9PT0gQ29uc3RhbnRzLnRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gcmV0dXJuL3JlamVjdCB0byByZWN1cnNpdmVseSByZXRyeSBvbiBmYWlsdXJlcyB1cCB0byBjaGF0IHRva2VuIHJldHJ5IGNvdW50IGxpbWl0XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICBpZiAoZ2V0Q2hhdFRva2VuRXJyb3IgJiYgZ2V0Q2hhdFRva2VuRXJyb3IuY29kZSA9PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGdldENoYXRUb2tlbkVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHJpZXMgdW50aWwgaXQgcmVhY2hlcyBpdHMgbGltaXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdldENoYXRUb2tlbihyZXF1ZXN0SWQsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zLCBjdXJyZW50UmV0cnlDb3VudCArIDEpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNvbHZlKHJlc3BvbnNlKSkuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcbiAgICAgIH0sIHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0YWJsZUNoYXRzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtczogSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyk6IFByb21pc2U8UmVjb25uZWN0TWFwcGluZ1JlY29yZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0YWJsZUNoYXRzXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIHJlY29ubmVjdGFibGUgY2hhdHMgcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgU3VjY2VlZGVkIGFuZCBvbGQgc2Vzc2lvbiByZXR1cm5lZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eShyZWNvbm5lY3RJZDogc3RyaW5nKTogUHJvbWlzZTxSZWNvbm5lY3RBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3RhYmxlIGF2YWlsYWJpbGl0eSBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHVuZGVmaW5lZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuV0FSTiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGFcIiwgdW5kZWZpbmVkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IEF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgY29uc3QgY2FjaE9iaiA9IHtcbiAgICAgIFwib3JnSWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgY29uc3QgdGVtcEFyciA9IEN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJjdXN0b21Db250ZXh0XCI6IHRlbXBBcnIgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJwb3J0YWxjb250YWN0aWRcIjogZGF0YS5wb3J0YWxjb250YWN0aWQgfSk7XG4gICAgfVxuXG4gICAgZGF0YS5jYWNoZUtleSA9IGhhc2guY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS5kaWdlc3QoJ2hleCcpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldEFnZW50QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgc2Vzc2lvbiB0byBvbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25Jbml0KHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCwgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgc2hvdWxkUmV0cnk6IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyLFxuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV1cbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gYGNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIHJlcXVlc3RQYXRoICs9IGA/JHtxdWVyeVBhcmFtc31gO1xuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVUNDRUVERUQsIFwiU2Vzc2lvbiBJbml0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIGRhdGEpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBjbG9zZSAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkNsb3NlKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCwgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGlzUmVjb25uZWN0Q2hhdCwgaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkIH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlOyAgXG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELCBcIlNlc3Npb24gQ2xvc2Ugc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVEZBSUxFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkVtYWlsIFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELCBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICByZXF1ZXN0UGF0aCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZW5kIHR5cGluZyBpbmRpY2F0b3JcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFR5cGluZ0luZGljYXRvcihyZXF1ZXN0SWQ6IHN0cmluZywgY3VycmVudExpdmVDaGF0VmVyc2lvbjogbnVtYmVyLCBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM6IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGF2b2lkaW5nIGxvZ2dpbmcgSW5mbyBmb3IgdHlwaW5naW5kaWNhdG9yIHRvIHJlZHVjZSBsb2cgdHJhZmZpY1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgY3VzdG9tZXJEaXNwbGF5TmFtZSB9ID0gc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHsgdGhyb3cgbmV3IEVycm9yKCdUeXBpbmcgaW5kaWNhdG9yIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHYyJykgfVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRofS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgIGhlYWRlcnNbQ29uc3RhbnRzLmN1c3RvbWVyRGlzcGxheU5hbWVdID0gY3VzdG9tZXJEaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZW5kVHlwaW5nSW5kaWNhdG9yXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBsb2dMZXZlbCBMb2cgbGV2ZWwgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB0ZWxlbWV0cnlFdmVudFR5cGUgVGVsZW1ldHJ5IGV2ZW50IHR5cGUgaW4gd2hpY2ggZXZlbnQgd2lsbCBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdCBJRFxuICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2VcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgRWxhcHNlZCB0aW1lIGluIG1zXG4gICAqIEBwYXJhbSByZXF1ZXN0UGF0aCBSZXF1ZXN0IHBhdGhcbiAgICogQHBhcmFtIG1ldGhvZCBNZXRob2RcbiAgICogQHBhcmFtIGVycm9yIEVycm9yXG4gICAqIEBwYXJhbSBkYXRhIERhdGFcbiAgICovXG4gIHByaXZhdGUgbG9nV2l0aExvZ2dlcihsb2dMZXZlbDogTG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZTogT0NTREtUZWxlbWV0cnlFdmVudCwgZGVzY3JpcHRpb246IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nLCByZXNwb25zZT86IEF4aW9zUmVzcG9uc2U8YW55PiwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlciwgcmVxdWVzdFBhdGg/OiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCByZXF1ZXN0UGF5bG9hZD86IGFueSk6IHZvaWQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgICAgXG4gICAgaWYgKCF0aGlzLmxvZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0geyAuLi5yZXF1ZXN0UGF5bG9hZCB9O1xuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2Uoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgIFJlcXVlc3RJZDogcmVxdWVzdElkLFxuICAgICAgUmVnaW9uOiByZXNwb25zZT8uZGF0YS5SZWdpb24sXG4gICAgICBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2U/LmhlYWRlcnNbQ29uc3RhbnRzLnRyYW5zYWN0aW9uaWRdLFxuICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgUmVxdWVzdE1ldGhvZDogbWV0aG9kLFxuICAgICAgUmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LnN0YXR1cyA6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBFeGNlcHRpb25EZXRhaWxzOiBlcnJvcixcbiAgICAgIFJlcXVlc3RQYXlsb2FkOiBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZFxuICAgIH07XG4gICAgdGhpcy5sb2dnZXIubG9nKGxvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGUsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgc2V0QXV0aENvZGVOb25jZSA9IChoZWFkZXJzOiBhbnkpID0+IHtcbiAgICBpZiAoaGVhZGVycz8uYXV0aGNvZGVub25jZSkge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UgPSBoZWFkZXJzPy5hdXRoY29kZW5vbmNlO1xuICAgIH1cbiAgfVxufVxuIl19
|