@cloudbase/realtime 1.2.2-alpha.0 → 1.8.1

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.
@@ -14,7 +14,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
14
14
  function verb(n) { return function (v) { return step([n, v]); }; }
15
15
  function step(op) {
16
16
  if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
18
  if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
19
  if (y = 0, t) op = [op[0] & 2, t.value];
20
20
  switch (op[0]) {
@@ -35,12 +35,14 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
35
35
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
36
  }
37
37
  };
38
- var __spreadArrays = (this && this.__spreadArrays) || function () {
39
- for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
40
- for (var r = Array(s), k = 0, i = 0; i < il; i++)
41
- for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
42
- r[k] = a[j];
43
- return r;
38
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
39
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
40
+ if (ar || !(i in from)) {
41
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
42
+ ar[i] = from[i];
43
+ }
44
+ }
45
+ return to.concat(ar || Array.prototype.slice.call(from));
44
46
  };
45
47
  var __importDefault = (this && this.__importDefault) || function (mod) {
46
48
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -122,21 +124,21 @@ var VirtualWebSocketClient = (function () {
122
124
  this.watchStatus = WATCH_STATUS.INITING;
123
125
  initWatchMsg = {
124
126
  watchId: this.watchId,
125
- requestId: message_1.genRequestId(),
127
+ requestId: (0, message_1.genRequestId)(),
126
128
  msgType: 'INIT_WATCH',
127
129
  msgData: {
128
130
  envId: envId,
129
131
  collName: this.collectionName,
130
132
  query: this.query,
131
133
  limit: this.limit,
132
- orderBy: this.orderBy
133
- }
134
+ orderBy: this.orderBy,
135
+ },
134
136
  };
135
137
  return [4, this.send({
136
138
  msg: initWatchMsg,
137
139
  waitResponse: true,
138
140
  skipOnMessage: true,
139
- timeout: DEFAULT_INIT_WATCH_TIMEOUT
141
+ timeout: DEFAULT_INIT_WATCH_TIMEOUT,
140
142
  })];
141
143
  case 2:
142
144
  initEventMsg = _b.sent();
@@ -144,7 +146,7 @@ var VirtualWebSocketClient = (function () {
144
146
  this.sessionInfo = {
145
147
  queryID: initEventMsg.msgData.queryID,
146
148
  currentEventId: currEvent - 1,
147
- currentDocs: []
149
+ currentDocs: [],
148
150
  };
149
151
  if (events.length > 0) {
150
152
  for (_i = 0, events_1 = events; _i < events_1.length; _i++) {
@@ -159,7 +161,7 @@ var VirtualWebSocketClient = (function () {
159
161
  id: currEvent,
160
162
  docChanges: [],
161
163
  docs: [],
162
- type: 'init'
164
+ type: 'init',
163
165
  });
164
166
  this.listener.onChange(snapshot);
165
167
  this.scheduleSendACK();
@@ -174,7 +176,7 @@ var VirtualWebSocketClient = (function () {
174
176
  this.handleWatchEstablishmentError(e_1, {
175
177
  operationName: 'INIT_WATCH',
176
178
  resolve: resolve,
177
- reject: reject
179
+ reject: reject,
178
180
  });
179
181
  return [3, 4];
180
182
  case 4: return [2];
@@ -194,7 +196,7 @@ var VirtualWebSocketClient = (function () {
194
196
  this._initWatchPromise = undefined;
195
197
  return [7];
196
198
  case 4:
197
- console.log("[realtime] initWatch " + (success ? 'success' : 'fail'));
199
+ console.log("[realtime] initWatch ".concat(success ? 'success' : 'fail'));
198
200
  return [2];
199
201
  }
200
202
  });
@@ -231,20 +233,20 @@ var VirtualWebSocketClient = (function () {
231
233
  this.watchStatus = WATCH_STATUS.REBUILDING;
232
234
  rebuildWatchMsg = {
233
235
  watchId: this.watchId,
234
- requestId: message_1.genRequestId(),
236
+ requestId: (0, message_1.genRequestId)(),
235
237
  msgType: 'REBUILD_WATCH',
236
238
  msgData: {
237
239
  envId: envId,
238
240
  collName: this.collectionName,
239
241
  queryID: this.sessionInfo.queryID,
240
- eventID: this.sessionInfo.currentEventId
241
- }
242
+ eventID: this.sessionInfo.currentEventId,
243
+ },
242
244
  };
243
245
  return [4, this.send({
244
246
  msg: rebuildWatchMsg,
245
247
  waitResponse: true,
246
248
  skipOnMessage: false,
247
- timeout: DEFAULT_REBUILD_WATCH_TIMEOUT
249
+ timeout: DEFAULT_REBUILD_WATCH_TIMEOUT,
248
250
  })];
249
251
  case 2:
250
252
  nextEventMsg = _a.sent();
@@ -258,7 +260,7 @@ var VirtualWebSocketClient = (function () {
258
260
  this.handleWatchEstablishmentError(e_2, {
259
261
  operationName: 'REBUILD_WATCH',
260
262
  resolve: resolve,
261
- reject: reject
263
+ reject: reject,
262
264
  });
263
265
  return [3, 4];
264
266
  case 4: return [2];
@@ -278,7 +280,7 @@ var VirtualWebSocketClient = (function () {
278
280
  this._rebuildWatchPromise = undefined;
279
281
  return [7];
280
282
  case 4:
281
- console.log("[realtime] rebuildWatch " + (success ? 'success' : 'fail'));
283
+ console.log("[realtime] rebuildWatch ".concat(success ? 'success' : 'fail'));
282
284
  return [2];
283
285
  }
284
286
  });
@@ -293,7 +295,7 @@ var VirtualWebSocketClient = (function () {
293
295
  errCode: isInitWatch
294
296
  ? error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_INIT_WATCH_FAIL
295
297
  : error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_REBUILD_WATCH_FAIL,
296
- errMsg: e
298
+ errMsg: e,
297
299
  }));
298
300
  options.reject(e);
299
301
  };
@@ -342,11 +344,11 @@ var VirtualWebSocketClient = (function () {
342
344
  case 1:
343
345
  _a.sent();
344
346
  return [3, 7];
345
- case 2: return [4, utils_1.sleep(DEFAULT_WAIT_TIME_ON_UNKNOWN_ERROR)];
347
+ case 2: return [4, (0, utils_1.sleep)(DEFAULT_WAIT_TIME_ON_UNKNOWN_ERROR)];
346
348
  case 3:
347
349
  _a.sent();
348
350
  if (!(this.watchStatus === WATCH_STATUS.PAUSED)) return [3, 4];
349
- options.reject(new error_1.CancelledError(options.operationName + " cancelled due to pause after unknownError"));
351
+ options.reject(new error_1.CancelledError("".concat(options.operationName, " cancelled due to pause after unknownError")));
350
352
  return [3, 7];
351
353
  case 4:
352
354
  if (!!this.isWSConnected()) return [3, 6];
@@ -365,7 +367,7 @@ var VirtualWebSocketClient = (function () {
365
367
  case 9: return [2];
366
368
  }
367
369
  });
368
- }); }
370
+ }); },
369
371
  });
370
372
  return [2];
371
373
  });
@@ -387,12 +389,12 @@ var VirtualWebSocketClient = (function () {
387
389
  this.watchStatus = WATCH_STATUS.CLOSING;
388
390
  closeWatchMsg = {
389
391
  watchId: this.watchId,
390
- requestId: message_1.genRequestId(),
392
+ requestId: (0, message_1.genRequestId)(),
391
393
  msgType: 'CLOSE_WATCH',
392
- msgData: null
394
+ msgData: null,
393
395
  };
394
396
  return [4, this.send({
395
- msg: closeWatchMsg
397
+ msg: closeWatchMsg,
396
398
  })];
397
399
  case 2:
398
400
  _a.sent();
@@ -403,7 +405,7 @@ var VirtualWebSocketClient = (function () {
403
405
  e_4 = _a.sent();
404
406
  this.closeWithError(new error_1.CloudSDKError({
405
407
  errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CLOSE_WATCH_FAIL,
406
- errMsg: e_4
408
+ errMsg: e_4,
407
409
  }));
408
410
  return [3, 5];
409
411
  case 4:
@@ -445,15 +447,15 @@ var VirtualWebSocketClient = (function () {
445
447
  }
446
448
  ackMsg = {
447
449
  watchId: this.watchId,
448
- requestId: message_1.genRequestId(),
450
+ requestId: (0, message_1.genRequestId)(),
449
451
  msgType: 'CHECK_LAST',
450
452
  msgData: {
451
453
  queryID: this.sessionInfo.queryID,
452
- eventID: this.sessionInfo.currentEventId
453
- }
454
+ eventID: this.sessionInfo.currentEventId,
455
+ },
454
456
  };
455
457
  return [4, this.send({
456
- msg: ackMsg
458
+ msg: ackMsg,
457
459
  })];
458
460
  case 1:
459
461
  _a.sent();
@@ -461,7 +463,7 @@ var VirtualWebSocketClient = (function () {
461
463
  return [3, 3];
462
464
  case 2:
463
465
  e_5 = _a.sent();
464
- if (error_1.isRealtimeErrorMessageError(e_5)) {
466
+ if ((0, error_1.isRealtimeErrorMessageError)(e_5)) {
465
467
  msg = e_5.payload;
466
468
  switch (msg.msgData.code) {
467
469
  case 'CHECK_LOGIN_FAILED':
@@ -477,7 +479,7 @@ var VirtualWebSocketClient = (function () {
477
479
  case 'COLLECTION_PERMISSION_DENIED': {
478
480
  this.closeWithError(new error_1.CloudSDKError({
479
481
  errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CHECK_LAST_FAIL,
480
- errMsg: msg.msgData.code
482
+ errMsg: msg.msgData.code,
481
483
  }));
482
484
  return [2];
483
485
  }
@@ -486,15 +488,15 @@ var VirtualWebSocketClient = (function () {
486
488
  }
487
489
  }
488
490
  }
489
- if (this._availableRetries.CHECK_LAST &&
490
- this._availableRetries.CHECK_LAST > 0) {
491
+ if (this._availableRetries.CHECK_LAST
492
+ && this._availableRetries.CHECK_LAST > 0) {
491
493
  this._availableRetries.CHECK_LAST--;
492
494
  this.scheduleSendACK();
493
495
  }
494
496
  else {
495
497
  this.closeWithError(new error_1.CloudSDKError({
496
498
  errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CHECK_LAST_FAIL,
497
- errMsg: e_5
499
+ errMsg: e_5,
498
500
  }));
499
501
  }
500
502
  return [3, 3];
@@ -503,7 +505,7 @@ var VirtualWebSocketClient = (function () {
503
505
  });
504
506
  }); };
505
507
  this.handleCommonError = function (e, options) {
506
- if (error_1.isRealtimeErrorMessageError(e)) {
508
+ if ((0, error_1.isRealtimeErrorMessageError)(e)) {
507
509
  var msg = e.payload;
508
510
  switch (msg.msgData.code) {
509
511
  case 'CHECK_LOGIN_FAILED':
@@ -526,17 +528,17 @@ var VirtualWebSocketClient = (function () {
526
528
  }
527
529
  }
528
530
  }
529
- else if (error_1.isTimeoutError(e)) {
531
+ else if ((0, error_1.isTimeoutError)(e)) {
530
532
  options.onTimeoutError(e);
531
533
  return;
532
534
  }
533
- else if (error_1.isCancelledError(e)) {
535
+ else if ((0, error_1.isCancelledError)(e)) {
534
536
  options.onCancelledError(e);
535
537
  return;
536
538
  }
537
539
  options.onUnknownError(e);
538
540
  };
539
- this.watchId = "watchid_" + +new Date() + "_" + Math.random();
541
+ this.watchId = "watchid_".concat(+new Date(), "_").concat(Math.random());
540
542
  this.envId = options.envId;
541
543
  this.collectionName = options.collectionName;
542
544
  this.query = options.query;
@@ -553,14 +555,14 @@ var VirtualWebSocketClient = (function () {
553
555
  this._availableRetries = {
554
556
  INIT_WATCH: DEFAULT_MAX_AUTO_RETRY_ON_ERROR,
555
557
  REBUILD_WATCH: DEFAULT_MAX_AUTO_RETRY_ON_ERROR,
556
- CHECK_LAST: DEFAULT_MAX_SEND_ACK_AUTO_RETRY_ON_ERROR
558
+ CHECK_LAST: DEFAULT_MAX_SEND_ACK_AUTO_RETRY_ON_ERROR,
557
559
  };
558
560
  this.listener = new listener_1.RealtimeListener({
559
561
  close: this.closeWatch,
560
562
  onChange: options.onChange,
561
563
  onError: options.onError,
562
564
  debug: this.debug,
563
- virtualClient: this
565
+ virtualClient: this,
564
566
  });
565
567
  this.initWatch();
566
568
  }
@@ -576,7 +578,7 @@ var VirtualWebSocketClient = (function () {
576
578
  case WATCH_STATUS.LOGGINGIN:
577
579
  case WATCH_STATUS.INITING:
578
580
  case WATCH_STATUS.REBUILDING: {
579
- console.warn("[realtime listener] internal non-fatal error: unexpected message received while " + this.watchStatus);
581
+ console.warn("[realtime listener] internal non-fatal error: unexpected message received while ".concat(this.watchStatus));
580
582
  return;
581
583
  }
582
584
  case WATCH_STATUS.CLOSED: {
@@ -595,7 +597,7 @@ var VirtualWebSocketClient = (function () {
595
597
  this.scheduleSendACK();
596
598
  switch (msg.msgType) {
597
599
  case 'NEXT_EVENT': {
598
- console.warn("nextevent " + msg.msgData.currEvent + " ignored", msg);
600
+ console.warn("nextevent ".concat(msg.msgData.currEvent, " ignored"), msg);
599
601
  this.handleServerEvents(msg);
600
602
  break;
601
603
  }
@@ -606,33 +608,34 @@ var VirtualWebSocketClient = (function () {
606
608
  this._waitExpectedTimeoutId = setTimeout(function () {
607
609
  _this.rebuildWatch();
608
610
  }, this.getWaitExpectedTimeoutLength());
609
- console.log("[realtime] waitExpectedTimeoutLength " + this.getWaitExpectedTimeoutLength());
611
+ console.log("[realtime] waitExpectedTimeoutLength ".concat(this.getWaitExpectedTimeoutLength()));
610
612
  }
611
613
  break;
612
614
  }
613
615
  case 'ERROR': {
614
616
  this.closeWithError(new error_1.CloudSDKError({
615
617
  errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_SERVER_ERROR_MSG,
616
- errMsg: msg.msgData.code + " - " + msg.msgData.message
618
+ errMsg: "".concat(msg.msgData.code, " - ").concat(msg.msgData.message),
617
619
  }));
618
620
  break;
619
621
  }
620
622
  default: {
621
- console.warn("[realtime listener] virtual client receive unexpected msg " + msg.msgType + ": ", msg);
623
+ console.warn("[realtime listener] virtual client receive unexpected msg ".concat(msg.msgType, ": "), msg);
622
624
  break;
623
625
  }
624
626
  }
625
627
  };
626
628
  VirtualWebSocketClient.prototype.closeWithError = function (error) {
629
+ var _a;
627
630
  this.watchStatus = WATCH_STATUS.ERRORED;
628
631
  this.clearACKSchedule();
629
632
  this.listener.onError(error);
630
- this.onWatchClose(this, (this.sessionInfo && this.sessionInfo.queryID) || '');
631
- console.log("[realtime] client closed (" + this.collectionName + " " + this.query + ") (watchId " + this.watchId + ")");
633
+ this.onWatchClose(this, ((_a = this.sessionInfo) === null || _a === void 0 ? void 0 : _a.queryID) || '');
634
+ console.log("[realtime] client closed (".concat(this.collectionName, " ").concat(this.query, ") (watchId ").concat(this.watchId, ")"));
632
635
  };
633
636
  VirtualWebSocketClient.prototype.pause = function () {
634
637
  this.watchStatus = WATCH_STATUS.PAUSED;
635
- console.log("[realtime] client paused (" + this.collectionName + " " + this.query + ") (watchId " + this.watchId + ")");
638
+ console.log("[realtime] client paused (".concat(this.collectionName, " ").concat(this.query, ") (watchId ").concat(this.watchId, ")"));
636
639
  };
637
640
  VirtualWebSocketClient.prototype.resume = function () {
638
641
  return __awaiter(this, void 0, void 0, function () {
@@ -641,18 +644,18 @@ var VirtualWebSocketClient = (function () {
641
644
  switch (_a.label) {
642
645
  case 0:
643
646
  this.watchStatus = WATCH_STATUS.RESUMING;
644
- console.log("[realtime] client resuming with " + (this.sessionInfo ? 'REBUILD_WATCH' : 'INIT_WATCH') + " (" + this.collectionName + " " + this.query + ") (" + this.watchId + ")");
647
+ console.log("[realtime] client resuming with ".concat(this.sessionInfo ? 'REBUILD_WATCH' : 'INIT_WATCH', " (").concat(this.collectionName, " ").concat(this.query, ") (").concat(this.watchId, ")"));
645
648
  _a.label = 1;
646
649
  case 1:
647
650
  _a.trys.push([1, 3, , 4]);
648
651
  return [4, (this.sessionInfo ? this.rebuildWatch() : this.initWatch())];
649
652
  case 2:
650
653
  _a.sent();
651
- console.log("[realtime] client successfully resumed (" + this.collectionName + " " + this.query + ") (" + this.watchId + ")");
654
+ console.log("[realtime] client successfully resumed (".concat(this.collectionName, " ").concat(this.query, ") (").concat(this.watchId, ")"));
652
655
  return [3, 4];
653
656
  case 3:
654
657
  e_6 = _a.sent();
655
- console.error("[realtime] client resume failed (" + this.collectionName + " " + this.query + ") (" + this.watchId + ")", e_6);
658
+ console.error("[realtime] client resume failed (".concat(this.collectionName, " ").concat(this.query, ") (").concat(this.watchId, ")"), e_6);
656
659
  return [3, 4];
657
660
  case 4: return [2];
658
661
  }
@@ -660,10 +663,10 @@ var VirtualWebSocketClient = (function () {
660
663
  });
661
664
  };
662
665
  VirtualWebSocketClient.prototype.useRetryTicket = function (operationName) {
663
- if (this._availableRetries[operationName] &&
664
- this._availableRetries[operationName] > 0) {
666
+ if (this._availableRetries[operationName]
667
+ && this._availableRetries[operationName] > 0) {
665
668
  this._availableRetries[operationName]--;
666
- console.log("[realtime] " + operationName + " use a retry ticket, now only " + this._availableRetries[operationName] + " retry left");
669
+ console.log("[realtime] ".concat(operationName, " use a retry ticket, now only ").concat(this._availableRetries[operationName], " retry left"));
667
670
  return true;
668
671
  }
669
672
  return false;
@@ -709,24 +712,24 @@ var VirtualWebSocketClient = (function () {
709
712
  catch (e) {
710
713
  this.closeWithError(new error_1.CloudSDKError({
711
714
  errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECEIVE_INVALID_SERVER_DATA,
712
- errMsg: e
715
+ errMsg: e,
713
716
  }));
714
717
  return [2];
715
718
  }
716
- docs = __spreadArrays(sessionInfo.currentDocs);
719
+ docs = __spreadArray([], sessionInfo.currentDocs, true);
717
720
  initEncountered = false;
718
721
  _loop_1 = function (i, len) {
719
- var change, localDoc, doc, fieldPath, _i, _a, fieldPath, err, err, doc, doc, err, ind, ind, docsSnapshot, docChanges, snapshot;
720
- return __generator(this, function (_b) {
721
- switch (_b.label) {
722
+ var change, localDoc, doc, fieldPath, _i, _b, fieldPath, err, err, doc, doc, err, ind, ind, docsSnapshot, docChanges, snapshot;
723
+ return __generator(this, function (_c) {
724
+ switch (_c.label) {
722
725
  case 0:
723
726
  change = allChangeEvents[i];
724
727
  if (!(sessionInfo.currentEventId >= change.id)) return [3, 1];
725
728
  if (!allChangeEvents[i - 1] || change.id > allChangeEvents[i - 1].id) {
726
- console.warn("[realtime] duplicate event received, cur " + sessionInfo.currentEventId + " but got " + change.id);
729
+ console.warn("[realtime] duplicate event received, cur ".concat(sessionInfo.currentEventId, " but got ").concat(change.id));
727
730
  }
728
731
  else {
729
- console.error("[realtime listener] server non-fatal error: events out of order (the latter event's id is smaller than that of the former) (requestId " + requestId + ")");
732
+ console.error("[realtime listener] server non-fatal error: events out of order (the latter event's id is smaller than that of the former) (requestId ".concat(requestId, ")"));
730
733
  }
731
734
  return [2, "continue"];
732
735
  case 1:
@@ -739,16 +742,16 @@ var VirtualWebSocketClient = (function () {
739
742
  case 'dequeue': {
740
743
  localDoc = docs.find(function (doc) { return doc._id === change.docId; });
741
744
  if (localDoc) {
742
- doc = lodash_clonedeep_1.default(localDoc);
745
+ doc = (0, lodash_clonedeep_1.default)(localDoc);
743
746
  if (change.updatedFields) {
744
747
  for (fieldPath in change.updatedFields) {
745
- lodash_set_1.default(doc, fieldPath, change.updatedFields[fieldPath]);
748
+ (0, lodash_set_1.default)(doc, fieldPath, change.updatedFields[fieldPath]);
746
749
  }
747
750
  }
748
751
  if (change.removedFields) {
749
- for (_i = 0, _a = change.removedFields; _i < _a.length; _i++) {
750
- fieldPath = _a[_i];
751
- lodash_unset_1.default(doc, fieldPath);
752
+ for (_i = 0, _b = change.removedFields; _i < _b.length; _i++) {
753
+ fieldPath = _b[_i];
754
+ (0, lodash_unset_1.default)(doc, fieldPath);
752
755
  }
753
756
  }
754
757
  change.doc = doc;
@@ -761,7 +764,7 @@ var VirtualWebSocketClient = (function () {
761
764
  case 'enqueue': {
762
765
  err = new error_1.CloudSDKError({
763
766
  errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
764
- errMsg: "HandleServerEvents: full doc is not provided with dataType=\"update\" and queueType=\"enqueue\" (requestId " + msg.requestId + ")"
767
+ errMsg: "HandleServerEvents: full doc is not provided with dataType=\"update\" and queueType=\"enqueue\" (requestId ".concat(msg.requestId, ")"),
765
768
  });
766
769
  this_1.closeWithError(err);
767
770
  throw err;
@@ -777,7 +780,7 @@ var VirtualWebSocketClient = (function () {
777
780
  if (!change.doc) {
778
781
  err = new error_1.CloudSDKError({
779
782
  errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
780
- errMsg: "HandleServerEvents: full doc is not provided with dataType=\"replace\" (requestId " + msg.requestId + ")"
783
+ errMsg: "HandleServerEvents: full doc is not provided with dataType=\"replace\" (requestId ".concat(msg.requestId, ")"),
781
784
  });
782
785
  this_1.closeWithError(err);
783
786
  throw err;
@@ -810,7 +813,7 @@ var VirtualWebSocketClient = (function () {
810
813
  case 'enqueue': {
811
814
  err = new error_1.CloudSDKError({
812
815
  errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
813
- errMsg: "HandleServerEvents: full doc is not provided with dataType=\"limit\" and queueType=\"enqueue\" (requestId " + msg.requestId + ")"
816
+ errMsg: "HandleServerEvents: full doc is not provided with dataType=\"limit\" and queueType=\"enqueue\" (requestId ".concat(msg.requestId, ")"),
814
817
  });
815
818
  this_1.closeWithError(err);
816
819
  throw err;
@@ -859,9 +862,9 @@ var VirtualWebSocketClient = (function () {
859
862
  break;
860
863
  }
861
864
  }
862
- if (i === len - 1 ||
863
- (allChangeEvents[i + 1] && allChangeEvents[i + 1].id !== change.id)) {
864
- docsSnapshot = __spreadArrays(docs);
865
+ if (i === len - 1
866
+ || (allChangeEvents[i + 1] && allChangeEvents[i + 1].id !== change.id)) {
867
+ docsSnapshot = __spreadArray([], docs, true);
865
868
  docChanges = allChangeEvents
866
869
  .slice(0, i + 1)
867
870
  .filter(function (c) { return c.id === change.id; });
@@ -871,16 +874,16 @@ var VirtualWebSocketClient = (function () {
871
874
  id: change.id,
872
875
  docChanges: docChanges,
873
876
  docs: docsSnapshot,
874
- msgType: msgType
877
+ msgType: msgType,
875
878
  });
876
879
  this_1.listener.onChange(snapshot);
877
880
  }
878
881
  return [3, 4];
879
882
  case 2:
880
- console.warn("[realtime listener] event received is out of order, cur " + this_1.sessionInfo.currentEventId + " but got " + change.id);
883
+ console.warn("[realtime listener] event received is out of order, cur ".concat(this_1.sessionInfo.currentEventId, " but got ").concat(change.id));
881
884
  return [4, this_1.rebuildWatch()];
882
885
  case 3:
883
- _b.sent();
886
+ _c.sent();
884
887
  return [2, { value: void 0 }];
885
888
  case 4: return [2];
886
889
  }
@@ -910,8 +913,8 @@ var VirtualWebSocketClient = (function () {
910
913
  console.error('[realtime listener] internal non-fatal error: sessionInfo lost after server event handling, this should never occur');
911
914
  return;
912
915
  }
913
- if (this.sessionInfo.expectEventId &&
914
- this.sessionInfo.currentEventId >= this.sessionInfo.expectEventId) {
916
+ if (this.sessionInfo.expectEventId
917
+ && this.sessionInfo.currentEventId >= this.sessionInfo.expectEventId) {
915
918
  this.clearWaitExpectedEvent();
916
919
  }
917
920
  if (this.sessionInfo.currentEventId < msg.msgData.currEvent) {
@@ -934,7 +937,7 @@ function getPublicEvent(event) {
934
937
  dataType: event.DataType,
935
938
  queueType: event.QueueType,
936
939
  docId: event.DocID,
937
- doc: event.Doc && event.Doc !== '{}' ? JSON.parse(event.Doc) : undefined
940
+ doc: event.Doc && event.Doc !== '{}' ? JSON.parse(event.Doc) : undefined,
938
941
  };
939
942
  if (event.DataType === 'update') {
940
943
  if (event.UpdatedFields) {
@@ -946,4 +949,4 @@ function getPublicEvent(event) {
946
949
  }
947
950
  return e;
948
951
  }
949
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC13ZWJzb2NrZXQtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMERBQTRCO0FBQzVCLDhEQUFnQztBQUNoQyxzRUFBd0M7QUFDeEMscUNBQXdDO0FBaUJ4Qyx1Q0FBNkM7QUFDN0MsdUNBQXFDO0FBRXJDLGlDQVNnQjtBQUNoQixpQ0FBK0I7QUE0Qy9CLElBQUssWUFVSjtBQVZELFdBQUssWUFBWTtJQUNmLHVDQUF1QixDQUFBO0lBQ3ZCLG1DQUFtQixDQUFBO0lBQ25CLHlDQUF5QixDQUFBO0lBQ3pCLGlDQUFpQixDQUFBO0lBQ2pCLG1DQUFtQixDQUFBO0lBQ25CLG1DQUFtQixDQUFBO0lBQ25CLGlDQUFpQixDQUFBO0lBQ2pCLGlDQUFpQixDQUFBO0lBQ2pCLHFDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFWSSxZQUFZLEtBQVosWUFBWSxRQVVoQjtBQUVELElBQU0sa0NBQWtDLEdBQUcsR0FBRyxDQUFBO0FBQzlDLElBQU0sK0JBQStCLEdBQUcsQ0FBQyxDQUFBO0FBQ3pDLElBQU0sd0NBQXdDLEdBQUcsQ0FBQyxDQUFBO0FBQ2xELElBQU0saUNBQWlDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQTtBQUNuRCxJQUFNLDBCQUEwQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7QUFDNUMsSUFBTSw2QkFBNkIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBO0FBRS9DO0lBcUNFLGdDQUFZLE9BQWtEO1FBQTlELGlCQStCQztRQTNDTyxnQkFBVyxHQUFpQixZQUFZLENBQUMsT0FBTyxDQUFBO1FBME1oRCxXQUFNLEdBQUcsVUFDZixLQUFjLEVBQ2QsT0FBaUI7Ozs7O3dCQUVqQixJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUE7d0JBQ3JCLFdBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUE7O3dCQUE5QyxXQUFXLEdBQUcsU0FBZ0M7d0JBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFOzRCQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQTt5QkFDL0I7d0JBQ0QsV0FBTyxXQUFXLEVBQUE7OzthQUNuQixDQUFBO1FBRU8sY0FBUyxHQUFHLFVBQU8saUJBQTJCOzs7Ozs7d0JBQ3BELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFOzRCQUMxQixXQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBQTt5QkFDOUI7d0JBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxDQUNsQyxVQUFPLE9BQU8sRUFBRSxNQUFNOzs7Ozs7d0NBRWxCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFOzRDQUU1QyxPQUFPLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxDQUFDLENBQUE7NENBRXRELFdBQU8sT0FBTyxFQUFFLEVBQUE7eUNBQ2pCO3dDQUVpQixXQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxFQUFBOzt3Q0FBMUQsS0FBSyxHQUFLLENBQUEsU0FBZ0QsQ0FBQSxNQUFyRDt3Q0FNYixJQUFLLElBQUksQ0FBQyxXQUE0QixLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUU7NENBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMseUNBQXlDLENBQUMsQ0FBQTs0Q0FDdEQsV0FBTyxPQUFPLEVBQUUsRUFBQTt5Q0FDakI7d0NBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFBO3dDQUVqQyxZQUFZLEdBQWdDOzRDQUNoRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87NENBQ3JCLFNBQVMsRUFBRSxzQkFBWSxFQUFFOzRDQUN6QixPQUFPLEVBQUUsWUFBWTs0Q0FDckIsT0FBTyxFQUFFO2dEQUNQLEtBQUssT0FBQTtnREFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0RBQzdCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnREFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dEQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87NkNBQ3RCO3lDQUNGLENBQUE7d0NBRW9CLFdBQU0sSUFBSSxDQUFDLElBQUksQ0FBK0I7Z0RBQ2pFLEdBQUcsRUFBRSxZQUFZO2dEQUNqQixZQUFZLEVBQUUsSUFBSTtnREFDbEIsYUFBYSxFQUFFLElBQUk7Z0RBQ25CLE9BQU8sRUFBRSwwQkFBMEI7NkNBQ3BDLENBQUMsRUFBQTs7d0NBTEksWUFBWSxHQUFHLFNBS25CO3dDQUVJLEtBQXdCLFlBQVksQ0FBQyxPQUFPLEVBQTFDLE1BQU0sWUFBQSxFQUFFLFNBQVMsZUFBQSxDQUF5Qjt3Q0FFbEQsSUFBSSxDQUFDLFdBQVcsR0FBRzs0Q0FDakIsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTzs0Q0FDckMsY0FBYyxFQUFFLFNBQVMsR0FBRyxDQUFDOzRDQUM3QixXQUFXLEVBQUUsRUFBRTt5Q0FDaEIsQ0FBQTt3Q0FHRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOzRDQUNyQixXQUFzQixFQUFOLGlCQUFNLEVBQU4sb0JBQU0sRUFBTixJQUFNLEVBQUU7Z0RBQWIsQ0FBQztnREFDVixDQUFDLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQTs2Q0FDakI7NENBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFBO3lDQUN0Qzs2Q0FBTTs0Q0FDTCxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUE7NENBQ3JDLFFBQVEsR0FBRyxJQUFJLG1CQUFRLENBQUM7Z0RBQzVCLEVBQUUsRUFBRSxTQUFTO2dEQUNiLFVBQVUsRUFBRSxFQUFFO2dEQUNkLElBQUksRUFBRSxFQUFFO2dEQUNSLElBQUksRUFBRSxNQUFNOzZDQUNiLENBQUMsQ0FBQTs0Q0FDRixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTs0Q0FDaEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO3lDQUN2Qjt3Q0FDRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO3dDQUNqRCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUE7d0NBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEdBQUcsK0JBQStCLENBQUE7d0NBQ25FLE9BQU8sRUFBRSxDQUFBOzs7O3dDQUVULElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFDLEVBQUU7NENBQ3BDLGFBQWEsRUFBRSxZQUFZOzRDQUMzQixPQUFPLFNBQUE7NENBQ1AsTUFBTSxRQUFBO3lDQUNQLENBQUMsQ0FBQTs7Ozs7NkJBRUwsQ0FDRixDQUFBO3dCQUVHLE9BQU8sR0FBRyxLQUFLLENBQUE7Ozs7d0JBR2pCLFdBQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFBOzt3QkFBNUIsU0FBNEIsQ0FBQTt3QkFDNUIsT0FBTyxHQUFHLElBQUksQ0FBQTs7O3dCQUVkLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUE7Ozt3QkFJcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBd0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBRSxDQUFDLENBQUE7Ozs7YUFFcEUsQ0FBQTtRQUVPLGlCQUFZLEdBQUcsVUFBTyxpQkFBMkI7Ozs7Ozt3QkFDdkQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7NEJBQzdCLFdBQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFBO3lCQUNqQzt3QkFFRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxPQUFPLENBQ3JDLFVBQU8sT0FBTyxFQUFFLE1BQU07Ozs7Ozt3Q0FFbEIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUU7NENBRTVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQTs0Q0FFekQsV0FBTyxPQUFPLEVBQUUsRUFBQTt5Q0FDakI7d0NBQ2lCLFdBQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEVBQUE7O3dDQUExRCxLQUFLLEdBQUssQ0FBQSxTQUFnRCxDQUFBLE1BQXJEO3dDQUViLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFOzRDQUNyQixNQUFNLElBQUksS0FBSyxDQUNiLDJFQUEyRSxDQUM1RSxDQUFBO3lDQUNGO3dDQUVELElBQUssSUFBSSxDQUFDLFdBQTRCLEtBQUssWUFBWSxDQUFDLE1BQU0sRUFBRTs0Q0FDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBOzRDQUN6RCxXQUFPLE9BQU8sRUFBRSxFQUFBO3lDQUNqQjt3Q0FFRCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUE7d0NBRXBDLGVBQWUsR0FBbUM7NENBQ3RELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTzs0Q0FDckIsU0FBUyxFQUFFLHNCQUFZLEVBQUU7NENBQ3pCLE9BQU8sRUFBRSxlQUFlOzRDQUN4QixPQUFPLEVBQUU7Z0RBQ1AsS0FBSyxPQUFBO2dEQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYztnREFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTztnREFDakMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYzs2Q0FDekM7eUNBQ0YsQ0FBQTt3Q0FFb0IsV0FBTSxJQUFJLENBQUMsSUFBSSxDQUErQjtnREFDakUsR0FBRyxFQUFFLGVBQWU7Z0RBQ3BCLFlBQVksRUFBRSxJQUFJO2dEQUNsQixhQUFhLEVBQUUsS0FBSztnREFDcEIsT0FBTyxFQUFFLDZCQUE2Qjs2Q0FDdkMsQ0FBQyxFQUFBOzt3Q0FMSSxZQUFZLEdBQUcsU0FLbkI7d0NBRUYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFBO3dDQUVyQyxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUE7d0NBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEdBQUcsK0JBQStCLENBQUE7d0NBQ3RFLE9BQU8sRUFBRSxDQUFBOzs7O3dDQUVULElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFDLEVBQUU7NENBQ3BDLGFBQWEsRUFBRSxlQUFlOzRDQUM5QixPQUFPLFNBQUE7NENBQ1AsTUFBTSxRQUFBO3lDQUNQLENBQUMsQ0FBQTs7Ozs7NkJBRUwsQ0FDRixDQUFBO3dCQUVHLE9BQU8sR0FBRyxLQUFLLENBQUE7Ozs7d0JBR2pCLFdBQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFBOzt3QkFBL0IsU0FBK0IsQ0FBQTt3QkFDL0IsT0FBTyxHQUFHLElBQUksQ0FBQTs7O3dCQUVkLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUE7Ozt3QkFJdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBMkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBRSxDQUFDLENBQUE7Ozs7YUFFdkUsQ0FBQTtRQUVPLGtDQUE2QixHQUFHLFVBQ3RDLENBQU0sRUFDTixPQUE4Qzs7OztnQkFFeEMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLEtBQUssWUFBWSxDQUFBO2dCQUVwRCxVQUFVLEdBQUc7b0JBRWpCLEtBQUksQ0FBQyxjQUFjLENBQ2pCLElBQUkscUJBQWEsQ0FBQzt3QkFDaEIsT0FBTyxFQUFFLFdBQVc7NEJBQ2xCLENBQUMsQ0FBRSxnQkFBUSxDQUFDLDhDQUF5RDs0QkFDckUsQ0FBQyxDQUFFLGdCQUFRLENBQUMsaURBQTREO3dCQUMxRSxNQUFNLEVBQUUsQ0FBQztxQkFDVixDQUFDLENBQ0gsQ0FBQTtvQkFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNuQixDQUFDLENBQUE7Z0JBRUssS0FBSyxHQUFHLFVBQUMsWUFBc0I7b0JBQ25DLElBQUksS0FBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUU7d0JBQzlDLElBQUksV0FBVyxFQUFFOzRCQUNmLEtBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUE7NEJBQ2xDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFBO3lCQUM5Qzs2QkFBTTs0QkFDTCxLQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFBOzRCQUNyQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTt5QkFDakQ7cUJBQ0Y7eUJBQU07d0JBQ0wsVUFBVSxFQUFFLENBQUE7cUJBQ2I7Z0JBQ0gsQ0FBQyxDQUFBO2dCQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUU7b0JBQ3hCLFdBQVcsRUFBRSxjQUFNLE9BQUEsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFYLENBQVc7b0JBQzlCLGNBQWMsRUFBRSxjQUFNLE9BQUEsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFaLENBQVk7b0JBQ2xDLG1CQUFtQixFQUFFLFVBQVU7b0JBQy9CLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxNQUFNO29CQUNoQyxjQUFjLEVBQUU7Ozs7Ozs7b0NBRU4sZ0JBQWdCLEdBQUc7Ozs7b0RBQ3ZCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtvREFDWixXQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBQTs7b0RBQTVCLFNBQTRCLENBQUE7b0RBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTs7Ozt5Q0FDWixDQUFBO3lDQUVHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFyQixjQUFxQjtvQ0FDdkIsV0FBTSxnQkFBZ0IsRUFBRSxFQUFBOztvQ0FBeEIsU0FBd0IsQ0FBQTs7d0NBRXhCLFdBQU0sYUFBSyxDQUFDLGtDQUFrQyxDQUFDLEVBQUE7O29DQUEvQyxTQUErQyxDQUFBO3lDQUMzQyxDQUFBLElBQUksQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLE1BQU0sQ0FBQSxFQUF4QyxjQUF3QztvQ0FFMUMsT0FBTyxDQUFDLE1BQU0sQ0FDWixJQUFJLHNCQUFjLENBQ2IsT0FBTyxDQUFDLGFBQWEsK0NBQTRDLENBQ3JFLENBQ0YsQ0FBQTs7O3lDQUNRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFyQixjQUFxQjtvQ0FDOUIsV0FBTSxnQkFBZ0IsRUFBRSxFQUFBOztvQ0FBeEIsU0FBd0IsQ0FBQTs7O29DQUV4QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7Ozs7O29DQUtoQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7Ozs7O3lCQUVkO2lCQUNGLENBQUMsQ0FBQTs7O2FBQ0gsQ0FBQTtRQUVPLGVBQVUsR0FBRzs7Ozs7d0JBQ2IsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7d0JBRWhFLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFOzRCQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUE7NEJBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBOzRCQUNoQyxXQUFNO3lCQUNQOzs7O3dCQUdDLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQTt3QkFFakMsYUFBYSxHQUFpQzs0QkFDbEQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPOzRCQUNyQixTQUFTLEVBQUUsc0JBQVksRUFBRTs0QkFDekIsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLE9BQU8sRUFBRSxJQUFJO3lCQUNkLENBQUE7d0JBRUQsV0FBTSxJQUFJLENBQUMsSUFBSSxDQUFDO2dDQUNkLEdBQUcsRUFBRSxhQUFhOzZCQUNuQixDQUFDLEVBQUE7O3dCQUZGLFNBRUUsQ0FBQTt3QkFFRixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQTt3QkFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFBOzs7O3dCQUV0QyxJQUFJLENBQUMsY0FBYyxDQUNqQixJQUFJLHFCQUFhLENBQUM7NEJBQ2hCLE9BQU8sRUFBRSxnQkFBUSxDQUFDLCtDQUF5RDs0QkFDM0UsTUFBTSxFQUFFLEdBQUM7eUJBQ1YsQ0FBQyxDQUNILENBQUE7Ozt3QkFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTs7Ozs7YUFFbkMsQ0FBQTtRQUVPLG9CQUFlLEdBQUc7WUFDeEIsS0FBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7WUFJdkIsS0FBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7Z0JBQzlCLElBQUksS0FBSSxDQUFDLHNCQUFzQixFQUFFO29CQUMvQixLQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7aUJBQ3ZCO3FCQUFNO29CQUNMLEtBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtpQkFDZjtZQUNILENBQUMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFBO1FBQ3ZDLENBQUMsQ0FBQTtRQUVPLHFCQUFnQixHQUFHO1lBQ3pCLElBQUksS0FBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIsWUFBWSxDQUFDLEtBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTthQUNqQztRQUNILENBQUMsQ0FBQTtRQUVPLFlBQU8sR0FBRzs7Ozs7O3dCQUVkLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFOzRCQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7NEJBQ3RCLFdBQU07eUJBQ1A7d0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7NEJBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsMkZBQTJGLENBQzVGLENBQUE7NEJBQ0QsV0FBTTt5QkFDUDt3QkFFSyxNQUFNLEdBQWdDOzRCQUMxQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87NEJBQ3JCLFNBQVMsRUFBRSxzQkFBWSxFQUFFOzRCQUN6QixPQUFPLEVBQUUsWUFBWTs0QkFDckIsT0FBTyxFQUFFO2dDQUNQLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87Z0NBQ2pDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWM7NkJBQ3pDO3lCQUNGLENBQUE7d0JBRUQsV0FBTSxJQUFJLENBQUMsSUFBSSxDQUFDO2dDQUNkLEdBQUcsRUFBRSxNQUFNOzZCQUNaLENBQUMsRUFBQTs7d0JBRkYsU0FFRSxDQUFBO3dCQUVGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTs7Ozt3QkFHdEIsSUFBSSxtQ0FBMkIsQ0FBQyxHQUFDLENBQUMsRUFBRTs0QkFDNUIsR0FBRyxHQUFHLEdBQUMsQ0FBQyxPQUFPLENBQUE7NEJBQ3JCLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0NBRXhCLEtBQUssb0JBQW9CLENBQUM7Z0NBQzFCLEtBQUssb0JBQW9CLENBQUM7Z0NBQzFCLEtBQUssb0JBQW9CLENBQUM7Z0NBQzFCLEtBQUssb0JBQW9CLENBQUMsQ0FBQztvQ0FDekIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO29DQUNuQixXQUFNO2lDQUNQO2dDQUVELEtBQUssdUJBQXVCLENBQUM7Z0NBQzdCLEtBQUssU0FBUyxDQUFDO2dDQUNmLEtBQUssY0FBYyxDQUFDO2dDQUNwQixLQUFLLDhCQUE4QixDQUFDLENBQUM7b0NBRW5DLElBQUksQ0FBQyxjQUFjLENBQ2pCLElBQUkscUJBQWEsQ0FBQzt3Q0FDaEIsT0FBTyxFQUFFLGdCQUFRLENBQUMsOENBQXdEO3dDQUMxRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJO3FDQUN6QixDQUFDLENBQ0gsQ0FBQTtvQ0FDRCxXQUFNO2lDQUNQO2dDQUNELE9BQU8sQ0FBQyxDQUFDO29DQUNQLE1BQUs7aUNBQ047NkJBQ0Y7eUJBQ0Y7d0JBR0QsSUFDRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVTs0QkFDakMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQ3JDOzRCQUNBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQTs0QkFDbkMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO3lCQUN2Qjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsY0FBYyxDQUNqQixJQUFJLHFCQUFhLENBQUM7Z0NBQ2hCLE9BQU8sRUFBRSxnQkFBUSxDQUFDLDhDQUF3RDtnQ0FDMUUsTUFBTSxFQUFFLEdBQUM7NkJBQ1YsQ0FBQyxDQUNILENBQUE7eUJBQ0Y7Ozs7O2FBRUosQ0FBQTtRQUVPLHNCQUFpQixHQUFHLFVBQzFCLENBQU0sRUFDTixPQUFrQztZQUVsQyxJQUFJLG1DQUEyQixDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNsQyxJQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFBO2dCQUNyQixRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFO29CQUV4QixLQUFLLG9CQUFvQixDQUFDO29CQUMxQixLQUFLLG9CQUFvQixDQUFDO29CQUMxQixLQUFLLG9CQUFvQixDQUFDO29CQUMxQixLQUFLLG9CQUFvQixDQUFDLENBQUM7d0JBQ3pCLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7d0JBQ3RCLE9BQU07cUJBQ1A7b0JBRUQsS0FBSyx1QkFBdUIsQ0FBQztvQkFDN0IsS0FBSyxTQUFTLENBQUM7b0JBQ2YsS0FBSyxjQUFjLENBQUM7b0JBQ3BCLEtBQUssOEJBQThCLENBQUMsQ0FBQzt3QkFDbkMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFBO3dCQUM5QixPQUFNO3FCQUNQO29CQUNELE9BQU8sQ0FBQyxDQUFDO3dCQUNQLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTt3QkFDOUIsT0FBTTtxQkFDUDtpQkFDRjthQUNGO2lCQUFNLElBQUksc0JBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFFNUIsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDekIsT0FBTTthQUNQO2lCQUFNLElBQUksd0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBRTlCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDM0IsT0FBTTthQUNQO1lBR0QsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUMzQixDQUFDLENBQUE7UUFubkJDLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBVyxDQUFDLElBQUksSUFBSSxFQUFFLFNBQUksSUFBSSxDQUFDLE1BQU0sRUFBSSxDQUFBO1FBQ3hELElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQTtRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUE7UUFDNUMsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQTtRQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUE7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQTtRQUMxQixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUE7UUFDMUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFBO1FBQzlDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxPQUFPLENBQUMsNEJBQTRCLENBQUE7UUFDeEUsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFBO1FBQ3hDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQTtRQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUE7UUFFMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHO1lBQ3ZCLFVBQVUsRUFBRSwrQkFBK0I7WUFDM0MsYUFBYSxFQUFFLCtCQUErQjtZQUM5QyxVQUFVLEVBQUUsd0NBQXdDO1NBQ3JELENBQUE7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksMkJBQWdCLENBQUM7WUFDbkMsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3RCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMxQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUNsQixDQUFDO0lBRUQsMENBQVMsR0FBVCxVQUFVLEdBQXFCO1FBQS9CLGlCQWdHQztRQTlGQyxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDeEIsS0FBSyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRXhCLElBQUksR0FBRyxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7b0JBQzNCLE9BQU07aUJBQ1A7Z0JBQ0QsTUFBSzthQUNOO1lBQ0QsS0FBSyxZQUFZLENBQUMsU0FBUyxDQUFDO1lBQzVCLEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUMxQixLQUFLLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxDQUFDLElBQUksQ0FDVixxRkFBbUYsSUFBSSxDQUFDLFdBQWEsQ0FDdEcsQ0FBQTtnQkFDRCxPQUFNO2FBQ1A7WUFDRCxLQUFLLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FDVixxR0FBcUcsQ0FDdEcsQ0FBQTtnQkFDRCxPQUFNO2FBQ1A7WUFDRCxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekIsT0FBTyxDQUFDLElBQUksQ0FDViwrR0FBK0csQ0FDaEgsQ0FBQTtnQkFDRCxPQUFNO2FBQ1A7U0FDRjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsZ0dBQWdHLENBQ2pHLENBQUE7WUFDRCxPQUFNO1NBQ1A7UUFFRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7UUFFdEIsUUFBUSxHQUFHLENBQUMsT0FBTyxFQUFFO1lBQ25CLEtBQUssWUFBWSxDQUFDLENBQUM7Z0JBSWpCLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBYSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsYUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQU8vRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQzVCLE1BQUs7YUFDTjtZQUNELEtBQUssYUFBYSxDQUFDLENBQUM7Z0JBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7b0JBRzNELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFBO29CQUN0RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtvQkFFN0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFVBQVUsQ0FBQzt3QkFFdkMsS0FBSSxDQUFDLFlBQVksRUFBRSxDQUFBO29CQUNyQixDQUFDLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUMsQ0FBQTtvQkFHdkMsT0FBTyxDQUFDLEdBQUcsQ0FDVCwwQ0FBd0MsSUFBSSxDQUFDLDRCQUE0QixFQUFJLENBQzlFLENBQUE7aUJBRUY7Z0JBQ0QsTUFBSzthQUNOO1lBQ0QsS0FBSyxPQUFPLENBQUMsQ0FBQztnQkFFWixJQUFJLENBQUMsY0FBYyxDQUNqQixJQUFJLHFCQUFhLENBQUM7b0JBQ2hCLE9BQU8sRUFBRSxnQkFBUSxDQUFDLCtDQUF5RDtvQkFDM0UsTUFBTSxFQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxXQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBUztpQkFDdkQsQ0FBQyxDQUNILENBQUE7Z0JBQ0QsTUFBSzthQUNOO1lBQ0QsT0FBTyxDQUFDLENBQUM7Z0JBRVAsT0FBTyxDQUFDLElBQUksQ0FDViwrREFBNkQsR0FBRyxDQUFDLE9BQU8sT0FBSSxFQUM1RSxHQUFHLENBQ0osQ0FBQTtnQkFFRCxNQUFLO2FBQ047U0FDRjtJQUNILENBQUM7SUFFRCwrQ0FBYyxHQUFkLFVBQWUsS0FBVTtRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUE7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFNUIsSUFBSSxDQUFDLFlBQVksQ0FDZixJQUFJLEVBQ0osQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUNyRCxDQUFBO1FBR0QsT0FBTyxDQUFDLEdBQUcsQ0FDVCwrQkFBNkIsSUFBSSxDQUFDLGNBQWMsU0FBSSxJQUFJLENBQUMsS0FBSyxtQkFBYyxJQUFJLENBQUMsT0FBTyxNQUFHLENBQzVGLENBQUE7SUFFSCxDQUFDO0lBRUQsc0NBQUssR0FBTDtRQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQTtRQUV0QyxPQUFPLENBQUMsR0FBRyxDQUNULCtCQUE2QixJQUFJLENBQUMsY0FBYyxTQUFJLElBQUksQ0FBQyxLQUFLLG1CQUFjLElBQUksQ0FBQyxPQUFPLE1BQUcsQ0FDNUYsQ0FBQTtJQUVILENBQUM7SUFNSyx1Q0FBTSxHQUFaOzs7Ozs7d0JBQ0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFBO3dCQUd4QyxPQUFPLENBQUMsR0FBRyxDQUNULHNDQUNFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsWUFBWSxXQUM5QyxJQUFJLENBQUMsY0FBYyxTQUFJLElBQUksQ0FBQyxLQUFLLFdBQU0sSUFBSSxDQUFDLE9BQU8sTUFBRyxDQUM1RCxDQUFBOzs7O3dCQUlDLFdBQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFBOzt3QkFBakUsU0FBaUUsQ0FBQTt3QkFHakUsT0FBTyxDQUFDLEdBQUcsQ0FDVCw2Q0FBMkMsSUFBSSxDQUFDLGNBQWMsU0FBSSxJQUFJLENBQUMsS0FBSyxXQUFNLElBQUksQ0FBQyxPQUFPLE1BQUcsQ0FDbEcsQ0FBQTs7Ozt3QkFJRCxPQUFPLENBQUMsS0FBSyxDQUNYLHNDQUFvQyxJQUFJLENBQUMsY0FBYyxTQUFJLElBQUksQ0FBQyxLQUFLLFdBQU0sSUFBSSxDQUFDLE9BQU8sTUFBRyxFQUMxRixHQUFDLENBQ0YsQ0FBQTs7Ozs7O0tBR0o7SUEyYk8sK0NBQWMsR0FBdEIsVUFBdUIsYUFBOEI7UUFDbkQsSUFDRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUUsR0FBRyxDQUFDLEVBQzFDO1lBQ0EsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBRSxFQUFFLENBQUE7WUFHeEMsT0FBTyxDQUFDLEdBQUcsQ0FDVCxnQkFBYyxhQUFhLHNDQUFpQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGdCQUFhLENBQy9HLENBQUE7WUFHRCxPQUFPLElBQUksQ0FBQTtTQUNaO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRWEsbURBQWtCLEdBQWhDLFVBQ0UsR0FBZ0U7Ozs7Ozs7d0JBRzlELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTt3QkFDdEIsV0FBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEVBQUE7O3dCQUFuQyxTQUFtQyxDQUFBO3dCQUNuQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsR0FBRyxDQUFDLENBQUE7Ozs7d0JBSTlDLE9BQU8sQ0FBQyxLQUFLLENBQ1gsd0ZBQXdGLEVBQ3hGLEdBQUMsQ0FDRixDQUFBO3dCQWFELE1BQU0sR0FBQyxDQUFBOzs7OztLQUVWO0lBRWEsb0RBQW1CLEdBQWpDLFVBQ0UsR0FBZ0U7Ozs7Ozt3QkFFeEQsU0FBUyxHQUFLLEdBQUcsVUFBUixDQUFRO3dCQUVqQixNQUFNLEdBQUssR0FBRyxDQUFDLE9BQU8sT0FBaEIsQ0FBZ0I7d0JBQ3RCLE9BQU8sR0FBSyxHQUFHLFFBQVIsQ0FBUTt3QkFFdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFOzRCQUN2QyxXQUFNO3lCQUNQO3dCQUVLLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFBO3dCQUdwQyxJQUFJOzRCQUNGLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFBO3lCQUM3Qzt3QkFBQyxPQUFPLENBQUMsRUFBRTs0QkFDVixJQUFJLENBQUMsY0FBYyxDQUNqQixJQUFJLHFCQUFhLENBQUM7Z0NBQ2hCLE9BQU8sRUFBRSxnQkFBUSxDQUFDLDBEQUFvRTtnQ0FDdEYsTUFBTSxFQUFFLENBQUM7NkJBQ1YsQ0FBQyxDQUNILENBQUE7NEJBQ0QsV0FBTTt5QkFDUDt3QkFHRyxJQUFJLGtCQUFPLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQTt3QkFDbkMsZUFBZSxHQUFHLEtBQUssQ0FBQTs0Q0FDbEIsQ0FBQyxFQUFNLEdBQUc7Ozs7O3dDQUNYLE1BQU0sR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUE7NkNBRTdCLENBQUEsV0FBVyxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFBLEVBQXZDLGNBQXVDO3dDQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFOzRDQUlwRSxPQUFPLENBQUMsSUFBSSxDQUNWLDhDQUE0QyxXQUFXLENBQUMsY0FBYyxpQkFBWSxNQUFNLENBQUMsRUFBSSxDQUM5RixDQUFBO3lDQUVGOzZDQUFNOzRDQUVMLE9BQU8sQ0FBQyxLQUFLLENBQ1gsMklBQXlJLFNBQVMsTUFBRyxDQUN0SixDQUFBO3lDQWNGOzs7NkNBRVEsQ0FBQSxXQUFXLENBQUMsY0FBYyxLQUFLLE1BQU0sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBLEVBQTVDLGNBQTRDO3dDQU1yRCxRQUFRLE1BQU0sQ0FBQyxRQUFRLEVBQUU7NENBQ3ZCLEtBQUssUUFBUSxDQUFDLENBQUM7Z0RBRWIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7b0RBQ2YsUUFBUSxNQUFNLENBQUMsU0FBUyxFQUFFO3dEQUN4QixLQUFLLFFBQVEsQ0FBQzt3REFDZCxLQUFLLFNBQVMsQ0FBQyxDQUFDOzREQUNSLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUF4QixDQUF3QixDQUFDLENBQUE7NERBQzNELElBQUksUUFBUSxFQUFFO2dFQUVOLEdBQUcsR0FBRywwQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dFQUUvQixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUU7b0VBQ3hCLEtBQVcsU0FBUyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUU7d0VBQzVDLG9CQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7cUVBQ3JEO2lFQUNGO2dFQUVELElBQUksTUFBTSxDQUFDLGFBQWEsRUFBRTtvRUFDeEIsV0FBNEMsRUFBcEIsS0FBQSxNQUFNLENBQUMsYUFBYSxFQUFwQixjQUFvQixFQUFwQixJQUFvQixFQUFFO3dFQUFuQyxTQUFTO3dFQUNsQixzQkFBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQTtxRUFDdEI7aUVBQ0Y7Z0VBRUQsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7NkRBQ2pCO2lFQUFNO2dFQUVMLE9BQU8sQ0FBQyxLQUFLLENBQ1gsbUhBQW1ILENBQ3BILENBQUE7NkRBY0Y7NERBQ0QsTUFBSzt5REFDTjt3REFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDOzREQUVSLEdBQUcsR0FBRyxJQUFJLHFCQUFhLENBQUM7Z0VBQzVCLE9BQU8sRUFBRSxnQkFBUSxDQUFDLHFEQUErRDtnRUFDakYsTUFBTSxFQUFFLGdIQUEwRyxHQUFHLENBQUMsU0FBUyxNQUFHOzZEQUNuSSxDQUFDLENBQUE7NERBQ0YsT0FBSyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUE7NERBQ3hCLE1BQU0sR0FBRyxDQUFBO3lEQUNWO3dEQUNELE9BQU8sQ0FBQyxDQUFDOzREQUNQLE1BQUs7eURBQ047cURBQ0Y7aURBQ0Y7Z0RBQ0QsTUFBSzs2Q0FDTjs0Q0FDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dEQUVkLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO29EQUVULEdBQUcsR0FBRyxJQUFJLHFCQUFhLENBQUM7d0RBQzVCLE9BQU8sRUFBRSxnQkFBUSxDQUFDLHFEQUErRDt3REFDakYsTUFBTSxFQUFFLHVGQUFtRixHQUFHLENBQUMsU0FBUyxNQUFHO3FEQUM1RyxDQUFDLENBQUE7b0RBQ0YsT0FBSyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUE7b0RBQ3hCLE1BQU0sR0FBRyxDQUFBO2lEQUNWO2dEQUNELE1BQUs7NkNBQ047NENBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQztnREFDUCxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBeEIsQ0FBd0IsQ0FBQyxDQUFBO2dEQUN0RCxJQUFJLEdBQUcsRUFBRTtvREFDUCxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQTtpREFDakI7cURBQU07b0RBRUwsT0FBTyxDQUFDLEtBQUssQ0FDWCwwR0FBMEcsQ0FDM0csQ0FBQTtpREFjRjtnREFDRCxNQUFLOzZDQUNOOzRDQUNELEtBQUssT0FBTyxDQUFDLENBQUM7Z0RBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7b0RBQ2YsUUFBTyxNQUFNLENBQUMsU0FBUyxFQUFFO3dEQUN2QixLQUFLLFNBQVMsQ0FBQyxDQUFDOzREQUNSLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUF4QixDQUF3QixDQUFDLENBQUE7NERBQ3RELElBQUksR0FBRyxFQUFFO2dFQUNQLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFBOzZEQUNqQjtpRUFBTTtnRUFDTCxPQUFPLENBQUMsS0FBSyxDQUNYLGtIQUFrSCxDQUNuSCxDQUFBOzZEQUNGOzREQUNELE1BQUs7eURBQ047d0RBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQzs0REFFUixHQUFHLEdBQUcsSUFBSSxxQkFBYSxDQUFDO2dFQUM1QixPQUFPLEVBQUUsZ0JBQVEsQ0FBQyxxREFBK0Q7Z0VBQ2pGLE1BQU0sRUFBRSwrR0FBeUcsR0FBRyxDQUFDLFNBQVMsTUFBRzs2REFDbEksQ0FBQyxDQUFBOzREQUNGLE9BQUssY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFBOzREQUN4QixNQUFNLEdBQUcsQ0FBQTt5REFDVjt3REFDRCxPQUFPLENBQUMsQ0FBQzs0REFDUCxNQUFLO3lEQUNOO3FEQUNGO2lEQUNGO2dEQUNELE1BQUs7NkNBQ047eUNBQ0Y7d0NBRUQsUUFBUSxNQUFNLENBQUMsU0FBUyxFQUFFOzRDQUN4QixLQUFLLE1BQU0sQ0FBQyxDQUFDO2dEQUNYLElBQUksQ0FBQyxlQUFlLEVBQUU7b0RBQ3BCLGVBQWUsR0FBRyxJQUFJLENBQUE7b0RBQ3RCLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtpREFDcEI7cURBQU07b0RBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7aURBQ3RCO2dEQUNELE1BQUs7NkNBQ047NENBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztnREFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtnREFDckIsTUFBSzs2Q0FDTjs0Q0FDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dEQUNSLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUF4QixDQUF3QixDQUFDLENBQUE7Z0RBQzNELElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFO29EQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO2lEQUNwQjtxREFBTTtvREFFTCxPQUFPLENBQUMsS0FBSyxDQUNYLDJHQUEyRyxDQUM1RyxDQUFBO2lEQWNGO2dEQUNELE1BQUs7NkNBQ047NENBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQztnREFPUCxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBeEIsQ0FBd0IsQ0FBQyxDQUFBO2dEQUMzRCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTtvREFDWixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQTtpREFDdkI7cURBQU07b0RBRUwsT0FBTyxDQUFDLEtBQUssQ0FDWCxvSEFBb0gsQ0FDckgsQ0FBQTtpREFjRjtnREFDRCxNQUFLOzZDQUNOO3lDQUNGO3dDQUVELElBQ0UsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDOzRDQUNiLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQ25FOzRDQUVNLFlBQVksa0JBQU8sSUFBSSxDQUFDLENBQUE7NENBR3hCLFVBQVUsR0FBRyxlQUFlO2lEQUMvQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7aURBQ2YsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFsQixDQUFrQixDQUFDLENBQUE7NENBR2xDLE9BQUssV0FBVyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFBOzRDQUMzQyxPQUFLLFdBQVcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBOzRDQUU3QixRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDO2dEQUM1QixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0RBQ2IsVUFBVSxZQUFBO2dEQUNWLElBQUksRUFBRSxZQUFZO2dEQUNsQixPQUFPLFNBQUE7NkNBQ1IsQ0FBQyxDQUFBOzRDQUdGLE9BQUssUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTt5Q0FFakM7Ozt3Q0FLRCxPQUFPLENBQUMsSUFBSSxDQUNWLDZEQUEyRCxPQUFLLFdBQVcsQ0FBQyxjQUFjLGlCQUFZLE1BQU0sQ0FBQyxFQUFJLENBQ2xILENBQUE7d0NBR0QsV0FBTSxPQUFLLFlBQVksRUFBRSxFQUFBOzt3Q0FBekIsU0FBeUIsQ0FBQTs7Ozs7Ozt3QkF0UnBCLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLGVBQWUsQ0FBQyxNQUFNOzs7NkJBQUUsQ0FBQSxDQUFDLEdBQUcsR0FBRyxDQUFBOzJDQUE1QyxDQUFDLEVBQU0sR0FBRzs7Ozs7Ozt3QkFBb0MsQ0FBQyxFQUFFLENBQUE7Ozs7OztLQTBSM0Q7SUFFTyxxRUFBb0MsR0FBNUMsVUFDRSxHQUFnRTtRQUVoRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyQixPQUFPLENBQUMsS0FBSyxDQUNYLHFIQUFxSCxDQUN0SCxDQUFBO1lBY0QsT0FBTTtTQUNQO1FBRUQsSUFDRSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWE7WUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQ2pFO1lBQ0EsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUE7U0FDOUI7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQzNELE9BQU8sQ0FBQyxJQUFJLENBQ1YsOEhBQThILENBQy9ILENBQUE7WUFDRCxPQUFNO1NBQ1A7SUFDSCxDQUFDO0lBRU8sdURBQXNCLEdBQTlCO1FBQ0UsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDL0IsWUFBWSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO1lBQ3pDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUE7U0FDeEM7SUFDSCxDQUFDO0lBQ0gsNkJBQUM7QUFBRCxDQUFDLEFBbGpDRCxJQWtqQ0M7QUFsakNZLHdEQUFzQjtBQW9qQ25DLFNBQVMsY0FBYyxDQUFDLEtBQWU7SUFDckMsSUFBTSxDQUFDLEdBQW1CO1FBQ3hCLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtRQUNaLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtRQUN4QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDMUIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUN6RSxDQUFBO0lBRUQsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUUvQixJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDdkIsQ0FBQyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQTtTQUNsRDtRQUdELElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBSzlDLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7U0FDbEQ7S0FDRjtJQUVELE9BQU8sQ0FBQyxDQUFBO0FBQ1YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzZXQgZnJvbSAnbG9kYXNoLnNldCdcbmltcG9ydCB1bnNldCBmcm9tICdsb2Rhc2gudW5zZXQnXG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnXG5pbXBvcnQgeyBnZW5SZXF1ZXN0SWQgfSBmcm9tICcuL21lc3NhZ2UnXG5pbXBvcnQge1xuICBJUmVzcG9uc2VNZXNzYWdlLFxuICBJUmVxdWVzdE1lc3NhZ2VJbml0V2F0Y2hNc2csXG4gIElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2csXG4gIElEQkV2ZW50LFxuICBJUmVxdWVzdE1lc3NhZ2VSZWJ1aWxkV2F0Y2hNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUNsb3NlV2F0Y2hNc2csXG4gIElSZXF1ZXN0TXNnVHlwZSxcbiAgSVJlc3BvbnNlTWVzc2FnZU5leHRFdmVudE1zZyxcbiAgSVJlcXVlc3RNZXNzYWdlQ2hlY2tMYXN0TXNnLFxuICBJV2F0Y2hPcHRpb25zXG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvcmVhbHRpbWUnXG5pbXBvcnQgeyBcbiAgSVNpbmdsZURCRXZlbnRcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9kYXRhYmFzZSdcbi8vIGltcG9ydCBSZXBvcnRlciBmcm9tIFwiLi9leHRlcm5hbHMvcHVibGljLWxpYi9yZXBvcnRlclwiXG5pbXBvcnQgeyBSZWFsdGltZUxpc3RlbmVyIH0gZnJvbSAnLi9saXN0ZW5lcidcbmltcG9ydCB7IFNuYXBzaG90IH0gZnJvbSAnLi9zbmFwc2hvdCdcbmltcG9ydCB7IElXU1NlbmRPcHRpb25zLCBJTG9naW5SZXN1bHQgfSBmcm9tICcuL3dlYnNvY2tldC1jbGllbnQnXG5pbXBvcnQgeyBcbiAgRVJSX0NPREUsXG4gIENsb3VkU0RLRXJyb3IsXG4gIGlzVGltZW91dEVycm9yLFxuICBDYW5jZWxsZWRFcnJvcixcbiAgaXNDYW5jZWxsZWRFcnJvcixcbiAgaXNSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yLCBcbiAgUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvciwgXG4gIFRpbWVvdXRFcnJvciBcbn0gZnJvbSAnLi9lcnJvcidcbmltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi91dGlscydcblxuLy8gPT09PT09PT09PT09PT09IFJlYWx0aW1lIFZpcnR1YWwgV2ViU29ja2V0IENsaWVudCAoSW50ZXJuYWwpID09PT09PT09PT09PT09PT09PT09XG5cbmludGVyZmFjZSBJVmlydHVhbFdlYlNvY2tldENsaWVudENvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIElXYXRjaE9wdGlvbnMge1xuICAvLyB3czogUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRcbiAgZW52SWQ/OiBzdHJpbmdcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZ1xuICBxdWVyeTogc3RyaW5nXG4gIGxpbWl0PzogbnVtYmVyXG4gIG9yZGVyQnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHNlbmQ6IDxUID0gYW55PihvcHRzOiBJV1NTZW5kT3B0aW9ucykgPT4gUHJvbWlzZTxUPlxuICBsb2dpbjogKGVudklkPzogc3RyaW5nLCByZWZyZXNoPzogYm9vbGVhbikgPT4gUHJvbWlzZTxhbnk+XG4gIGlzV1NDb25uZWN0ZWQ6ICgpID0+IGJvb2xlYW5cbiAgb25jZVdTQ29ubmVjdGVkOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGg6ICgpID0+IG51bWJlclxuICBvbldhdGNoU3RhcnQ6IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4gdm9pZFxuICBvbldhdGNoQ2xvc2U6IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4gdm9pZFxuICBkZWJ1Zz86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIElXYXRjaFNlc3Npb25JbmZvIHtcbiAgcXVlcnlJRDogc3RyaW5nXG4gIGN1cnJlbnRFdmVudElkOiBudW1iZXJcbiAgY3VycmVudERvY3M6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICBleHBlY3RFdmVudElkPzogbnVtYmVyXG59XG5cbmludGVyZmFjZSBJSGFuZGxlQ29tbW9uRXJyb3JPcHRpb25zIHtcbiAgb25TaWduRXJyb3I6IChlOiBSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yKSA9PiB2b2lkXG4gIG9uVGltZW91dEVycm9yOiAoZTogVGltZW91dEVycm9yKSA9PiB2b2lkXG4gIG9uQ2FuY2VsbGVkRXJyb3I6IChlOiBDYW5jZWxsZWRFcnJvcikgPT4gdm9pZFxuICBvbk5vdFJldHJ5YWJsZUVycm9yOiAoZTogUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcikgPT4gdm9pZFxuICBvblVua25vd25FcnJvcjogKGU6IGFueSkgPT4gdm9pZFxufVxuXG5pbnRlcmZhY2UgSUhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yT3B0aW9ucyB7XG4gIG9wZXJhdGlvbk5hbWU6ICdJTklUX1dBVENIJyB8ICdSRUJVSUxEX1dBVENIJ1xuICByZXNvbHZlOiAodmFsdWU/OiBQcm9taXNlTGlrZTx2b2lkPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICByZWplY3Q6IChlOiBhbnkpID0+IHZvaWRcbiAgLy8gcmV0cnk6IChyZWZyZXNoTG9naW4/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8vIGFib3J0V2F0Y2g6IChlOiBhbnkpID0+IHZvaWRcbn1cblxuZW51bSBXQVRDSF9TVEFUVVMge1xuICBMT0dHSU5HSU4gPSAnTE9HR0lOR0lOJyxcbiAgSU5JVElORyA9ICdJTklUSU5HJyxcbiAgUkVCVUlMRElORyA9ICdSRUJVSUxESU5HJyxcbiAgQUNUSVZFID0gJ0FDVElWRScsXG4gIEVSUk9SRUQgPSAnRVJST1JFRCcsXG4gIENMT1NJTkcgPSAnQ0xPU0lORycsXG4gIENMT1NFRCA9ICdDTE9TRUQnLFxuICBQQVVTRUQgPSAnUEFVU0VEJyxcbiAgUkVTVU1JTkcgPSAnUkVTVU1JTkcnXG59XG5cbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FX09OX1VOS05PV05fRVJST1IgPSAxMDBcbmNvbnN0IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1IgPSAyXG5jb25zdCBERUZBVUxUX01BWF9TRU5EX0FDS19BVVRPX1JFVFJZX09OX0VSUk9SID0gMlxuY29uc3QgREVGQVVMVF9TRU5EX0FDS19ERUJPVU5DRV9USU1FT1VUID0gMTAgKiAxMDAwXG5jb25zdCBERUZBVUxUX0lOSVRfV0FUQ0hfVElNRU9VVCA9IDEwICogMTAwMFxuY29uc3QgREVGQVVMVF9SRUJVSUxEX1dBVENIX1RJTUVPVVQgPSAxMCAqIDEwMDBcblxuZXhwb3J0IGNsYXNzIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQge1xuICAvLyBwYXNzZWQgb3ZlclxuICB3YXRjaElkOiBzdHJpbmdcbiAgLy8gb3duXG4gIGxpc3RlbmVyOiBSZWFsdGltZUxpc3RlbmVyXG4gIHByaXZhdGUgZW52SWQ/OiBzdHJpbmdcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uTmFtZTogc3RyaW5nXG4gIHByaXZhdGUgcXVlcnk6IHN0cmluZ1xuICBwcml2YXRlIGxpbWl0OiBudW1iZXJcbiAgcHJpdmF0ZSBvcmRlckJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHByaXZhdGUgc2VuZDogPFQgPSBhbnk+KG9wdHM6IElXU1NlbmRPcHRpb25zKSA9PiBQcm9taXNlPFQ+XG4gIHByaXZhdGUgbG9naW46IChlbnZJZD86IHN0cmluZywgcmVmcmVzaD86IGJvb2xlYW4pID0+IFByb21pc2U8YW55PlxuICBwcml2YXRlIGlzV1NDb25uZWN0ZWQ6ICgpID0+IGJvb2xlYW5cbiAgcHJpdmF0ZSBvbmNlV1NDb25uZWN0ZWQ6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgcHJpdmF0ZSBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiAoKSA9PiBudW1iZXJcbiAgcHJpdmF0ZSBvbldhdGNoU3RhcnQ6IChcbiAgICBjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsXG4gICAgcXVlcnlJRDogc3RyaW5nXG4gICkgPT4gdm9pZFxuICBwcml2YXRlIG9uV2F0Y2hDbG9zZTogKFxuICAgIGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCxcbiAgICBxdWVyeUlEOiBzdHJpbmdcbiAgKSA9PiB2b2lkXG4gIHByaXZhdGUgZGVidWc/OiBib29sZWFuXG5cbiAgcHJpdmF0ZSB3YXRjaFN0YXR1czogV0FUQ0hfU1RBVFVTID0gV0FUQ0hfU1RBVFVTLklOSVRJTkdcbiAgcHJpdmF0ZSBfYXZhaWxhYmxlUmV0cmllczogUGFydGlhbDxSZWNvcmQ8SVJlcXVlc3RNc2dUeXBlLCBudW1iZXI+PlxuICBwcml2YXRlIF9hY2tUaW1lb3V0SWQ/OiBudW1iZXJcbiAgcHJpdmF0ZSBfaW5pdFdhdGNoUHJvbWlzZT86IFByb21pc2U8dm9pZD5cbiAgcHJpdmF0ZSBfcmVidWlsZFdhdGNoUHJvbWlzZT86IFByb21pc2U8dm9pZD5cblxuICAvLyBvYnRhaW5lZFxuICBwcml2YXRlIHNlc3Npb25JbmZvPzogSVdhdGNoU2Vzc2lvbkluZm9cblxuICAvLyBpbnRlcm5hbFxuICBwcml2YXRlIF93YWl0RXhwZWN0ZWRUaW1lb3V0SWQ/OiBudW1iZXJcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJVmlydHVhbFdlYlNvY2tldENsaWVudENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHRoaXMud2F0Y2hJZCA9IGB3YXRjaGlkXyR7K25ldyBEYXRlKCl9XyR7TWF0aC5yYW5kb20oKX1gXG4gICAgdGhpcy5lbnZJZCA9IG9wdGlvbnMuZW52SWRcbiAgICB0aGlzLmNvbGxlY3Rpb25OYW1lID0gb3B0aW9ucy5jb2xsZWN0aW9uTmFtZVxuICAgIHRoaXMucXVlcnkgPSBvcHRpb25zLnF1ZXJ5XG4gICAgdGhpcy5saW1pdCA9IG9wdGlvbnMubGltaXRcbiAgICB0aGlzLm9yZGVyQnkgPSBvcHRpb25zLm9yZGVyQnlcbiAgICB0aGlzLnNlbmQgPSBvcHRpb25zLnNlbmRcbiAgICB0aGlzLmxvZ2luID0gb3B0aW9ucy5sb2dpblxuICAgIHRoaXMuaXNXU0Nvbm5lY3RlZCA9IG9wdGlvbnMuaXNXU0Nvbm5lY3RlZFxuICAgIHRoaXMub25jZVdTQ29ubmVjdGVkID0gb3B0aW9ucy5vbmNlV1NDb25uZWN0ZWRcbiAgICB0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGggPSBvcHRpb25zLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGhcbiAgICB0aGlzLm9uV2F0Y2hTdGFydCA9IG9wdGlvbnMub25XYXRjaFN0YXJ0XG4gICAgdGhpcy5vbldhdGNoQ2xvc2UgPSBvcHRpb25zLm9uV2F0Y2hDbG9zZVxuICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnXG5cbiAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzID0ge1xuICAgICAgSU5JVF9XQVRDSDogREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUixcbiAgICAgIFJFQlVJTERfV0FUQ0g6IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1IsXG4gICAgICBDSEVDS19MQVNUOiBERUZBVUxUX01BWF9TRU5EX0FDS19BVVRPX1JFVFJZX09OX0VSUk9SXG4gICAgfVxuXG4gICAgdGhpcy5saXN0ZW5lciA9IG5ldyBSZWFsdGltZUxpc3RlbmVyKHtcbiAgICAgIGNsb3NlOiB0aGlzLmNsb3NlV2F0Y2gsXG4gICAgICBvbkNoYW5nZTogb3B0aW9ucy5vbkNoYW5nZSxcbiAgICAgIG9uRXJyb3I6IG9wdGlvbnMub25FcnJvcixcbiAgICAgIGRlYnVnOiB0aGlzLmRlYnVnLFxuICAgICAgdmlydHVhbENsaWVudDogdGhpc1xuICAgIH0pXG5cbiAgICB0aGlzLmluaXRXYXRjaCgpXG4gIH1cblxuICBvbk1lc3NhZ2UobXNnOiBJUmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgLy8gd2F0Y2hTdGF0dXMgc2FuaXR5IGNoZWNrXG4gICAgc3dpdGNoICh0aGlzLndhdGNoU3RhdHVzKSB7XG4gICAgICBjYXNlIFdBVENIX1NUQVRVUy5QQVVTRUQ6IHtcbiAgICAgICAgLy8gaWdub3JlIGFsbCBidXQgZXJyb3IgbWVzc2FnZVxuICAgICAgICBpZiAobXNnLm1zZ1R5cGUgIT09ICdFUlJPUicpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuTE9HR0lOR0lOOlxuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuSU5JVElORzpcbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLlJFQlVJTERJTkc6IHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogdW5leHBlY3RlZCBtZXNzYWdlIHJlY2VpdmVkIHdoaWxlICR7dGhpcy53YXRjaFN0YXR1c31gXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjYXNlIFdBVENIX1NUQVRVUy5DTE9TRUQ6IHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogdW5leHBlY3RlZCBtZXNzYWdlIHJlY2VpdmVkIHdoZW4gdGhlIHdhdGNoIGhhcyBjbG9zZWQnXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjYXNlIFdBVENIX1NUQVRVUy5FUlJPUkVEOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGVuIHRoZSB3YXRjaCBoYXMgZW5kZWQgd2l0aCBlcnJvcidcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiBzZXNzaW9uSW5mbyBub3QgZm91bmQgd2hpbGUgbWVzc2FnZSBpcyByZWNlaXZlZC4nXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG5cbiAgICBzd2l0Y2ggKG1zZy5tc2dUeXBlKSB7XG4gICAgICBjYXNlICdORVhUX0VWRU5UJzoge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAod3guX2lnbm9yZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYG5leHRldmVudCAke21zZy5tc2dEYXRhLmN1cnJFdmVudH0gaWdub3JlZGAsIG1zZylcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyB3eC5faWdub3JlID0gZmFsc2VcbiAgICAgICAgLy8gcmV0dXJuXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlU2VydmVyRXZlbnRzKG1zZylcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NIRUNLX0VWRU5UJzoge1xuICAgICAgICBpZiAodGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA8IG1zZy5tc2dEYXRhLmN1cnJFdmVudCkge1xuICAgICAgICAgIC8vIGNsaWVudCBldmVudElEIDwgc2VydmVyIGV2ZW50SUQ6XG4gICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgb25lIG9yIG1vcmUgcGVuZGluZyBldmVudHMgbm90IHlldCByZWNlaXZlZCBidXQgc2VudCBieSB0aGUgc2VydmVyXG4gICAgICAgICAgdGhpcy5zZXNzaW9uSW5mby5leHBlY3RFdmVudElkID0gbXNnLm1zZ0RhdGEuY3VyckV2ZW50XG4gICAgICAgICAgdGhpcy5jbGVhcldhaXRFeHBlY3RlZEV2ZW50KClcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdGhpcy5fd2FpdEV4cGVjdGVkVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBtdXN0IHJlYnVpbGQgd2F0Y2hcbiAgICAgICAgICAgIHRoaXMucmVidWlsZFdhdGNoKClcbiAgICAgICAgICB9LCB0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGgoKSlcblxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtyZWFsdGltZV0gd2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCAke3RoaXMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCgpfWBcbiAgICAgICAgICApXG4gICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgLy8gcmVjZWl2ZSBzZXJ2ZXIgZXJyb3JcbiAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihcbiAgICAgICAgICBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfU0VSVkVSX0VSUk9SX01TRyBhcyBzdHJpbmcsXG4gICAgICAgICAgICBlcnJNc2c6IGAke21zZy5tc2dEYXRhLmNvZGV9IC0gJHttc2cubXNnRGF0YS5tZXNzYWdlfWBcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gdmlydHVhbCBjbGllbnQgcmVjZWl2ZSB1bmV4cGVjdGVkIG1zZyAke21zZy5tc2dUeXBlfTogYCxcbiAgICAgICAgICBtc2dcbiAgICAgICAgKVxuICAgICAgICAvLyB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xvc2VXaXRoRXJyb3IoZXJyb3I6IGFueSkge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuRVJST1JFRFxuICAgIHRoaXMuY2xlYXJBQ0tTY2hlZHVsZSgpXG4gICAgdGhpcy5saXN0ZW5lci5vbkVycm9yKGVycm9yKVxuICAgIC8vIFJlcG9ydGVyLnN1cnJvdW5kVGhpcmRCeVRyeUNhdGNoKCgpID0+IHRoaXMubGlzdGVuZXIub25FcnJvcihlcnJvcikpXG4gICAgdGhpcy5vbldhdGNoQ2xvc2UoXG4gICAgICB0aGlzLFxuICAgICAgKHRoaXMuc2Vzc2lvbkluZm8gJiYgdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlEKSB8fCAnJ1xuICAgIClcblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtyZWFsdGltZV0gY2xpZW50IGNsb3NlZCAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAod2F0Y2hJZCAke3RoaXMud2F0Y2hJZH0pYFxuICAgIClcbiAgICAvLyB9XG4gIH1cblxuICBwYXVzZSgpIHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLlBBVVNFRFxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtyZWFsdGltZV0gY2xpZW50IHBhdXNlZCAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAod2F0Y2hJZCAke3RoaXMud2F0Y2hJZH0pYFxuICAgIClcbiAgICAvLyB9XG4gIH1cblxuICAvLyByZXN1bWUoKSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuc2Vzc2lvbkluZm8gPyB0aGlzLnJlYnVpbGRXYXRjaCgpIDogdGhpcy5pbml0V2F0Y2goKVxuICAvLyB9XG5cbiAgYXN5bmMgcmVzdW1lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuUkVTVU1JTkdcblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFtyZWFsdGltZV0gY2xpZW50IHJlc3VtaW5nIHdpdGggJHtcbiAgICAgICAgdGhpcy5zZXNzaW9uSW5mbyA/ICdSRUJVSUxEX1dBVENIJyA6ICdJTklUX1dBVENIJ1xuICAgICAgfSAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAoJHt0aGlzLndhdGNoSWR9KWBcbiAgICApXG4gICAgLy8gfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0ICh0aGlzLnNlc3Npb25JbmZvID8gdGhpcy5yZWJ1aWxkV2F0Y2goKSA6IHRoaXMuaW5pdFdhdGNoKCkpXG5cbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCBzdWNjZXNzZnVsbHkgcmVzdW1lZCAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAoJHt0aGlzLndhdGNoSWR9KWBcbiAgICAgIClcbiAgICAgIC8vIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCByZXN1bWUgZmFpbGVkICgke3RoaXMuY29sbGVjdGlvbk5hbWV9ICR7dGhpcy5xdWVyeX0pICgke3RoaXMud2F0Y2hJZH0pYCxcbiAgICAgICAgZVxuICAgICAgKVxuICAgICAgLy8gfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xvZ2luID0gYXN5bmMgKFxuICAgIGVudklkPzogc3RyaW5nLFxuICAgIHJlZnJlc2g/OiBib29sZWFuXG4gICk6IFByb21pc2U8SUxvZ2luUmVzdWx0PiA9PiB7XG4gICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5MT0dHSU5HSU5cbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IHRoaXMubG9naW4oZW52SWQsIHJlZnJlc2gpXG4gICAgaWYgKCF0aGlzLmVudklkKSB7XG4gICAgICB0aGlzLmVudklkID0gbG9naW5SZXN1bHQuZW52SWRcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2luUmVzdWx0XG4gIH1cblxuICBwcml2YXRlIGluaXRXYXRjaCA9IGFzeW5jIChmb3JjZVJlZnJlc2hMb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodGhpcy5faW5pdFdhdGNoUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXRXYXRjaFByb21pc2VcbiAgICB9XG5cbiAgICB0aGlzLl9pbml0V2F0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oXG4gICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdhdGNoIGNhbmNlbGxlZCBvbiBwYXVzZScpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgeyBlbnZJZCB9ID0gYXdhaXQgdGhpcy5fbG9naW4odGhpcy5lbnZJZCwgZm9yY2VSZWZyZXNoTG9naW4pXG5cbiAgICAgICAgICAvLyBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgICAgICAvLyAgIHRocm93IG5ldyBFcnJvcihgY2FuIG5vdCByZWJ1aWxkV2F0Y2ggd2l0aG91dCBhIHN1Y2Nlc3NmdWwgaW5pdFdhdGNoIChsYWNrIG9mIHNlc3Npb25JbmZvKWApXG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgaWYgKCh0aGlzLndhdGNoU3RhdHVzIGFzIFdBVENIX1NUQVRVUykgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuSU5JVElOR1xuXG4gICAgICAgICAgY29uc3QgaW5pdFdhdGNoTXNnOiBJUmVxdWVzdE1lc3NhZ2VJbml0V2F0Y2hNc2cgPSB7XG4gICAgICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICAgICAgbXNnVHlwZTogJ0lOSVRfV0FUQ0gnLFxuICAgICAgICAgICAgbXNnRGF0YToge1xuICAgICAgICAgICAgICBlbnZJZCxcbiAgICAgICAgICAgICAgY29sbE5hbWU6IHRoaXMuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgICBsaW1pdDogdGhpcy5saW1pdCxcbiAgICAgICAgICAgICAgb3JkZXJCeTogdGhpcy5vcmRlckJ5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5pdEV2ZW50TXNnID0gYXdhaXQgdGhpcy5zZW5kPElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2c+KHtcbiAgICAgICAgICAgIG1zZzogaW5pdFdhdGNoTXNnLFxuICAgICAgICAgICAgd2FpdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgICAgc2tpcE9uTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IERFRkFVTFRfSU5JVF9XQVRDSF9USU1FT1VUXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IHsgZXZlbnRzLCBjdXJyRXZlbnQgfSA9IGluaXRFdmVudE1zZy5tc2dEYXRhXG5cbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvID0ge1xuICAgICAgICAgICAgcXVlcnlJRDogaW5pdEV2ZW50TXNnLm1zZ0RhdGEucXVlcnlJRCxcbiAgICAgICAgICAgIGN1cnJlbnRFdmVudElkOiBjdXJyRXZlbnQgLSAxLFxuICAgICAgICAgICAgY3VycmVudERvY3M6IFtdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRklYOiBpbiBpbml0RXZlbnQgbWVzc2FnZSwgYWxsIGV2ZW50cyBoYXZlIGlkIDAsIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIGN1cnJFdmVudFxuICAgICAgICAgIGlmIChldmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgICAgICAgICAgICBlLklEID0gY3VyckV2ZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNlcnZlckV2ZW50cyhpbml0RXZlbnRNc2cpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPSBjdXJyRXZlbnRcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IFNuYXBzaG90KHtcbiAgICAgICAgICAgICAgaWQ6IGN1cnJFdmVudCxcbiAgICAgICAgICAgICAgZG9jQ2hhbmdlczogW10sXG4gICAgICAgICAgICAgIGRvY3M6IFtdLFxuICAgICAgICAgICAgICB0eXBlOiAnaW5pdCdcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uQ2hhbmdlKHNuYXBzaG90KVxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uV2F0Y2hTdGFydCh0aGlzLCB0aGlzLnNlc3Npb25JbmZvLnF1ZXJ5SUQpXG4gICAgICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5BQ1RJVkVcbiAgICAgICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzLklOSVRfV0FUQ0ggPSBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SXG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yKGUsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdJTklUX1dBVENIJyxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3RcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuXG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2luaXRXYXRjaFByb21pc2VcbiAgICAgIHN1Y2Nlc3MgPSB0cnVlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2luaXRXYXRjaFByb21pc2UgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSBpbml0V2F0Y2ggJHtzdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnfWApXG4gICAgLy8gfVxuICB9XG5cbiAgcHJpdmF0ZSByZWJ1aWxkV2F0Y2ggPSBhc3luYyAoZm9yY2VSZWZyZXNoTG9naW4/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWJ1aWxkV2F0Y2hQcm9taXNlXG4gICAgfVxuXG4gICAgdGhpcy5fcmVidWlsZFdhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KFxuICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzID09PSBXQVRDSF9TVEFUVVMuUEFVU0VEKSB7XG4gICAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIHJlYnVpbGRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7IGVudklkIH0gPSBhd2FpdCB0aGlzLl9sb2dpbih0aGlzLmVudklkLCBmb3JjZVJlZnJlc2hMb2dpbilcblxuICAgICAgICAgIGlmICghdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnY2FuIG5vdCByZWJ1aWxkV2F0Y2ggd2l0aG91dCBhIHN1Y2Nlc3NmdWwgaW5pdFdhdGNoIChsYWNrIG9mIHNlc3Npb25JbmZvKSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoKHRoaXMud2F0Y2hTdGF0dXMgYXMgV0FUQ0hfU1RBVFVTKSA9PT0gV0FUQ0hfU1RBVFVTLlBBVVNFRCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tyZWFsdGltZV0gcmVidWlsZFdhdGNoIGNhbmNlbGxlZCBvbiBwYXVzZScpXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5SRUJVSUxESU5HXG5cbiAgICAgICAgICBjb25zdCByZWJ1aWxkV2F0Y2hNc2c6IElSZXF1ZXN0TWVzc2FnZVJlYnVpbGRXYXRjaE1zZyA9IHtcbiAgICAgICAgICAgIHdhdGNoSWQ6IHRoaXMud2F0Y2hJZCxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgICAgICBtc2dUeXBlOiAnUkVCVUlMRF9XQVRDSCcsXG4gICAgICAgICAgICBtc2dEYXRhOiB7XG4gICAgICAgICAgICAgIGVudklkLFxuICAgICAgICAgICAgICBjb2xsTmFtZTogdGhpcy5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgcXVlcnlJRDogdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlELFxuICAgICAgICAgICAgICBldmVudElEOiB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbmV4dEV2ZW50TXNnID0gYXdhaXQgdGhpcy5zZW5kPElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2c+KHtcbiAgICAgICAgICAgIG1zZzogcmVidWlsZFdhdGNoTXNnLFxuICAgICAgICAgICAgd2FpdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgICAgc2tpcE9uTWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgICB0aW1lb3V0OiBERUZBVUxUX1JFQlVJTERfV0FUQ0hfVElNRU9VVFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICB0aGlzLmhhbmRsZVNlcnZlckV2ZW50cyhuZXh0RXZlbnRNc2cpXG5cbiAgICAgICAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLkFDVElWRVxuICAgICAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMuUkVCVUlMRF9XQVRDSCA9IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1JcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlV2F0Y2hFc3RhYmxpc2htZW50RXJyb3IoZSwge1xuICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1JFQlVJTERfV0FUQ0gnLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG5cbiAgICBsZXQgc3VjY2VzcyA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fcmVidWlsZFdhdGNoUHJvbWlzZVxuICAgICAgc3VjY2VzcyA9IHRydWVcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVidWlsZFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIHJlYnVpbGRXYXRjaCAke3N1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZmFpbCd9YClcbiAgICAvLyB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yID0gYXN5bmMgKFxuICAgIGU6IGFueSxcbiAgICBvcHRpb25zOiBJSGFuZGxlV2F0Y2hFc3RhYmxpc2htZW50RXJyb3JPcHRpb25zXG4gICkgPT4ge1xuICAgIGNvbnN0IGlzSW5pdFdhdGNoID0gb3B0aW9ucy5vcGVyYXRpb25OYW1lID09PSAnSU5JVF9XQVRDSCdcblxuICAgIGNvbnN0IGFib3J0V2F0Y2ggPSAoKSA9PiB7XG4gICAgICAvLyBtb2NrIHRlbXAgY29tbWVudFxuICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihcbiAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgIGVyckNvZGU6IGlzSW5pdFdhdGNoXG4gICAgICAgICAgICA/IChFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfSU5JVF9XQVRDSF9GQUlMIGFzIHN0cmluZylcbiAgICAgICAgICAgIDogKEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9SRUJVSUxEX1dBVENIX0ZBSUwgYXMgc3RyaW5nKSxcbiAgICAgICAgICBlcnJNc2c6IGVcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIG9wdGlvbnMucmVqZWN0KGUpXG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnkgPSAocmVmcmVzaExvZ2luPzogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKHRoaXMudXNlUmV0cnlUaWNrZXQob3B0aW9ucy5vcGVyYXRpb25OYW1lKSkge1xuICAgICAgICBpZiAoaXNJbml0V2F0Y2gpIHtcbiAgICAgICAgICB0aGlzLl9pbml0V2F0Y2hQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgICAgb3B0aW9ucy5yZXNvbHZlKHRoaXMuaW5pdFdhdGNoKHJlZnJlc2hMb2dpbikpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVidWlsZFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIG9wdGlvbnMucmVzb2x2ZSh0aGlzLnJlYnVpbGRXYXRjaChyZWZyZXNoTG9naW4pKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhYm9ydFdhdGNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZUNvbW1vbkVycm9yKGUsIHtcbiAgICAgIG9uU2lnbkVycm9yOiAoKSA9PiByZXRyeSh0cnVlKSxcbiAgICAgIG9uVGltZW91dEVycm9yOiAoKSA9PiByZXRyeShmYWxzZSksXG4gICAgICBvbk5vdFJldHJ5YWJsZUVycm9yOiBhYm9ydFdhdGNoLFxuICAgICAgb25DYW5jZWxsZWRFcnJvcjogb3B0aW9ucy5yZWplY3QsXG4gICAgICBvblVua25vd25FcnJvcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG9uV1NEaXNjb25uZWN0ZWQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBhdXNlKClcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25jZVdTQ29ubmVjdGVkKClcbiAgICAgICAgICAgIHJldHJ5KHRydWUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzV1NDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgYXdhaXQgb25XU0Rpc2Nvbm5lY3RlZCgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKERFRkFVTFRfV0FJVF9USU1FX09OX1VOS05PV05fRVJST1IpXG4gICAgICAgICAgICBpZiAodGhpcy53YXRjaFN0YXR1cyA9PT0gV0FUQ0hfU1RBVFVTLlBBVVNFRCkge1xuICAgICAgICAgICAgICAvLyBjYW5jZWxcbiAgICAgICAgICAgICAgb3B0aW9ucy5yZWplY3QoXG4gICAgICAgICAgICAgICAgbmV3IENhbmNlbGxlZEVycm9yKFxuICAgICAgICAgICAgICAgICAgYCR7b3B0aW9ucy5vcGVyYXRpb25OYW1lfSBjYW5jZWxsZWQgZHVlIHRvIHBhdXNlIGFmdGVyIHVua25vd25FcnJvcmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNXU0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgIGF3YWl0IG9uV1NEaXNjb25uZWN0ZWQoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0cnkoZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCBlcnJvciB3aGlsZSBoYW5kbGluZyBlcnJvciwgaW4gb3JkZXIgdG8gcHJvdmlkZSBtYXhpbXVtIGVmZm9ydCBvbiBTRUFNSU5HTEVTUyBGQVVMVCBUT0xFUkFOQ0UsIGp1c3QgcmV0cnlcbiAgICAgICAgICByZXRyeSh0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VXYXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBxdWVyeUlkID0gdGhpcy5zZXNzaW9uSW5mbyA/IHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCA6ICcnXG5cbiAgICBpZiAodGhpcy53YXRjaFN0YXR1cyAhPT0gV0FUQ0hfU1RBVFVTLkFDVElWRSkge1xuICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5DTE9TRURcbiAgICAgIHRoaXMub25XYXRjaENsb3NlKHRoaXMsIHF1ZXJ5SWQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5DTE9TSU5HXG5cbiAgICAgIGNvbnN0IGNsb3NlV2F0Y2hNc2c6IElSZXF1ZXN0TWVzc2FnZUNsb3NlV2F0Y2hNc2cgPSB7XG4gICAgICAgIHdhdGNoSWQ6IHRoaXMud2F0Y2hJZCxcbiAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgbXNnVHlwZTogJ0NMT1NFX1dBVENIJyxcbiAgICAgICAgbXNnRGF0YTogbnVsbFxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgICBtc2c6IGNsb3NlV2F0Y2hNc2dcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuc2Vzc2lvbkluZm8gPSB1bmRlZmluZWRcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQ0xPU0VEXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihcbiAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9DTE9TRV9XQVRDSF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICBlcnJNc2c6IGVcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vbldhdGNoQ2xvc2UodGhpcywgcXVlcnlJZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlU2VuZEFDSyA9ICgpID0+IHtcbiAgICB0aGlzLmNsZWFyQUNLU2NoZWR1bGUoKVxuXG4gICAgLy8gVE9ETzogc2hvdWxkIHdlIGNoZWNrIHN0YXR1cyBhZnRlciB0aW1lb3V0XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuX2Fja1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbmRBQ0soKVxuICAgICAgfVxuICAgIH0sIERFRkFVTFRfU0VORF9BQ0tfREVCT1VOQ0VfVElNRU9VVClcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJBQ0tTY2hlZHVsZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5fYWNrVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fYWNrVGltZW91dElkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VuZEFDSyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgIT09IFdBVENIX1NUQVRVUy5BQ1RJVkUpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBjYW4gbm90IHNlbmQgYWNrIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGluaXRXYXRjaCAobGFjayBvZiBzZXNzaW9uSW5mbyknXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFja01zZzogSVJlcXVlc3RNZXNzYWdlQ2hlY2tMYXN0TXNnID0ge1xuICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgIG1zZ1R5cGU6ICdDSEVDS19MQVNUJyxcbiAgICAgICAgbXNnRGF0YToge1xuICAgICAgICAgIHF1ZXJ5SUQ6IHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCxcbiAgICAgICAgICBldmVudElEOiB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgICAgbXNnOiBhY2tNc2dcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBUT0RPOiByZWZhY3RvclxuICAgICAgaWYgKGlzUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcihlKSkge1xuICAgICAgICBjb25zdCBtc2cgPSBlLnBheWxvYWRcbiAgICAgICAgc3dpdGNoIChtc2cubXNnRGF0YS5jb2RlKSB7XG4gICAgICAgICAgLy8gc2lnbmF0dXJlIGVycm9yIC0+IHJldHJ5IHdpdGggcmVmcmVzaGVkIHNpZ25hdHVyZVxuICAgICAgICAgIGNhc2UgJ0NIRUNLX0xPR0lOX0ZBSUxFRCc6XG4gICAgICAgICAgY2FzZSAnU0lHTl9FWFBJUkVEX0VSUk9SJzpcbiAgICAgICAgICBjYXNlICdTSUdOX0lOVkFMSURfRVJST1InOlxuICAgICAgICAgIGNhc2UgJ1NJR05fUEFSQU1fSU5WQUxJRCc6IHtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZFdhdGNoKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBvdGhlciAtPiB0aHJvd1xuICAgICAgICAgIGNhc2UgJ1FVRVJZSURfSU5WQUxJRF9FUlJPUic6XG4gICAgICAgICAgY2FzZSAnU1lTX0VSUic6XG4gICAgICAgICAgY2FzZSAnSU5WQUxJSURfRU5WJzpcbiAgICAgICAgICBjYXNlICdDT0xMRUNUSU9OX1BFUk1JU1NJT05fREVOSUVEJzoge1xuICAgICAgICAgICAgLy8gbXVzdCB0aHJvd1xuICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihcbiAgICAgICAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9DSEVDS19MQVNUX0ZBSUwgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIGVyck1zZzogbXNnLm1zZ0RhdGEuY29kZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG1heWJlIHJldHJ5YWJsZVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzLkNIRUNLX0xBU1QgJiZcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcy5DSEVDS19MQVNUID4gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMuQ0hFQ0tfTEFTVC0tXG4gICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoXG4gICAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX0NIRUNLX0xBU1RfRkFJTCBhcyBzdHJpbmcsXG4gICAgICAgICAgICBlcnJNc2c6IGVcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb21tb25FcnJvciA9IChcbiAgICBlOiBhbnksXG4gICAgb3B0aW9uczogSUhhbmRsZUNvbW1vbkVycm9yT3B0aW9uc1xuICApOiB2b2lkID0+IHtcbiAgICBpZiAoaXNSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yKGUpKSB7XG4gICAgICBjb25zdCBtc2cgPSBlLnBheWxvYWRcbiAgICAgIHN3aXRjaCAobXNnLm1zZ0RhdGEuY29kZSkge1xuICAgICAgICAvLyBzaWduYXR1cmUgZXJyb3IgLT4gcmV0cnkgd2l0aCByZWZyZXNoZWQgc2lnbmF0dXJlXG4gICAgICAgIGNhc2UgJ0NIRUNLX0xPR0lOX0ZBSUxFRCc6XG4gICAgICAgIGNhc2UgJ1NJR05fRVhQSVJFRF9FUlJPUic6XG4gICAgICAgIGNhc2UgJ1NJR05fSU5WQUxJRF9FUlJPUic6XG4gICAgICAgIGNhc2UgJ1NJR05fUEFSQU1fSU5WQUxJRCc6IHtcbiAgICAgICAgICBvcHRpb25zLm9uU2lnbkVycm9yKGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gbm90LXJldHJ5YWJsZSBlcnJvciAtPiB0aHJvd1xuICAgICAgICBjYXNlICdRVUVSWUlEX0lOVkFMSURfRVJST1InOlxuICAgICAgICBjYXNlICdTWVNfRVJSJzpcbiAgICAgICAgY2FzZSAnSU5WQUxJSURfRU5WJzpcbiAgICAgICAgY2FzZSAnQ09MTEVDVElPTl9QRVJNSVNTSU9OX0RFTklFRCc6IHtcbiAgICAgICAgICBvcHRpb25zLm9uTm90UmV0cnlhYmxlRXJyb3IoZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgb3B0aW9ucy5vbk5vdFJldHJ5YWJsZUVycm9yKGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVGltZW91dEVycm9yKGUpKSB7XG4gICAgICAvLyB0aW1lb3V0IGVycm9yXG4gICAgICBvcHRpb25zLm9uVGltZW91dEVycm9yKGUpXG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKGlzQ2FuY2VsbGVkRXJyb3IoZSkpIHtcbiAgICAgIC8vIGNhbmNlbGxlZCBlcnJvclxuICAgICAgb3B0aW9ucy5vbkNhbmNlbGxlZEVycm9yKGUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB1bmtub3duIGVycm9yXG4gICAgb3B0aW9ucy5vblVua25vd25FcnJvcihlKVxuICB9XG5cbiAgLy8gY3JlZGl0IGEgcmV0cnkgY2hhbmNlIGZyb20gYXZhaWxhYmxlUmV0cmllc1xuICBwcml2YXRlIHVzZVJldHJ5VGlja2V0KG9wZXJhdGlvbk5hbWU6IElSZXF1ZXN0TXNnVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXNbb3BlcmF0aW9uTmFtZV0gJiZcbiAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXNbb3BlcmF0aW9uTmFtZV0hID4gMFxuICAgICkge1xuICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllc1tvcGVyYXRpb25OYW1lXSEtLVxuXG4gICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgW3JlYWx0aW1lXSAke29wZXJhdGlvbk5hbWV9IHVzZSBhIHJldHJ5IHRpY2tldCwgbm93IG9ubHkgJHt0aGlzLl9hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdfSByZXRyeSBsZWZ0YFxuICAgICAgKVxuICAgICAgLy8gfVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VydmVyRXZlbnRzKFxuICAgIG1zZzogSVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZyB8IElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2dcbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgIGF3YWl0IHRoaXMuX2hhbmRsZVNlcnZlckV2ZW50cyhtc2cpXG4gICAgICB0aGlzLl9wb3N0SGFuZGxlU2VydmVyRXZlbnRzVmFsaWRpdHlDaGVjayhtc2cpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAvLyBUT0RPOiByZXBvcnRcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogaGFuZGxlIHNlcnZlciBldmVudHMgZmFpbGVkIHdpdGggZXJyb3I6ICcsXG4gICAgICAgIGVcbiAgICAgIClcblxuICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiBoYW5kbGUgc2VydmVyIGV2ZW50cyBmYWlsZWQgd2l0aCBlcnJvcjogICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbih7fSwgZSwge1xuICAgICAgLy8gICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgLy8gICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgIC8vICAgICB9KVxuICAgICAgLy8gICApfSBcXG5gXG4gICAgICAvLyApXG4gICAgICAvLyB9XG5cbiAgICAgIHRocm93IGVcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVTZXJ2ZXJFdmVudHMoXG4gICAgbXNnOiBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnIHwgSVJlc3BvbnNlTWVzc2FnZU5leHRFdmVudE1zZ1xuICApIHtcbiAgICBjb25zdCB7IHJlcXVlc3RJZCB9ID0gbXNnXG5cbiAgICBjb25zdCB7IGV2ZW50cyB9ID0gbXNnLm1zZ0RhdGFcbiAgICBjb25zdCB7IG1zZ1R5cGUgfSA9IG1zZ1xuXG4gICAgaWYgKCFldmVudHMubGVuZ3RoIHx8ICF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzZXNzaW9uSW5mbyA9IHRoaXMuc2Vzc2lvbkluZm9cblxuICAgIGxldCBhbGxDaGFuZ2VFdmVudHM6IElTaW5nbGVEQkV2ZW50W11cbiAgICB0cnkge1xuICAgICAgYWxsQ2hhbmdlRXZlbnRzID0gZXZlbnRzLm1hcChnZXRQdWJsaWNFdmVudClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKFxuICAgICAgICBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1JFQ0VJVkVfSU5WQUxJRF9TRVJWRVJfREFUQSBhcyBzdHJpbmcsXG4gICAgICAgICAgZXJyTXNnOiBlXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBhZ2dyZWdhdGUgZG9jc1xuICAgIGxldCBkb2NzID0gWy4uLnNlc3Npb25JbmZvLmN1cnJlbnREb2NzXVxuICAgIGxldCBpbml0RW5jb3VudGVyZWQgPSBmYWxzZVxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhbGxDaGFuZ2VFdmVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYW5nZSA9IGFsbENoYW5nZUV2ZW50c1tpXVxuXG4gICAgICBpZiAoc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPj0gY2hhbmdlLmlkKSB7XG4gICAgICAgIGlmICghYWxsQ2hhbmdlRXZlbnRzW2kgLSAxXSB8fCBjaGFuZ2UuaWQgPiBhbGxDaGFuZ2VFdmVudHNbaSAtIDFdLmlkKSB7XG4gICAgICAgICAgLy8gZHVwbGljYXRlIGV2ZW50LCBkcm9wYWJsZVxuICAgICAgICAgIC8vIFRPRE86IHJlcG9ydFxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbcmVhbHRpbWVdIGR1cGxpY2F0ZSBldmVudCByZWNlaXZlZCwgY3VyICR7c2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWR9IGJ1dCBnb3QgJHtjaGFuZ2UuaWR9YFxuICAgICAgICAgIClcbiAgICAgICAgICAvLyB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYWxsQ2hhbmdlRXZlbnRzIHNob3VsZCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIGV2ZW50SWQsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbnMsIG11c3QgcmVwb3J0IGEgbm9uLWZhdGFsIGVycm9yXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIHNlcnZlciBub24tZmF0YWwgZXJyb3I6IGV2ZW50cyBvdXQgb2Ygb3JkZXIgKHRoZSBsYXR0ZXIgZXZlbnQncyBpZCBpcyBzbWFsbGVyIHRoYW4gdGhhdCBvZiB0aGUgZm9ybWVyKSAocmVxdWVzdElkICR7cmVxdWVzdElkfSlgXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBzZXJ2ZXIgbm9uLWZhdGFsIGVycm9yOiBldmVudHMgb3V0IG9mIG9yZGVyICh0aGUgbGF0dGVyIGV2ZW50J3MgaWQgaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGZvcm1lcikgICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgLy8gICAgICAge30sXG4gICAgICAgICAgLy8gICAgICAge1xuICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgICAgICAvLyAgICAgICB9XG4gICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAvLyAgICl9IFxcbmBcbiAgICAgICAgICAvLyApXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPT09IGNoYW5nZS5pZCAtIDEpIHtcbiAgICAgICAgLy8gY29ycmVjdCBzZXF1ZW5jZVxuICAgICAgICAvLyBmaXJzdCBoYW5kbGUgZGF0YVR5cGUgdGhlbiBxdWV1ZVR5cGU6XG4gICAgICAgIC8vIDEuIGRhdGFUeXBlOiB3ZSBPTkxZIHBvcHVsYXRlIGNoYW5nZS5kb2MgaWYgbmVjY2Vzc2FyeVxuICAgICAgICAvLyAyLiBxdWV1ZVR5cGU6IHdlIGJ1aWxkIHRoZSBkYXRhIHNuYXBzaG90XG5cbiAgICAgICAgc3dpdGNoIChjaGFuZ2UuZGF0YVR5cGUpIHtcbiAgICAgICAgICBjYXNlICd1cGRhdGUnOiB7XG4gICAgICAgICAgICAvLyBvbmx5IG5lZWQgdG8gcG9wdWxhdGUgY2hhbmdlLmRvYyB3aGVuIGl0IGlzIG5vdCBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKCFjaGFuZ2UuZG9jKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnF1ZXVlVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVxdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsRG9jID0gZG9jcy5maW5kKGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpXG4gICAgICAgICAgICAgICAgICBpZiAobG9jYWxEb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBwYXJ0aWFsIHVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBjbG9uZURlZXAobG9jYWxEb2MpXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS51cGRhdGVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZFBhdGggaW4gY2hhbmdlLnVwZGF0ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldChkb2MsIGZpZWxkUGF0aCwgY2hhbmdlLnVwZGF0ZWRGaWVsZHNbZmllbGRQYXRoXSlcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLnJlbW92ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBjaGFuZ2UucmVtb3ZlZEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoZG9jLCBmaWVsZFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlLmRvYyA9IGRvY1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyByZXBvcnRcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHVwZGF0ZSBkYXRhVHlwZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAgICAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCB1cGRhdGUgZGF0YVR5cGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuICAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgKVxuICAgICAgICAgICAgICAgICAgICAvLyAgICl9IFxcbmBcbiAgICAgICAgICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5xdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIC8vIGRvYyBpcyBwcm92aWRlZCBieSBzZXJ2ZXIsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9VTkVYUEVDVEVEX0ZBVEFMX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiBgSGFuZGxlU2VydmVyRXZlbnRzOiBmdWxsIGRvYyBpcyBub3QgcHJvdmlkZWQgd2l0aCBkYXRhVHlwZT1cInVwZGF0ZVwiIGFuZCBxdWV1ZVR5cGU9XCJlbnF1ZXVlXCIgKHJlcXVlc3RJZCAke21zZy5yZXF1ZXN0SWR9KWBcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycilcbiAgICAgICAgICAgICAgICAgIHRocm93IGVyclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncmVwbGFjZSc6IHtcbiAgICAgICAgICAgIC8vIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgICAgICAgICAvLyBkb2MgaXMgcHJvdmlkZWQgYnkgc2VydmVyLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1clxuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1VORVhQRUNURURfRkFUQUxfRVJST1IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIGVyck1zZzogYEhhbmRsZVNlcnZlckV2ZW50czogZnVsbCBkb2MgaXMgbm90IHByb3ZpZGVkIHdpdGggZGF0YVR5cGU9XCJyZXBsYWNlXCIgKHJlcXVlc3RJZCAke21zZy5yZXF1ZXN0SWR9KWBcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpXG4gICAgICAgICAgICAgIHRocm93IGVyclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncmVtb3ZlJzoge1xuICAgICAgICAgICAgY29uc3QgZG9jID0gZG9jcy5maW5kKGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpXG4gICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgIGNoYW5nZS5kb2MgPSBkb2NcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCByZW1vdmUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJ1xuICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcmVtb3ZlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgLy8gICAgICAge30sXG4gICAgICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gICAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgICAvLyAgICAgKVxuICAgICAgICAgICAgICAvLyAgICl9IFxcbmBcbiAgICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbGltaXQnOiB7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZS5kb2MpIHtcbiAgICAgICAgICAgICAgc3dpdGNoKGNoYW5nZS5xdWV1ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkZXF1ZXVlJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZG9jID0gZG9jcy5maW5kKGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpXG4gICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kb2MgPSBkb2NcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBsaW1pdCBkYXRhVHlwZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2VucXVldWUnOiB7XG4gICAgICAgICAgICAgICAgICAvLyBkb2MgaXMgcHJvdmlkZWQgYnkgc2VydmVyLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1clxuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfVU5FWFBFQ1RFRF9GQVRBTF9FUlJPUiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogYEhhbmRsZVNlcnZlckV2ZW50czogZnVsbCBkb2MgaXMgbm90IHByb3ZpZGVkIHdpdGggZGF0YVR5cGU9XCJsaW1pdFwiIGFuZCBxdWV1ZVR5cGU9XCJlbnF1ZXVlXCIgKHJlcXVlc3RJZCAke21zZy5yZXF1ZXN0SWR9KWBcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycilcbiAgICAgICAgICAgICAgICAgIHRocm93IGVyclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGNoYW5nZS5xdWV1ZVR5cGUpIHtcbiAgICAgICAgICBjYXNlICdpbml0Jzoge1xuICAgICAgICAgICAgaWYgKCFpbml0RW5jb3VudGVyZWQpIHtcbiAgICAgICAgICAgICAgaW5pdEVuY291bnRlcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICBkb2NzID0gW2NoYW5nZS5kb2NdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkb2NzLnB1c2goY2hhbmdlLmRvYylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2VucXVldWUnOiB7XG4gICAgICAgICAgICBkb2NzLnB1c2goY2hhbmdlLmRvYylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2RlcXVldWUnOiB7XG4gICAgICAgICAgICBjb25zdCBpbmQgPSBkb2NzLmZpbmRJbmRleChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgaWYgKGluZCA+IC0xKSB7XG4gICAgICAgICAgICAgIGRvY3Muc3BsaWNlKGluZCwgMSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBkZXF1ZXVlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLidcbiAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIGRlcXVldWUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIC8vICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAvLyAgICAgICB7fSxcbiAgICAgICAgICAgICAgLy8gICAgICAge1xuICAgICAgICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgLy8gICAgICAgICB3YXRjaElkOiBtc2cud2F0Y2hJZFxuICAgICAgICAgICAgICAvLyAgICAgICB9XG4gICAgICAgICAgICAgIC8vICAgICApXG4gICAgICAgICAgICAgIC8vICAgKX0gXFxuYFxuICAgICAgICAgICAgICAvLyApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICd1cGRhdGUnOiB7XG4gICAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBkb2NzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAvLyAgICAgZG9jc1xuICAgICAgICAgICAgLy8gICApfSBjaGFuZ2UgZG9jICR7SlNPTi5zdHJpbmdpZnkoY2hhbmdlKX0gXFxuYFxuICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgY29uc3QgaW5kID0gZG9jcy5maW5kSW5kZXgoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZClcbiAgICAgICAgICAgIGlmIChpbmQgPiAtMSkge1xuICAgICAgICAgICAgICBkb2NzW2luZF0gPSBjaGFuZ2UuZG9jXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcXVldWVUeXBlIHVwZGF0ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nXG4gICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBxdWV1ZVR5cGUgdXBkYXRlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgLy8gICAgICAge30sXG4gICAgICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gICAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgICAvLyAgICAgKVxuICAgICAgICAgICAgICAvLyAgICl9IFxcbmBcbiAgICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaSA9PT0gbGVuIC0gMSB8fFxuICAgICAgICAgIChhbGxDaGFuZ2VFdmVudHNbaSArIDFdICYmIGFsbENoYW5nZUV2ZW50c1tpICsgMV0uaWQgIT09IGNoYW5nZS5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYSBzaGFsbG93IHNsaWNlIGNyZWF0ZXMgYSBzaGFsbG93IHNuYXBzaG90XG4gICAgICAgICAgY29uc3QgZG9jc1NuYXBzaG90ID0gWy4uLmRvY3NdXG5cbiAgICAgICAgICAvLyB3ZSBzbGljZSBmaXJzdCBjYXVzZScgaWYgdGhlcmUncmUgYWxsQ2hhbmdlRXZlbnRzIHRoYXQgYXJlIG9mIHRoZSBzYW1lIGlkIGFmdGVyIHRoaXMgY2hhbmdlLCB3ZSBkb24ndCB3YW50IHRvIGludm9sdmUgaXQgZm9yIGl0IGlzIHVuZXhwZWN0ZWQgaW52YWxpZCBvcmRlclxuICAgICAgICAgIGNvbnN0IGRvY0NoYW5nZXMgPSBhbGxDaGFuZ2VFdmVudHNcbiAgICAgICAgICAgIC5zbGljZSgwLCBpICsgMSlcbiAgICAgICAgICAgIC5maWx0ZXIoYyA9PiBjLmlkID09PSBjaGFuZ2UuaWQpXG5cbiAgICAgICAgICAvLyBhbGwgY2hhbmdlcyBvZiB0aGlzIGV2ZW50IGhhcyBiZWVuIGhhbmRsZSwgd2UgY291bGQgZGlzcGF0Y2ggdGhlIGV2ZW50IG5vd1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPSBjaGFuZ2UuaWRcbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnREb2NzID0gZG9jc1xuXG4gICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3Qoe1xuICAgICAgICAgICAgaWQ6IGNoYW5nZS5pZCxcbiAgICAgICAgICAgIGRvY0NoYW5nZXMsXG4gICAgICAgICAgICBkb2NzOiBkb2NzU25hcHNob3QsXG4gICAgICAgICAgICBtc2dUeXBlXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFJlcG9ydGVyLnN1cnJvdW5kVGhpcmRCeVRyeUNhdGNoKCgpID0+XG4gICAgICAgICAgdGhpcy5saXN0ZW5lci5vbkNoYW5nZShzbmFwc2hvdClcbiAgICAgICAgICAvLyApKClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3V0LW9mLW9yZGVyIGV2ZW50XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBUT0RPOiByZXBvcnRcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGV2ZW50IHJlY2VpdmVkIGlzIG91dCBvZiBvcmRlciwgY3VyICR7dGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZH0gYnV0IGdvdCAke2NoYW5nZS5pZH1gXG4gICAgICAgIClcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyByZWJ1aWxkIHdhdGNoXG4gICAgICAgIGF3YWl0IHRoaXMucmVidWlsZFdhdGNoKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcG9zdEhhbmRsZVNlcnZlckV2ZW50c1ZhbGlkaXR5Q2hlY2soXG4gICAgbXNnOiBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnIHwgSVJlc3BvbnNlTWVzc2FnZU5leHRFdmVudE1zZ1xuICApIHtcbiAgICBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogc2Vzc2lvbkluZm8gbG9zdCBhZnRlciBzZXJ2ZXIgZXZlbnQgaGFuZGxpbmcsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyJ1xuICAgICAgKVxuXG4gICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHNlc3Npb25JbmZvIGxvc3QgYWZ0ZXIgc2VydmVyIGV2ZW50IGhhbmRsaW5nLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1ciAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAvLyAgICAgICB7fSxcbiAgICAgIC8vICAgICAgIHtcbiAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgLy8gICAgICAgICB3YXRjaElkOiBtc2cud2F0Y2hJZFxuICAgICAgLy8gICAgICAgfVxuICAgICAgLy8gICAgIClcbiAgICAgIC8vICAgKX0gXFxuYFxuICAgICAgLy8gKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zZXNzaW9uSW5mby5leHBlY3RFdmVudElkICYmXG4gICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID49IHRoaXMuc2Vzc2lvbkluZm8uZXhwZWN0RXZlbnRJZFxuICAgICkge1xuICAgICAgdGhpcy5jbGVhcldhaXRFeHBlY3RlZEV2ZW50KClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA8IG1zZy5tc2dEYXRhLmN1cnJFdmVudCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IGNsaWVudCBldmVudElkIGRvZXMgbm90IG1hdGNoIHdpdGggc2VydmVyIGV2ZW50IGlkIGFmdGVyIHNlcnZlciBldmVudCBoYW5kbGluZydcbiAgICAgIClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJXYWl0RXhwZWN0ZWRFdmVudCgpIHtcbiAgICBpZiAodGhpcy5fd2FpdEV4cGVjdGVkVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fd2FpdEV4cGVjdGVkVGltZW91dElkKVxuICAgICAgdGhpcy5fd2FpdEV4cGVjdGVkVGltZW91dElkID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB1YmxpY0V2ZW50KGV2ZW50OiBJREJFdmVudCk6IElTaW5nbGVEQkV2ZW50IHtcbiAgY29uc3QgZTogSVNpbmdsZURCRXZlbnQgPSB7XG4gICAgaWQ6IGV2ZW50LklELFxuICAgIGRhdGFUeXBlOiBldmVudC5EYXRhVHlwZSxcbiAgICBxdWV1ZVR5cGU6IGV2ZW50LlF1ZXVlVHlwZSxcbiAgICBkb2NJZDogZXZlbnQuRG9jSUQsXG4gICAgZG9jOiBldmVudC5Eb2MgJiYgZXZlbnQuRG9jICE9PSAne30nID8gSlNPTi5wYXJzZShldmVudC5Eb2MpIDogdW5kZWZpbmVkXG4gIH1cblxuICBpZiAoZXZlbnQuRGF0YVR5cGUgPT09ICd1cGRhdGUnKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChldmVudC5VcGRhdGVkRmllbGRzKSB7XG4gICAgICBlLnVwZGF0ZWRGaWVsZHMgPSBKU09OLnBhcnNlKGV2ZW50LlVwZGF0ZWRGaWVsZHMpXG4gICAgfVxuICAgIC8vIFRPRE86IHdhaXQgZm9yIHRjYiB0byBjaGFuZ2UgcmVtb3ZlZEZpZWxkcyB0byBSZW1vdmVkRmllbGRzXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChldmVudC5yZW1vdmVkRmllbGRzIHx8IGV2ZW50LlJlbW92ZWRGaWVsZHMpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIC8vIGUucmVtb3ZlZEZpZWxkcyA9IGV2ZW50LnJlbW92ZWRGaWVsZHNcbiAgICAgIC8vICAgPyBKU09OLnBhcnNlKGV2ZW50LnJlbW92ZWRGaWVsZHMpXG4gICAgICAvLyAgIDogSlNPTi5wYXJzZShldmVudC5SZW1vdmVkRmllbGRzKVxuICAgICAgZS5yZW1vdmVkRmllbGRzID0gSlNPTi5wYXJzZShldmVudC5yZW1vdmVkRmllbGRzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlXG59XG4iXX0=
952
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC13ZWJzb2NrZXQtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSwwREFBNkI7QUFDN0IsOERBQWlDO0FBQ2pDLHNFQUF5QztBQUN6QyxxQ0FBeUM7QUFpQnpDLHVDQUE4QztBQUM5Qyx1Q0FBc0M7QUFFdEMsaUNBU2lCO0FBQ2pCLGlDQUFnQztBQTRDaEMsSUFBSyxZQVVKO0FBVkQsV0FBSyxZQUFZO0lBQ2YsdUNBQXVCLENBQUE7SUFDdkIsbUNBQW1CLENBQUE7SUFDbkIseUNBQXlCLENBQUE7SUFDekIsaUNBQWlCLENBQUE7SUFDakIsbUNBQW1CLENBQUE7SUFDbkIsbUNBQW1CLENBQUE7SUFDbkIsaUNBQWlCLENBQUE7SUFDakIsaUNBQWlCLENBQUE7SUFDakIscUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZJLFlBQVksS0FBWixZQUFZLFFBVWhCO0FBRUQsSUFBTSxrQ0FBa0MsR0FBRyxHQUFHLENBQUM7QUFDL0MsSUFBTSwrQkFBK0IsR0FBRyxDQUFDLENBQUM7QUFDMUMsSUFBTSx3Q0FBd0MsR0FBRyxDQUFDLENBQUM7QUFDbkQsSUFBTSxpQ0FBaUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3BELElBQU0sMEJBQTBCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM3QyxJQUFNLDZCQUE2QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFaEQ7SUFxQ0UsZ0NBQVksT0FBa0Q7UUFBOUQsaUJBK0JDO1FBM0NPLGdCQUFXLEdBQWlCLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFzTGpELFdBQU0sR0FBRyxVQUNmLEtBQWMsRUFDZCxPQUFpQjs7Ozs7d0JBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFB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QUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztLQUN6RSxDQUFDO0lBRUYsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtRQUUvQixJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDdkIsQ0FBQyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNuRDtRQUdELElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBSzlDLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDbkQ7S0FDRjtJQUVELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXBsdXNwbHVzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbWlzdXNlZC1wcm9taXNlcyAqL1xuaW1wb3J0IHNldCBmcm9tICdsb2Rhc2guc2V0JztcbmltcG9ydCB1bnNldCBmcm9tICdsb2Rhc2gudW5zZXQnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB7IGdlblJlcXVlc3RJZCB9IGZyb20gJy4vbWVzc2FnZSc7XG5pbXBvcnQge1xuICBJUmVzcG9uc2VNZXNzYWdlLFxuICBJUmVxdWVzdE1lc3NhZ2VJbml0V2F0Y2hNc2csXG4gIElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2csXG4gIElEQkV2ZW50LFxuICBJUmVxdWVzdE1lc3NhZ2VSZWJ1aWxkV2F0Y2hNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUNsb3NlV2F0Y2hNc2csXG4gIElSZXF1ZXN0TXNnVHlwZSxcbiAgSVJlc3BvbnNlTWVzc2FnZU5leHRFdmVudE1zZyxcbiAgSVJlcXVlc3RNZXNzYWdlQ2hlY2tMYXN0TXNnLFxuICBJV2F0Y2hPcHRpb25zLFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3JlYWx0aW1lJztcbmltcG9ydCB7XG4gIElTaW5nbGVEQkV2ZW50LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2RhdGFiYXNlJztcbi8vIGltcG9ydCBSZXBvcnRlciBmcm9tIFwiLi9leHRlcm5hbHMvcHVibGljLWxpYi9yZXBvcnRlclwiXG5pbXBvcnQgeyBSZWFsdGltZUxpc3RlbmVyIH0gZnJvbSAnLi9saXN0ZW5lcic7XG5pbXBvcnQgeyBTbmFwc2hvdCB9IGZyb20gJy4vc25hcHNob3QnO1xuaW1wb3J0IHsgSVdTU2VuZE9wdGlvbnMsIElMb2dpblJlc3VsdCB9IGZyb20gJy4vd2Vic29ja2V0LWNsaWVudCc7XG5pbXBvcnQge1xuICBFUlJfQ09ERSxcbiAgQ2xvdWRTREtFcnJvcixcbiAgaXNUaW1lb3V0RXJyb3IsXG4gIENhbmNlbGxlZEVycm9yLFxuICBpc0NhbmNlbGxlZEVycm9yLFxuICBpc1JlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IsXG4gIFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IsXG4gIFRpbWVvdXRFcnJvcixcbn0gZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vLyA9PT09PT09PT09PT09PT0gUmVhbHRpbWUgVmlydHVhbCBXZWJTb2NrZXQgQ2xpZW50IChJbnRlcm5hbCkgPT09PT09PT09PT09PT09PT09PT1cblxuaW50ZXJmYWNlIElWaXJ0dWFsV2ViU29ja2V0Q2xpZW50Q29uc3RydWN0b3JPcHRpb25zIGV4dGVuZHMgSVdhdGNoT3B0aW9ucyB7XG4gIC8vIHdzOiBSZWFsdGltZVdlYlNvY2tldENsaWVudFxuICBlbnZJZD86IHN0cmluZ1xuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nXG4gIHF1ZXJ5OiBzdHJpbmdcbiAgbGltaXQ/OiBudW1iZXJcbiAgb3JkZXJCeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgc2VuZDogPFQgPSBhbnk+KG9wdHM6IElXU1NlbmRPcHRpb25zKSA9PiBQcm9taXNlPFQ+XG4gIGxvZ2luOiAoZW52SWQ/OiBzdHJpbmcsIHJlZnJlc2g/OiBib29sZWFuKSA9PiBQcm9taXNlPGFueT5cbiAgaXNXU0Nvbm5lY3RlZDogKCkgPT4gYm9vbGVhblxuICBvbmNlV1NDb25uZWN0ZWQ6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aDogKCkgPT4gbnVtYmVyXG4gIG9uV2F0Y2hTdGFydDogKGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCwgcXVlcnlJRDogc3RyaW5nKSA9PiB2b2lkXG4gIG9uV2F0Y2hDbG9zZTogKGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCwgcXVlcnlJRDogc3RyaW5nKSA9PiB2b2lkXG4gIGRlYnVnPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgSVdhdGNoU2Vzc2lvbkluZm8ge1xuICBxdWVyeUlEOiBzdHJpbmdcbiAgY3VycmVudEV2ZW50SWQ6IG51bWJlclxuICBjdXJyZW50RG9jczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gIGV4cGVjdEV2ZW50SWQ/OiBudW1iZXJcbn1cblxuaW50ZXJmYWNlIElIYW5kbGVDb21tb25FcnJvck9wdGlvbnMge1xuICBvblNpZ25FcnJvcjogKGU6IFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IpID0+IHZvaWRcbiAgb25UaW1lb3V0RXJyb3I6IChlOiBUaW1lb3V0RXJyb3IpID0+IHZvaWRcbiAgb25DYW5jZWxsZWRFcnJvcjogKGU6IENhbmNlbGxlZEVycm9yKSA9PiB2b2lkXG4gIG9uTm90UmV0cnlhYmxlRXJyb3I6IChlOiBSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yKSA9PiB2b2lkXG4gIG9uVW5rbm93bkVycm9yOiAoZTogYW55KSA9PiB2b2lkXG59XG5cbmludGVyZmFjZSBJSGFuZGxlV2F0Y2hFc3RhYmxpc2htZW50RXJyb3JPcHRpb25zIHtcbiAgb3BlcmF0aW9uTmFtZTogJ0lOSVRfV0FUQ0gnIHwgJ1JFQlVJTERfV0FUQ0gnXG4gIHJlc29sdmU6ICh2YWx1ZT86IFByb21pc2VMaWtlPHZvaWQ+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gIHJlamVjdDogKGU6IGFueSkgPT4gdm9pZFxuICAvLyByZXRyeTogKHJlZnJlc2hMb2dpbj86IGJvb2xlYW4pID0+IHZvaWRcbiAgLy8gYWJvcnRXYXRjaDogKGU6IGFueSkgPT4gdm9pZFxufVxuXG5lbnVtIFdBVENIX1NUQVRVUyB7XG4gIExPR0dJTkdJTiA9ICdMT0dHSU5HSU4nLFxuICBJTklUSU5HID0gJ0lOSVRJTkcnLFxuICBSRUJVSUxESU5HID0gJ1JFQlVJTERJTkcnLFxuICBBQ1RJVkUgPSAnQUNUSVZFJyxcbiAgRVJST1JFRCA9ICdFUlJPUkVEJyxcbiAgQ0xPU0lORyA9ICdDTE9TSU5HJyxcbiAgQ0xPU0VEID0gJ0NMT1NFRCcsXG4gIFBBVVNFRCA9ICdQQVVTRUQnLFxuICBSRVNVTUlORyA9ICdSRVNVTUlORydcbn1cblxuY29uc3QgREVGQVVMVF9XQUlUX1RJTUVfT05fVU5LTk9XTl9FUlJPUiA9IDEwMDtcbmNvbnN0IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1IgPSAyO1xuY29uc3QgREVGQVVMVF9NQVhfU0VORF9BQ0tfQVVUT19SRVRSWV9PTl9FUlJPUiA9IDI7XG5jb25zdCBERUZBVUxUX1NFTkRfQUNLX0RFQk9VTkNFX1RJTUVPVVQgPSAxMCAqIDEwMDA7XG5jb25zdCBERUZBVUxUX0lOSVRfV0FUQ0hfVElNRU9VVCA9IDEwICogMTAwMDtcbmNvbnN0IERFRkFVTFRfUkVCVUlMRF9XQVRDSF9USU1FT1VUID0gMTAgKiAxMDAwO1xuXG5leHBvcnQgY2xhc3MgVmlydHVhbFdlYlNvY2tldENsaWVudCB7XG4gIC8vIHBhc3NlZCBvdmVyXG4gIHdhdGNoSWQ6IHN0cmluZztcbiAgLy8gb3duXG4gIGxpc3RlbmVyOiBSZWFsdGltZUxpc3RlbmVyO1xuICBwcml2YXRlIGVudklkPzogc3RyaW5nO1xuICBwcml2YXRlIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgcXVlcnk6IHN0cmluZztcbiAgcHJpdmF0ZSBsaW1pdDogbnVtYmVyO1xuICBwcml2YXRlIG9yZGVyQnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgc2VuZDogPFQgPSBhbnk+KG9wdHM6IElXU1NlbmRPcHRpb25zKSA9PiBQcm9taXNlPFQ+O1xuICBwcml2YXRlIGxvZ2luOiAoZW52SWQ/OiBzdHJpbmcsIHJlZnJlc2g/OiBib29sZWFuKSA9PiBQcm9taXNlPGFueT47XG4gIHByaXZhdGUgaXNXU0Nvbm5lY3RlZDogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSBvbmNlV1NDb25uZWN0ZWQ6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aDogKCkgPT4gbnVtYmVyO1xuICBwcml2YXRlIG9uV2F0Y2hTdGFydDogKFxuICAgIGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCxcbiAgICBxdWVyeUlEOiBzdHJpbmdcbiAgKSA9PiB2b2lkO1xuICBwcml2YXRlIG9uV2F0Y2hDbG9zZTogKFxuICAgIGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCxcbiAgICBxdWVyeUlEOiBzdHJpbmdcbiAgKSA9PiB2b2lkO1xuICBwcml2YXRlIGRlYnVnPzogYm9vbGVhbjtcblxuICBwcml2YXRlIHdhdGNoU3RhdHVzOiBXQVRDSF9TVEFUVVMgPSBXQVRDSF9TVEFUVVMuSU5JVElORztcbiAgcHJpdmF0ZSBfYXZhaWxhYmxlUmV0cmllczogUGFydGlhbDxSZWNvcmQ8SVJlcXVlc3RNc2dUeXBlLCBudW1iZXI+PjtcbiAgcHJpdmF0ZSBfYWNrVGltZW91dElkPzogbnVtYmVyO1xuICBwcml2YXRlIF9pbml0V2F0Y2hQcm9taXNlPzogUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBfcmVidWlsZFdhdGNoUHJvbWlzZT86IFByb21pc2U8dm9pZD47XG5cbiAgLy8gb2J0YWluZWRcbiAgcHJpdmF0ZSBzZXNzaW9uSW5mbz86IElXYXRjaFNlc3Npb25JbmZvO1xuXG4gIC8vIGludGVybmFsXG4gIHByaXZhdGUgX3dhaXRFeHBlY3RlZFRpbWVvdXRJZD86IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJVmlydHVhbFdlYlNvY2tldENsaWVudENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHRoaXMud2F0Y2hJZCA9IGB3YXRjaGlkXyR7K25ldyBEYXRlKCl9XyR7TWF0aC5yYW5kb20oKX1gO1xuICAgIHRoaXMuZW52SWQgPSBvcHRpb25zLmVudklkO1xuICAgIHRoaXMuY29sbGVjdGlvbk5hbWUgPSBvcHRpb25zLmNvbGxlY3Rpb25OYW1lO1xuICAgIHRoaXMucXVlcnkgPSBvcHRpb25zLnF1ZXJ5O1xuICAgIHRoaXMubGltaXQgPSBvcHRpb25zLmxpbWl0O1xuICAgIHRoaXMub3JkZXJCeSA9IG9wdGlvbnMub3JkZXJCeTtcbiAgICB0aGlzLnNlbmQgPSBvcHRpb25zLnNlbmQ7XG4gICAgdGhpcy5sb2dpbiA9IG9wdGlvbnMubG9naW47XG4gICAgdGhpcy5pc1dTQ29ubmVjdGVkID0gb3B0aW9ucy5pc1dTQ29ubmVjdGVkO1xuICAgIHRoaXMub25jZVdTQ29ubmVjdGVkID0gb3B0aW9ucy5vbmNlV1NDb25uZWN0ZWQ7XG4gICAgdGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoID0gb3B0aW9ucy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoO1xuICAgIHRoaXMub25XYXRjaFN0YXJ0ID0gb3B0aW9ucy5vbldhdGNoU3RhcnQ7XG4gICAgdGhpcy5vbldhdGNoQ2xvc2UgPSBvcHRpb25zLm9uV2F0Y2hDbG9zZTtcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPSB7XG4gICAgICBJTklUX1dBVENIOiBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SLFxuICAgICAgUkVCVUlMRF9XQVRDSDogREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUixcbiAgICAgIENIRUNLX0xBU1Q6IERFRkFVTFRfTUFYX1NFTkRfQUNLX0FVVE9fUkVUUllfT05fRVJST1IsXG4gICAgfTtcblxuICAgIHRoaXMubGlzdGVuZXIgPSBuZXcgUmVhbHRpbWVMaXN0ZW5lcih7XG4gICAgICBjbG9zZTogdGhpcy5jbG9zZVdhdGNoLFxuICAgICAgb25DaGFuZ2U6IG9wdGlvbnMub25DaGFuZ2UsXG4gICAgICBvbkVycm9yOiBvcHRpb25zLm9uRXJyb3IsXG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyxcbiAgICAgIHZpcnR1YWxDbGllbnQ6IHRoaXMsXG4gICAgfSk7XG5cbiAgICB0aGlzLmluaXRXYXRjaCgpO1xuICB9XG5cbiAgb25NZXNzYWdlKG1zZzogSVJlc3BvbnNlTWVzc2FnZSkge1xuICAgIC8vIHdhdGNoU3RhdHVzIHNhbml0eSBjaGVja1xuICAgIHN3aXRjaCAodGhpcy53YXRjaFN0YXR1cykge1xuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuUEFVU0VEOiB7XG4gICAgICAgIC8vIGlnbm9yZSBhbGwgYnV0IGVycm9yIG1lc3NhZ2VcbiAgICAgICAgaWYgKG1zZy5tc2dUeXBlICE9PSAnRVJST1InKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuTE9HR0lOR0lOOlxuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuSU5JVElORzpcbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLlJFQlVJTERJTkc6IHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogdW5leHBlY3RlZCBtZXNzYWdlIHJlY2VpdmVkIHdoaWxlICR7dGhpcy53YXRjaFN0YXR1c31gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuQ0xPU0VEOiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGVuIHRoZSB3YXRjaCBoYXMgY2xvc2VkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLkVSUk9SRUQ6IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogdW5leHBlY3RlZCBtZXNzYWdlIHJlY2VpdmVkIHdoZW4gdGhlIHdhdGNoIGhhcyBlbmRlZCB3aXRoIGVycm9yJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHNlc3Npb25JbmZvIG5vdCBmb3VuZCB3aGlsZSBtZXNzYWdlIGlzIHJlY2VpdmVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKCk7XG5cbiAgICBzd2l0Y2ggKG1zZy5tc2dUeXBlKSB7XG4gICAgICBjYXNlICdORVhUX0VWRU5UJzoge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAod3guX2lnbm9yZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYG5leHRldmVudCAke21zZy5tc2dEYXRhLmN1cnJFdmVudH0gaWdub3JlZGAsIG1zZyk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gd3guX2lnbm9yZSA9IGZhbHNlXG4gICAgICAgIC8vIHJldHVyblxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmhhbmRsZVNlcnZlckV2ZW50cyhtc2cpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NIRUNLX0VWRU5UJzoge1xuICAgICAgICBpZiAodGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA8IG1zZy5tc2dEYXRhLmN1cnJFdmVudCkge1xuICAgICAgICAgIC8vIGNsaWVudCBldmVudElEIDwgc2VydmVyIGV2ZW50SUQ6XG4gICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgb25lIG9yIG1vcmUgcGVuZGluZyBldmVudHMgbm90IHlldCByZWNlaXZlZCBidXQgc2VudCBieSB0aGUgc2VydmVyXG4gICAgICAgICAgdGhpcy5zZXNzaW9uSW5mby5leHBlY3RFdmVudElkID0gbXNnLm1zZ0RhdGEuY3VyckV2ZW50O1xuICAgICAgICAgIHRoaXMuY2xlYXJXYWl0RXhwZWN0ZWRFdmVudCgpO1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICB0aGlzLl93YWl0RXhwZWN0ZWRUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vIG11c3QgcmVidWlsZCB3YXRjaFxuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkV2F0Y2goKTtcbiAgICAgICAgICB9LCB0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGgoKSk7XG5cbiAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSB3YWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoICR7dGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoKCl9YCk7XG4gICAgICAgICAgLy8gfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIC8vIHJlY2VpdmUgc2VydmVyIGVycm9yXG4gICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9TRVJWRVJfRVJST1JfTVNHIGFzIHN0cmluZyxcbiAgICAgICAgICBlcnJNc2c6IGAke21zZy5tc2dEYXRhLmNvZGV9IC0gJHttc2cubXNnRGF0YS5tZXNzYWdlfWAsXG4gICAgICAgIH0pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gdmlydHVhbCBjbGllbnQgcmVjZWl2ZSB1bmV4cGVjdGVkIG1zZyAke21zZy5tc2dUeXBlfTogYCxcbiAgICAgICAgICBtc2dcbiAgICAgICAgKTtcbiAgICAgICAgLy8gfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbG9zZVdpdGhFcnJvcihlcnJvcjogYW55KSB7XG4gICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5FUlJPUkVEO1xuICAgIHRoaXMuY2xlYXJBQ0tTY2hlZHVsZSgpO1xuICAgIHRoaXMubGlzdGVuZXIub25FcnJvcihlcnJvcik7XG4gICAgLy8gUmVwb3J0ZXIuc3Vycm91bmRUaGlyZEJ5VHJ5Q2F0Y2goKCkgPT4gdGhpcy5saXN0ZW5lci5vbkVycm9yKGVycm9yKSlcbiAgICB0aGlzLm9uV2F0Y2hDbG9zZShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnNlc3Npb25JbmZvPy5xdWVyeUlEIHx8ICcnXG4gICAgKTtcblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIGNsaWVudCBjbG9zZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKHdhdGNoSWQgJHt0aGlzLndhdGNoSWR9KWApO1xuICAgIC8vIH1cbiAgfVxuXG4gIHBhdXNlKCkge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuUEFVU0VEO1xuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIGNsaWVudCBwYXVzZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKHdhdGNoSWQgJHt0aGlzLndhdGNoSWR9KWApO1xuICAgIC8vIH1cbiAgfVxuXG4gIC8vIHJlc3VtZSgpIHtcbiAgLy8gICByZXR1cm4gdGhpcy5zZXNzaW9uSW5mbyA/IHRoaXMucmVidWlsZFdhdGNoKCkgOiB0aGlzLmluaXRXYXRjaCgpXG4gIC8vIH1cblxuICBhc3luYyByZXN1bWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5SRVNVTUlORztcblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIGNsaWVudCByZXN1bWluZyB3aXRoICR7XG4gICAgICB0aGlzLnNlc3Npb25JbmZvID8gJ1JFQlVJTERfV0FUQ0gnIDogJ0lOSVRfV0FUQ0gnXG4gICAgfSAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAoJHt0aGlzLndhdGNoSWR9KWApO1xuICAgIC8vIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCAodGhpcy5zZXNzaW9uSW5mbyA/IHRoaXMucmVidWlsZFdhdGNoKCkgOiB0aGlzLmluaXRXYXRjaCgpKTtcblxuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSBjbGllbnQgc3VjY2Vzc2Z1bGx5IHJlc3VtZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKCR7dGhpcy53YXRjaElkfSlgKTtcbiAgICAgIC8vIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCByZXN1bWUgZmFpbGVkICgke3RoaXMuY29sbGVjdGlvbk5hbWV9ICR7dGhpcy5xdWVyeX0pICgke3RoaXMud2F0Y2hJZH0pYCxcbiAgICAgICAgZVxuICAgICAgKTtcbiAgICAgIC8vIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9sb2dpbiA9IGFzeW5jIChcbiAgICBlbnZJZD86IHN0cmluZyxcbiAgICByZWZyZXNoPzogYm9vbGVhblxuICApOiBQcm9taXNlPElMb2dpblJlc3VsdD4gPT4ge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuTE9HR0lOR0lOO1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gYXdhaXQgdGhpcy5sb2dpbihlbnZJZCwgcmVmcmVzaCk7XG4gICAgaWYgKCF0aGlzLmVudklkKSB7XG4gICAgICB0aGlzLmVudklkID0gbG9naW5SZXN1bHQuZW52SWQ7XG4gICAgfVxuICAgIHJldHVybiBsb2dpblJlc3VsdDtcbiAgfTtcblxuICBwcml2YXRlIGluaXRXYXRjaCA9IGFzeW5jIChmb3JjZVJlZnJlc2hMb2dpbj86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodGhpcy5faW5pdFdhdGNoUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2luaXRXYXRjaFByb21pc2U7XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdFdhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzID09PSBXQVRDSF9TVEFUVVMuUEFVU0VEKSB7XG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdhdGNoIGNhbmNlbGxlZCBvbiBwYXVzZScpO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBlbnZJZCB9ID0gYXdhaXQgdGhpcy5fbG9naW4odGhpcy5lbnZJZCwgZm9yY2VSZWZyZXNoTG9naW4pO1xuXG4gICAgICAgIC8vIGlmICghdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgICAvLyAgIHRocm93IG5ldyBFcnJvcihgY2FuIG5vdCByZWJ1aWxkV2F0Y2ggd2l0aG91dCBhIHN1Y2Nlc3NmdWwgaW5pdFdhdGNoIChsYWNrIG9mIHNlc3Npb25JbmZvKWApXG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAoKHRoaXMud2F0Y2hTdGF0dXMgYXMgV0FUQ0hfU1RBVFVTKSA9PT0gV0FUQ0hfU1RBVFVTLlBBVVNFRCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5JTklUSU5HO1xuXG4gICAgICAgIGNvbnN0IGluaXRXYXRjaE1zZzogSVJlcXVlc3RNZXNzYWdlSW5pdFdhdGNoTXNnID0ge1xuICAgICAgICAgIHdhdGNoSWQ6IHRoaXMud2F0Y2hJZCxcbiAgICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICAgIG1zZ1R5cGU6ICdJTklUX1dBVENIJyxcbiAgICAgICAgICBtc2dEYXRhOiB7XG4gICAgICAgICAgICBlbnZJZCxcbiAgICAgICAgICAgIGNvbGxOYW1lOiB0aGlzLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgICAgcXVlcnk6IHRoaXMucXVlcnksXG4gICAgICAgICAgICBsaW1pdDogdGhpcy5saW1pdCxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMub3JkZXJCeSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGluaXRFdmVudE1zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnPih7XG4gICAgICAgICAgbXNnOiBpbml0V2F0Y2hNc2csXG4gICAgICAgICAgd2FpdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgdGltZW91dDogREVGQVVMVF9JTklUX1dBVENIX1RJTUVPVVQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHsgZXZlbnRzLCBjdXJyRXZlbnQgfSA9IGluaXRFdmVudE1zZy5tc2dEYXRhO1xuXG4gICAgICAgIHRoaXMuc2Vzc2lvbkluZm8gPSB7XG4gICAgICAgICAgcXVlcnlJRDogaW5pdEV2ZW50TXNnLm1zZ0RhdGEucXVlcnlJRCxcbiAgICAgICAgICBjdXJyZW50RXZlbnRJZDogY3VyckV2ZW50IC0gMSxcbiAgICAgICAgICBjdXJyZW50RG9jczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRklYOiBpbiBpbml0RXZlbnQgbWVzc2FnZSwgYWxsIGV2ZW50cyBoYXZlIGlkIDAsIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIGN1cnJFdmVudFxuICAgICAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgICAgICAgICBlLklEID0gY3VyckV2ZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmhhbmRsZVNlcnZlckV2ZW50cyhpbml0RXZlbnRNc2cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPSBjdXJyRXZlbnQ7XG4gICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3Qoe1xuICAgICAgICAgICAgaWQ6IGN1cnJFdmVudCxcbiAgICAgICAgICAgIGRvY0NoYW5nZXM6IFtdLFxuICAgICAgICAgICAgZG9jczogW10sXG4gICAgICAgICAgICB0eXBlOiAnaW5pdCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5saXN0ZW5lci5vbkNoYW5nZShzbmFwc2hvdCk7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uV2F0Y2hTdGFydCh0aGlzLCB0aGlzLnNlc3Npb25JbmZvLnF1ZXJ5SUQpO1xuICAgICAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLkFDVElWRTtcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcy5JTklUX1dBVENIID0gREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUjtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yKGUsIHtcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnSU5JVF9XQVRDSCcsXG4gICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3QsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9pbml0V2F0Y2hQcm9taXNlO1xuICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2luaXRXYXRjaFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gaW5pdFdhdGNoICR7c3VjY2VzcyA/ICdzdWNjZXNzJyA6ICdmYWlsJ31gKTtcbiAgICAvLyB9XG4gIH07XG5cbiAgcHJpdmF0ZSByZWJ1aWxkV2F0Y2ggPSBhc3luYyAoZm9yY2VSZWZyZXNoTG9naW4/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWJ1aWxkV2F0Y2hQcm9taXNlO1xuICAgIH1cblxuICAgIHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy53YXRjaFN0YXR1cyA9PT0gV0FUQ0hfU1RBVFVTLlBBVVNFRCkge1xuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIHJlYnVpbGRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGVudklkIH0gPSBhd2FpdCB0aGlzLl9sb2dpbih0aGlzLmVudklkLCBmb3JjZVJlZnJlc2hMb2dpbik7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW4gbm90IHJlYnVpbGRXYXRjaCB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBpbml0V2F0Y2ggKGxhY2sgb2Ygc2Vzc2lvbkluZm8pJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHRoaXMud2F0Y2hTdGF0dXMgYXMgV0FUQ0hfU1RBVFVTKSA9PT0gV0FUQ0hfU1RBVFVTLlBBVVNFRCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIHJlYnVpbGRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5SRUJVSUxESU5HO1xuXG4gICAgICAgIGNvbnN0IHJlYnVpbGRXYXRjaE1zZzogSVJlcXVlc3RNZXNzYWdlUmVidWlsZFdhdGNoTXNnID0ge1xuICAgICAgICAgIHdhdGNoSWQ6IHRoaXMud2F0Y2hJZCxcbiAgICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICAgIG1zZ1R5cGU6ICdSRUJVSUxEX1dBVENIJyxcbiAgICAgICAgICBtc2dEYXRhOiB7XG4gICAgICAgICAgICBlbnZJZCxcbiAgICAgICAgICAgIGNvbGxOYW1lOiB0aGlzLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgICAgcXVlcnlJRDogdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlELFxuICAgICAgICAgICAgZXZlbnRJRDogdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG5leHRFdmVudE1zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnPih7XG4gICAgICAgICAgbXNnOiByZWJ1aWxkV2F0Y2hNc2csXG4gICAgICAgICAgd2FpdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgIHRpbWVvdXQ6IERFRkFVTFRfUkVCVUlMRF9XQVRDSF9USU1FT1VULFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmhhbmRsZVNlcnZlckV2ZW50cyhuZXh0RXZlbnRNc2cpO1xuXG4gICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQUNUSVZFO1xuICAgICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzLlJFQlVJTERfV0FUQ0ggPSBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlV2F0Y2hFc3RhYmxpc2htZW50RXJyb3IoZSwge1xuICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdSRUJVSUxEX1dBVENIJyxcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2U7XG4gICAgICBzdWNjZXNzID0gdHJ1ZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVidWlsZFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSByZWJ1aWxkV2F0Y2ggJHtzdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnfWApO1xuICAgIC8vIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yID0gYXN5bmMgKFxuICAgIGU6IGFueSxcbiAgICBvcHRpb25zOiBJSGFuZGxlV2F0Y2hFc3RhYmxpc2htZW50RXJyb3JPcHRpb25zXG4gICkgPT4ge1xuICAgIGNvbnN0IGlzSW5pdFdhdGNoID0gb3B0aW9ucy5vcGVyYXRpb25OYW1lID09PSAnSU5JVF9XQVRDSCc7XG5cbiAgICBjb25zdCBhYm9ydFdhdGNoID0gKCkgPT4ge1xuICAgICAgLy8gbW9jayB0ZW1wIGNvbW1lbnRcbiAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICBlcnJDb2RlOiBpc0luaXRXYXRjaFxuICAgICAgICAgID8gKEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9JTklUX1dBVENIX0ZBSUwgYXMgc3RyaW5nKVxuICAgICAgICAgIDogKEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9SRUJVSUxEX1dBVENIX0ZBSUwgYXMgc3RyaW5nKSxcbiAgICAgICAgZXJyTXNnOiBlLFxuICAgICAgfSkpO1xuICAgICAgb3B0aW9ucy5yZWplY3QoZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHJ5ID0gKHJlZnJlc2hMb2dpbj86IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh0aGlzLnVzZVJldHJ5VGlja2V0KG9wdGlvbnMub3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgICAgaWYgKGlzSW5pdFdhdGNoKSB7XG4gICAgICAgICAgdGhpcy5faW5pdFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBvcHRpb25zLnJlc29sdmUodGhpcy5pbml0V2F0Y2gocmVmcmVzaExvZ2luKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVidWlsZFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBvcHRpb25zLnJlc29sdmUodGhpcy5yZWJ1aWxkV2F0Y2gocmVmcmVzaExvZ2luKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFib3J0V2F0Y2goKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5oYW5kbGVDb21tb25FcnJvcihlLCB7XG4gICAgICBvblNpZ25FcnJvcjogKCkgPT4gcmV0cnkodHJ1ZSksXG4gICAgICBvblRpbWVvdXRFcnJvcjogKCkgPT4gcmV0cnkoZmFsc2UpLFxuICAgICAgb25Ob3RSZXRyeWFibGVFcnJvcjogYWJvcnRXYXRjaCxcbiAgICAgIG9uQ2FuY2VsbGVkRXJyb3I6IG9wdGlvbnMucmVqZWN0LFxuICAgICAgb25Vbmtub3duRXJyb3I6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvbldTRGlzY29ubmVjdGVkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5vbmNlV1NDb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIHJldHJ5KHRydWUpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoIXRoaXMuaXNXU0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICBhd2FpdCBvbldTRGlzY29ubmVjdGVkKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKERFRkFVTFRfV0FJVF9USU1FX09OX1VOS05PV05fRVJST1IpO1xuICAgICAgICAgICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICAgICAgLy8gY2FuY2VsXG4gICAgICAgICAgICAgIG9wdGlvbnMucmVqZWN0KG5ldyBDYW5jZWxsZWRFcnJvcihgJHtvcHRpb25zLm9wZXJhdGlvbk5hbWV9IGNhbmNlbGxlZCBkdWUgdG8gcGF1c2UgYWZ0ZXIgdW5rbm93bkVycm9yYCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1dTQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgYXdhaXQgb25XU0Rpc2Nvbm5lY3RlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0cnkoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgaGFuZGxpbmcgZXJyb3IsIGluIG9yZGVyIHRvIHByb3ZpZGUgbWF4aW11bSBlZmZvcnQgb24gU0VBTUlOR0xFU1MgRkFVTFQgVE9MRVJBTkNFLCBqdXN0IHJldHJ5XG4gICAgICAgICAgcmV0cnkodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBjbG9zZVdhdGNoID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5SWQgPSB0aGlzLnNlc3Npb25JbmZvID8gdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlEIDogJyc7XG5cbiAgICBpZiAodGhpcy53YXRjaFN0YXR1cyAhPT0gV0FUQ0hfU1RBVFVTLkFDVElWRSkge1xuICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5DTE9TRUQ7XG4gICAgICB0aGlzLm9uV2F0Y2hDbG9zZSh0aGlzLCBxdWVyeUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5DTE9TSU5HO1xuXG4gICAgICBjb25zdCBjbG9zZVdhdGNoTXNnOiBJUmVxdWVzdE1lc3NhZ2VDbG9zZVdhdGNoTXNnID0ge1xuICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgIG1zZ1R5cGU6ICdDTE9TRV9XQVRDSCcsXG4gICAgICAgIG1zZ0RhdGE6IG51bGwsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgICBtc2c6IGNsb3NlV2F0Y2hNc2csXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZXNzaW9uSW5mbyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQ0xPU0VEO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfQ0xPU0VfV0FUQ0hfRkFJTCBhcyBzdHJpbmcsXG4gICAgICAgIGVyck1zZzogZSxcbiAgICAgIH0pKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vbldhdGNoQ2xvc2UodGhpcywgcXVlcnlJZCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2NoZWR1bGVTZW5kQUNLID0gKCkgPT4ge1xuICAgIHRoaXMuY2xlYXJBQ0tTY2hlZHVsZSgpO1xuXG4gICAgLy8gVE9ETzogc2hvdWxkIHdlIGNoZWNrIHN0YXR1cyBhZnRlciB0aW1lb3V0XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuX2Fja1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZW5kQUNLKCk7XG4gICAgICB9XG4gICAgfSwgREVGQVVMVF9TRU5EX0FDS19ERUJPVU5DRV9USU1FT1VUKTtcbiAgfTtcblxuICBwcml2YXRlIGNsZWFyQUNLU2NoZWR1bGUgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuX2Fja1RpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2Fja1RpbWVvdXRJZCk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc2VuZEFDSyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgIT09IFdBVENIX1NUQVRVUy5BQ1RJVkUpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGNhbiBub3Qgc2VuZCBhY2sgd2l0aG91dCBhIHN1Y2Nlc3NmdWwgaW5pdFdhdGNoIChsYWNrIG9mIHNlc3Npb25JbmZvKScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFja01zZzogSVJlcXVlc3RNZXNzYWdlQ2hlY2tMYXN0TXNnID0ge1xuICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgIG1zZ1R5cGU6ICdDSEVDS19MQVNUJyxcbiAgICAgICAgbXNnRGF0YToge1xuICAgICAgICAgIHF1ZXJ5SUQ6IHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCxcbiAgICAgICAgICBldmVudElEOiB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgICAgbXNnOiBhY2tNc2csXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBUT0RPOiByZWZhY3RvclxuICAgICAgaWYgKGlzUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcihlKSkge1xuICAgICAgICBjb25zdCBtc2cgPSBlLnBheWxvYWQ7XG4gICAgICAgIHN3aXRjaCAobXNnLm1zZ0RhdGEuY29kZSkge1xuICAgICAgICAgIC8vIHNpZ25hdHVyZSBlcnJvciAtPiByZXRyeSB3aXRoIHJlZnJlc2hlZCBzaWduYXR1cmVcbiAgICAgICAgICBjYXNlICdDSEVDS19MT0dJTl9GQUlMRUQnOlxuICAgICAgICAgIGNhc2UgJ1NJR05fRVhQSVJFRF9FUlJPUic6XG4gICAgICAgICAgY2FzZSAnU0lHTl9JTlZBTElEX0VSUk9SJzpcbiAgICAgICAgICBjYXNlICdTSUdOX1BBUkFNX0lOVkFMSUQnOiB7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRXYXRjaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBvdGhlciAtPiB0aHJvd1xuICAgICAgICAgIGNhc2UgJ1FVRVJZSURfSU5WQUxJRF9FUlJPUic6XG4gICAgICAgICAgY2FzZSAnU1lTX0VSUic6XG4gICAgICAgICAgY2FzZSAnSU5WQUxJSURfRU5WJzpcbiAgICAgICAgICBjYXNlICdDT0xMRUNUSU9OX1BFUk1JU1NJT05fREVOSUVEJzoge1xuICAgICAgICAgICAgLy8gbXVzdCB0aHJvd1xuICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9DSEVDS19MQVNUX0ZBSUwgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICBlcnJNc2c6IG1zZy5tc2dEYXRhLmNvZGUsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBtYXliZSByZXRyeWFibGVcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcy5DSEVDS19MQVNUXG4gICAgICAgICYmIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMuQ0hFQ0tfTEFTVCA+IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzLkNIRUNLX0xBU1QtLTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9DSEVDS19MQVNUX0ZBSUwgYXMgc3RyaW5nLFxuICAgICAgICAgIGVyck1zZzogZSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIGhhbmRsZUNvbW1vbkVycm9yID0gKFxuICAgIGU6IGFueSxcbiAgICBvcHRpb25zOiBJSGFuZGxlQ29tbW9uRXJyb3JPcHRpb25zXG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChpc1JlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IoZSkpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGUucGF5bG9hZDtcbiAgICAgIHN3aXRjaCAobXNnLm1zZ0RhdGEuY29kZSkge1xuICAgICAgICAvLyBzaWduYXR1cmUgZXJyb3IgLT4gcmV0cnkgd2l0aCByZWZyZXNoZWQgc2lnbmF0dXJlXG4gICAgICAgIGNhc2UgJ0NIRUNLX0xPR0lOX0ZBSUxFRCc6XG4gICAgICAgIGNhc2UgJ1NJR05fRVhQSVJFRF9FUlJPUic6XG4gICAgICAgIGNhc2UgJ1NJR05fSU5WQUxJRF9FUlJPUic6XG4gICAgICAgIGNhc2UgJ1NJR05fUEFSQU1fSU5WQUxJRCc6IHtcbiAgICAgICAgICBvcHRpb25zLm9uU2lnbkVycm9yKGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3QtcmV0cnlhYmxlIGVycm9yIC0+IHRocm93XG4gICAgICAgIGNhc2UgJ1FVRVJZSURfSU5WQUxJRF9FUlJPUic6XG4gICAgICAgIGNhc2UgJ1NZU19FUlInOlxuICAgICAgICBjYXNlICdJTlZBTElJRF9FTlYnOlxuICAgICAgICBjYXNlICdDT0xMRUNUSU9OX1BFUk1JU1NJT05fREVOSUVEJzoge1xuICAgICAgICAgIG9wdGlvbnMub25Ob3RSZXRyeWFibGVFcnJvcihlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIG9wdGlvbnMub25Ob3RSZXRyeWFibGVFcnJvcihlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVGltZW91dEVycm9yKGUpKSB7XG4gICAgICAvLyB0aW1lb3V0IGVycm9yXG4gICAgICBvcHRpb25zLm9uVGltZW91dEVycm9yKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoaXNDYW5jZWxsZWRFcnJvcihlKSkge1xuICAgICAgLy8gY2FuY2VsbGVkIGVycm9yXG4gICAgICBvcHRpb25zLm9uQ2FuY2VsbGVkRXJyb3IoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdW5rbm93biBlcnJvclxuICAgIG9wdGlvbnMub25Vbmtub3duRXJyb3IoZSk7XG4gIH07XG5cbiAgLy8gY3JlZGl0IGEgcmV0cnkgY2hhbmNlIGZyb20gYXZhaWxhYmxlUmV0cmllc1xuICBwcml2YXRlIHVzZVJldHJ5VGlja2V0KG9wZXJhdGlvbk5hbWU6IElSZXF1ZXN0TXNnVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXNbb3BlcmF0aW9uTmFtZV1cbiAgICAgICYmIHRoaXMuX2F2YWlsYWJsZVJldHJpZXNbb3BlcmF0aW9uTmFtZV0hID4gMFxuICAgICkge1xuICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllc1tvcGVyYXRpb25OYW1lXSEtLTtcblxuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSAke29wZXJhdGlvbk5hbWV9IHVzZSBhIHJldHJ5IHRpY2tldCwgbm93IG9ubHkgJHt0aGlzLl9hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdfSByZXRyeSBsZWZ0YCk7XG4gICAgICAvLyB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlcnZlckV2ZW50cyhtc2c6IElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2cgfCBJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKCk7XG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVTZXJ2ZXJFdmVudHMobXNnKTtcbiAgICAgIHRoaXMuX3Bvc3RIYW5kbGVTZXJ2ZXJFdmVudHNWYWxpZGl0eUNoZWNrKG1zZyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAvLyBUT0RPOiByZXBvcnRcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogaGFuZGxlIHNlcnZlciBldmVudHMgZmFpbGVkIHdpdGggZXJyb3I6ICcsXG4gICAgICAgIGVcbiAgICAgICk7XG5cbiAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogaGFuZGxlIHNlcnZlciBldmVudHMgZmFpbGVkIHdpdGggZXJyb3I6ICAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oe30sIGUsIHtcbiAgICAgIC8vICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgIC8vICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAvLyAgICAgfSlcbiAgICAgIC8vICAgKX0gXFxuYFxuICAgICAgLy8gKVxuICAgICAgLy8gfVxuXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2hhbmRsZVNlcnZlckV2ZW50cyhtc2c6IElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2cgfCBJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnKSB7XG4gICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1zZztcblxuICAgIGNvbnN0IHsgZXZlbnRzIH0gPSBtc2cubXNnRGF0YTtcbiAgICBjb25zdCB7IG1zZ1R5cGUgfSA9IG1zZztcblxuICAgIGlmICghZXZlbnRzLmxlbmd0aCB8fCAhdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc2Vzc2lvbkluZm8gfSA9IHRoaXM7XG5cbiAgICBsZXQgYWxsQ2hhbmdlRXZlbnRzOiBJU2luZ2xlREJFdmVudFtdO1xuICAgIHRyeSB7XG4gICAgICBhbGxDaGFuZ2VFdmVudHMgPSBldmVudHMubWFwKGdldFB1YmxpY0V2ZW50KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1JFQ0VJVkVfSU5WQUxJRF9TRVJWRVJfREFUQSBhcyBzdHJpbmcsXG4gICAgICAgIGVyck1zZzogZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhZ2dyZWdhdGUgZG9jc1xuICAgIGxldCBkb2NzID0gWy4uLnNlc3Npb25JbmZvLmN1cnJlbnREb2NzXTtcbiAgICBsZXQgaW5pdEVuY291bnRlcmVkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFsbENoYW5nZUV2ZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgY2hhbmdlID0gYWxsQ2hhbmdlRXZlbnRzW2ldO1xuXG4gICAgICBpZiAoc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPj0gY2hhbmdlLmlkKSB7XG4gICAgICAgIGlmICghYWxsQ2hhbmdlRXZlbnRzW2kgLSAxXSB8fCBjaGFuZ2UuaWQgPiBhbGxDaGFuZ2VFdmVudHNbaSAtIDFdLmlkKSB7XG4gICAgICAgICAgLy8gZHVwbGljYXRlIGV2ZW50LCBkcm9wYWJsZVxuICAgICAgICAgIC8vIFRPRE86IHJlcG9ydFxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3JlYWx0aW1lXSBkdXBsaWNhdGUgZXZlbnQgcmVjZWl2ZWQsIGN1ciAke3Nlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkfSBidXQgZ290ICR7Y2hhbmdlLmlkfWApO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhbGxDaGFuZ2VFdmVudHMgc2hvdWxkIGJlIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gZXZlbnRJZCwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVucywgbXVzdCByZXBvcnQgYSBub24tZmF0YWwgZXJyb3JcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbcmVhbHRpbWUgbGlzdGVuZXJdIHNlcnZlciBub24tZmF0YWwgZXJyb3I6IGV2ZW50cyBvdXQgb2Ygb3JkZXIgKHRoZSBsYXR0ZXIgZXZlbnQncyBpZCBpcyBzbWFsbGVyIHRoYW4gdGhhdCBvZiB0aGUgZm9ybWVyKSAocmVxdWVzdElkICR7cmVxdWVzdElkfSlgKTtcblxuICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gc2VydmVyIG5vbi1mYXRhbCBlcnJvcjogZXZlbnRzIG91dCBvZiBvcmRlciAodGhlIGxhdHRlciBldmVudCdzIGlkIGlzIHNtYWxsZXIgdGhhbiB0aGF0IG9mIHRoZSBmb3JtZXIpICAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIC8vICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgIC8vICAgICApXG4gICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgLy8gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmIChzZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA9PT0gY2hhbmdlLmlkIC0gMSkge1xuICAgICAgICAvLyBjb3JyZWN0IHNlcXVlbmNlXG4gICAgICAgIC8vIGZpcnN0IGhhbmRsZSBkYXRhVHlwZSB0aGVuIHF1ZXVlVHlwZTpcbiAgICAgICAgLy8gMS4gZGF0YVR5cGU6IHdlIE9OTFkgcG9wdWxhdGUgY2hhbmdlLmRvYyBpZiBuZWNjZXNzYXJ5XG4gICAgICAgIC8vIDIuIHF1ZXVlVHlwZTogd2UgYnVpbGQgdGhlIGRhdGEgc25hcHNob3RcblxuICAgICAgICBzd2l0Y2ggKGNoYW5nZS5kYXRhVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ3VwZGF0ZSc6IHtcbiAgICAgICAgICAgIC8vIG9ubHkgbmVlZCB0byBwb3B1bGF0ZSBjaGFuZ2UuZG9jIHdoZW4gaXQgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAoIWNoYW5nZS5kb2MpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChjaGFuZ2UucXVldWVUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndXBkYXRlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdkZXF1ZXVlJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxEb2MgPSBkb2NzLmZpbmQoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAobG9jYWxEb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBwYXJ0aWFsIHVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBjbG9uZURlZXAobG9jYWxEb2MpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UudXBkYXRlZEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRQYXRoIGluIGNoYW5nZS51cGRhdGVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQoZG9jLCBmaWVsZFBhdGgsIGNoYW5nZS51cGRhdGVkRmllbGRzW2ZpZWxkUGF0aF0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UucmVtb3ZlZEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRQYXRoIG9mIGNoYW5nZS5yZW1vdmVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bnNldChkb2MsIGZpZWxkUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlLmRvYyA9IGRvYztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCB1cGRhdGUgZGF0YVR5cGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgdXBkYXRlIGRhdGFUeXBlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLiAgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdlbnF1ZXVlJzoge1xuICAgICAgICAgICAgICAgICAgLy8gZG9jIGlzIHByb3ZpZGVkIGJ5IHNlcnZlciwgdGhpcyBzaG91bGQgbmV2ZXIgb2NjdXJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1VORVhQRUNURURfRkFUQUxfRVJST1IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6IGBIYW5kbGVTZXJ2ZXJFdmVudHM6IGZ1bGwgZG9jIGlzIG5vdCBwcm92aWRlZCB3aXRoIGRhdGFUeXBlPVwidXBkYXRlXCIgYW5kIHF1ZXVlVHlwZT1cImVucXVldWVcIiAocmVxdWVzdElkICR7bXNnLnJlcXVlc3RJZH0pYCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdyZXBsYWNlJzoge1xuICAgICAgICAgICAgLy8gdmFsaWRhdGlvblxuICAgICAgICAgICAgaWYgKCFjaGFuZ2UuZG9jKSB7XG4gICAgICAgICAgICAgIC8vIGRvYyBpcyBwcm92aWRlZCBieSBzZXJ2ZXIsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyXG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfVU5FWFBFQ1RFRF9GQVRBTF9FUlJPUiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZXJyTXNnOiBgSGFuZGxlU2VydmVyRXZlbnRzOiBmdWxsIGRvYyBpcyBub3QgcHJvdmlkZWQgd2l0aCBkYXRhVHlwZT1cInJlcGxhY2VcIiAocmVxdWVzdElkICR7bXNnLnJlcXVlc3RJZH0pYCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGRvY3MuZmluZChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKTtcbiAgICAgICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgICAgY2hhbmdlLmRvYyA9IGRvYztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCByZW1vdmUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJyk7XG5cbiAgICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcmVtb3ZlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgLy8gICAgICAge30sXG4gICAgICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gICAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgICAvLyAgICAgKVxuICAgICAgICAgICAgICAvLyAgICl9IFxcbmBcbiAgICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2xpbWl0Jzoge1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UuZG9jKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnF1ZXVlVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RlcXVldWUnOiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBkb2NzLmZpbmQoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kb2MgPSBkb2M7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgbGltaXQgZGF0YVR5cGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5xdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIC8vIGRvYyBpcyBwcm92aWRlZCBieSBzZXJ2ZXIsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9VTkVYUEVDVEVEX0ZBVEFMX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiBgSGFuZGxlU2VydmVyRXZlbnRzOiBmdWxsIGRvYyBpcyBub3QgcHJvdmlkZWQgd2l0aCBkYXRhVHlwZT1cImxpbWl0XCIgYW5kIHF1ZXVlVHlwZT1cImVucXVldWVcIiAocmVxdWVzdElkICR7bXNnLnJlcXVlc3RJZH0pYCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoY2hhbmdlLnF1ZXVlVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2luaXQnOiB7XG4gICAgICAgICAgICBpZiAoIWluaXRFbmNvdW50ZXJlZCkge1xuICAgICAgICAgICAgICBpbml0RW5jb3VudGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBkb2NzID0gW2NoYW5nZS5kb2NdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZG9jcy5wdXNoKGNoYW5nZS5kb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2VucXVldWUnOiB7XG4gICAgICAgICAgICBkb2NzLnB1c2goY2hhbmdlLmRvYyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnZGVxdWV1ZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGluZCA9IGRvY3MuZmluZEluZGV4KGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpO1xuICAgICAgICAgICAgaWYgKGluZCA+IC0xKSB7XG4gICAgICAgICAgICAgIGRvY3Muc3BsaWNlKGluZCwgMSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgZGVxdWV1ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nKTtcblxuICAgICAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBkZXF1ZXVlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgLy8gICAgICAge30sXG4gICAgICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gICAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgICAvLyAgICAgKVxuICAgICAgICAgICAgICAvLyAgICl9IFxcbmBcbiAgICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3VwZGF0ZSc6IHtcbiAgICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGRvY3MgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIC8vICAgICBkb2NzXG4gICAgICAgICAgICAvLyAgICl9IGNoYW5nZSBkb2MgJHtKU09OLnN0cmluZ2lmeShjaGFuZ2UpfSBcXG5gXG4gICAgICAgICAgICAvLyApXG4gICAgICAgICAgICBjb25zdCBpbmQgPSBkb2NzLmZpbmRJbmRleChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKTtcbiAgICAgICAgICAgIGlmIChpbmQgPiAtMSkge1xuICAgICAgICAgICAgICBkb2NzW2luZF0gPSBjaGFuZ2UuZG9jO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVE9ETyByZXBvcnRcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHF1ZXVlVHlwZSB1cGRhdGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJyk7XG5cbiAgICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcXVldWVUeXBlIHVwZGF0ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpID09PSBsZW4gLSAxXG4gICAgICAgICAgfHwgKGFsbENoYW5nZUV2ZW50c1tpICsgMV0gJiYgYWxsQ2hhbmdlRXZlbnRzW2kgKyAxXS5pZCAhPT0gY2hhbmdlLmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBhIHNoYWxsb3cgc2xpY2UgY3JlYXRlcyBhIHNoYWxsb3cgc25hcHNob3RcbiAgICAgICAgICBjb25zdCBkb2NzU25hcHNob3QgPSBbLi4uZG9jc107XG5cbiAgICAgICAgICAvLyB3ZSBzbGljZSBmaXJzdCBjYXVzZScgaWYgdGhlcmUncmUgYWxsQ2hhbmdlRXZlbnRzIHRoYXQgYXJlIG9mIHRoZSBzYW1lIGlkIGFmdGVyIHRoaXMgY2hhbmdlLCB3ZSBkb24ndCB3YW50IHRvIGludm9sdmUgaXQgZm9yIGl0IGlzIHVuZXhwZWN0ZWQgaW52YWxpZCBvcmRlclxuICAgICAgICAgIGNvbnN0IGRvY0NoYW5nZXMgPSBhbGxDaGFuZ2VFdmVudHNcbiAgICAgICAgICAgIC5zbGljZSgwLCBpICsgMSlcbiAgICAgICAgICAgIC5maWx0ZXIoYyA9PiBjLmlkID09PSBjaGFuZ2UuaWQpO1xuXG4gICAgICAgICAgLy8gYWxsIGNoYW5nZXMgb2YgdGhpcyBldmVudCBoYXMgYmVlbiBoYW5kbGUsIHdlIGNvdWxkIGRpc3BhdGNoIHRoZSBldmVudCBub3dcbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID0gY2hhbmdlLmlkO1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudERvY3MgPSBkb2NzO1xuXG4gICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3Qoe1xuICAgICAgICAgICAgaWQ6IGNoYW5nZS5pZCxcbiAgICAgICAgICAgIGRvY0NoYW5nZXMsXG4gICAgICAgICAgICBkb2NzOiBkb2NzU25hcHNob3QsXG4gICAgICAgICAgICBtc2dUeXBlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gUmVwb3J0ZXIuc3Vycm91bmRUaGlyZEJ5VHJ5Q2F0Y2goKCkgPT5cbiAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uQ2hhbmdlKHNuYXBzaG90KTtcbiAgICAgICAgICAvLyApKClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3V0LW9mLW9yZGVyIGV2ZW50XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBUT0RPOiByZXBvcnRcbiAgICAgICAgY29uc29sZS53YXJuKGBbcmVhbHRpbWUgbGlzdGVuZXJdIGV2ZW50IHJlY2VpdmVkIGlzIG91dCBvZiBvcmRlciwgY3VyICR7dGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZH0gYnV0IGdvdCAke2NoYW5nZS5pZH1gKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyByZWJ1aWxkIHdhdGNoXG4gICAgICAgIGF3YWl0IHRoaXMucmVidWlsZFdhdGNoKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wb3N0SGFuZGxlU2VydmVyRXZlbnRzVmFsaWRpdHlDaGVjayhtc2c6IElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2cgfCBJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnKSB7XG4gICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogc2Vzc2lvbkluZm8gbG9zdCBhZnRlciBzZXJ2ZXIgZXZlbnQgaGFuZGxpbmcsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyJyk7XG5cbiAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogc2Vzc2lvbkluZm8gbG9zdCBhZnRlciBzZXJ2ZXIgZXZlbnQgaGFuZGxpbmcsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgIC8vICAgICAgIHt9LFxuICAgICAgLy8gICAgICAge1xuICAgICAgLy8gICAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAvLyAgICAgICB9XG4gICAgICAvLyAgICAgKVxuICAgICAgLy8gICApfSBcXG5gXG4gICAgICAvLyApXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zZXNzaW9uSW5mby5leHBlY3RFdmVudElkXG4gICAgICAmJiB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID49IHRoaXMuc2Vzc2lvbkluZm8uZXhwZWN0RXZlbnRJZFxuICAgICkge1xuICAgICAgdGhpcy5jbGVhcldhaXRFeHBlY3RlZEV2ZW50KCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPCBtc2cubXNnRGF0YS5jdXJyRXZlbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IGNsaWVudCBldmVudElkIGRvZXMgbm90IG1hdGNoIHdpdGggc2VydmVyIGV2ZW50IGlkIGFmdGVyIHNlcnZlciBldmVudCBoYW5kbGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJXYWl0RXhwZWN0ZWRFdmVudCgpIHtcbiAgICBpZiAodGhpcy5fd2FpdEV4cGVjdGVkVGltZW91dElkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fd2FpdEV4cGVjdGVkVGltZW91dElkKTtcbiAgICAgIHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHVibGljRXZlbnQoZXZlbnQ6IElEQkV2ZW50KTogSVNpbmdsZURCRXZlbnQge1xuICBjb25zdCBlOiBJU2luZ2xlREJFdmVudCA9IHtcbiAgICBpZDogZXZlbnQuSUQsXG4gICAgZGF0YVR5cGU6IGV2ZW50LkRhdGFUeXBlLFxuICAgIHF1ZXVlVHlwZTogZXZlbnQuUXVldWVUeXBlLFxuICAgIGRvY0lkOiBldmVudC5Eb2NJRCxcbiAgICBkb2M6IGV2ZW50LkRvYyAmJiBldmVudC5Eb2MgIT09ICd7fScgPyBKU09OLnBhcnNlKGV2ZW50LkRvYykgOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgaWYgKGV2ZW50LkRhdGFUeXBlID09PSAndXBkYXRlJykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoZXZlbnQuVXBkYXRlZEZpZWxkcykge1xuICAgICAgZS51cGRhdGVkRmllbGRzID0gSlNPTi5wYXJzZShldmVudC5VcGRhdGVkRmllbGRzKTtcbiAgICB9XG4gICAgLy8gVE9ETzogd2FpdCBmb3IgdGNiIHRvIGNoYW5nZSByZW1vdmVkRmllbGRzIHRvIFJlbW92ZWRGaWVsZHNcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGV2ZW50LnJlbW92ZWRGaWVsZHMgfHwgZXZlbnQuUmVtb3ZlZEZpZWxkcykge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgLy8gZS5yZW1vdmVkRmllbGRzID0gZXZlbnQucmVtb3ZlZEZpZWxkc1xuICAgICAgLy8gICA/IEpTT04ucGFyc2UoZXZlbnQucmVtb3ZlZEZpZWxkcylcbiAgICAgIC8vICAgOiBKU09OLnBhcnNlKGV2ZW50LlJlbW92ZWRGaWVsZHMpXG4gICAgICBlLnJlbW92ZWRGaWVsZHMgPSBKU09OLnBhcnNlKGV2ZW50LnJlbW92ZWRGaWVsZHMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlO1xufVxuIl19