@vgroup/dialbox 0.8.18 → 0.8.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/components/call-progress/call-progress.component.mjs +120 -10
- package/esm2020/lib/dialbox.component.mjs +15 -72
- package/esm2020/lib/environments/environments.mjs +10 -10
- package/esm2020/lib/service/twilio.service.mjs +70 -10
- package/fesm2015/vgroup-dialbox.mjs +225 -108
- package/fesm2015/vgroup-dialbox.mjs.map +1 -1
- package/fesm2020/vgroup-dialbox.mjs +211 -98
- package/fesm2020/vgroup-dialbox.mjs.map +1 -1
- package/lib/components/call-progress/call-progress.component.d.ts +9 -0
- package/lib/dialbox.component.d.ts +1 -1
- package/lib/service/twilio.service.d.ts +12 -0
- package/package.json +1 -1
|
@@ -24,58 +24,6 @@ export class DialboxComponent {
|
|
|
24
24
|
get isDialpadHidden() {
|
|
25
25
|
return this._isDialpadHidden;
|
|
26
26
|
}
|
|
27
|
-
// Intercept the keyboard refresh shortcuts (F5, Ctrl+R / Cmd+R) so we can
|
|
28
|
-
// show OUR custom-worded confirmation instead of the browser's generic one.
|
|
29
|
-
// @HostListener('window:keydown', ['$event'])
|
|
30
|
-
// handleRefreshShortcut(event: KeyboardEvent) {
|
|
31
|
-
// const isRefreshKey =
|
|
32
|
-
// event.key === 'F5' ||
|
|
33
|
-
// ((event.ctrlKey || event.metaKey) && (event.key === 'r' || event.key === 'R'));
|
|
34
|
-
// if (isRefreshKey && (this.isCallInProgress || this.incomingCallsList?.length)) {
|
|
35
|
-
// // Stop the browser's default refresh so our modal can decide.
|
|
36
|
-
// event.preventDefault();
|
|
37
|
-
// event.returnValue = true;
|
|
38
|
-
// // this.confirmReloadDuringCall();
|
|
39
|
-
// }
|
|
40
|
-
// }
|
|
41
|
-
// private confirmReloadDuringCall() {
|
|
42
|
-
// if (this.isReloadConfirmed) {
|
|
43
|
-
// return;
|
|
44
|
-
// }
|
|
45
|
-
// swal({
|
|
46
|
-
// title: 'Reload page?',
|
|
47
|
-
// text: 'Reloading this page will disconnect your active call. Are you sure you want to continue?',
|
|
48
|
-
// type: 'warning',
|
|
49
|
-
// showCancelButton: true,
|
|
50
|
-
// confirmButtonText: 'Reload',
|
|
51
|
-
// cancelButtonText: 'Cancel',
|
|
52
|
-
// // Tag only THIS modal's container so the z-index override applies to the
|
|
53
|
-
// // reload warning alone, not to other swal error/warning alerts.
|
|
54
|
-
// onBeforeOpen: (modalElement: HTMLElement) => {
|
|
55
|
-
// modalElement?.parentElement?.classList.add('swal-reload-on-top');
|
|
56
|
-
// },
|
|
57
|
-
// })
|
|
58
|
-
// .then(async (result) => {
|
|
59
|
-
// if (!result.value) {
|
|
60
|
-
// // Cancel / dismiss -> stay on the page, keep the call active.
|
|
61
|
-
// return;
|
|
62
|
-
// }
|
|
63
|
-
// // Reload confirmed: tear down the call, then reload. The flag prevents
|
|
64
|
-
// // the native beforeunload dialog from appearing on top of this.
|
|
65
|
-
// this.isReloadConfirmed = true;
|
|
66
|
-
// const conferenceId = this.incomingCallsList?.[0]?.conferenceId;
|
|
67
|
-
// if (conferenceId) {
|
|
68
|
-
// try {
|
|
69
|
-
// await this.extensionService
|
|
70
|
-
// .getRemoveParticipants('all', conferenceId)
|
|
71
|
-
// .toPromise();
|
|
72
|
-
// } catch {
|
|
73
|
-
// // Proceed with reload even if cleanup fails.
|
|
74
|
-
// }
|
|
75
|
-
// }
|
|
76
|
-
// window.location.reload();
|
|
77
|
-
// });
|
|
78
|
-
// }
|
|
79
27
|
beforeUnloadHandler($event) {
|
|
80
28
|
// Already confirmed via our custom modal -> reload silently.
|
|
81
29
|
if (this.isReloadConfirmed) {
|
|
@@ -202,6 +150,17 @@ export class DialboxComponent {
|
|
|
202
150
|
this.incomeingCallSocketService.connect(this.deviceId);
|
|
203
151
|
try {
|
|
204
152
|
this.incomeingCallSocketService.listen().subscribe(async (incomingCallData) => {
|
|
153
|
+
// A special number added to a normal call fails on BE (error already shown), but the socket
|
|
154
|
+
// still sends that participant without an isLeft key, so it showed up as active. Treat it as left.
|
|
155
|
+
if (Array.isArray(incomingCallData)) {
|
|
156
|
+
incomingCallData.forEach((callInfo) => {
|
|
157
|
+
callInfo?.participants?.forEach((participant) => {
|
|
158
|
+
if (participant?.specialCall === true && participant?.isLeft === undefined) {
|
|
159
|
+
participant.isLeft = true;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
}
|
|
205
164
|
this.twilioService.conferenceCallInfo = incomingCallData;
|
|
206
165
|
this.conferenceCallList.emit(incomingCallData);
|
|
207
166
|
this.token = localStorage.getItem('ext_token') || '';
|
|
@@ -276,7 +235,6 @@ export class DialboxComponent {
|
|
|
276
235
|
if (this.incomingCallsList?.length && incomingCallData?.length) {
|
|
277
236
|
this.isCallInProgress = true;
|
|
278
237
|
this.isDialpadHidden = false;
|
|
279
|
-
// this.isLoadershow = false;
|
|
280
238
|
this.isIncomingCallnotification = false;
|
|
281
239
|
this.cdk.detectChanges();
|
|
282
240
|
}
|
|
@@ -287,7 +245,7 @@ export class DialboxComponent {
|
|
|
287
245
|
this.isCallInProgress = true;
|
|
288
246
|
this.cdk.detectChanges();
|
|
289
247
|
}
|
|
290
|
-
else if (!this.isIncomingCallnotification) {
|
|
248
|
+
else if (!this.isIncomingCallnotification && !this.twilioService.isAwaitingSpecialCallConfirm) {
|
|
291
249
|
// Genuinely idle: no answered calls and no ringing notifications → full reset.
|
|
292
250
|
this.callData = [];
|
|
293
251
|
this.incomingCallsList = [];
|
|
@@ -302,16 +260,6 @@ export class DialboxComponent {
|
|
|
302
260
|
}, 2000);
|
|
303
261
|
}
|
|
304
262
|
}
|
|
305
|
-
if (!this.incomingCallsList?.length) {
|
|
306
|
-
// setTimeout(() => {
|
|
307
|
-
// if(!this.incomingCallsList?.length) {
|
|
308
|
-
// this.isCallInProgress = false;
|
|
309
|
-
// this.twilioService.device?.disconnectAll();
|
|
310
|
-
// this.twilioService.spareDevice?.disconnectAll();
|
|
311
|
-
// this.twilioService.acceptedCallList = [];
|
|
312
|
-
// }
|
|
313
|
-
// }, 5000);
|
|
314
|
-
}
|
|
315
263
|
});
|
|
316
264
|
this.token = localStorage.getItem('ext_token') || '';
|
|
317
265
|
this.getContactList();
|
|
@@ -510,13 +458,8 @@ export class DialboxComponent {
|
|
|
510
458
|
this.incomingCallsList.splice(incomingCallIndex, 1);
|
|
511
459
|
this.incomeingCallSocketService.pause();
|
|
512
460
|
this.cdk.detectChanges();
|
|
513
|
-
// if (!this.incomingCallsList?.length) {
|
|
514
|
-
// console.log('407');
|
|
515
|
-
// this.isCallInProgress = false;
|
|
516
|
-
// }
|
|
517
461
|
}
|
|
518
462
|
if (this.connectingIncomingCallId == snapshot?.data?.data?.recordId || this.connectingIncomingCallId == snapshot?.data?.data?.participantId && snapshot?.data?.data?.status != "accepted") {
|
|
519
|
-
// swal("Error", 'Internal Server Error', "error");
|
|
520
463
|
this.twilioService.isConnectingIncomingCallId.next('');
|
|
521
464
|
}
|
|
522
465
|
console.log('test', this.incomingCallsList);
|
|
@@ -1319,10 +1262,10 @@ export class DialboxComponent {
|
|
|
1319
1262
|
}
|
|
1320
1263
|
}
|
|
1321
1264
|
DialboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DialboxComponent, deps: [{ token: i1.TwilioService }, { token: i2.ExtensionService }, { token: i3.IpAddressService }, { token: i2.ExtensionService }, { token: i0.ChangeDetectorRef }, { token: i4.Router }, { token: i5.IncomeingCallSocketService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1322
|
-
DialboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DialboxComponent, selector: "lib-dialbox", inputs: { autoOpenOnIncoming: "autoOpenOnIncoming", contactInfo: "contactInfo", deviceId: "deviceId", userId: "userId", callAction: "callAction", isDialpadHidden: "isDialpadHidden", incomingCallData: "incomingCallData", incomingCallnotification: "incomingCallnotification", updatedTwilioToken: "updatedTwilioToken" }, outputs: { closeDialpadEvent: "closeDialpadEvent", callInitiated: "callInitiated", endCallEvent: "endCallEvent", minimiseEvent: "minimiseEvent", incomingCallsNewInfoEvent: "incomingCallsNewInfoEvent", incomingCallInitiated: "incomingCallInitiated", conferenceCallList: "conferenceCallList", numberDialed: "numberDialed" }, host: { listeners: { "window:beforeunload": "beforeUnloadHandler($event)", "window:unload": "unloadHandler()" } }, viewQueries: [{ propertyName: "dialInputElement", first: true, predicate: ["dialInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <lib-call-progress *ngIf=\"isCallInProgress\" (endCallEvent)=\"endCall()\" (minimiseEvent)=\"onMinimise($event)\"\r\n (muteAllStatusEvent)=\"showDialAlert($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\" [newIncomingCallData]=\"newIncomingCallData\"\r\n [deviceId]=\"deviceId\" [newIncomingCallsList]=\"incomingCallsList\" [missCallInfo]=\"missCallInfo\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\" [selectedCallerId]=\"selectedCallerId\"\r\n [callerIdList]=\"callerIdList\" [callAction]=\"callAction\" [conferenceCallInfo]=\"conferenceCallInfo\"\r\n [newCallConference]=\"newCallConference\" [userSettingInfo]=\"userSettingInfo\"\r\n [cancelConnectingAction]=\"cancelConnectingAction\"\r\n [outgoingContactName]=\"outgoingContactName\"\r\n [incomingFromImage]=\"incomingFromImage\"\r\n (endIncomingCallEvent)=\"endIncomingCall($event)\" (isLoadershown)=\"onLoadershow($event)\" [callData]=\"callData\">\r\n </lib-call-progress>\r\n\r\n <div class=\"loader-wrapper outgoing-call-loader\" *ngIf=\"isLoadershow\">\r\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\r\n <div class=\"call-animation call-animation-play\">\r\n <img class=\"avatar-img\" [src]=\"contactImgForLoader\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\r\n <p style=\"text-transform: capitalize;\">{{ contactNameForLoader || dialedNumber }}</p>\r\n </div>\r\n \r\n <div class=\"call-action-btns\">\r\n <div class=\"d-flex justify-content-center\">\r\n <button class=\"call-btn end-call-btn\" disabled style=\"visibility: hidden;\" (click)=\"cancelConnectingCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\"\r\n *ngIf=\"(!isCallInProgress && !incomingCallsList.length) && !isLoadershow\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\"\r\n (ngModelChange)=\"onDialInputChange($event)\" />\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\"\r\n enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\"\r\n d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \" />\r\n </svg>\r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\"\r\n ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i\r\n class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <div style=\"height: 119px; overflow: auto;\">\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\" />\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.selectedNumber.number}}</p>\r\n </div>\r\n </div>\r\n <div class=\"contact-card\" *ngIf=\"!filteredContactList.length && dialedNumber.length > 2 && !isValidationMessageShow\">\r\n <div class=\"no-contact-message\">\r\n No Contacts Found\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\" (keydown.enter)=\"onEnter(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\" [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress\r\n (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}}\r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text :\r\n ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\"\r\n (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\"\r\n [ngClass]=\"{'visible': !isCallerIdHidden}\">\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span class=\"material-symbols-outlined\" style=\"cursor: pointer\" (click)=\"isCallerIdHidden = true\">\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\"\r\n (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a\r\n routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\"\r\n title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\"\r\n (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px!important;height:600px!important;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.no-contact-message{width:100%;margin:auto 16px;color:#fff}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;border-radius:50%}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;width:36px;height:36px}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;width:36px;height:36px;animation:spin89345 1s linear infinite;position:absolute;top:50%;left:44%;z-index:100000}.loader-wrapper{width:320px;height:600px;z-index:100000;display:block;position:absolute;border-radius:31px}@keyframes spin89345{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.outgoing-call-loader{display:flex;flex-direction:column;justify-content:center;align-items:center}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;display:flex;flex-direction:column;align-items:center}.callerDetails h1,.callerDetails p{margin-top:8px;color:#fff}.call-action-btns{text-align:center;margin-top:90px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}::ng-deep .swal2-container.swal-reload-on-top{z-index:10000000000000!important}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i8.CallProgressComponent, selector: "lib-call-progress", inputs: ["callData", "selectedCallerId", "newIncomingCallData", "newIncomingCallsList", "callerIdList", "newCallConference", "missCallInfo", "userSettingInfo", "deviceId", "callAction", "conferenceCallInfo", "incomingFromImage", "cancelConnectingAction", "outgoingContactName"], outputs: ["endCallEvent", "incomingCallsNewInfo", "minimiseEvent", "muteAllStatusEvent", "incomingCallInitiated", "isLoadershown", "endIncomingCallEvent"] }, { kind: "directive", type: i9.ShortPressDirective, selector: "[shortPress]", outputs: ["shortPress"] }, { kind: "directive", type: i10.LongPressDirective, selector: "[longPress]", outputs: ["longPress"] }] });
|
|
1265
|
+
DialboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DialboxComponent, selector: "lib-dialbox", inputs: { autoOpenOnIncoming: "autoOpenOnIncoming", contactInfo: "contactInfo", deviceId: "deviceId", userId: "userId", callAction: "callAction", isDialpadHidden: "isDialpadHidden", incomingCallData: "incomingCallData", incomingCallnotification: "incomingCallnotification", updatedTwilioToken: "updatedTwilioToken" }, outputs: { closeDialpadEvent: "closeDialpadEvent", callInitiated: "callInitiated", endCallEvent: "endCallEvent", minimiseEvent: "minimiseEvent", incomingCallsNewInfoEvent: "incomingCallsNewInfoEvent", incomingCallInitiated: "incomingCallInitiated", conferenceCallList: "conferenceCallList", numberDialed: "numberDialed" }, host: { listeners: { "window:beforeunload": "beforeUnloadHandler($event)", "window:unload": "unloadHandler()" } }, viewQueries: [{ propertyName: "dialInputElement", first: true, predicate: ["dialInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\n <lib-call-progress *ngIf=\"isCallInProgress\" (endCallEvent)=\"endCall()\" (minimiseEvent)=\"onMinimise($event)\"\n (muteAllStatusEvent)=\"showDialAlert($event)\"\n (incomingCallInitiated)=\"newIncomingCallInitiated()\" [newIncomingCallData]=\"newIncomingCallData\"\n [deviceId]=\"deviceId\" [newIncomingCallsList]=\"incomingCallsList\" [missCallInfo]=\"missCallInfo\"\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\" [selectedCallerId]=\"selectedCallerId\"\n [callerIdList]=\"callerIdList\" [callAction]=\"callAction\" [conferenceCallInfo]=\"conferenceCallInfo\"\n [newCallConference]=\"newCallConference\" [userSettingInfo]=\"userSettingInfo\"\n [cancelConnectingAction]=\"cancelConnectingAction\"\n [outgoingContactName]=\"outgoingContactName\"\n [incomingFromImage]=\"incomingFromImage\"\n (endIncomingCallEvent)=\"endIncomingCall($event)\" (isLoadershown)=\"onLoadershow($event)\" [callData]=\"callData\">\n </lib-call-progress>\n\n <div class=\"loader-wrapper outgoing-call-loader\" *ngIf=\"isLoadershow\">\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\n <div class=\"call-animation call-animation-play\">\n <img class=\"avatar-img\" [src]=\"contactImgForLoader\" alt=\"\" />\n </div>\n <div class=\"callerDetails\">\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\n <p style=\"text-transform: capitalize;\">{{ contactNameForLoader || dialedNumber }}</p>\n </div>\n \n <div class=\"call-action-btns\">\n <div class=\"d-flex justify-content-center\">\n <button class=\"call-btn end-call-btn\" disabled style=\"visibility: hidden;\" (click)=\"cancelConnectingCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Special Call Charges Modal (first call: shown over the \"Connecting...\" loader, same position as .loader-wrapper).\n When a call screen is already open, lib-call-progress shows this modal instead. -->\n <div class=\"loader-wrapper special-call-modal-wrapper\" *ngIf=\"twilioService.specialCallConfirm && !twilioService.specialCallConfirm.inCallScreen\">\n <div class=\"special-call-modal\">\n <div class=\"warning-icon\">\n <span class=\"material-symbols-outlined\">warning</span>\n </div>\n <h3>Call Charges</h3>\n <p *ngIf=\"twilioService.specialCallConfirm?.message\">{{ twilioService.specialCallConfirm?.message }}</p>\n <p *ngIf=\"!twilioService.specialCallConfirm?.message\">\n Additional charges apply to this call. Do you want to proceed?\n </p>\n <div class=\"warning-actions\">\n <button class=\"cancel-btn\" (click)=\"twilioService.resolveSpecialCallConfirm(false)\">\n Cancel\n </button>\n <button class=\"proceed-btn\" (click)=\"twilioService.resolveSpecialCallConfirm(true)\">\n Proceed\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\"\n *ngIf=\"(!isCallInProgress && !incomingCallsList.length) && !isLoadershow\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\n <div class=\"no-selection-alert\">\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\n </div>\n </div>\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"flex-grow-1 my-auto text-left\">\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\n </div>\n <div class=\"text-right\">\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\n </div>\n </div>\n </div>\n </div>\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\n <div class=\"d-flex justify-content-between mt-2\">\n <p></p>\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\">\n <path\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\n </svg>\n </span>\n </div>\n <div class=\"input-box\">\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\"\n (ngModelChange)=\"onDialInputChange($event)\" />\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\"\n enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\"\n d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \" />\n </svg>\n </span>\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\"\n ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i\n class=\"fa fa-info-circle\"></i></span>\n </div>\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\n </div>\n <div style=\"height: 119px; overflow: auto;\">\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\n <div class=\"contact-img\">\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\" />\n <ng-template #alphaName>\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\n </ng-template>\n </div>\n <div class=\"contact-details\">\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\n <p>{{contact.selectedNumber.number}}</p>\n </div>\n </div>\n <div class=\"contact-card\" *ngIf=\"!filteredContactList.length && dialedNumber.length > 2 && !isValidationMessageShow\">\n <div class=\"no-contact-message\">\n No Contacts Found\n </div>\n </div>\n </div>\n </div>\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\n <defs>\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n </div>\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\" (keydown.enter)=\"onEnter(key.num)\"\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\" [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress\n (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\n {{key.num}}\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\n voicemail\n </span>\n <ng-template #otherThanOne>\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text :\n ' '}}</span>\n </ng-template>\n </button>\n </div>\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\"\n (mouseleave)=\"onCallBtnMouseLeave($event)\">\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\n <span class=\"material-symbols-outlined\" style=\"color: white\">\n call\n </span>\n </div>\n </div>\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\n <div>\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\n {{selectedCallerId?.number}}\n </div>\n </div>\n <ng-template #askBlock>\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\n <div class=\"d-flex justify-content-center\">\n <h5 class=\"mb-0\">Select C2C number</h5>\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\n </div>\n </div>\n </ng-template>\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\n <span class=\"guidetext\">Please select a number from below dropdown</span>\n </div>\n </div>\n\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\"\n [ngClass]=\"{'visible': !isCallerIdHidden}\">\n <div style=\"display: flex; justify-content: space-between\">\n <!-- <h4>Select C2C Softphone Number</h4> -->\n <h4>Make outgoing call using</h4>\n <span class=\"material-symbols-outlined\" style=\"cursor: pointer\" (click)=\"isCallerIdHidden = true\">\n close\n </span>\n </div>\n <ul>\n <ng-container *ngFor=\"let callerId of callerIdList\">\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\"\n (click)=\"onDedicatedNumSelect(callerId)\">\n <div>\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\n {{callerId?.number}}\n </div>\n <span>{{callerId?.countryName}}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n </div>\n <ng-template #noCallerIdMessage>\n <span class=\"no-caller-id-message\">To make any voice calls, please <a\n routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\"\n title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\n </span>\n </ng-template>\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\n <div class=\"card dedicatedNumPopup\">\n <div class=\"card-header chooseDedicatedHeader\">\n <h5>Choose C2C Number</h5>\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\n </div>\n <div class=\"card-body dedicatedNumList\">\n <ul>\n <ng-container *ngFor=\"let callerId of callerIdList\">\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\"\n (click)=\"showDedicatedPopup = false\">\n <div>\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\n {{callerId?.number}}\n </div>\n <span>{{callerId?.countryName}}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px!important;height:600px!important;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.no-contact-message{width:100%;margin:auto 16px;color:#fff}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;border-radius:50%}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;width:36px;height:36px}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;width:36px;height:36px;animation:spin89345 1s linear infinite;position:absolute;top:50%;left:44%;z-index:100000}.loader-wrapper{width:320px;height:600px;z-index:100000;display:block;position:absolute;border-radius:31px}@keyframes spin89345{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.outgoing-call-loader{display:flex;flex-direction:column;justify-content:center;align-items:center}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;display:flex;flex-direction:column;align-items:center}.callerDetails h1,.callerDetails p{margin-top:8px;color:#fff}.call-action-btns{text-align:center;margin-top:90px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}::ng-deep .swal2-container.swal-reload-on-top{z-index:10000000000000!important}.special-call-modal-wrapper{display:flex;align-items:center;justify-content:center;z-index:100001;background:rgba(0,0,0,.5)}.special-call-modal{background:#ffffff;width:280px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.special-call-modal .warning-icon{margin-bottom:12px}.special-call-modal .warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.special-call-modal h3{margin-bottom:12px;font-size:20px;font-weight:600;color:#111827!important}.special-call-modal p{color:#555!important;font-size:14px;line-height:1.5;margin-bottom:24px}.special-call-modal p strong{color:#111827!important}.special-call-modal .warning-actions{display:flex;justify-content:center;gap:12px}.special-call-modal .cancel-btn,.special-call-modal .proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.special-call-modal .cancel-btn{background:#e5e7eb;color:#111827}.special-call-modal .proceed-btn{background:#234de8;color:#fff}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i8.CallProgressComponent, selector: "lib-call-progress", inputs: ["callData", "selectedCallerId", "newIncomingCallData", "newIncomingCallsList", "callerIdList", "newCallConference", "missCallInfo", "userSettingInfo", "deviceId", "callAction", "conferenceCallInfo", "incomingFromImage", "cancelConnectingAction", "outgoingContactName"], outputs: ["endCallEvent", "incomingCallsNewInfo", "minimiseEvent", "muteAllStatusEvent", "incomingCallInitiated", "isLoadershown", "endIncomingCallEvent"] }, { kind: "directive", type: i9.ShortPressDirective, selector: "[shortPress]", outputs: ["shortPress"] }, { kind: "directive", type: i10.LongPressDirective, selector: "[longPress]", outputs: ["longPress"] }] });
|
|
1323
1266
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DialboxComponent, decorators: [{
|
|
1324
1267
|
type: Component,
|
|
1325
|
-
args: [{ selector: 'lib-dialbox', template: "<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <lib-call-progress *ngIf=\"isCallInProgress\" (endCallEvent)=\"endCall()\" (minimiseEvent)=\"onMinimise($event)\"\r\n (muteAllStatusEvent)=\"showDialAlert($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\" [newIncomingCallData]=\"newIncomingCallData\"\r\n [deviceId]=\"deviceId\" [newIncomingCallsList]=\"incomingCallsList\" [missCallInfo]=\"missCallInfo\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\" [selectedCallerId]=\"selectedCallerId\"\r\n [callerIdList]=\"callerIdList\" [callAction]=\"callAction\" [conferenceCallInfo]=\"conferenceCallInfo\"\r\n [newCallConference]=\"newCallConference\" [userSettingInfo]=\"userSettingInfo\"\r\n [cancelConnectingAction]=\"cancelConnectingAction\"\r\n [outgoingContactName]=\"outgoingContactName\"\r\n [incomingFromImage]=\"incomingFromImage\"\r\n (endIncomingCallEvent)=\"endIncomingCall($event)\" (isLoadershown)=\"onLoadershow($event)\" [callData]=\"callData\">\r\n </lib-call-progress>\r\n\r\n <div class=\"loader-wrapper outgoing-call-loader\" *ngIf=\"isLoadershow\">\r\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\r\n <div class=\"call-animation call-animation-play\">\r\n <img class=\"avatar-img\" [src]=\"contactImgForLoader\" alt=\"\" />\r\n </div>\r\n <div class=\"callerDetails\">\r\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\r\n <p style=\"text-transform: capitalize;\">{{ contactNameForLoader || dialedNumber }}</p>\r\n </div>\r\n \r\n <div class=\"call-action-btns\">\r\n <div class=\"d-flex justify-content-center\">\r\n <button class=\"call-btn end-call-btn\" disabled style=\"visibility: hidden;\" (click)=\"cancelConnectingCall()\">\r\n <span class=\"material-symbols-outlined\"> call_end </span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\"\r\n *ngIf=\"(!isCallInProgress && !incomingCallsList.length) && !isLoadershow\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\">\r\n <path\r\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\"\r\n (ngModelChange)=\"onDialInputChange($event)\" />\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\"\r\n enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\"\r\n d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \" />\r\n </svg>\r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\"\r\n ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i\r\n class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <div style=\"height: 119px; overflow: auto;\">\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\" />\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.selectedNumber.number}}</p>\r\n </div>\r\n </div>\r\n <div class=\"contact-card\" *ngIf=\"!filteredContactList.length && dialedNumber.length > 2 && !isValidationMessageShow\">\r\n <div class=\"no-contact-message\">\r\n No Contacts Found\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\r\n <defs>\r\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\" (keydown.enter)=\"onEnter(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\" [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress\r\n (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}}\r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text :\r\n ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\"\r\n (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\"\r\n [ngClass]=\"{'visible': !isCallerIdHidden}\">\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span class=\"material-symbols-outlined\" style=\"cursor: pointer\" (click)=\"isCallerIdHidden = true\">\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\"\r\n (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a\r\n routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\"\r\n title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\"\r\n (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px!important;height:600px!important;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.no-contact-message{width:100%;margin:auto 16px;color:#fff}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;border-radius:50%}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;width:36px;height:36px}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;width:36px;height:36px;animation:spin89345 1s linear infinite;position:absolute;top:50%;left:44%;z-index:100000}.loader-wrapper{width:320px;height:600px;z-index:100000;display:block;position:absolute;border-radius:31px}@keyframes spin89345{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.outgoing-call-loader{display:flex;flex-direction:column;justify-content:center;align-items:center}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;display:flex;flex-direction:column;align-items:center}.callerDetails h1,.callerDetails p{margin-top:8px;color:#fff}.call-action-btns{text-align:center;margin-top:90px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}::ng-deep .swal2-container.swal-reload-on-top{z-index:10000000000000!important}\n"] }]
|
|
1268
|
+
args: [{ selector: 'lib-dialbox', template: "<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\n <lib-call-progress *ngIf=\"isCallInProgress\" (endCallEvent)=\"endCall()\" (minimiseEvent)=\"onMinimise($event)\"\n (muteAllStatusEvent)=\"showDialAlert($event)\"\n (incomingCallInitiated)=\"newIncomingCallInitiated()\" [newIncomingCallData]=\"newIncomingCallData\"\n [deviceId]=\"deviceId\" [newIncomingCallsList]=\"incomingCallsList\" [missCallInfo]=\"missCallInfo\"\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\" [selectedCallerId]=\"selectedCallerId\"\n [callerIdList]=\"callerIdList\" [callAction]=\"callAction\" [conferenceCallInfo]=\"conferenceCallInfo\"\n [newCallConference]=\"newCallConference\" [userSettingInfo]=\"userSettingInfo\"\n [cancelConnectingAction]=\"cancelConnectingAction\"\n [outgoingContactName]=\"outgoingContactName\"\n [incomingFromImage]=\"incomingFromImage\"\n (endIncomingCallEvent)=\"endIncomingCall($event)\" (isLoadershown)=\"onLoadershow($event)\" [callData]=\"callData\">\n </lib-call-progress>\n\n <div class=\"loader-wrapper outgoing-call-loader\" *ngIf=\"isLoadershow\">\n <div class=\"active-call\" style=\"display: flex; flex-direction: column; position: relative;\">\n <div class=\"call-animation call-animation-play\">\n <img class=\"avatar-img\" [src]=\"contactImgForLoader\" alt=\"\" />\n </div>\n <div class=\"callerDetails\">\n <h1 style=\"margin-top: 8px;\">Connecting...</h1>\n <p style=\"text-transform: capitalize;\">{{ contactNameForLoader || dialedNumber }}</p>\n </div>\n \n <div class=\"call-action-btns\">\n <div class=\"d-flex justify-content-center\">\n <button class=\"call-btn end-call-btn\" disabled style=\"visibility: hidden;\" (click)=\"cancelConnectingCall()\">\n <span class=\"material-symbols-outlined\"> call_end </span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Special Call Charges Modal (first call: shown over the \"Connecting...\" loader, same position as .loader-wrapper).\n When a call screen is already open, lib-call-progress shows this modal instead. -->\n <div class=\"loader-wrapper special-call-modal-wrapper\" *ngIf=\"twilioService.specialCallConfirm && !twilioService.specialCallConfirm.inCallScreen\">\n <div class=\"special-call-modal\">\n <div class=\"warning-icon\">\n <span class=\"material-symbols-outlined\">warning</span>\n </div>\n <h3>Call Charges</h3>\n <p *ngIf=\"twilioService.specialCallConfirm?.message\">{{ twilioService.specialCallConfirm?.message }}</p>\n <p *ngIf=\"!twilioService.specialCallConfirm?.message\">\n Additional charges apply to this call. Do you want to proceed?\n </p>\n <div class=\"warning-actions\">\n <button class=\"cancel-btn\" (click)=\"twilioService.resolveSpecialCallConfirm(false)\">\n Cancel\n </button>\n <button class=\"proceed-btn\" (click)=\"twilioService.resolveSpecialCallConfirm(true)\">\n Proceed\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\"\n *ngIf=\"(!isCallInProgress && !incomingCallsList.length) && !isLoadershow\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\n <div class=\"no-selection-alert\">\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\n </div>\n </div>\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\n <div class=\"d-flex justify-content-between\">\n <div class=\"flex-grow-1 my-auto text-left\">\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\n </div>\n <div class=\"text-right\">\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\n </div>\n </div>\n </div>\n </div>\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\n <div class=\"d-flex justify-content-between mt-2\">\n <p></p>\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\">\n <path\n d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\" />\n </svg>\n </span>\n </div>\n <div class=\"input-box\">\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\"\n (ngModelChange)=\"onDialInputChange($event)\" />\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\"\n enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\"\n d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \" />\n </svg>\n </span>\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\"\n ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i\n class=\"fa fa-info-circle\"></i></span>\n </div>\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\n </div>\n <div style=\"height: 119px; overflow: auto;\">\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\n <div class=\"contact-img\">\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\" />\n <ng-template #alphaName>\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\n </ng-template>\n </div>\n <div class=\"contact-details\">\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\n <p>{{contact.selectedNumber.number}}</p>\n </div>\n </div>\n <div class=\"contact-card\" *ngIf=\"!filteredContactList.length && dialedNumber.length > 2 && !isValidationMessageShow\">\n <div class=\"no-contact-message\">\n No Contacts Found\n </div>\n </div>\n </div>\n </div>\n <div class=\"wave-container\">\n <svg class=\"waves\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n viewBox=\"0 24 150 28\" preserveAspectRatio=\"none\" shape-rendering=\"auto\">\n <defs>\n <path id=\"gentle-wave\" d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\" />\n </defs>\n <g class=\"parallax\">\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"0\" fill=\"rgba(255,255,255,0.7)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"3\" fill=\"rgba(255,255,255,0.5)\" />\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\n </g>\n </svg>\n </div>\n </div>\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\" (keydown.enter)=\"onEnter(key.num)\"\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\" [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress\n (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\n {{key.num}}\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\n voicemail\n </span>\n <ng-template #otherThanOne>\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text :\n ' '}}</span>\n </ng-template>\n </button>\n </div>\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\"\n (mouseleave)=\"onCallBtnMouseLeave($event)\">\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\n <span class=\"material-symbols-outlined\" style=\"color: white\">\n call\n </span>\n </div>\n </div>\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\n <div>\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\n {{selectedCallerId?.number}}\n </div>\n </div>\n <ng-template #askBlock>\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\n <div class=\"d-flex justify-content-center\">\n <h5 class=\"mb-0\">Select C2C number</h5>\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\n </div>\n </div>\n </ng-template>\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\n <span class=\"guidetext\">Please select a number from below dropdown</span>\n </div>\n </div>\n\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\"\n [ngClass]=\"{'visible': !isCallerIdHidden}\">\n <div style=\"display: flex; justify-content: space-between\">\n <!-- <h4>Select C2C Softphone Number</h4> -->\n <h4>Make outgoing call using</h4>\n <span class=\"material-symbols-outlined\" style=\"cursor: pointer\" (click)=\"isCallerIdHidden = true\">\n close\n </span>\n </div>\n <ul>\n <ng-container *ngFor=\"let callerId of callerIdList\">\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\"\n (click)=\"onDedicatedNumSelect(callerId)\">\n <div>\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\n {{callerId?.number}}\n </div>\n <span>{{callerId?.countryName}}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n </div>\n <ng-template #noCallerIdMessage>\n <span class=\"no-caller-id-message\">To make any voice calls, please <a\n routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\"\n title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\n </span>\n </ng-template>\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\n <div class=\"card dedicatedNumPopup\">\n <div class=\"card-header chooseDedicatedHeader\">\n <h5>Choose C2C Number</h5>\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\n </div>\n <div class=\"card-body dedicatedNumList\">\n <ul>\n <ng-container *ngFor=\"let callerId of callerIdList\">\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\"\n (click)=\"showDedicatedPopup = false\">\n <div>\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\n {{callerId?.number}}\n </div>\n <span>{{callerId?.countryName}}</span>\n </li>\n </ng-container>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px!important;height:600px!important;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.no-contact-message{width:100%;margin:auto 16px;color:#fff}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;border-radius:50%}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;width:36px;height:36px}.loader{border:4px solid rgb(123 122 122 / 87%);border-left-color:transparent;width:36px;height:36px;animation:spin89345 1s linear infinite;position:absolute;top:50%;left:44%;z-index:100000}.loader-wrapper{width:320px;height:600px;z-index:100000;display:block;position:absolute;border-radius:31px}@keyframes spin89345{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.outgoing-call-loader{display:flex;flex-direction:column;justify-content:center;align-items:center}.call-animation{background:#fff;width:100px;height:100px;position:relative;margin:20px auto 0;border-radius:100%;border:solid 4px #fff;display:flex;align-items:center;justify-content:center}.call-animation:before{position:absolute;content:\"\";top:0;left:0;width:100%;height:100%;backface-visibility:hidden;border-radius:50%}.call-animation-play{animation:play 3s linear infinite}.avatar-img{width:94px;height:94px;border-radius:100%}@keyframes play{0%{transform:scale(1)}15%{box-shadow:0 0 0 2px #fff6}25%{box-shadow:0 0 0 4px #fff6,0 0 0 8px #fff3}25%{box-shadow:0 0 0 8px #fff6,0 0 0 16px #fff3}50%{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3}to{box-shadow:0 0 0 10px #fff6,0 0 0 20px #fff3;transform:scale(1.1);opacity:0}}.callerDetails{margin-top:8px;display:flex;flex-direction:column;align-items:center}.callerDetails h1,.callerDetails p{margin-top:8px;color:#fff}.call-action-btns{text-align:center;margin-top:90px}.end-call-btn{background-color:#e14e4e}.end-call-btn span{color:#fff!important}.call-btn span{color:#234de8}.call-sec-btn,.mic-btn{position:relative;box-sizing:border-box;border:1px solid #cccbcb;background-color:transparent;border-radius:25px;padding:12px;box-shadow:6px 6px 10px -1px #bebebe26,-5px -4px 10px -1px #d2d2d226;width:50px;height:50px}.mic-btn{padding:5px;width:37px;height:37px}::ng-deep .swal2-container.swal-reload-on-top{z-index:10000000000000!important}.special-call-modal-wrapper{display:flex;align-items:center;justify-content:center;z-index:100001;background:rgba(0,0,0,.5)}.special-call-modal{background:#ffffff;width:280px;border-radius:18px;padding:24px;text-align:center;box-shadow:0 10px 30px #00000040}.special-call-modal .warning-icon{margin-bottom:12px}.special-call-modal .warning-icon .material-symbols-outlined{font-size:48px;color:#f59e0b}.special-call-modal h3{margin-bottom:12px;font-size:20px;font-weight:600;color:#111827!important}.special-call-modal p{color:#555!important;font-size:14px;line-height:1.5;margin-bottom:24px}.special-call-modal p strong{color:#111827!important}.special-call-modal .warning-actions{display:flex;justify-content:center;gap:12px}.special-call-modal .cancel-btn,.special-call-modal .proceed-btn{border:none;padding:10px 18px;border-radius:8px;cursor:pointer;font-weight:600}.special-call-modal .cancel-btn{background:#e5e7eb;color:#111827}.special-call-modal .proceed-btn{background:#234de8;color:#fff}\n"] }]
|
|
1326
1269
|
}], ctorParameters: function () { return [{ type: i1.TwilioService }, { type: i2.ExtensionService }, { type: i3.IpAddressService }, { type: i2.ExtensionService }, { type: i0.ChangeDetectorRef }, { type: i4.Router }, { type: i5.IncomeingCallSocketService }]; }, propDecorators: { autoOpenOnIncoming: [{
|
|
1327
1270
|
type: Input
|
|
1328
1271
|
}], contactInfo: [{
|
|
@@ -1367,4 +1310,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
1367
1310
|
type: HostListener,
|
|
1368
1311
|
args: ['window:unload']
|
|
1369
1312
|
}] } });
|
|
1370
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRW5NLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUcvQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUE7Ozs7Ozs7Ozs7OztBQVluQyxNQUFNLE9BQU8sZ0JBQWdCO0lBaUIzQixJQUFhLGVBQWUsQ0FBQyxLQUFjO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLDZEQUE2RDtZQUM3RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFNRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQWlFRCwwRUFBMEU7SUFDMUUsNEVBQTRFO0lBQzVFLDhDQUE4QztJQUM5QyxnREFBZ0Q7SUFDaEQseUJBQXlCO0lBQ3pCLDRCQUE0QjtJQUM1QixzRkFBc0Y7SUFFdEYscUZBQXFGO0lBQ3JGLHFFQUFxRTtJQUNyRSw4QkFBOEI7SUFDOUIsZ0NBQWdDO0lBQ2hDLHlDQUF5QztJQUN6QyxNQUFNO0lBQ04sSUFBSTtJQUVKLHNDQUFzQztJQUN0QyxrQ0FBa0M7SUFDbEMsY0FBYztJQUNkLE1BQU07SUFDTixXQUFX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TTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNpQixnQkFBZ0I7c0JBQXZDLFNBQVM7dUJBQUMsV0FBVztnQkFDWixZQUFZO3NCQUFyQixNQUFNO2dCQWdIUCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcUIvQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUd2lsaW9TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlL3R3aWxpby5zZXJ2aWNlJztcclxuaW1wb3J0IHN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xyXG5pbXBvcnQgeyBFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlL2V4dGVuc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsga2V5cGFkIH0gZnJvbSAnLi4va2V5cGFkJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgSXBBZGRyZXNzU2VydmljZSB9IGZyb20gJy4vc2VydmljZS9pcC1hZGRyZXNzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDYWxsIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xyXG5pbXBvcnQgeyBJbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZSB9IGZyb20gJy4vc2VydmljZS9pbmNvbWVpbmctY2FsbC1zb2NrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWRpYWxib3gnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kaWFsYm94LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kaWFsYm94LmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlhbGJveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcclxuICBwcml2YXRlIF9pc0RpYWxwYWRIaWRkZW46IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8vIExldCB0aGUgbGlicmFyeSBkZWNpZGUgdG8gYXV0by1vcGVuIG9uIGluY29taW5nIGNhbGwgd2l0aG91dCBob3N0IHdpcmluZ1xyXG4gIEBJbnB1dCgpIGF1dG9PcGVuT25JbmNvbWluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgY29udGFjdEluZm86IGFueTtcclxuICBASW5wdXQoKSBkZXZpY2VJZDogYW55O1xyXG4gIEBJbnB1dCgpIHVzZXJJZDogYW55O1xyXG4gIEBJbnB1dCgpIGNhbGxBY3Rpb246IGFueTtcclxuICBpc0xvYWRlcnNob3cgPSBmYWxzZTtcclxuICBpc0luY29taW5nQ2FsbG5vdGlmaWNhdGlvbjogYW55ID0gZmFsc2U7XHJcbiAgbm90aWZpY2F0aW9uQ2FsbExpc3Q6IGFueSA9IFtdO1xyXG4gIGRldmljZU51bWJlckxpc3Q6IGFueVtdID0gW107XHJcbiAgbWlzc0NhbGxJbmZvOiBhbnkgPSB7fTtcclxuICBjb25uZWN0aW5nSW5jb21pbmdDYWxsSWQ6IHN0cmluZyA9ICcnO1xyXG4gIG5ld0NhbGxDb25mZXJlbmNlOiBhbnk7XHJcbiAgdXNlclNldHRpbmdJbmZvOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpIHNldCBpc0RpYWxwYWRIaWRkZW4odmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzRGlhbHBhZEhpZGRlbiA9IHZhbHVlO1xyXG4gICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAvLyBXaGVuIGRpYWxwYWQgYmVjb21lcyB2aXNpYmxlLCBlbnN1cmUgVHdpbGlvIGlzIGluaXRpYWxpemVkXHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVR3aWxpbygpO1xyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKSBpbmNvbWluZ0NhbGxEYXRhOiBhbnlcclxuICBASW5wdXQoKSBpbmNvbWluZ0NhbGxub3RpZmljYXRpb246IGFueTtcclxuICBASW5wdXQoKSB1cGRhdGVkVHdpbGlvVG9rZW46IHN0cmluZyA9ICcnO1xyXG4gIGNvbmZlcmVuY2VDYWxsSW5mbzogYW55ID0ge307XHJcbiAgaXNWYWxpZGF0aW9uTWVzc2FnZVNob3cgPSBmYWxzZVxyXG4gIGdldCBpc0RpYWxwYWRIaWRkZW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNEaWFscGFkSGlkZGVuO1xyXG4gIH1cclxuICBAT3V0cHV0KCkgY2xvc2VEaWFscGFkRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgY2FsbEluaXRpYXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZW5kQ2FsbEV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIG1pbmltaXNlRXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0luZm9FdmVudDogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbEluaXRpYXRlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBjb25mZXJlbmNlQ2FsbExpc3Q6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAVmlld0NoaWxkKCdkaWFsSW5wdXQnKSBkaWFsSW5wdXRFbGVtZW50ITogRWxlbWVudFJlZjtcclxuICBAT3V0cHV0KCkgbnVtYmVyRGlhbGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgLy8gTmV3IG9iamVjdCByZWZlcmVuY2UgZWFjaCB0aW1lIENhbmNlbCBpcyBjbGlja2VkLCBzbyBsaWItY2FsbC1wcm9ncmVzcydzIG5nT25DaGFuZ2VzXHJcbiAgLy8gZmlyZXMgZXZlbiBpZiB0aGUgY29tcG9uZW50IHdhc24ndCBtb3VudGVkIHlldCBhdCBjbGljayB0aW1lLlxyXG4gIGNhbmNlbENvbm5lY3RpbmdBY3Rpb246IGFueSA9IG51bGw7XHJcblxyXG4gIGlzQ2FsbEluUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBrZXlwYWRWYWwgPSBrZXlwYWQ7XHJcbiAgc2hvd0lucHV0Q2xlYXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaWFsZWROdW1iZXI6IHN0cmluZyA9ICcnO1xyXG4gIGNvbnRhY3RMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkQ29udGFjdExpc3Q6IGFueVtdID0gW107XHJcbiAgY2FsbGVySWRMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkQ2FsbGVySWQ6IGFueTtcclxuICBpc0NhbGxlcklkSGlkZGVuOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc1RyaWFsUGVyaW9kT3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzUGF5bWVudER1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcclxuICB0b2FzdFRpbWVvdXQgPSA3MDAwO1xyXG4gIGNhbGxOdW1iZXJUb2FzdCA9IHtcclxuICAgIHNob3c6IGZhbHNlLFxyXG4gICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxyXG4gICAgbnVtYmVyOiAnJyxcclxuICAgIGRpc3BsYXlOdW06ICcnXHJcbiAgfVxyXG4gIGNhbGxEYXRhOiBhbnkgPSB7XHJcbiAgICBwaG9uZTogJycsXHJcbiAgICBkaXNwbGF5TnVtOiAnJyxcclxuICAgIGRpYWw6IGZhbHNlLFxyXG4gICAgbmFtZTogJycsXHJcbiAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgIGV4dE51bTogJydcclxuICB9O1xyXG4gIGxhc3REaWFsZWQ6IHsgbmFtZT86IHN0cmluZzsgaW1hZ2U/OiBzdHJpbmc7IG51bWJlcjogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcclxuICBzYW5pdGl6ZWROdW06IGFueTtcclxuICBkaWFsQWxlcnQgPSB7XHJcbiAgICBtc2c6ICcnLFxyXG4gICAgc2hvdzogZmFsc2VcclxuICB9XHJcbiAgdG9rZW4/OiBzdHJpbmc7XHJcbiAgc2hvd0RlZGljYXRlZFBvcHVwOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbmV3SW5jb21pbmdDYWxsczogYW55ID0gW107XHJcbiAgaW5jb21pbmdDYWxsc0xpc3Q6IGFueSA9IFtdO1xyXG4gIG5ld0luY29taW5nQ2FsbERhdGE/OiBDYWxsO1xyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIGNhbGxQcmVmZXJlbmNlOiBhbnk7XHJcbiAgc2hha2VEZWRpY2F0ZWRCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1NtYXJ0RGlhbENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAvLyBTZXQgb25jZSB0aGUgdXNlciBjb25maXJtcyBhbiBpbnRlbnRpb25hbCByZWxvYWQgdmlhIG91ciBjdXN0b20gbW9kYWwsXHJcbiAgLy8gc28gdGhlIG5hdGl2ZSBiZWZvcmV1bmxvYWQgcHJvbXB0IGlzIG5vdCBzaG93biBvbiB0b3Agb2YgaXQuXHJcbiAgcHJpdmF0ZSBpc1JlbG9hZENvbmZpcm1lZCA9IGZhbHNlO1xyXG4gIG51bGxQYXJ0aWNpcGFudENhbGxMaXN0OiBhbnkgPVtdXHJcbiAgY29udGFjdE5hbWVGb3JMb2FkZXIgPSAnJztcclxuICBjb250YWN0SW1nRm9yTG9hZGVyID0gJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xyXG4gIGluY29taW5nRnJvbUltYWdlID0gJyc7XHJcbiAgLy8gSW50ZXJjZXB0IHRoZSBrZXlib2FyZCByZWZyZXNoIHNob3J0Y3V0cyAoRjUsIEN0cmwrUiAvIENtZCtSKSBzbyB3ZSBjYW5cclxuICAvLyBzaG93IE9VUiBjdXN0b20td29yZGVkIGNvbmZpcm1hdGlvbiBpbnN0ZWFkIG9mIHRoZSBicm93c2VyJ3MgZ2VuZXJpYyBvbmUuXHJcbiAgLy8gQEhvc3RMaXN0ZW5lcignd2luZG93OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIC8vIGhhbmRsZVJlZnJlc2hTaG9ydGN1dChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gIC8vICAgY29uc3QgaXNSZWZyZXNoS2V5ID1cclxuICAvLyAgICAgZXZlbnQua2V5ID09PSAnRjUnIHx8XHJcbiAgLy8gICAgICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiAoZXZlbnQua2V5ID09PSAncicgfHwgZXZlbnQua2V5ID09PSAnUicpKTtcclxuXHJcbiAgLy8gICBpZiAoaXNSZWZyZXNoS2V5ICYmICh0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgfHwgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoKSkge1xyXG4gIC8vICAgICAvLyBTdG9wIHRoZSBicm93c2VyJ3MgZGVmYXVsdCByZWZyZXNoIHNvIG91ciBtb2RhbCBjYW4gZGVjaWRlLlxyXG4gIC8vICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIC8vICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IHRydWU7XHJcbiAgLy8gICAgIC8vIHRoaXMuY29uZmlybVJlbG9hZER1cmluZ0NhbGwoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIHByaXZhdGUgY29uZmlybVJlbG9hZER1cmluZ0NhbGwoKSB7XHJcbiAgLy8gICBpZiAodGhpcy5pc1JlbG9hZENvbmZpcm1lZCkge1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy8gICBzd2FsKHtcclxuICAvLyAgICAgdGl0bGU6ICdSZWxvYWQgcGFnZT8nLFxyXG4gIC8vICAgICB0ZXh0OiAnUmVsb2FkaW5nIHRoaXMgcGFnZSB3aWxsIGRpc2Nvbm5lY3QgeW91ciBhY3RpdmUgY2FsbC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPycsXHJcbiAgLy8gICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAvLyAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcclxuICAvLyAgICAgY29uZmlybUJ1dHRvblRleHQ6ICdSZWxvYWQnLFxyXG4gIC8vICAgICBjYW5jZWxCdXR0b25UZXh0OiAnQ2FuY2VsJyxcclxuICAvLyAgICAgLy8gVGFnIG9ubHkgVEhJUyBtb2RhbCdzIGNvbnRhaW5lciBzbyB0aGUgei1pbmRleCBvdmVycmlkZSBhcHBsaWVzIHRvIHRoZVxyXG4gIC8vICAgICAvLyByZWxvYWQgd2FybmluZyBhbG9uZSwgbm90IHRvIG90aGVyIHN3YWwgZXJyb3Ivd2FybmluZyBhbGVydHMuXHJcbiAgLy8gICAgIG9uQmVmb3JlT3BlbjogKG1vZGFsRWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcclxuICAvLyAgICAgICBtb2RhbEVsZW1lbnQ/LnBhcmVudEVsZW1lbnQ/LmNsYXNzTGlzdC5hZGQoJ3N3YWwtcmVsb2FkLW9uLXRvcCcpO1xyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgfSlcclxuICAvLyAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xyXG4gIC8vICAgICAgIGlmICghcmVzdWx0LnZhbHVlKSB7XHJcbiAgLy8gICAgICAgICAvLyBDYW5jZWwgLyBkaXNtaXNzIC0+IHN0YXkgb24gdGhlIHBhZ2UsIGtlZXAgdGhlIGNhbGwgYWN0aXZlLlxyXG4gIC8vICAgICAgICAgcmV0dXJuO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICAvLyBSZWxvYWQgY29uZmlybWVkOiB0ZWFyIGRvd24gdGhlIGNhbGwsIHRoZW4gcmVsb2FkLiBUaGUgZmxhZyBwcmV2ZW50c1xyXG4gIC8vICAgICAgIC8vIHRoZSBuYXRpdmUgYmVmb3JldW5sb2FkIGRpYWxvZyBmcm9tIGFwcGVhcmluZyBvbiB0b3Agb2YgdGhpcy5cclxuICAvLyAgICAgICB0aGlzLmlzUmVsb2FkQ29uZmlybWVkID0gdHJ1ZTtcclxuICAvLyAgICAgICBjb25zdCBjb25mZXJlbmNlSWQgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0Py5bMF0/LmNvbmZlcmVuY2VJZDtcclxuICAvLyAgICAgICBpZiAoY29uZmVyZW5jZUlkKSB7XHJcbiAgLy8gICAgICAgICB0cnkge1xyXG4gIC8vICAgICAgICAgICBhd2FpdCB0aGlzLmV4dGVuc2lvblNlcnZpY2VcclxuICAvLyAgICAgICAgICAgICAuZ2V0UmVtb3ZlUGFydGljaXBhbnRzKCdhbGwnLCBjb25mZXJlbmNlSWQpXHJcbiAgLy8gICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gIC8vICAgICAgICAgfSBjYXRjaCB7XHJcbiAgLy8gICAgICAgICAgIC8vIFByb2NlZWQgd2l0aCByZWxvYWQgZXZlbiBpZiBjbGVhbnVwIGZhaWxzLlxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgLy8gICAgIH0pO1xyXG4gIC8vIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmJlZm9yZXVubG9hZCcsIFsnJGV2ZW50J10pXHJcbiAgYmVmb3JlVW5sb2FkSGFuZGxlcigkZXZlbnQ6IGFueSkge1xyXG4gICAgLy8gQWxyZWFkeSBjb25maXJtZWQgdmlhIG91ciBjdXN0b20gbW9kYWwgLT4gcmVsb2FkIHNpbGVudGx5LlxyXG4gICAgaWYgKHRoaXMuaXNSZWxvYWRDb25maXJtZWQpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIC8vIEZhbGxiYWNrIGZvciB0aGUgYnJvd3NlcidzIHJlZnJlc2ggYnV0dG9uIC8gdGFiIGNsb3NlLCB3aGljaCBjYW5ub3QgYmVcclxuICAgIC8vIGludGVyY2VwdGVkIHdpdGggYSBjdXN0b20gbW9kYWwuIFRyaWdnZXJzIHRoZSBuYXRpdmUgY29uZmlybWF0aW9uIHNvIHRoZVxyXG4gICAgLy8gdXNlciBkb2VzIG5vdCBsb3NlIHRoZSBjYWxsIGFjY2lkZW50YWxseS4gKEJyb3dzZXIgY29udHJvbHMgdGhlIHdvcmRpbmcuKVxyXG4gICAgaWYgKHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyB8fCB0aGlzLmluY29taW5nQ2FsbHNMaXN0Py5sZW5ndGgpIHtcclxuXHJcbiAgICAgIGNvbnN0IGNvbmZpcm1hdGlvbk1lc3NhZ2UgPSAnUmVsb2FkaW5nIHRoaXMgcGFnZSB3aWxsIGRpc2Nvbm5lY3QgeW91ciBhY3RpdmUgY2FsbC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPyc7XHJcbiAgICAgICAkZXZlbnQucmV0dXJuVmFsdWUgPSBjb25maXJtYXRpb25NZXNzYWdlIDtcclxuICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgcmV0dXJuIGNvbmZpcm1hdGlvbk1lc3NhZ2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnVubG9hZCcpXHJcbiAgdW5sb2FkSGFuZGxlcigpIHtcclxuICAgIC8vIFNraXAgaWYgd2UgYWxyZWFkeSByZW1vdmVkIHBhcnRpY2lwYW50cyBpbiB0aGUgY3VzdG9tLW1vZGFsIGZsb3cuXHJcbiAgICBpZiAodGhpcy5pc1JlbG9hZENvbmZpcm1lZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHdpbGlvU2VydmljZTogVHdpbGlvU2VydmljZSxcclxuICAgIHByaXZhdGUgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgaXBTZXJ2aWNlOiBJcEFkZHJlc3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZGs6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2U6IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLFxyXG4gICkge1xyXG4gICAgLy8gSW5pdGlhbGl6ZSBpZiBkaWFscGFkIGlzIHZpc2libGUgYnkgZGVmYXVsdFxyXG4gICAgaWYgKCF0aGlzLmlzRGlhbHBhZEhpZGRlbikge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVUd2lsaW8oKTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UuY3JlYXRlQXVkaW9CYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVUd2lsaW8oKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLnRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIHx8ICcnO1xyXG4gICAgICBpZiAoIXRoaXMudG9rZW4pIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBUd2lsaW8gc2VydmljZVxyXG4gICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaW5pdGlhbGl6ZVR3aWxpb0RldmljZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGV2aWNlSWQnKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIEVuc3VyZSBUd2lsaW8gaXMgaW5pdGlhbGl6ZWQgZXZlbiB3aGVuIGRpYWxwYWQgc3RhcnRzIGhpZGRlbixcclxuICAgIC8vIHNvIHdlIGNhbiBhdXRvLW9wZW4gb24gaW5jb21pbmcgY2FsbHMuXHJcbiAgICB0aGlzLmluaXRpYWxpemVUd2lsaW8oKTtcclxuICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UuY29ubmVjdCh0aGlzLmRldmljZUlkKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UubGlzdGVuKCkuc3Vic2NyaWJlKGFzeW5jIChpbmNvbWluZ0NhbGxEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvID0gaW5jb21pbmdDYWxsRGF0YTtcclxuICAgICAgICB0aGlzLmNvbmZlcmVuY2VDYWxsTGlzdC5lbWl0KGluY29taW5nQ2FsbERhdGEpO1xyXG4gICAgICAgIHRoaXMudG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfHwgJyc7XHJcbiAgICAgICAgaWYgKHRoaXMudG9rZW4gPT0gJ2xvZ291dCcpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZvdW5kJyk7XHJcbiAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuZGV2aWNlPy5kaXNjb25uZWN0QWxsKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEZpbHRlciBvdXQgY29uZmVyZW5jZXMgd2l0aCBubyBwYXJ0aWNpcGFudHNcclxuICAgICAgICBpbmNvbWluZ0NhbGxEYXRhID0gaW5jb21pbmdDYWxsRGF0YT8ubGVuZ3RoID4gMFxyXG4gICAgICAgICAgPyBpbmNvbWluZ0NhbGxEYXRhLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcnRpY2lwYW50cz8ubGVuZ3RoID4gMClcclxuICAgICAgICAgIDogW107XHJcbiAgICAgICAgLy8gQWxsIGNvbmZlcmVuY2VJZHMgcmVjZWl2ZWQgZnJvbSBzb2NrZXQgdGhpcyB0aWNrXHJcbiAgICAgICAgY29uc3Qgc29ja2V0Q29uZmVyZW5jZUlkczogc3RyaW5nW10gPSBpbmNvbWluZ0NhbGxEYXRhLm1hcCgoYzogYW55KSA9PiBjLmNvbmZlcmVuY2VJZCk7XHJcblxyXG4gICAgICAgIGluY29taW5nQ2FsbERhdGEuZm9yRWFjaCgoY2FsbEluZm86IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgV0UgYXJlIGFuIGFjdGl2ZSBwYXJ0aWNpcGFudCBpbiB0aGlzIGNvbmZlcmVuY2VcclxuICAgICAgICAgIGNvbnN0IG91ck51bWJlciA9IGNhbGxJbmZvPy5wYXJ0aWNpcGFudHMuZmluZCgocmVzRGF0YTogYW55KSA9PlxyXG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHJlc0RhdGE/LmNsaWVudCAmJiAocmVzRGF0YT8uaG9zdCAmJiBjYWxsSW5mby5jYWxsU291cmNlID09ICdEaWFscGFkJyB8fCAhcmVzRGF0YT8uaG9zdCkpIHx8XHJcbiAgICAgICAgICAgICAgKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy50bykgJiYgcmVzRGF0YT8uZGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyAmJiByZXNEYXRhPy5jbGllbnQpXHJcbiAgICAgICAgICAgICkgJiYgIXJlc0RhdGE/LmlzTGVmdCk7XHJcblxyXG4gICAgICAgICAgLy8gTWF0Y2ggdGhlIEFDVElWRSBjb25mZXJlbmNlIGVudHJ5IG9ubHkg4oCUIG5ldmVyIGEgcGVuZGluZyBpbmNvbWluZy1jYWxsXHJcbiAgICAgICAgICAvLyBub3RpZmljYXRpb24sIHdoaWNoIGNhbiBzaGFyZSB0aGlzIGNvbmZlcmVuY2VJZCBidXQgbXVzdCBub3QgYmUgb3ZlcndyaXR0ZW5cclxuICAgICAgICAgIC8vIHdpdGggc29ja2V0IGRhdGEgKGl0IGlzIGtleWVkL21hbmFnZWQgc2VwYXJhdGVseSBieSBwYXJ0aWNpcGFudElkKS5cclxuICAgICAgICAgIGNvbnN0IGNhbGxJbmRleCA9IHRoaXMuaW5jb21pbmdDYWxsc0xpc3QuZmluZEluZGV4KChyZXM6IGFueSkgPT4gcmVzLmNvbmZlcmVuY2VJZCA9PSBjYWxsSW5mby5jb25mZXJlbmNlSWQgJiYgIXJlcz8uX2lzTm90aWZpY2F0aW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAob3VyTnVtYmVyPy5pZCkge1xyXG4gICAgICAgICAgICAvLyBXZSBhcmUgaW4gdGhpcyBjYWxsIOKAlCB1cGRhdGUgZXhpc3Rpbmcgb3IgYWRkIG5ld1xyXG4gICAgICAgICAgICBpZiAoY2FsbEluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0W2NhbGxJbmRleF0gPSB7IC4uLnRoaXMuaW5jb21pbmdDYWxsc0xpc3RbY2FsbEluZGV4XSwgLi4uY2FsbEluZm8gfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnB1c2goeyAuLi5jYWxsSW5mbyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gV2UgYXJlIE5PVCBhIHBhcnRpY2lwYW50IOKAlCByZW1vdmUgZnJvbSBpbmNvbWluZ0NhbGxzTGlzdCBvbmx5IGlmIGl0IGlzIE5PVCBhbiBpbmNvbWluZy1jYWxsIG5vdGlmaWNhdGlvblxyXG4gICAgICAgICAgICBpZiAoY2FsbEluZGV4ID4gLTEgJiYgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdFtjYWxsSW5kZXhdPy5jYWxsRGlyZWN0aW9uICE9PSAnaW5jb21pbmctY2FsbCcpIHtcclxuICAgICAgICAgICAgICAvLyBGSVg6IHNwbGljZShpbmRleCwgZGVsZXRlQ291bnQpIOKAlCB3YXMgaW5jb3JyZWN0bHkgc3BsaWNlKDEsIGNhbGxJbmRleClcclxuICAgICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnNwbGljZShjYWxsSW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGFjdGl2ZS1jYWxsIGVudHJpZXMgd2hvc2UgY29uZmVyZW5jZUlkIGlzIG5vIGxvbmdlciBpbiB0aGUgc29ja2V0XHJcbiAgICAgICAgLy8gYnV0IGtlZXAgaW5jb21pbmctY2FsbCBub3RpZmljYXRpb25zICh0aGV5IGFyZSBtYW5hZ2VkIGJ5IG5vdGlmaWNhdGlvbkNhbGxMaXN0IGV4cGlyeSlcclxuICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKHJlczogYW55KSA9PlxyXG4gICAgICAgICAgc29ja2V0Q29uZmVyZW5jZUlkcy5pbmNsdWRlcyhyZXMuY29uZmVyZW5jZUlkKSB8fCByZXMuY2FsbERpcmVjdGlvbiA9PT0gJ2luY29taW5nLWNhbGwnXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBSZW1vdmUgZXhwaXJlZCBub3RpZmljYXRpb24gZW50cmllc1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LmZpbHRlcihcclxuICAgICAgICAgIChyZXM6IGFueSkgPT4gcmVzLmVuZFRpbWUgPj0gbmV3IERhdGUoKS5nZXRUaW1lKClcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIE1lcmdlIG5vdGlmaWNhdGlvbkNhbGxMaXN0IE9OQ0UgKG5vdCBpbnNpZGUgZm9yRWFjaCkuIEEgcGVuZGluZyBpbmNvbWluZy1jYWxsXHJcbiAgICAgICAgLy8gbm90aWZpY2F0aW9uIGlzIGlkZW50aWZpZWQgYnkgaXRzIE9XTiBwYXJ0aWNpcGFudElkIOKAlCBuZXZlciBieSBjb25mZXJlbmNlSWQg4oCUXHJcbiAgICAgICAgLy8gYmVjYXVzZSBpdCBjYW4gbGVnaXRpbWF0ZWx5IHNoYXJlIHRoZSBjb25mZXJlbmNlSWQgb2YgYSBjb25mZXJlbmNlIHdlIGFyZSBhbHJlYWR5XHJcbiAgICAgICAgLy8gaW4gKGUuZy4gd2hlbiBhIHNlY29uZCBvbmUgb2Ygb3VyIG51bWJlcnMgaXMgaW52aXRlZCBpbnRvIHRoYXQgc2FtZSBjb25mZXJlbmNlKS5cclxuICAgICAgICAvLyBPbmx5IHNraXAgYSBub3RpZmljYXRpb24gaWYgYW4gaWRlbnRpY2FsIG9uZSAoc2FtZSBwYXJ0aWNpcGFudElkKSBpcyBhbHJlYWR5IHByZXNlbnQuXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdOb3RpZmljYXRpb25QYXJ0aWNpcGFudElkcyA9IG5ldyBTZXQoXHJcbiAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0XHJcbiAgICAgICAgICAgIC5maWx0ZXIoKHI6IGFueSkgPT4gcj8uX2lzTm90aWZpY2F0aW9uKVxyXG4gICAgICAgICAgICAubWFwKChyOiBhbnkpID0+IHI/LnBhcnRpY2lwYW50SWQpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBub3RpZmljYXRpb25zVG9BZGQgPSB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LmZpbHRlcihcclxuICAgICAgICAgIChuOiBhbnkpID0+ICFleGlzdGluZ05vdGlmaWNhdGlvblBhcnRpY2lwYW50SWRzLmhhcyhuPy5wYXJ0aWNpcGFudElkKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IFsuLi50aGlzLmluY29taW5nQ2FsbHNMaXN0LCAuLi5ub3RpZmljYXRpb25zVG9BZGRdO1xyXG4gICAgICAgIC8vIEZpbmFsIGRlZHVwbGljYXRpb24uIEFjdGl2ZSBjb25mZXJlbmNlIGVudHJpZXMgYXJlIGtleWVkIGJ5IGNvbmZlcmVuY2VJZCAoc29ja2V0IGRhdGFcclxuICAgICAgICAvLyB3aW5zIOKAlCBsYXN0IHdyaXRlIHdpbnMpLiBQZW5kaW5nIGluY29taW5nLWNhbGwgbm90aWZpY2F0aW9ucyBhcmUga2V5ZWQgaW4gYSBTRVBBUkFURVxyXG4gICAgICAgIC8vIG5hbWVzcGFjZSBieSBwYXJ0aWNpcGFudElkLCBzbyBhIG5vdGlmaWNhdGlvbiBhbmQgYW4gYWN0aXZlIGNvbmZlcmVuY2UgdGhhdCBzaGFyZSB0aGVcclxuICAgICAgICAvLyBzYW1lIGNvbmZlcmVuY2VJZCBCT1RIIHN1cnZpdmUgKHRoZSBzZWNvbmQtbnVtYmVyIHNjZW5hcmlvKSBpbnN0ZWFkIG9mIHJlcGxhY2luZyBlYWNoIG90aGVyLlxyXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmluY29taW5nQ2FsbHNMaXN0KSB7XHJcbiAgICAgICAgICBjb25zdCBrZXkgPSBpdGVtPy5faXNOb3RpZmljYXRpb25cclxuICAgICAgICAgICAgPyBgbm90aWY6JHtpdGVtPy5wYXJ0aWNpcGFudElkfWBcclxuICAgICAgICAgICAgOiBgY29uZjoke2l0ZW0/LmNvbmZlcmVuY2VJZH1gO1xyXG4gICAgICAgICAgc2Vlbi5zZXQoa2V5LCBpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGZpbmFsTGlzdCA9IEFycmF5LmZyb20oc2Vlbi52YWx1ZXMoKSk7XHJcblxyXG4gICAgICAgIC8vIFJlbW92ZSBhbnkgbm90aWZpY2F0aW9uIGVudHJ5IGlmIGFuIGFjdGl2ZSBjb25mZXJlbmNlIHdpdGggdGhlIHNhbWUgY29uZmVyZW5jZUlkIGFscmVhZHkgZXhpc3RzXHJcbiAgICAgICAgLy8gYWRkZWQgZm9yIDc0NzIgYnVnXHJcbiAgICAgICAgY29uc3QgYWN0aXZlQ29uZmVyZW5jZUlkcyA9IG5ldyBTZXQoXHJcbiAgICAgICAgICBmaW5hbExpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+ICFpdGVtLl9pc05vdGlmaWNhdGlvbikubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uY29uZmVyZW5jZUlkKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgZmluYWxMaXN0ID0gZmluYWxMaXN0LmZpbHRlcihcclxuICAgICAgICAgIChpdGVtOiBhbnkpID0+ICEoaXRlbS5faXNOb3RpZmljYXRpb24gJiYgYWN0aXZlQ29uZmVyZW5jZUlkcy5oYXMoaXRlbS5jb25mZXJlbmNlSWQpKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IGZpbmFsTGlzdDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCAmJiBpbmNvbWluZ0NhbGxEYXRhPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gdGhpcy5pc0xvYWRlcnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxub3RpZmljYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgaGFzUGVuZGluZ05vdGlmaWNhdGlvbnMgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnNvbWUoXHJcbiAgICAgICAgICAgIChyZXM6IGFueSkgPT4gcmVzPy5faXNOb3RpZmljYXRpb24gfHwgcmVzPy5jYWxsRGlyZWN0aW9uID09PSAnaW5jb21pbmctY2FsbCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBjb25zdCBoYXNBY2NlcHRlZENhbGxzID0gdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3Q/Lmxlbmd0aCA+IDA7XHJcblxyXG4gICAgICAgICAgaWYgKChoYXNBY2NlcHRlZENhbGxzIHx8IGhhc1BlbmRpbmdOb3RpZmljYXRpb25zKSAmJiB0aGlzLmluY29taW5nQ2FsbHNMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0luY29taW5nQ2FsbG5vdGlmaWNhdGlvbikge1xyXG4gICAgICAgICAgICAvLyBHZW51aW5lbHkgaWRsZTogbm8gYW5zd2VyZWQgY2FsbHMgYW5kIG5vIHJpbmdpbmcgbm90aWZpY2F0aW9ucyDihpIgZnVsbCByZXNldC5cclxuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnMzQ0Jyk7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuZGV2aWNlPy5kaXNjb25uZWN0QWxsKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2Uuc3BhcmVEZXZpY2U/LmRpc2Nvbm5lY3RBbGwoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5hY2NlcHRlZENhbGxMaXN0ID0gW107XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIXRoaXMuaW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGlmKCF0aGlzLmluY29taW5nQ2FsbHNMaXN0Py5sZW5ndGgpIHtcclxuICAgICAgICAgICAgLy8gICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gICB0aGlzLnR3aWxpb1NlcnZpY2UuZGV2aWNlPy5kaXNjb25uZWN0QWxsKCk7XHJcbiAgICAgICAgICAgIC8vICAgdGhpcy50d2lsaW9TZXJ2aWNlLnNwYXJlRGV2aWNlPy5kaXNjb25uZWN0QWxsKCk7XHJcbiAgICAgICAgICAgIC8vICAgdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3QgPSBbXTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgLy8gfSwgNTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy50b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB8fCAnJztcclxuICAgICAgdGhpcy5nZXRDb250YWN0TGlzdCgpO1xyXG4gICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuaXNMb2FkZXJzaG93LnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGVyc2hvdyA9IHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICB9KTtcclxuICAgICAgLy8gRklYOiAuZmlsdGVyKCkgcmV0dXJucyBhIG5ldyBhcnJheSDigJQgbXVzdCBhc3NpZ24gYmFjayB0byBhY3R1YWxseSBtdXRhdGUgdGhlIGxpc3RzXHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pc0FjY2VwdElJbmNvbWluZ0NhbGwuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIGByZXNgIGlzIGVpdGhlciBhIHBsYWluIGNvbmZlcmVuY2VJZCAobGVnYWN5KSBvciB7IGNvbmZlcmVuY2VJZCwgcGFydGljaXBhbnRJZCB9LlxyXG4gICAgICAgIGNvbnN0IGFjY2VwdGVkQ29uZmVyZW5jZUlkID0gdHlwZW9mIHJlcyA9PT0gJ3N0cmluZycgPyByZXMgOiByZXM/LmNvbmZlcmVuY2VJZDtcclxuICAgICAgICBjb25zdCBhY2NlcHRlZFBhcnRpY2lwYW50SWQgPSB0eXBlb2YgcmVzID09PSAnc3RyaW5nJyA/IG51bGwgOiByZXM/LnBhcnRpY2lwYW50SWQ7XHJcblxyXG4gICAgICAgIGlmIChhY2NlcHRlZFBhcnRpY2lwYW50SWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdCA9IHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgICAoY2FsbDogYW55KSA9PiBjYWxsPy5wYXJ0aWNpcGFudElkICE9IGFjY2VwdGVkUGFydGljaXBhbnRJZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcihcclxuICAgICAgICAgICAgKGNhbGw6IGFueSkgPT5cclxuICAgICAgICAgICAgICAhKChjYWxsPy5wYXJ0aWNpcGFudElkID09IGFjY2VwdGVkUGFydGljaXBhbnRJZCB8fCBjYWxsPy5pZCA9PSBhY2NlcHRlZFBhcnRpY2lwYW50SWQpICYmXHJcbiAgICAgICAgICAgICAgICBjYWxsPy5jYWxsRGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJylcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIExlZ2FjeSBmYWxsYmFjazogcmVtb3ZlIGJ5IGNvbmZlcmVuY2VJZC5cclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LmZpbHRlcigoY2FsbDogYW55KSA9PiBjYWxsPy5jb25mZXJlbmNlSWQgIT0gYWNjZXB0ZWRDb25mZXJlbmNlSWQpO1xyXG4gICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IHRoaXMuaW5jb21pbmdDYWxsc0xpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgICAoY2FsbDogYW55KSA9PiBjYWxsPy5jb25mZXJlbmNlSWQgIT0gYWNjZXB0ZWRDb25mZXJlbmNlSWQgfHwgY2FsbD8uY2FsbERpcmVjdGlvbiAhPSAnaW5jb21pbmctY2FsbCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcclxuICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzQ29ubmVjdGluZ0luY29taW5nQ2FsbElkLnN1YnNjcmliZSgoY2FsbElkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0aW5nSW5jb21pbmdDYWxsSWQgPSBjYWxsSWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBzdWIxID0gdGhpcy50d2lsaW9TZXJ2aWNlLmRpYWxOdW1iZXJGcm9tT3RoZXJNb2R1bGUuc3Vic2NyaWJlKChjb250YWN0OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoY29udGFjdC5udW1iZXIpIHtcclxuICAgICAgICAgIHRoaXMuaXNTbWFydERpYWxDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoY29udGFjdC5pc0RpYWxGcm9tSGlzdG9yeSkge1xyXG4gICAgICAgICAgICAvL2hhbmRsZSBkaWFsaW5nIGZyb20gaGlzdG9yeSBwYWdlXHJcbiAgICAgICAgICAgIGlmIChjb250YWN0LmNhbGxlcklkID09ICdzbWFydERpYWxpbmcnKSB7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IHsgbnVtYmVyOiBjb250YWN0LmZyb20gfTtcclxuICAgICAgICAgICAgICB0aGlzLmlzU21hcnREaWFsQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBjb250YWN0Lm51bWJlcjtcclxuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBjb250YWN0Lm5hbWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0LmltZztcclxuICAgICAgICAgICAgICB0aGlzLm91dGdvaW5nQ29udGFjdE5hbWUgPSBjb250YWN0Lm5hbWU7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5mcm9tID0gY29udGFjdC5mcm9tO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oY29udGFjdCk7XHJcbiAgICAgICAgICAgICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5wdXNoKGNvbnRhY3QpXHJcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWF0ZUNhbGwoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnMjgyJywgY29udGFjdClcclxuICAgICAgICAgICAgICB0aGlzLmdldFVzZXJJbmZvcm1hdGlvbihjb250YWN0KTtcclxuICAgICAgICAgICAgICB0aGlzLmRpYWxlZE51bWJlciA9IGNvbnRhY3QubnVtYmVyO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb250YWN0LmNhbGxlcklkID09ICdhbHdheXNBc2snIHx8IGNvbnRhY3QuY2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpIHtcclxuICAgICAgICAgICAgICB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgICAgICAgICAgICB0aGlzLmRpYWxlZE51bWJlciA9IGNvbnRhY3QubnVtYmVyO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gY29udGFjdC5udW1iZXI7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gY29udGFjdC5uYW1lO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gY29udGFjdC5pbWc7XHJcbiAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBjb250YWN0Lm51bWJlcjtcclxuICAgICAgICAgICAgICB0aGlzLmluaXRpYXRlQ2FsbCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIC8vIGhhbmRsZSBpbmNvbWluZyBjYWxsIChtYW5hZ2VkIGludGVybmFsbHk7IGhvc3QgbmVlZCBub3QgcGFzcyBpbmNvbWluZ0NhbGxEYXRhKVxyXG4gICAgICBjb25zdCBzdWIyID0gdGhpcy50d2lsaW9TZXJ2aWNlLmN1cnJlbnRDYWxsLnN1YnNjcmliZSgoaW5jb21pbmdDYWxsRGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKGluY29taW5nQ2FsbERhdGEpIHtcclxuICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc1Nob3dJbmNvbWluZ0NhbGwgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMuYXV0b09wZW5PbkluY29taW5nICYmIHRoaXMuX2lzRGlhbHBhZEhpZGRlbikge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5pc0NhbGxJblByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxscy5wdXNoKGluY29taW5nQ2FsbERhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGluY29taW5nQ2FsbERhdGFbJ2lzRmlyc3RDYWxsJ10gPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gaW5jb21pbmdDYWxsRGF0YS5wYXJhbWV0ZXJzWydGcm9tJ107XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGluY29taW5nQ2FsbERhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCduYW1lJyk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaXNJbmNvbWluZ0NhbGwgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjb25zdCBzdWIzID0gdGhpcy50d2lsaW9TZXJ2aWNlLmluY29taW5nQ2FsbE5vdGlmaWNhdGlvbi5zdWJzY3JpYmUoKG5vdGlmaWNhdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maW5kSW5kZXgoKHJlc0luZm86IGFueSk9PiByZXNJbmZvPy5jb25mZXJlbmNlSWQgPT0gbm90aWZpY2F0aW9uPy5jb25mZXJlbmNlSWQpXHJcbiAgICAgICAgICBpZihpbmRleCA9PSAtMSkge1xyXG4gICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmlzSW5jb21pbmdDYWxsbm90aWZpY2F0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIGxldCBjYWxsZXJJbmZvOiBhbnk7XHJcbiAgICAgICAgICBsZXQgbnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzKSA9PiByZXMubnVtYmVyKVxyXG4gICAgICAgICAgICBpZiAoIW51bWJlckxpc3QuaW5jbHVkZXMobm90aWZpY2F0aW9uPy5mcm9tTnVtYmVyKSkge1xyXG4gICAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24/LmMyY0J1c2luZXNzICE9ICdmYWxzZScgJiYgbm90aWZpY2F0aW9uPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0VXNlckluZm9ybWF0aW9uKG5vdGlmaWNhdGlvbj8ucGFydGljaXBhbnRJZCkuc3Vic2NyaWJlKChyZXNJbmZvOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY2FsbGVySW5mbyA9IHJlc0luZm8/LmMyY0luZm9ybWF0aW9uIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbE5vdGlmaWNhdGlvbihjYWxsZXJJbmZvLCBub3RpZmljYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24oe30sIG5vdGlmaWNhdGlvbik7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdGcm9tSW1hZ2UgPSAnJztcclxuICAgICAgICAgICAgaWYobm90aWZpY2F0aW9uPy5mcm9tSW1hZ2Upe1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdGcm9tSW1hZ2UgPSBub3RpZmljYXRpb24/LmZyb21JbWFnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWIxKTtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWIyKTtcclxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWIzKTtcclxuICAgICAgdGhpcy5nZXRVc2VyU2V0dGluZ3MoKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhOiBhbnkpIHtcclxuICAgIGxldCBkYXRhID0gdGhpcy5mcm9tRW50cmllcyhBcnJheS5mcm9tKGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5lbnRyaWVzKCkpKTtcclxuICAgIGlmKGRhdGFbJ3R3aWxpb0F1dGhJZCddKSB7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oZGF0YVsndHdpbGlvQXV0aElkJ10pLnN1YnNjcmliZShcclxuICAgICAgICByZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICBpbmNvbWluZ0NhbGxEYXRhWyd1c2VySW5mbyddID0gcmVzcG9uc2VcclxuICAgICAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiBlbnRyaWVzLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIGFueT4pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5yZWdpc3RlckRyYWdFbGVtZW50KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlc1snaW5jb21pbmdDYWxsbm90aWZpY2F0aW9uJ10/LmN1cnJlbnRWYWx1ZSAmJiB0aGlzLmluY29taW5nQ2FsbG5vdGlmaWNhdGlvbiAmJiB0aGlzLmluY29taW5nQ2FsbG5vdGlmaWNhdGlvbj8uZGF0YT8uY29udGVudCAhPSBcIlZvaWNlbWFpbFwiKSB7XHJcbiAgICAgIC8vIENhcHR1cmUgc25hcHNob3QgaW1tZWRpYXRlbHkgc28gYXN5bmMgY2FsbGJhY2tzIGFsd2F5cyB1c2UgdGhpcyBjYWxsJ3MgZGF0YSxcclxuICAgICAgLy8gbm90IHdoYXRldmVyIHRoaXMuaW5jb21pbmdDYWxsbm90aWZpY2F0aW9uIHBvaW50cyB0byB3aGVuIHRoZXkgZXZlbnR1YWxseSBydW4uXHJcbiAgICAgIGNvbnNvbGUubG9nKCdub3RpZmljYXRpb25mcm9tQkUnLCB0aGlzLmluY29taW5nQ2FsbG5vdGlmaWNhdGlvbik7XHJcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5pbmNvbWluZ0NhbGxub3RpZmljYXRpb247XHJcbiAgICAgIGxldCBpbmRleCA9IHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QuZmluZEluZGV4KChyZXNJbmZvOiBhbnkpPT4gcmVzSW5mbz8uY29uZmVyZW5jZUlkID09IHNuYXBzaG90Py5kYXRhPy5kYXRhPy5jb25mZXJlbmNlSWQpXHJcbiAgICAgIC8vIGluY29taW5nIGNhbGwgZGV0YWlsIGZyb20gbm90aWZhY3Rpb25cclxuICAgICAgaWYgKGluZGV4ID09IC0xICYmIHNuYXBzaG90Py5kYXRhPy5jb250ZW50ID09IFwiSW5jb21pbmdDYWxsXCIgJiYgc25hcHNob3Q/LmRhdGE/LmRhdGE/LnN0YXR1cyAhPSBcInJlamVjdGVkXCIgJiYgc25hcHNob3Q/LmRhdGE/LmRhdGE/LnN0YXR1cyAhPSBcImFjY2VwdGVkXCIpIHtcclxuICAgICAgICAvLyB0aGlzLmlzSW5jb21pbmdDYWxsbm90aWZpY2F0aW9uID0gdHJ1ZTtcclxuICAgICAgICAvLyBsZXQgY2FsbGVySW5mbzogYW55O1xyXG4gICAgICAgIC8vIGxldCBudW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXMpID0+IHJlcy5udW1iZXIpXHJcbiAgICAgICAgLy8gaWYgKCFudW1iZXJMaXN0LmluY2x1ZGVzKHNuYXBzaG90LmRhdGEuZGF0YT8uZnJvbU51bWJlcikpIHtcclxuICAgICAgICAvLyAgIGlmIChzbmFwc2hvdC5kYXRhPy5kYXRhPy5jMmNCdXNpbmVzcyAhPSAnZmFsc2UnICYmIHNuYXBzaG90LmRhdGEuZGF0YT8ucGFydGljaXBhbnRJZCkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0VXNlckluZm9ybWF0aW9uKHNuYXBzaG90LmRhdGEuZGF0YT8ucGFydGljaXBhbnRJZCkuc3Vic2NyaWJlKChyZXNJbmZvOiBhbnkpID0+IHtcclxuICAgICAgICAvLyAgICAgICBjYWxsZXJJbmZvID0gcmVzSW5mbz8uYzJjSW5mb3JtYXRpb24gfHwge307XHJcbiAgICAgICAgLy8gICAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24oY2FsbGVySW5mbywgc25hcHNob3QpO1xyXG4gICAgICAgIC8vICAgICB9KVxyXG4gICAgICAgIC8vICAgfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24oe30sIHNuYXBzaG90KTtcclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gdGhpcy5pbmNvbWluZ0Zyb21JbWFnZSA9ICcnO1xyXG4gICAgICAgIC8vIGlmKHNuYXBzaG90LmRhdGEuZGF0YT8uZnJvbUltYWdlKXtcclxuICAgICAgICAvLyAgIHRoaXMuaW5jb21pbmdGcm9tSW1hZ2UgPSBzbmFwc2hvdC5kYXRhLmRhdGE/LmZyb21JbWFnZVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgfSBlbHNlIGlmIChzbmFwc2hvdD8uZGF0YT8uY29udGVudCA9PSBcIk1pc3NlZCBDYWxsXCIgfHwgc25hcHNob3Q/LmRhdGE/LmRhdGE/LnN0YXR1cyA9PSBcInJlamVjdGVkXCIgfHwgc25hcHNob3Q/LmRhdGE/LmRhdGE/LnN0YXR1cyA9PSBcImFjY2VwdGVkXCIpIHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0ID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maWx0ZXIoKGNhbGw6IGFueSkgPT4gY2FsbD8ucGFydGljaXBhbnRJZCAhPSBzbmFwc2hvdD8uZGF0YT8uZGF0YT8ucmVjb3JkSWQgJiYgY2FsbD8ucGFydGljaXBhbnRJZCAhPSBzbmFwc2hvdD8uZGF0YT8uZGF0YT8ucGFydGljaXBhbnRJZCk7XHJcbiAgICAgICAgdGhpcy5taXNzQ2FsbEluZm8gPSBzbmFwc2hvdDtcclxuICAgICAgICBsZXQgaW5jb21pbmdDYWxsSW5kZXggPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbmRJbmRleCgoY2FsbDogYW55KSA9PiAoY2FsbD8ucGFydGljaXBhbnRJZCA9PSBzbmFwc2hvdD8uZGF0YT8uZGF0YT8ucmVjb3JkSWQgfHwgY2FsbC5wYXJ0aWNpcGFudElkID09IHNuYXBzaG90Py5kYXRhPy5kYXRhPy5wYXJ0aWNpcGFudElkKSAmJiBjYWxsPy5jYWxsRGlyZWN0aW9uID09ICdpbmNvbWluZy1jYWxsJyk7XHJcbiAgICAgICAgICBpZiAoaW5jb21pbmdDYWxsSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnaW5jb21pbmdDYWxsSW5kZXgnLCBpbmNvbWluZ0NhbGxJbmRleCwgc25hcHNob3QpO1xyXG4gICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnNwbGljZShpbmNvbWluZ0NhbGxJbmRleCwgMSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICAgICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAvLyBpZiAoIXRoaXMuaW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKCc0MDcnKTtcclxuICAgICAgICAgICAgLy8gICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYodGhpcy5jb25uZWN0aW5nSW5jb21pbmdDYWxsSWQgPT0gc25hcHNob3Q/LmRhdGE/LmRhdGE/LnJlY29yZElkIHx8IHRoaXMuY29ubmVjdGluZ0luY29taW5nQ2FsbElkID09IHNuYXBzaG90Py5kYXRhPy5kYXRhPy5wYXJ0aWNpcGFudElkICYmIHNuYXBzaG90Py5kYXRhPy5kYXRhPy5zdGF0dXMgIT0gXCJhY2NlcHRlZFwiKSB7XHJcbiAgICAgICAgICAgIC8vIHN3YWwoXCJFcnJvclwiLCAnSW50ZXJuYWwgU2VydmVyIEVycm9yJywgXCJlcnJvclwiKTtcclxuICAgICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzQ29ubmVjdGluZ0luY29taW5nQ2FsbElkLm5leHQoJycpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc29sZS5sb2coJ3Rlc3QnLCB0aGlzLmluY29taW5nQ2FsbHNMaXN0KTtcclxuICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc1Nob3dJbmNvbWluZ0NhbGwgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxub3RpZmljYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCc1OTAnLCB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0KTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgY2FsbEVuZEluZGV4ID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maW5kSW5kZXgoKGNhbGw6IGFueSkgPT4gY2FsbD8ucGFydGljaXBhbnRJZCA9PT0gc25hcHNob3Q/LmRhdGE/LmRhdGE/LnJlY29yZElkIHx8IGNhbGw/LnBhcnRpY2lwYW50SWQgPT09IHNuYXBzaG90Py5kYXRhPy5kYXRhPy5wYXJ0aWNpcGFudElkKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LnNwbGljZShjYWxsRW5kSW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKCdub3RpZmljYXRpb25DYWxsTGlzdCcsIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QpO1xyXG4gICAgICBsZXQgcGFyZW50Q2FsbDogc3RyaW5nW10gPSBbXVxyXG4gICAgICBpZiAodGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdCA9IHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QuZmlsdGVyKChyZXM6IGFueSkgPT4gcmVzLmVuZFRpbWUgPj0gKG5ldyBEYXRlKCkuZ2V0VGltZSgpKSk7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5mb3JFYWNoKChjYWxsOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpbmZvID0gaXRlbS5wYXJ0aWNpcGFudHMuZmluZCgocmVzSW5mbzogYW55KSA9PiByZXNJbmZvPy5pZCA9PT0gY2FsbD8ucGFydGljaXBhbnRJZCAmJiBjYWxsPy5jYWxsRGlyZWN0aW9uICE9PSAnaW5jb21pbmcnKVxyXG4gICAgICAgICAgICBpZiAoaW5mbykge1xyXG4gICAgICAgICAgICAgIHBhcmVudENhbGwucHVzaChpbmZvLmlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHBhcmVudENhbGw/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0ID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gIXBhcmVudENhbGwuaW5jbHVkZXMoaXRlbT8ucGFydGljaXBhbnRJZCkpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCcuLi4uLicsIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QpXHJcbiAgICAgIH1cclxuICAgICAgLy8gTWVyZ2Ugbm90aWZpY2F0aW9uQ2FsbExpc3QgaW50byBpbmNvbWluZ0NhbGxzTGlzdCB3aXRob3V0IGR1cGxpY2F0aW5nIGVudHJpZXMgdGhhdCBhcmUgYWxyZWFkeSBwcmVzZW50LlxyXG4gICAgICBjb25zdCBleGlzdGluZ1BhcnRpY2lwYW50SWRzID0gbmV3IFNldCh0aGlzLmluY29taW5nQ2FsbHNMaXN0Lm1hcCgoYzogYW55KSA9PiBjPy5wYXJ0aWNpcGFudElkKSk7XHJcbiAgICAgIGNvbnN0IG5ld0l0ZW1zID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maWx0ZXIoKG46IGFueSkgPT4gIWV4aXN0aW5nUGFydGljaXBhbnRJZHMuaGFzKG4/LnBhcnRpY2lwYW50SWQpKTtcclxuICAgICAgaWYgKG5ld0l0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSBbLi4udGhpcy5pbmNvbWluZ0NhbGxzTGlzdCwgLi4ubmV3SXRlbXNdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydkZXZpY2VJZCddKSB7XHJcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5kZXZpY2VJZCA9IGNoYW5nZXNbJ2RldmljZUlkJ10uY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLmV4dFNlcnZpY2UuZ2V0SXBJbmZvKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1sndXBkYXRlZFR3aWxpb1Rva2VuJ10/LmN1cnJlbnRWYWx1ZSAmJiB0aGlzLnVwZGF0ZWRUd2lsaW9Ub2tlbikge1xyXG4gICAgICBpZih0aGlzLnR3aWxpb1NlcnZpY2UuaW5jb21pbmdDYWxsVG9rZW4gIT0gdGhpcy51cGRhdGVkVHdpbGlvVG9rZW4pIHtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaW5jb21pbmdDYWxsVG9rZW4gPSB0aGlzLnVwZGF0ZWRUd2lsaW9Ub2tlbjtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UudG9rZW5Jbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmluaXRpYWxpemVUd2lsaW9EZXZpY2UodGhpcy5kZXZpY2VJZCB8fCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZGV2aWNlSWQnKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWyd1c2VySWQnXT8uY3VycmVudFZhbHVlICYmIHRoaXMudXNlcklkKSB7XHJcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS51c2VySWQgPSB0aGlzLnVzZXJJZDtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydjb250YWN0SW5mbyddPy5jdXJyZW50VmFsdWUgJiYgdGhpcy5jb250YWN0SW5mbykge1xyXG4gICAgICBsZXQgY29udGFjdCA9IHRoaXMuY29udGFjdEluZm87XHJcbiAgICAgIHRoaXMuaXNWYWxpZGF0aW9uTWVzc2FnZVNob3cgPSB0cnVlO1xyXG4gICAgICBpZiAoY29udGFjdC5udW1iZXIgJiYgIXRoaXMuaW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5pc1NtYXJ0RGlhbENhbGwgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmRpYWxlZE51bWJlciA9IGNvbnRhY3QubnVtYmVyO1xyXG4gICAgICAgIGlmIChjb250YWN0LmlzRGlhbEZyb21IaXN0b3J5KSB7XHJcbiAgICAgICAgICAvL2hhbmRsZSBkaWFsaW5nIGZyb20gaGlzdG9yeSBwYWdlXHJcbiAgICAgICAgICBpZiAoY29udGFjdC5jYWxsZXJJZCA9PSAnc21hcnREaWFsaW5nJykge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0geyBudW1iZXI6IGNvbnRhY3QuZnJvbSB9O1xyXG4gICAgICAgICAgICB0aGlzLmlzU21hcnREaWFsQ2FsbCA9IHRydWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gY29udGFjdC5udW1iZXI7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IGNvbnRhY3QubmFtZTtcclxuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0LmltZztcclxuICAgICAgICAgICAgdGhpcy5vdXRnb2luZ0NvbnRhY3ROYW1lID0gY29udGFjdC5uYW1lO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmZyb20gPSBjb250YWN0LmZyb207XHJcbiAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNvbnRhY3QpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlQ2FsbCgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNvbnRhY3QpO1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxlZE51bWJlciA9IGNvbnRhY3QubnVtYmVyO1xyXG4gICAgICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IGNvbnRhY3QubnVtYmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoY29udGFjdC5jYWxsZXJJZCA9PSAnYWx3YXlzQXNrJyB8fCBjb250YWN0LmNhbGxlcklkID09ICdzbWFydERpYWxpbmcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VXNlckNhbGxTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sIDEwMDApO1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxlZE51bWJlciA9IGNvbnRhY3QubnVtYmVyO1xyXG4gICAgICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IGNvbnRhY3QubnVtYmVyO1xyXG5cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gY29udGFjdC5udW1iZXI7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IGNvbnRhY3QubmFtZTtcclxuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0LmltZztcclxuICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBjb250YWN0Lm51bWJlcjtcclxuICAgICAgICAgICAgdGhpcy5pbml0aWF0ZUNhbGwoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9IGVsc2UgaWYgKGNvbnRhY3QubnVtYmVyICYmIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoKSB7XHJcbiAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIGluY29taW5nIGNhbGxzXHJcbiAgICAgICAgdGhpcy5uZXdDYWxsQ29uZmVyZW5jZSA9IGNvbnRhY3Q7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydpc0RpYWxwYWRIaWRkZW4nXSAmJiAhdGhpcy5pc0RpYWxwYWRIaWRkZW4pIHtcclxuICAgICAgdGhpcy5nZXRDb250YWN0TGlzdCgpO1xyXG4gICAgICB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmRpYWxJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICB9LCAwKTtcclxuICAgICAgaWYgKCF0aGlzLmluY29taW5nQ2FsbHNMaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLmluY29taW5nQ2FsbERhdGEpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NhbGxJblByb2dyZXNzKSB7XHJcbiAgICAgICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHMucHVzaCh0aGlzLmluY29taW5nQ2FsbERhdGEpO1xyXG4gICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24odGhpcy5pbmNvbWluZ0NhbGxEYXRhKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gdGhpcy5pbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnNbJ0Zyb20nXTtcclxuICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKHRoaXMuaW5jb21pbmdDYWxsRGF0YSk7XHJcbiAgICAgICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSB0aGlzLmluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ25hbWUnKTtcclxuICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gdGhpcy5pbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCdpbWFnZScpIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJztcclxuICAgICAgICAgIHRoaXMuY2FsbERhdGEuaXNJbmNvbWluZ0NhbGwgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluY29taW5nQ2FsbERhdGEub24oJ2NhbmNlbCcsICgpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCc1MjMnKTtcclxuICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGF0YS5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGF0YS5vbignZGlzY29ubmVjdCcsICgpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCc1MjYnKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2NhbGxBY3Rpb24nXT8uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIGlmICh0aGlzLmNhbGxBY3Rpb24/LnR5cGUgPT0gJ3JlSm9pbicpIHtcclxuICAgICAgICB0aGlzLmV4dFNlcnZpY2UuZ2V0SXBJbmZvKCk7XHJcbiAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmKHRoaXMuY2FsbEFjdGlvbj8uY29uZmVyZW5jZUlkKSB7XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFJlbW92ZVBhcnRpY2lwYW50cygnYWxsJywgdGhpcy5jYWxsQWN0aW9uPy5jb25mZXJlbmNlSWQpLnN1YnNjcmliZSgocmVzKSA9PiB7IH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSByZWdpc3RlckRyYWdFbGVtZW50KCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZWxtbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhZ3BhcmVudDEnKTtcclxuICAgICAgaWYgKCFlbG1udCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RyYWcgZWxlbWVudCBub3QgZm91bmQnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBwb3MxID0gMCwgcG9zMiA9IDAsIHBvczMgPSAwLCBwb3M0ID0gMDtcclxuXHJcbiAgICAgIGNvbnN0IGRyYWdNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGlmICh0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgcG9zMyA9IGUuY2xpZW50WDtcclxuICAgICAgICBwb3M0ID0gZS5jbGllbnRZO1xyXG5cclxuICAgICAgICBjb25zdCBvbk1vdXNlTW92ZSA9IChtb3ZlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IGVsZW1lbnREcmFnKG1vdmVFdmVudCk7XHJcbiAgICAgICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xyXG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XHJcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgZWxlbWVudERyYWcgPSAoZTogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBwb3MxID0gcG9zMyAtIGUuY2xpZW50WDtcclxuICAgICAgICBwb3MyID0gcG9zNCAtIGUuY2xpZW50WTtcclxuICAgICAgICBwb3MzID0gZS5jbGllbnRYO1xyXG4gICAgICAgIHBvczQgPSBlLmNsaWVudFk7XHJcblxyXG4gICAgICAgIGVsbW50LnN0eWxlLnRvcCA9IChlbG1udC5vZmZzZXRUb3AgLSBwb3MyKSArICdweCc7XHJcbiAgICAgICAgZWxtbnQuc3R5bGUubGVmdCA9IChlbG1udC5vZmZzZXRMZWZ0IC0gcG9zMSkgKyAncHgnO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gQ2hlY2sgZm9yIGhlYWRlciBlbGVtZW50XHJcbiAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsbW50LmlkICsgJ2hlYWRlcicpO1xyXG4gICAgICBpZiAoaGVhZGVyKSB7XHJcbiAgICAgICAgaGVhZGVyLm9ubW91c2Vkb3duID0gZHJhZ01vdXNlRG93bjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBlbG1udC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGluY29taW5nQ2FsbE5vdGlmaWNhdGlvbihjYWxsZXJJbmZvOiBhbnksIG5vdGlmaWNhdGlvbjogYW55KSB7XHJcbiAgICBpZighbm90aWZpY2F0aW9uPy5jb25mZXJlbmNlSWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGluY29taW5nQ2FsbDogYW55ID0ge1xyXG4gICAgICBjb25mZXJlbmNlSWQ6IG5vdGlmaWNhdGlvbj8uY29uZmVyZW5jZUlkLFxyXG4gICAgICBpc0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgaXNJbmNvbWluZ0NhbGw6IHRydWUsXHJcbiAgICAgIC8vIENsaWVudC1vbmx5IG1hcmtlcjogdGhpcyBlbnRyeSBpcyBhIHBlbmRpbmcgaW5jb21pbmctY2FsbCBub3RpZmljYXRpb24sIE5PVCBhblxyXG4gICAgICAvLyBhY3RpdmUgc29ja2V0IGNvbmZlcmVuY2UuIFVzZWQgdG8gZGVkdXBlIGJ5IHBhcnRpY2lwYW50SWQgaW5zdGVhZCBvZiBjb25mZXJlbmNlSWQsXHJcbiAgICAgIC8vIHNvIGEgbm90aWZpY2F0aW9uIGNhbiBjb2V4aXN0IHdpdGggYW4gYWN0aXZlIGNvbmZlcmVuY2UgdGhhdCBzaGFyZXMgaXRzIGNvbmZlcmVuY2VJZC5cclxuICAgICAgX2lzTm90aWZpY2F0aW9uOiB0cnVlLFxyXG4gICAgICBwYXJ0aWNpcGFudElkOiBub3RpZmljYXRpb24/LnBhcnRpY2lwYW50SWQsXHJcbiAgICAgIGNhbGxEaXJlY3Rpb246IFwiaW5jb21pbmctY2FsbFwiLFxyXG4gICAgICBwYXJ0aWNpcGFudHM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBkaXJlY3Rpb246IFwiaW5jb21pbmctY2FsbFwiLCBidXNpbmVzc051bWJlcjogbm90aWZpY2F0aW9uLmMyY0J1c2luZXNzLCBpbWc6IG5vdGlmaWNhdGlvbi5mcm9tSW1hZ2UgfHwgbm90aWZpY2F0aW9uLmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJywgaXNJbmNvbWluZ0NhbGw6IHRydWUsIGlzSG9sZDogZmFsc2UsIGlzQ29uZmVyZW5jZTogZmFsc2UsIGlzQWNjZXB0Q2FsbDogZmFsc2UsIGRpYWw6IHRydWUsIHBob25lOiBub3RpZmljYXRpb24uZnJvbU51bWJlciwgdG86IG5vdGlmaWNhdGlvbi50b051bWJlcixcclxuICAgICAgICAgIGZyb206IG5vdGlmaWNhdGlvbi5mcm9tTnVtYmVyLCBmcm9tTmFtZTogbm90aWZpY2F0aW9uLmZyb21OYW1lLCBwYXJ0aWNpcGFudElkOiBub3RpZmljYXRpb24ucGFydGljaXBhbnRJZCwgbmFtZTogbm90aWZpY2F0aW9uLmZyb21OYW1lLCB0aW1lOiAnJywgaWQ6IG5vdGlmaWNhdGlvbi5wYXJ0aWNpcGFudElkLCBjb25mZXJlbmNlSWQ6IG5vdGlmaWNhdGlvbi5jb25mZXJlbmNlSWQsIGNsaWVudFNpZDogbm90aWZpY2F0aW9uLmNsaWVudFNpZCwgY2FsbFN0YXR1czogJ3JpbmdpbmcnXHJcbiAgICAgICAgfVxyXG4gICAgICBdLFxyXG4gICAgfVxyXG4gICAgdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdCA9IGF3YWl0IHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QuZmlsdGVyKChyZXM6IGFueSkgPT4gcmVzPy5lbmRUaW1lID4gbmV3IERhdGUoKS5nZXRUaW1lKCkpO1xyXG5cclxuICAgIGlmIChjYWxsZXJJbmZvKSB7XHJcbiAgICAgIGluY29taW5nQ2FsbC5wYXJ0aWNpcGFudHNbMF1bJ2VtYWlsJ10gPSBjYWxsZXJJbmZvLmVtYWlsO1xyXG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWyduYW1lJ10gPSBjYWxsZXJJbmZvLm5hbWU7XHJcbiAgICAgIGluY29taW5nQ2FsbC5wYXJ0aWNpcGFudHNbMF1bJ2ltYWdlJ10gPSBjYWxsZXJJbmZvLmltYWdlO1xyXG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWydleHRlbnNpb24nXSA9IGNhbGxlckluZm8uZXh0ZW5zaW9uO1xyXG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWyd1c2VySW5mb0lkJ10gPSBjYWxsZXJJbmZvLmlkO1xyXG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWydtZXNzYWdlJ10gPSBjYWxsZXJJbmZvLm1lc3NhZ2U7XHJcbiAgICAgIGluY29taW5nQ2FsbC5wYXJ0aWNpcGFudHNbMF1bJ25vdGUnXSA9IGNhbGxlckluZm8ubm90ZTtcclxuICAgICAgaW5jb21pbmdDYWxsLnBhcnRpY2lwYW50c1swXVsnbnVtYmVyJ10gPSBjYWxsZXJJbmZvLm51bWJlcjtcclxuICAgICAgaW5jb21pbmdDYWxsLnBhcnRpY2lwYW50c1swXVsncG9pbnROYW1lJ10gPSBjYWxsZXJJbmZvLnBvaW50TmFtZTtcclxuICAgICAgaW5jb21pbmdDYWxsLnBhcnRpY2lwYW50c1swXVsnc29mdHBob25lVHdpbGlvQXV0aElkJ10gPSBjYWxsZXJJbmZvLnNvZnRwaG9uZVR3aWxpb0F1dGhJZDtcclxuICAgICAgaW5jb21pbmdDYWxsLnBhcnRpY2lwYW50c1swXVsnc291cmNlTmFtZSddID0gY2FsbGVySW5mby5zb3VyY2VOYW1lO1xyXG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWydzdWJqZWN0J10gPSBjYWxsZXJJbmZvLnN1YmplY3Q7XHJcbiAgICB9XHJcbiAgICBpbmNvbWluZ0NhbGxbJ2VuZFRpbWUnXSA9IChuZXcgRGF0ZSgpLmdldFRpbWUoKSArIDQ1ICogMTAwMCk7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LnB1c2goaW5jb21pbmdDYWxsKTtcclxuICAgIC8vIE9ubHkgYWRkIHRoaXMgc3BlY2lmaWMgY2FsbCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LCBwcmV2ZW50aW5nIGR1cGxpY2F0ZXMgd2hlblxyXG4gICAgLy8gbXVsdGlwbGUgY2FsbHMgYXJyaXZlIHNpbXVsdGFuZW91c2x5IGFuZCBub3RpZmljYXRpb25DYWxsTGlzdCBoYXMgcHJpb3IgZW50cmllcy5cclxuICAgIGNvbnN0IGFscmVhZHlJbkxpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnNvbWUoKGM6IGFueSkgPT4gYz8ucGFydGljaXBhbnRJZCA9PT0gaW5jb21pbmdDYWxsLnBhcnRpY2lwYW50SWQpO1xyXG4gICAgaWYgKCFhbHJlYWR5SW5MaXN0KSB7XHJcbiAgICAgIC8vIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSBbLi4udGhpcy5pbmNvbWluZ0NhbGxzTGlzdCwgaW5jb21pbmdDYWxsXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTdGFydCB0aGUgcmluZyBmb3IgdGhpcyBpbmNvbWluZyBjYWxsICh1bmxlc3MgdGhlIHVzZXIgaGFzIG11dGVkIGluY29taW5nIGNhbGxzKS5cclxuXHJcbiAgICB0aGlzLmNkay5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBpZiAobm90aWZpY2F0aW9uPy5wYXJ0aWNpcGFudElkKSB7XHJcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZE51bWJlcihudW06IGFueSkge1xyXG4gICAgaWYgKG51bSA9PSAnIycgfHwgbnVtID09ICcqJyB8fCBudW0gPT0gJysnIHx8IE51bWJlci5pc0ludGVnZXIobnVtKSkge1xyXG4gICAgICBpZiAobnVtID09ICcjJykge1xyXG4gICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1oYXNoLS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgIH0gZWxzZSBpZiAobnVtID09ICcqJykge1xyXG4gICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1zdGFyLS5tcDNgKS5wbGF5KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLSR7bnVtfS0ubXAzYCkucGxheSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmRpYWxlZE51bWJlciArPSBudW07XHJcbiAgICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5udW1iZXJEaWFsZWQuZW1pdCh0aGlzLmRpYWxlZE51bWJlcik7XHJcblxyXG4gICAgICB0aGlzLm9uRGlhbElucHV0Q2hhbmdlKHRoaXMuZGlhbGVkTnVtYmVyKVxyXG4gICAgfSBlbHNlIGlmIChudW0gPT09ICd2b2ljZW1haWwnKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZXh0ZW5zaW9uL3ZvaWNlbWFpbC8nICsgdGhpcy50b2tlbl0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZURpYWxwYWQoKSB7XHJcbiAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IHRydWU7XHJcbiAgICB0aGlzLmNsb3NlRGlhbHBhZEV2ZW50LmVtaXQoKTtcclxuICAgIHRoaXMuY2xlYXJBbGxEaWFsZWQoKTtcclxuICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IFtdO1xyXG4gIH1cclxuXHJcbiAgb25EaWFsSW5wdXRDaGFuZ2UoaW5wdXRWYWw6IGFueSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gVXBkYXRlZCByZWdleCB0byBpbmNsdWRlIHgsIFgsIGV4dC4sIEV4dC4sIGFuZCAsXHJcbiAgICAgIGNvbnN0IGlzTnVtZXJpY0lucHV0ID0gL15bXFxkXFxzK1xcLV0rJC8udGVzdChpbnB1dFZhbCk7XHJcbiAgICAgIGxldCBtYWluTnVtYmVyID0gaW5wdXRWYWw7XHJcbiAgICAgIFxyXG4gICAgICBcclxuICAgICAgLy8gQ2hlY2sgZm9yIGV4dGVuc2lvbiBpbmRpY2F0b3JzIGFuZCBzcGxpdCB0aGUgaW5wdXRcclxuICAgICAgY29uc3QgZXh0TWF0Y2ggPSBpbnB1dFZhbC5tYXRjaCgvKHh8WHxleHRcXC58RXh0XFwufCwpKC4qKS8pO1xyXG4gICAgICBpZiAoZXh0TWF0Y2gpIHtcclxuICAgICAgICBtYWluTnVtYmVyID0gaW5wdXRWYWwuc3Vic3RyaW5nKDAsIGV4dE1hdGNoLmluZGV4KS50cmltKCk7XHJcbiAgICAgICAgdGhpcy5jYWxsRGF0YS5leHROdW0gPSBleHRNYXRjaFsyXS50cmltKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBpc051bWVyaWNJbnB1dCA/IG1haW5OdW1iZXIucmVwbGFjZSgvW1xcc1xcLV0rL2csICcnKSA6IG1haW5OdW1iZXI7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gaXNOdW1lcmljSW5wdXQgPyB0aGlzLnNhbml0aXplZE51bSA6ICcnO1xyXG4gICAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gaW5wdXRWYWwubGVuZ3RoID4gMDtcclxuICAgICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gZW1pdCBjdXJyZW50IG51bWJlciB3aGVuZXZlciBpbnB1dCBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy5udW1iZXJEaWFsZWQuZW1pdCh0aGlzLmRpYWxlZE51bWJlcik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGlucHV0VmFsLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICB0aGlzLmlzVmFsaWRhdGlvbk1lc3NhZ2VTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5jb250YWN0TGlzdC5mb3JFYWNoKGNvbnRhY3QgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzTnVtZXJpY0lucHV0KSB7XHJcbiAgICAgICAgICAgIGNvbnRhY3QubnVtYmVyc0xpc3QuZm9yRWFjaCgobnVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAobnVtLm51bWJlci5pbmNsdWRlcyh0aGlzLnNhbml0aXplZE51bSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdC5wdXNoKHsgLi4uY29udGFjdCwgc2VsZWN0ZWROdW1iZXI6IG51bSB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBgJHtjb250YWN0LmZpcnN0TmFtZX0gJHtjb250YWN0Lm1pZGRsZU5hbWV9ICR7Y29udGFjdC5sYXN0TmFtZX1gLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGlmIChmdWxsTmFtZS5pbmNsdWRlcyh0aGlzLnNhbml0aXplZE51bS50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgIGNvbnRhY3QubnVtYmVyc0xpc3QuZm9yRWFjaCgobnVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdC5wdXNoKHsgLi4uY29udGFjdCwgc2VsZWN0ZWROdW1iZXI6IG51bSB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZpcnN0TGV0dGVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmFtZSA/IG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgOiAnJztcclxuICB9XHJcbiAgY2xlYXJJbnB1dCgpIHtcclxuICAgIGlmICh0aGlzLmRpYWxlZE51bWJlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gdGhpcy5kaWFsZWROdW1iZXIuc2xpY2UoMCwgLTEpO1xyXG4gICAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gdGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoICE9PSAwO1xyXG5cclxuICAgICAgdGhpcy5vbkRpYWxJbnB1dENoYW5nZSh0aGlzLmRpYWxlZE51bWJlcilcclxuICAgIH1cclxuICB9XHJcbiAgY2xlYXJBbGxEaWFsZWQoKSB7XHJcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9ICcnO1xyXG4gICAgdGhpcy5zYW5pdGl6ZWROdW0gPSAnJztcclxuICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSBmYWxzZTtcclxuICB9XHJcbiAgZ2V0Q2FsbGVySWRMaXN0KCkge1xyXG4gICAgdGhpcy5leHRTZXJ2aWNlLmRpc3BsYXlJRCh0aGlzLnRva2VuIHx8ICcnKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY2FsbGVySWRMaXN0ID0gcmVzLmNhbGxlcklkTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS52b2ljZUZlYXR1cmUgPT09IHRydWUpO1xyXG4gICAgICB0aGlzLmRldmljZU51bWJlckxpc3QgPSB0aGlzLmNhbGxlcklkTGlzdC5tYXAoKHJlczogYW55KSA9PiByZXMubnVtYmVyKTtcclxuICAgICAgaWYgKHRoaXMuY2FsbGVySWRMaXN0Lmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0gdGhpcy5jYWxsZXJJZExpc3RbMF07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FsbFByZWZlcmVuY2UgPT09ICdhbHdheXNBc2snIHx8IHRoaXMuY2FsbFByZWZlcmVuY2UgPT09ICdzbWFydERpYWxpbmcnKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPSB0aGlzLmNhbGxlcklkTGlzdC5maW5kKGl0ZW0gPT4gKGl0ZW0ubnVtYmVyID09IHRoaXMuY2FsbFByZWZlcmVuY2UpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBnZXRDb250YWN0TGlzdCgpIHtcclxuICAgIHRoaXMudHdpbGlvU2VydmljZS5nZXRDb250YWN0TGlzdCgpLnN1YnNjcmliZSgocmVzcDogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwLnJlc3BvbnNlID09ICdTdWNjZXNzJykge1xyXG4gICAgICAgIHRoaXMuY29udGFjdExpc3QgPSByZXNwLnBob25lQm9vaztcclxuICAgICAgfVxyXG4gICAgfSwgZXJyID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgfSlcclxuICB9XHJcbiAgZ2V0RnVsbE5hbWUoY29udGFjdDogYW55KTogc3RyaW5nIHtcclxuICAgIGxldCBmdWxsTmFtZSA9IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnO1xyXG4gICAgaWYgKGNvbnRhY3QubWlkZGxlTmFtZSkge1xyXG4gICAgICBmdWxsTmFtZSArPSBgICR7Y29udGFjdC5taWRkbGVOYW1lfWA7XHJcbiAgICB9XHJcbiAgICBpZiAoY29udGFjdC5sYXN0TmFtZSkge1xyXG4gICAgICBmdWxsTmFtZSArPSBgICR7Y29udGFjdC5sYXN0TmFtZX1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bGxOYW1lLnRyaW0oKTtcclxuICB9XHJcblxyXG5cclxuICB0b2dnbGVDYWxsZXJJZERpdigpIHtcclxuICAgIHRoaXMuaXNDYWxsZXJJZEhpZGRlbiA9ICF0aGlzLmlzQ2FsbGVySWRIaWRkZW47XHJcbiAgfVxyXG4gIG91dGdvaW5nQ29udGFjdE5hbWU6c3RyaW5nID0gJyc7XHJcbiAgb25Db250YWN0U2VsZWN0KGNvbnRhY3Q6IGFueSkge1xyXG4gICAgdGhpcy5kaWFsZWROdW1iZXIgPSBjb250YWN0LnNlbGVjdGVkTnVtYmVyLm51bWJlcjtcclxuICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IHRoaXMuZ2V0RnVsbE5hbWUoY29udGFjdCk7XHJcbiAgICB0aGlzLm91dGdvaW5nQ29udGFjdE5hbWUgPSB0aGlzLmNhbGxEYXRhLm5hbWU7XHJcbiAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGNvbnRhY3QuaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xyXG4gICAgdGhpcy5vbkRpYWxJbnB1dENoYW5nZSh0aGlzLmRpYWxlZE51bWJlcik7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcclxuICAgIHRoaXMuaXNWYWxpZGF0aW9uTWVzc2FnZVNob3cgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZW5kQ2FsbCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcclxuXHJcbiAgICAgIC8vIFJlc2V0IGNhbGwgZGF0YVxyXG4gICAgICB0aGlzLmNhbGxEYXRhID0ge1xyXG4gICAgICAgIHBob25lOiAnJyxcclxuICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcclxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgICAgZGlhbDogZmFsc2UsXHJcbiAgICAgICAgZGlzcGxheU51bTogJycsXHJcbiAgICAgICAgZXh0TnVtOiAnJ1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gUmVzZXQgZGlhbGVkIG51bWJlclxyXG4gICAgICB0aGlzLmRpYWxlZE51bWJlciA9ICcnO1xyXG4gICAgICB0aGlzLnNhbml0aXplZE51bSA9ICcnO1xyXG4gICAgICBjb25zb2xlLmxvZygnNzk1Jyk7XHJcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5kZXZpY2UuZGlzY29ubmVjdEFsbCgpXHJcbiAgICAgIC8vIEVtaXQgZW5kIGNhbGwgZXZlbnRcclxuICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG5cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIEV2ZW4gaWYgdGhlcmUncyBhbiBlcnJvciwgdHJ5IHRvIHJlc2V0IHRoZSBzdGF0ZVxyXG4gICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcclxuICAgICAgICBwaG9uZTogJycsXHJcbiAgICAgICAgbmFtZTogJycsXHJcbiAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXHJcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxyXG4gICAgICAgIGRpYWw6IGZhbHNlLFxyXG4gICAgICAgIGRpc3BsYXlOdW06ICcnLFxyXG4gICAgICAgIGV4dE51bTogJydcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ2FuY2VscyBhbiBvdXRnb2luZyBjYWxsIHdoaWxlIGl0IGlzIHN0aWxsIGNvbm5lY3RpbmcgKHRoZSBcIkNvbm5lY3RpbmcuLi5cIiBsb2FkZXIgc2hvd25cclxuICAvLyBiZWZvcmUgdGhlIGNhbGwgaGFzIGpvaW5lZCB0aGUgY29uZmVyZW5jZSkuIGVuZENhbGwoKSBjYW4ndCBiZSByZXVzZWQgaGVyZSBiZWNhdXNlIGl0XHJcbiAgLy8gZGlzY29ubmVjdHMgdHdpbGlvU2VydmljZS5kZXZpY2UsIHdoaWNoIGhhbmRsZXMgaW5jb21pbmcgY2FsbHMsIG5vdCB0aGUgb3V0Z29pbmcgY2FsbFxyXG4gIC8vIGNyZWF0ZWQgYnkgY2FsbC1wcm9ncmVzcydzIG93biBkZXZpY2UvY2FsbCBpbnN0YW5jZS5cclxuICBjYW5jZWxDb25uZWN0aW5nQ2FsbCgpIHtcclxuICAgIC8vIERyaXZlIHRoZSBjaGlsZCB2aWEgYW4gQElucHV0IHJhdGhlciB0aGFuIEBWaWV3Q2hpbGQ6IHRoaXMgZGVsaXZlcnMgZXZlbiBpZlxyXG4gICAgLy8gbGliLWNhbGwtcHJvZ3Jlc3MgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQgYXQgY2xpY2sgdGltZSwgc2luY2UgQW5ndWxhciBhcHBsaWVzXHJcbiAgICAvLyB0aGUgYm91bmQgdmFsdWUgYXMgc29vbiBhcyB0aGUgY29tcG9uZW50IGRvZXMgbW91bnQuXHJcbiAgICB0aGlzLmNhbmNlbENvbm5lY3RpbmdBY3Rpb24gPSB7IHRzOiBEYXRlLm5vdygpIH07XHJcbiAgICB0aGlzLmlzTG9hZGVyc2hvdyA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcclxuICAgIHRoaXMuY2FsbERhdGEgPSB7XHJcbiAgICAgIHBob25lOiAnJyxcclxuICAgICAgbmFtZTogJycsXHJcbiAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxyXG4gICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXHJcbiAgICAgIGRpYWw6IGZhbHNlLFxyXG4gICAgICBkaXNwbGF5TnVtOiAnJyxcclxuICAgICAgZXh0TnVtOiAnJ1xyXG4gICAgfTtcclxuICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gJyc7XHJcbiAgICB0aGlzLnNhbml0aXplZE51bSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdGlhdGVDYWxsKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKCF0aGlzLmRpYWxlZE51bWJlciAmJiB0aGlzLmxhc3REaWFsZWQpIHtcclxuICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IHRoaXMubGFzdERpYWxlZC5udW1iZXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKCk7XHJcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zYXZlTGFzdERpYWxlZCgpO1xyXG4gICAgICB0aGlzLmlzU2F2ZWRDb250YWN0RGlhbGxlZCgpO1xyXG5cclxuICAgICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmlzUGF5bWVudER1ZSkge1xyXG4gICAgICAgIHN3YWwoJ1dhcm5pbmcnLCAnUGxlYXNlIG5vdGUgdGhhdCB5b3VyIHBheW1lbnQgaXMgZHVlLCBUbyBjb250aW51ZSBvbiB5b3VyIHNlcnZpY2VzIGtpbmRseSBzdWJzY3JpYmUgdG8gdXNlIHVuaW50ZXJydXB0ZWQgc2VydmljZXMuJyk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmlzVHJpYWxQZXJpb2RPdmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RyaWFsT3ZlcicpID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2FuaXRpemVkTnVtID09PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpbGlvTnVtYmVyJykpIHtcclxuICAgICAgICBzd2FsKCdFcnJvcicsICdZb3UgY2FuIG5vdCBkaWFsIHRoaXMgbnVtYmVyJyk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBoYXNQZXJtaXNzaW9uID0gYXdhaXQgdGhpcy5jaGVja01pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XHJcbiAgICAgIGlmICghaGFzUGVybWlzc2lvbikge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYXNrRm9yTWljcm9waG9uZVBlcm1pc3Npb24oKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaXNMb2FkZXJzaG93ID0gdHJ1ZTtcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2FsbGVySWQpIHtcclxuICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ1NlbGVjdCBhIEMyQyBudW1iZXIgdG8gY2FsbCcpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xyXG4gICAgICAgIH0sIDMwMDApO1xyXG4gICAgICAgIHRoaXMuaXNMb2FkZXJzaG93ID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIE1vdW50IGxpYi1jYWxsLXByb2dyZXNzIG5vdyAobm90IGFmdGVyIGdldFRvTnVtYmVyJ3MgYXdhaXQpIHNvIGl0J3MgcmVhZHlcclxuICAgICAgLy8gdG8gcmVjZWl2ZSBjYWxsRGF0YS9jYW5jZWxDb25uZWN0aW5nQWN0aW9uIGFzIHNvb24gYXMgdGhlIENhbmNlbCBidXR0b24gYXBwZWFycy5cclxuICAgICAgLy8gUmVzZXQgZmlyc3Q6IGEgc3RhbGUgbm9uLW51bGwgdmFsdWUgaGVyZSB3b3VsZCBsb29rIGxpa2UgYSBmcmVzaCBjYW5jZWwgdG8gdGhlXHJcbiAgICAgIC8vIGZyZXNobHktbW91bnRlZCBjaGlsZCdzIG5nT25DaGFuZ2VzLCBzaW5jZSAqbmdJZiBkZXN0cm95cy9yZWNyZWF0ZXMgaXQgcGVyIGNhbGwuXHJcbiAgICAgIHRoaXMuY2FuY2VsQ29ubmVjdGluZ0FjdGlvbiA9IG51bGw7XHJcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgICAgIC8vIENsZWFyIGRpc3BsYXlOdW0gaWYgdmFsdWUgaXMgYm91bmQgZnJvbSBwcmV2aW91cyBjYWxsXHJcbiAgICAgIHRoaXMuY2FsbERhdGEuZGlzcGxheU51bSA9ICcnO1xyXG5cclxuICAgICAgLy8gR2V0IG51bWJlciB0byBiZSBkaWFsZWQgZnJvbSBiYWNrZW5kXHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0VG9OdW1iZXIodGhpcy5zYW5pdGl6ZWROdW0pO1xyXG4gICAgICBpZiAodGhpcy50ZXJtaW5hdGVDYWxsKSB7XHJcbiAgICAgICAgdGhpcy50ZXJtaW5hdGVDYWxsID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBVcGRhdGUgY2FsbCBkYXRhIGluIGEgc2luZ2xlIG9wZXJhdGlvblxyXG4gICAgICB0aGlzLmNhbGxEYXRhID0ge1xyXG4gICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXHJcbiAgICAgICAgcGhvbmU6IHRoaXMuc2FuaXRpemVkTnVtLFxyXG4gICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcclxuICAgICAgICBkaWFsOiB0cnVlLFxyXG4gICAgICAgIGZyb206IHRoaXMuaXNTbWFydERpYWxDYWxsID8gdGhpcy5jYWxsRGF0YS5mcm9tIDogdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcixcclxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5nZXRVc2VyU2V0dGluZ3MoKTtcclxuICAgICAgdGhpcy5jYWxsSW5pdGlhdGVkLmVtaXQoeyAuLi50aGlzLmNhbGxEYXRhIH0pO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3IgaW4gaW5pdGlhdGVDYWxsOicsIGUpO1xyXG4gICAgICB0aGlzLmlzTG9hZGVyc2hvdyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ZhaWxlZCB0byBpbml0aWF0ZSBjYWxsLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xyXG4gICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgaXNJbnZhbGlkTnVtYmVyKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuc2FuaXRpemVkTnVtID09ICcnKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZhbGlkTnVtYmVyUGF0dGVybiA9IC9eWytcXGRcXHMoKS1dKiQvOyAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdmFsaWQgY2hhcmFjdGVyc1xyXG4gICAgICBjb25zdCBwaG9uZU51bWJlciA9IHRoaXMuc2FuaXRpemVkTnVtO1xyXG4gICAgICBpZiAoIXZhbGlkTnVtYmVyUGF0dGVybi50ZXN0KHBob25lTnVtYmVyKSkge1xyXG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZih0aGlzLnNhbml0aXplZE51bS5sZW5ndGggPiAxNSl7XHJcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcclxuICAgICAgcmV0dXJuIHRydWU7IC8vIFJldHVybiB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBtZWFuaW5nIHRoZSBudW1iZXIgaXMgaW52YWxpZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUxhc3REaWFsZWQoKSB7XHJcbiAgICBjb25zdCBjb250YWN0ID0gdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0LmZpbmQoKGM6IGFueSkgPT4gYy5udW1iZXJzTGlzdC5zb21lKChuOiBhbnkpID0+IG4ubnVtYmVyID09PSB0aGlzLmRpYWxlZE51bWJlcikpO1xyXG4gICAgaWYgKGNvbnRhY3QpIHtcclxuICAgICAgdGhpcy5sYXN0RGlhbGVkID0ge1xyXG4gICAgICAgIG5hbWU6IGNvbnRhY3QubmFtZSxcclxuICAgICAgICBpbWFnZTogY29udGFjdC5pbWFnZSxcclxuICAgICAgICBudW1iZXI6IHRoaXMuZGlhbGVkTnVtYmVyXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5kaWFsZWROdW1iZXIpIHtcclxuICAgICAgICB0aGlzLmxhc3REaWFsZWQgPSB7IG51bWJlcjogdGhpcy5kaWFsZWROdW1iZXIgfTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcbiAgaXNTYXZlZENvbnRhY3REaWFsbGVkKCkge1xyXG4gICAgbGV0IHBob25lTnVtID0gdGhpcy5zYW5pdGl6ZWROdW0ucmVwbGFjZSgvXFxzKy9nLCAnJyk7XHJcbiAgICBsZXQgY29udGFjdCA9IHRoaXMuY29udGFjdExpc3QuZmlsdGVyKChjb250YWN0OiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGNvbnRhY3QubnVtYmVyc0xpc3Quc29tZSgobnVtOiBhbnkpID0+IG51bS5udW1iZXIgPT09IHBob25lTnVtKVxyXG4gICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZyhjb250YWN0KTtcclxuICAgIGlmIChjb250YWN0Lmxlbmd0aCkge1xyXG4gICAgICBcclxuICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gYCR7Y29udGFjdFswXS5maXJzdE5hbWV9ICR7Y29udGFjdFswXS5taWRkbGVOYW1lfSAke2NvbnRhY3RbMF0ubGFzdE5hbWV9YC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB0aGlzLmNvbnRhY3ROYW1lRm9yTG9hZGVyID0gdGhpcy5jYWxsRGF0YS5uYW1lO1xyXG4gICAgICB0aGlzLm91dGdvaW5nQ29udGFjdE5hbWUgPSB0aGlzLmNvbnRhY3ROYW1lRm9yTG9hZGVyO1xyXG4gICAgICBcclxuICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0WzBdLmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJztcclxuICAgICAgdGhpcy5jb250YWN0SW1nRm9yTG9hZGVyID0gdGhpcy5jYWxsRGF0YS5pbWc7XHJcbiAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSB0aGlzLnNhbml0aXplZE51bTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5jb250YWN0TmFtZUZvckxvYWRlciA9ICcnO1xyXG4gICAgICAgdGhpcy5vdXRnb2luZ0NvbnRhY3ROYW1lID0gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIHNob3dEaWFsQWxlcnQobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRpYWxBbGVydCA9IHtcclxuICAgICAgbXNnOiBtZXNzYWdlLFxyXG4gICAgICBzaG93OiB0cnVlXHJcbiAgICB9O1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZGlhbEFsZXJ0LnNob3cgPSBmYWxzZTtcclxuICAgIH0sIDMwMDApO1xyXG4gIH1cclxuICBhc3luYyBpc0NhbGxlcklkU2V0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdGtuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpO1xyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IHRoaXMuZXh0U2VydmljZS5mZXRjaENhbGxlcklkKHRrbiB8fCAnJykudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZXMuc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0cmlhbE92ZXInLCByZXMudHJpYWxPdmVyKTtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNUcmlhbE92ZXIubmV4dChyZXMudHJpYWxPdmVyKTtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGF5bWVudER1ZScsIHJlcy5wYXltZW50RHVlKTtcclxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNQYXltZW50RHVlLm5leHQocmVzLnBheW1lbnREdWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZXMuY2FsbGVyaWQpIHtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FsbGVySUQnLCByZXMuY2FsbGVyaWQpO1xyXG4gICAgICAgIHRoaXMuZXh0U2VydmljZS5jaGFuZ2VNZXNzYWdlKHJlcy5jYWxsZXJpZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhbGxlcklEJywgJ05vdCBzZXQnKTtcclxuICAgICAgICB0aGlzLmV4dFNlcnZpY2UuY2hhbmdlTWVzc2FnZSgnTm90IHNldCcpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhbGxlcklEJykgIT09ICdOb3Qgc2V0Jyk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFzeW5jIGNoZWNrTWljcm9waG9uZVBlcm1pc3Npb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xyXG4gICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB0cmFjay5zdG9wKCkpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5uYW1lID09PSAnTm90QWxsb3dlZEVycm9yJykge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgYXN5bmMgYXNrRm9yTWljcm9waG9uZVBlcm1pc3Npb24oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xyXG4gICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB0cmFjay5zdG9wKCkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignVXNlciBkZW5pZWQgbWljcm9waG9uZSBwZXJtaXNzaW9uOicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gYmVsb3cgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSBjb3VudHJ5IGNvZGUgd2l0aCBudW1iZXIgZnJvbSBzZXJ2ZXIgXHJcbiAgYXN5bmMgZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyOiBzdHJpbmcpIHtcclxuICAgIGlmIChkaWFsZWROdW1iZXJbMF0gIT09ICcrJykge1xyXG4gICAgICAvLyB0aGlzIGlzIGNhc2Ugd2hlbiB1c2VyIGdlb2xvY2F0aW9uIGRpYWwgY29kZSBpcyBvblxyXG4gICAgICBsZXQgaXBBZGRyZXNzOiBhbnkgPSBhd2FpdCB0aGlzLmlwU2VydmljZS5nZXRJcEFkZHJlc3NJbmZvKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGNvbnN0IHJlczogYW55ID0gYXdhaXQgdGhpcy50d2lsaW9TZXJ2aWNlLmdldFRvTnVtYmVyKGRpYWxlZE51bWJlciwgaXBBZGRyZXNzLmFkZHJlc3MuY291bnRyeUNvZGUpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICB0aGlzLnRvYXN0VGltZW91dCA9IHJlcy50aW1lSW50ZXJ2YWwgKiAxMDAwO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2hvd051bWJlclRvYXN0KHJlcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgaXNBbGVydEVuYWJsZSgpIHtcclxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaXNBbGVydEVuYWJsZScpO1xyXG4gIH1cclxuICBhc3luYyBzaG93TnVtYmVyVG9hc3QoZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gdHJ1ZTtcclxuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0Lm51bWJlciA9IGRhdGEudG9OdW1iZXI7XHJcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtID0gZGF0YS5kaXNwbGF5TnVtYmVyO1xyXG4gICAgdGhpcy5jYWxsRGF0YS5kaXNwbGF5TnVtID0gZGF0YS5kaXNwbGF5TnVtYmVyO1xyXG4gICAgYXdhaXQgdGhpcy5kZWxheSh0aGlzLnRvYXN0VGltZW91dCk7XHJcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9IGRhdGEudG9OdW1iZXI7XHJcbiAgICB0aGlzLnNhbml0aXplZE51bSA9IGRhdGEudG9OdW1iZXI7XHJcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XHJcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5udW1iZXIgPSAnJztcclxuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0LmRpc3BsYXlOdW0gPSAnJztcclxuICB9XHJcbiAgZGVsYXkobXM6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xyXG4gIH1cclxuICBpc01pbmltaXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9uTWluaW1pc2UoaXNNaW5pbWlzZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuaXNNaW5pbWlzZWQgPSBpc01pbmltaXNlZDtcclxuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KGlzTWluaW1pc2VkKTtcclxuICB9XHJcbiAgaGFuZGxlTnVtYmVyUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGEgfHwgKHdpbmRvdyBhcyBhbnkpLmNsaXBib2FyZERhdGE7XHJcbiAgICBjb25zdCBwYXN0ZWREYXRhID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XHJcblxyXG4gICAgLy8gTG9nIHRoZSBwYXN0ZWQgY29udGVudCB0byB0aGUgY29uc29sZVxyXG4gICAgaWYgKHBhc3RlZERhdGEpIHtcclxuICAgICAgdGhpcy5kaWFsZWROdW1iZXIgPSBwYXN0ZWREYXRhLnRyaW0oKTtcclxuICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBwYXN0ZWREYXRhLnRyaW0oKTtcclxuXHJcbiAgICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSB0cnVlO1xyXG4gICAgICB0aGlzLm9uRGlhbElucHV0Q2hhbmdlKHRoaXMuZGlhbGVkTnVtYmVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTG9hZGVyc2hvdyhldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQgfHwgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuaXNMb2FkZXJzaG93ID0gZXZlbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uRW50ZXIobnVtOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gdGhpcy5kaWFsZWROdW1iZXIgKyBudW07XHJcbiAgICB0aGlzLnNhbml0aXplZE51bSA9IHRoaXMuZGlhbGVkTnVtYmVyO1xyXG4gICAgdGhpcy5zaG93SW5wdXRDbGVhckJ0biA9IHRydWU7XHJcbiAgICB0aGlzLm51bWJlckRpYWxlZC5lbWl0KHRoaXMuZGlhbGVkTnVtYmVyKTtcclxuICB9XHJcblxyXG4gIGdldFVzZXJDYWxsU2V0dGluZygpIHtcclxuICAgIGNvbnN0IHRrbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKTtcclxuICAgIHRoaXMuZXh0U2VydmljZS5mZXRjaENhbGxlcklkKHRrbiB8fCAnJykuc3Vic2NyaWJlKChyZXNwOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3Auc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgIHRoaXMuY2FsbFByZWZlcmVuY2UgPSByZXNwLmNhbGxlcmlkO1xyXG4gICAgICAgIHRoaXMuZ2V0Q2FsbGVySWRMaXN0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG4gIG9uRGVkaWNhdGVkTnVtU2VsZWN0KGlkOiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IGlkO1xyXG4gICAgdGhpcy5pc0NhbGxlcklkSGlkZGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuZXh0U2VydmljZS5zZXRDYWxsZXJJZChpZCk7XHJcbiAgfVxyXG4gIGNhbmNlbERpYWxOdW1iZXIoKSB7XHJcbiAgICB0aGlzLnRlcm1pbmF0ZUNhbGwgPSB0cnVlO1xyXG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRGl2S2V5ZG93bihldjogYW55KSB7XHJcbiAgICBpZiAodGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5kaWFsSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICAgIGlmIChldi5rZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRpYWxwYWQgaXMgb3BlblxyXG4gICAgICBpZiAoIXRoaXMuaXNEaWFscGFkSGlkZGVuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlhbGVkTnVtYmVyLmxlbmd0aCA+IDIgJiYgdGhpcy5zZWxlY3RlZENhbGxlcklkKSB7XHJcbiAgICAgICAgICB0aGlzLmluaXRpYXRlQ2FsbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCkge1xyXG4gICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IHRydWU7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xyXG4gICAgICAgICAgfSwgMTAwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBvbkNhbGxCdG5Nb3VzZUVudGVyKGV2OiBhbnkpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZENhbGxlcklkIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ2Fsd2F5c0FzaycpIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpKSB7XHJcbiAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcbiAgb25DYWxsQnRuTW91c2VMZWF2ZShldjogYW55KSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCB8fCAodGhpcy5zZWxlY3RlZENhbGxlcklkID09ICdhbHdheXNBc2snKSB8fCAodGhpcy5zZWxlY3RlZENhbGxlcklkID09ICdzbWFydERpYWxpbmcnKSkge1xyXG4gICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlbmRJbmNvbWluZ0NhbGwoaW5jb21pbmdDYWxsOiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKCcxMTAxJylcclxuICAgIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5wYXJ0aWNpcGFudElkICE9PSBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRJZCk7XHJcbiAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbT8ucGFydGljaXBhbnRJZCAhPT0gaW5jb21pbmdDYWxsLnBhcnRpY2lwYW50SWQpO1xyXG4gICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xyXG4gICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICBhY2NlcHROZXdJbmNvbWluZ0NhbGwoY2FsbDogQ2FsbCkge1xyXG4gICAgLy9maXJzdCBjdXQgdGhlIGN1cnJlbnQgY2FsbFxyXG4gICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxEYXRhID0gY2FsbDtcclxuICB9XHJcbiAgcmVqZWN0TmV3SW5jb21pbmdDYWxsKGNhbGw6IENhbGwpIHtcclxuICAgIGNhbGwucmVqZWN0KCk7XHJcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHMgPSB0aGlzLm5ld0luY29taW5nQ2FsbHMuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0ucGFyYW1ldGVycy5DYWxsU2lkICE9PSBjYWxsLnBhcmFtZXRlcnNbJ0NhbGxTaWQnXSk7XHJcbiAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJhbWV0ZXJzLkNhbGxTaWQgIT09IGNhbGwucGFyYW1ldGVyc1snQ2FsbFNpZCddKTtcclxuICB9XHJcbiAgbmV3SW5jb21pbmdDYWxsSW5pdGlhdGVkKCkge1xyXG4gICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgIHRoaXMubmV3SW5jb21pbmdDYWxscyA9IFtdO1xyXG4gICAgdGhpcy5pbmNvbWluZ0NhbGxJbml0aWF0ZWQuZW1pdCgpO1xyXG4gIH1cclxuICBpbmNvbWluZ0NhbGxzTmV3SW5mbyhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSBkYXRhO1xyXG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTmV3SW5mb0V2ZW50LmVtaXQoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyU2V0dGluZ3MoKSB7XHJcbiAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0VXNlclNldHRpbmdzKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICB0aGlzLnVzZXJTZXR0aW5nSW5mbyA9IHJlcy51c2VyU2V0dGluZztcclxuICAgICAgICB0aGlzLmNkay5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFsbCBzdWJzY3JpcHRpb25zXHJcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBTdG9wIHJpbmdpbmcgaWYgYW4gaW5jb21pbmcgY2FsbCB3YXMgcGVuZGluZyB3aGVuIHRoZSBjb21wb25lbnQgaXMgdG9ybiBkb3duIChlLmcuIGxvZ291dCkuXHJcbiAgICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UucGF1c2UoKTtcclxuICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IFtdO1xyXG5cclxuICAgICAgLy8gQ2xlYW4gdXAgVHdpbGlvIGRldmljZSB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcclxuICAgICAgaWYgKHRoaXMudHdpbGlvU2VydmljZVsnZGV2aWNlJ10pIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnMTQwMicpO1xyXG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZVsnZGV2aWNlJ10uZGlzY29ubmVjdEFsbCgpO1xyXG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZVsnZGV2aWNlJ10uZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5zZXRJbmNvbWluZ011dGVkKHRydWUpO1xyXG5cclxuICAgICAgLy8gRW5kIGFueSBhY3RpdmUgY2FsbFxyXG4gICAgICBpZiAodGhpcy5pc0NhbGxJblByb2dyZXNzKSB7XHJcbiAgICAgICAgdGhpcy5lbmRDYWxsKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENsZWFyIGFueSB0aW1lb3V0cyBvciBpbnRlcnZhbHMgaWYgdGhleSBleGlzdFxyXG4gICAgICBpZiAodGhpcy50b2FzdFRpbWVvdXQpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b2FzdFRpbWVvdXQpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgY29tcG9uZW50IGNsZWFudXA6JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwiZHJhZ3BhcmVudDFcIiBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOmlzRGlhbHBhZEhpZGRlbiA/ICdub25lJzogJ2Jsb2NrJ31cIj5cclxuICA8bGliLWNhbGwtcHJvZ3Jlc3MgKm5nSWY9XCJpc0NhbGxJblByb2dyZXNzXCIgKGVuZENhbGxFdmVudCk9XCJlbmRDYWxsKClcIiAobWluaW1pc2VFdmVudCk9XCJvbk1pbmltaXNlKCRldmVudClcIlxyXG4gICAgKG11dGVBbGxTdGF0dXNFdmVudCk9XCJzaG93RGlhbEFsZXJ0KCRldmVudClcIlxyXG4gICAgKGluY29taW5nQ2FsbEluaXRpYXRlZCk9XCJuZXdJbmNvbWluZ0NhbGxJbml0aWF0ZWQoKVwiIFtuZXdJbmNvbWluZ0NhbGxEYXRhXT1cIm5ld0luY29taW5nQ2FsbERhdGFcIlxyXG4gICAgW2RldmljZUlkXT1cImRldmljZUlkXCIgW25ld0luY29taW5nQ2FsbHNMaXN0XT1cImluY29taW5nQ2FsbHNMaXN0XCIgW21pc3NDYWxsSW5mb109XCJtaXNzQ2FsbEluZm9cIlxyXG4gICAgKGluY29taW5nQ2FsbHNOZXdJbmZvKT1cImluY29taW5nQ2FsbHNOZXdJbmZvKCRldmVudClcIiBbc2VsZWN0ZWRDYWxsZXJJZF09XCJzZWxlY3RlZENhbGxlcklkXCJcclxuICAgIFtjYWxsZXJJZExpc3RdPVwiY2FsbGVySWRMaXN0XCIgW2NhbGxBY3Rpb25dPVwiY2FsbEFjdGlvblwiIFtjb25mZXJlbmNlQ2FsbEluZm9dPVwiY29uZmVyZW5jZUNhbGxJbmZvXCJcclxuICAgIFtuZXdDYWxsQ29uZmVyZW5jZV09XCJuZXdDYWxsQ29uZmVyZW5jZVwiIFt1c2VyU2V0dGluZ0luZm9dPVwidXNlclNldHRpbmdJbmZvXCJcclxuICAgIFtjYW5jZWxDb25uZWN0aW5nQWN0aW9uXT1cImNhbmNlbENvbm5lY3RpbmdBY3Rpb25cIlxyXG4gICAgW291dGdvaW5nQ29udGFjdE5hbWVdPVwib3V0Z29pbmdDb250YWN0TmFtZVwiXHJcbiAgICBbaW5jb21pbmdGcm9tSW1hZ2VdPVwiaW5jb21pbmdGcm9tSW1hZ2VcIlxyXG4gICAgKGVuZEluY29taW5nQ2FsbEV2ZW50KT1cImVuZEluY29taW5nQ2FsbCgkZXZlbnQpXCIgKGlzTG9hZGVyc2hvd24pPVwib25Mb2FkZXJzaG93KCRldmVudClcIiBbY2FsbERhdGFdPVwiY2FsbERhdGFcIj5cclxuICA8L2xpYi1jYWxsLXByb2dyZXNzPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJsb2FkZXItd3JhcHBlciBvdXRnb2luZy1jYWxsLWxvYWRlclwiICpuZ0lmPVwiaXNMb2FkZXJzaG93XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhY3RpdmUtY2FsbFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgcG9zaXRpb246IHJlbGF0aXZlO1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvbiBjYWxsLWFuaW1hdGlvbi1wbGF5XCI+XHJcbiAgICAgICAgICA8aW1nIGNsYXNzPVwiYXZhdGFyLWltZ1wiIFtzcmNdPVwiY29udGFjdEltZ0ZvckxvYWRlclwiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cclxuICAgICAgICAgIDxoMSBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDtcIj5Db25uZWN0aW5nLi4uPC9oMT5cclxuICAgICAgICAgIDxwIHN0eWxlPVwidGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XCI+e3sgY29udGFjdE5hbWVGb3JMb2FkZXIgfHwgZGlhbGVkTnVtYmVyIH19PC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGwtYWN0aW9uLWJ0bnNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsbC1idG4gZW5kLWNhbGwtYnRuXCIgZGlzYWJsZWQgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47XCIgKGNsaWNrKT1cImNhbmNlbENvbm5lY3RpbmdDYWxsKClcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIj4gY2FsbF9lbmQgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7J21pbmktZGlhbHBhZCc6IGlzTWluaW1pc2VkfVwiXHJcbiAgICAqbmdJZj1cIighaXNDYWxsSW5Qcm9ncmVzcyAmJiAhaW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoKSAmJiAhaXNMb2FkZXJzaG93XCIgdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwiaGFuZGxlRGl2S2V5ZG93bigkZXZlbnQpXCI+XHJcbiAgICA8ZGl2IGlkPVwidG9wUGFuZWxcIiBbbmdTdHlsZV09XCJ7J2hlaWdodCc6IGNhbGxlcklkTGlzdC5sZW5ndGggPyAnNDAlJyA6ICczOSUnfVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1hbGVydHNcIiAqbmdJZj1cImRpYWxBbGVydC5zaG93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXNlbGVjdGlvbi1hbGVydFwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+e3tkaWFsQWxlcnQubXNnfX08L3A+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRpbWVzXCIgKGNsaWNrKT1cInNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2VcIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1hbGVydHNcIiAqbmdJZj1cImNhbGxOdW1iZXJUb2FzdC5zaG93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRpYWxib3gtcG9wMSBhbGVydCBmYWRlIHNob3dcIiBbbmdDbGFzc109XCJjYWxsTnVtYmVyVG9hc3QudHlwZVwiIHJvbGU9XCJhbGVydFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgbXktYXV0byB0ZXh0LWxlZnRcIj5cclxuICAgICAgICAgICAgICBZb3UnciBjYWxsaW5nIDxzdHJvbmc+e3tjYWxsTnVtYmVyVG9hc3QuZGlzcGxheU51bX19PC9zdHJvbmc+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLWRpc2MgcC0wIHB4LTFcIiAoY2xpY2spPVwiY2FuY2VsRGlhbE51bWJlcigpXCI+Q2FuY2VsIENhbGw8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAwIDE4cHhcIiAocGFzdGUpPVwiaGFuZGxlTnVtYmVyUGFzdGUoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtMlwiPlxyXG4gICAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cImhpZGVEaWFscGFkKClcIj5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiIGZpbGw9XCIjZmZmZmZmXCI+XHJcbiAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJtMjU2LTIwMC01Ni01NiAyMjQtMjI0LTIyNC0yMjQgNTYtNTYgMjI0IDIyNCAyMjQtMjI0IDU2IDU2LTIyNCAyMjQgMjI0IDIyNC01NiA1Ni0yMjQtMjI0LTIyNCAyMjRaXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWJveFwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgI2RpYWxJbnB1dCBwbGFjZWhvbGRlcj1cIkVudGVyIGEgbmFtZSBvciBudW1iZXJcIiB0YWJpbmRleD1cIjFcIiBbKG5nTW9kZWwpXT1cImRpYWxlZE51bWJlclwiXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGlhbElucHV0Q2hhbmdlKCRldmVudClcIiAvPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJcIiBpZD1cImlucHV0LWNsZWFyLWJ0blwiIChjbGljayk9XCJjbGVhcklucHV0KClcIiAqbmdJZj1cInNob3dJbnB1dENsZWFyQnRuXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI1MHB4XCIgaGVpZ2h0PVwiMzBweFwiIHZpZXdCb3g9XCIwIDEwIDQwIDYwXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmVyc2lvbj1cIjEuMVwiIGJhc2VQcm9maWxlPVwiZnVsbFwiXHJcbiAgICAgICAgICAgICAgZW5hYmxlLWJhY2tncm91bmQ9XCJuZXcgMCAwIDc2LjAwIDc2LjAwXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cclxuICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiIzVkNjA2MVwiIGZpbGwtb3BhY2l0eT1cIjFcIiBzdHJva2Utd2lkdGg9XCIwLjJcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICBkPVwiTSA0Ny41MjgyLDQyLjk0OTdMIDQyLjU3ODQsMzhMIDQ3LjUyODIsMzMuMDUwMkwgNDQuOTQ5NywzMC40NzE4TCA0MCwzNS40MjE2TCAzNS4wNTAyLDMwLjQ3MThMIDMyLjQ3MTgsMzMuMDUwMkwgMzcuNDIxNiwzOEwgMzIuNDcxOCw0Mi45NDk3TCAzNS4wNTAyLDQ1LjUyODJMIDQwLDQwLjU3ODRMIDQ0Ljk0OTcsNDUuNTI4MkwgNDcuNTI4Miw0Mi45NDk3IFogTSAxOC4wMTQ3LDQxLjUzNTVMIDI2Ljk2NDYsNTAuNDg1NEMgMjguMDY4Myw1MS41ODkgMjksNTIgMzEsNTJMIDUyLDUyQyA1NC43NjE0LDUyIDU3LDQ5Ljc2MTQgNTcsNDdMIDU3LDI5QyA1NywyNi4yMzg2IDU0Ljc2MTQsMjQgNTIsMjRMIDMxLDI0QyAyOSwyNCAyOC4wNjgzLDI0LjQxMTMgMjYuOTY0NiwyNS41MTQ5TCAxOC4wMTQ3LDM0LjQ2NDVDIDE2LjA2MjEsMzYuNDE3MSAxNi4wNjIxLDM5LjU4MjkgMTguMDE0Nyw0MS41MzU1IFogTSAzMSw0OUMgMzAsNDkgMjkuNjA0OCw0OC44ODI4IDI5LjA4Niw0OC4zNjQxTCAyMC4xMzYxLDM5LjQxNDJDIDE5LjM1NSwzOC42MzMyIDE5LjM1NSwzNy4zNjY5IDIwLjEzNjEsMzYuNTg1OEwgMjkuMDg2LDI3LjYzNjJDIDI5LjYwNDgsMjcuMTE3NSAzMCwyNyAzMSwyNy4wMDAxTCA1MiwyNy4wMDAxQyA1My4xMDQ2LDI3LjAwMDEgNTQsMjcuODk1NSA1NCwyOS4wMDAxTCA1NCw0Ny4wMDAxQyA1NCw0OC4xMDQ2IDUzLjEwNDYsNDkuMDAwMSA1Miw0OS4wMDAxTCAzMSw0OSBaIFwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1pbmZvLWljb25cIiBwbGFjZW1lbnQ9XCJib3R0b20tcmlnaHRcIiB0b29sdGlwQ2xhc3M9XCJpbnB1dC10b29sdGlwXCJcclxuICAgICAgICAgICAgbmdiVG9vbHRpcD1cIkZvciBleHRlbnNpb24gZGlhbGluZywgdXNlIGZvcm1hdHMgbGlrZSArMTIzNDU2Nzg5MTAgeDEyMywrMTIzNDU2Nzg5MTAgZXh0LjEyMywgKzEyMzQ1Njc4OTEwLDEyM1wiPjxpXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZVwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImd1aWRlXCIgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoICYmICEoZGlhbGVkTnVtYmVyLmxlbmd0aCA+IDIpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImd1aWRldGV4dFwiPlBsZWFzZSBlbnRlciBhIG51bWJlciBvciBzZWxlY3QgYSBzYXZlZCBjb250YWN0PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDExOXB4OyBvdmVyZmxvdzogYXV0bztcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWNhcmRcIiAqbmdGb3I9XCJsZXQgY29udGFjdCBvZiBmaWx0ZXJlZENvbnRhY3RMaXN0XCIgKGNsaWNrKT1cIm9uQ29udGFjdFNlbGVjdChjb250YWN0KVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbWdcIj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiY29udGFjdC5pbWFnZVwiIGFsdD1cInVzZXIgaW1hZ2VcIiBsb2FkaW5nPVwibGF6eVwiICpuZ0lmPVwiY29udGFjdC5pbWFnZSBlbHNlIGFscGhhTmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNhbHBoYU5hbWU+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRhY3QtYWxwaGEtaW1nXCI+e3tnZXRGaXJzdExldHRlcihjb250YWN0LmZpcnN0TmFtZSl9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgIDxwIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNHB4XCIgY2xhc3M9XCJjb250YWN0LW5hbWVcIj57e2dldEZ1bGxOYW1lKGNvbnRhY3QpIH19PC9wPlxyXG4gICAgICAgICAgICAgIDxwPnt7Y29udGFjdC5zZWxlY3RlZE51bWJlci5udW1iZXJ9fTwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWNhcmRcIiAqbmdJZj1cIiFmaWx0ZXJlZENvbnRhY3RMaXN0Lmxlbmd0aCAmJiBkaWFsZWROdW1iZXIubGVuZ3RoID4gMiAmJiAhaXNWYWxpZGF0aW9uTWVzc2FnZVNob3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWNvbnRhY3QtbWVzc2FnZVwiPlxyXG4gICAgICAgICAgICAgIE5vIENvbnRhY3RzIEZvdW5kXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwid2F2ZXNcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcclxuICAgICAgICAgIHZpZXdCb3g9XCIwIDI0IDE1MCAyOFwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCIgc2hhcGUtcmVuZGVyaW5nPVwiYXV0b1wiPlxyXG4gICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgIDxwYXRoIGlkPVwiZ2VudGxlLXdhdmVcIiBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCIgLz5cclxuICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgIDxnIGNsYXNzPVwicGFyYWxsYXhcIj5cclxuICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjBcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjcpXCIgLz5cclxuICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjNcIiBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjUpXCIgLz5cclxuICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjdcIiBmaWxsPVwiI2ZmZlwiIC8+XHJcbiAgICAgICAgICA8L2c+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzTWluaW1pc2VkXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJkaWFsLWJ0blwiICpuZ0Zvcj1cImxldCBrZXkgb2Yga2V5cGFkVmFsO2xldCBpID0gaW5kZXhcIiAoa2V5ZG93bi5lbnRlcik9XCJvbkVudGVyKGtleS5udW0pXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBrZXkudGV4dCA9PT0gJysnID8gJzNweCcgOiAnMCd9XCIgW3RhYmluZGV4XT1cImRpYWxlZE51bWJlci5sZW5ndGggPyAnMCc6IGkrMlwiIGxvbmdQcmVzc1xyXG4gICAgICAgIChsb25nUHJlc3MpPVwiYWRkTnVtYmVyKGtleS50ZXh0KVwiIHNob3J0UHJlc3MgKHNob3J0UHJlc3MpPVwiYWRkTnVtYmVyKGtleS5udW0pXCI+XHJcbiAgICAgICAge3trZXkubnVtfX1cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImtleS5udW0gPT0gMTtlbHNlIG90aGVyVGhhbk9uZVwiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB2b2ljZW1haWxcIj5cclxuICAgICAgICAgIHZvaWNlbWFpbFxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI290aGVyVGhhbk9uZT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWFsYmhhYmV0c1wiIFtuZ0NsYXNzXT1cInsncGx1c1NpZ24nOiBrZXkudGV4dCA9PT0gJysnfVwiPnt7a2V5LnRleHQgPyBrZXkudGV4dCA6XHJcbiAgICAgICAgICAgICcmbmJzcDsnfX08L3NwYW4+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxsLWJ0bi1jb250YWluZXJcIiAqbmdJZj1cIiFpc01pbmltaXNlZFwiIChtb3VzZWVudGVyKT1cIm9uQ2FsbEJ0bk1vdXNlRW50ZXIoJGV2ZW50KVwiXHJcbiAgICAgIChtb3VzZWxlYXZlKT1cIm9uQ2FsbEJ0bk1vdXNlTGVhdmUoJGV2ZW50KVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1idG5cIiAoY2xpY2spPVwiaW5pdGlhdGVDYWxsKClcIiBbdGFiaW5kZXhdPVwiZGlhbGVkTnVtYmVyLmxlbmd0aCA/ICcyJzogJzE1J1wiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieydwb2ludGVyLWV2ZW50cyc6IGRpYWxlZE51bWJlci5sZW5ndGggJiYgc2VsZWN0ZWRDYWxsZXJJZCA/ICdhdXRvJyA6ICdub25lJywgJ29wYWNpdHknOiBkaWFsZWROdW1iZXIubGVuZ3RoICYmIHNlbGVjdGVkQ2FsbGVySWQgPyAnMScgOiAnMC41J31cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPlxyXG4gICAgICAgICAgY2FsbFxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoICYmICFpc01pbmltaXNlZFwiIGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNob3duQ2FsbGVySWRcIiAqbmdJZj1cInNlbGVjdGVkQ2FsbGVySWQ7IGVsc2UgYXNrQmxvY2tcIiAoY2xpY2spPVwidG9nZ2xlQ2FsbGVySWREaXYoKVwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCInZmkgZmktJyArIHNlbGVjdGVkQ2FsbGVySWQ/Lmlzb0NvZGU/LnRvTG93ZXJDYXNlKClcIj48L3NwYW4+XHJcbiAgICAgICAgICB7e3NlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcn19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2Fza0Jsb2NrPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaG93bkNhbGxlcklkXCIgKGNsaWNrKT1cInRvZ2dsZUNhbGxlcklkRGl2KClcIiBbbmdDbGFzc109XCJ7ICd0aWx0LXNoYWtpbmcnOiBzaGFrZURlZGljYXRlZEJ0biB9XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMFwiPlNlbGVjdCBDMkMgbnVtYmVyPC9oNT5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hbmdsZS1kb3duIG1sLTIgdGV4dC1ibHVlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjJweFwiPjwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ3VpZGUyXCIgKm5nSWY9XCJzaGFrZURlZGljYXRlZEJ0blwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZ3VpZGV0ZXh0XCI+UGxlYXNlIHNlbGVjdCBhIG51bWJlciBmcm9tIGJlbG93IGRyb3Bkb3duPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoOyBlbHNlIG5vQ2FsbGVySWRNZXNzYWdlXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsZXItaWQtbGlzdC1jb250YWluZXJcIiAqbmdJZj1cImNhbGxlcklkTGlzdC5sZW5ndGggJiYgIWlzTWluaW1pc2VkXCIgaWQ9XCJjYWxsZXJJZENvbnRhaW5lclwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyd2aXNpYmxlJzogIWlzQ2FsbGVySWRIaWRkZW59XCI+XHJcbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlblwiPlxyXG4gICAgICAgICAgPCEtLSA8aDQ+U2VsZWN0IEMyQyBTb2Z0cGhvbmUgTnVtYmVyPC9oND4gLS0+XHJcbiAgICAgICAgICA8aDQ+TWFrZSBvdXRnb2luZyBjYWxsIHVzaW5nPC9oND5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCIgKGNsaWNrKT1cImlzQ2FsbGVySWRIaWRkZW4gPSB0cnVlXCI+XHJcbiAgICAgICAgICAgIGNsb3NlXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHVsPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FsbGVySWQgb2YgY2FsbGVySWRMaXN0XCI+XHJcbiAgICAgICAgICAgIDxsaSBbbmdDbGFzc109XCJ7J3NlbGVjdGVkQ2FsbGVySWRDbGFzcyc6IGNhbGxlcklkPy5udW1iZXIgPT0gc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVkaWNhdGVkTnVtU2VsZWN0KGNhbGxlcklkKVwiPlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCInZmkgZmktJyArIGNhbGxlcklkPy5pc29Db2RlPy50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAge3tjYWxsZXJJZD8ubnVtYmVyfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8c3Bhbj57e2NhbGxlcklkPy5jb3VudHJ5TmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC91bD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy10ZW1wbGF0ZSAjbm9DYWxsZXJJZE1lc3NhZ2U+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibm8tY2FsbGVyLWlkLW1lc3NhZ2VcIj5UbyBtYWtlIGFueSB2b2ljZSBjYWxscywgcGxlYXNlIDxhXHJcbiAgICAgICAgICByb3V0ZXJMaW5rPVwiL2V4dGVuc2lvbi9kZWRpY2F0ZWRudW1iZXIve3t0b2tlbn19XCIgY2xhc3M9XCJjbGljay1oZXJlLWxpbmtcIlxyXG4gICAgICAgICAgdGl0bGU9XCJTZXR0aW5ncyA+IEMyQyBOdW1iZXJcIj5zdWJzY3JpYmU8L2E+IHRvIGEgdm9pY2UgY2FwYWJsZSBDMkMgTnVtYmVyLlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPGRpdiBjbGFzcz1cImRlZGljYXRlZC1vdmVybGF5XCIgKm5nSWY9XCJzaG93RGVkaWNhdGVkUG9wdXBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZGVkaWNhdGVkTnVtUG9wdXBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgY2hvb3NlRGVkaWNhdGVkSGVhZGVyXCI+XHJcbiAgICAgICAgICA8aDU+Q2hvb3NlIEMyQyBOdW1iZXI8L2g1PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNob3dEZWRpY2F0ZWRQb3B1cCA9IGZhbHNlXCI+Y2xvc2U8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkZWRpY2F0ZWROdW1MaXN0XCI+XHJcbiAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhbGxlcklkIG9mIGNhbGxlcklkTGlzdFwiPlxyXG4gICAgICAgICAgICAgIDxsaSBbbmdDbGFzc109XCJ7J3NlbGVjdGVkQ2FsbGVySWRDbGFzcyc6IGNhbGxlcklkPy5udW1iZXIgPT0gc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0RlZGljYXRlZFBvcHVwID0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIidmaSBmaS0nICsgY2FsbGVySWQ/Lmlzb0NvZGU/LnRvTG93ZXJDYXNlKClcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIHt7Y2FsbGVySWQ/Lm51bWJlcn19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7Y2FsbGVySWQ/LmNvdW50cnlOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L3VsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
|
1313
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRW5NLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUcvQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUE7Ozs7Ozs7Ozs7OztBQVluQyxNQUFNLE9BQU8sZ0JBQWdCO0lBaUIzQixJQUFhLGVBQWUsQ0FBQyxLQUFjO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLDZEQUE2RDtZQUM3RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFNRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQW1FRCxtQkFBbUIsQ0FBQyxNQUFXO1FBQzdCLDZEQUE2RDtRQUM3RCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUNELHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UsNEVBQTRFO1FBQzVFLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUU7WUFFM0QsTUFBTSxtQkFBbUIsR0FBRywwRkFBMEYsQ0FB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Z0I7a0dBQWhCLGdCQUFnQiwyNkJDbEI3QiwyeGFBNE9NOzRGRDFOTyxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsYUFBYTsrUkFPZCxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQVVPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBT0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBTUksaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNpQixnQkFBZ0I7c0JBQXZDLFNBQVM7dUJBQUMsV0FBVztnQkFDWixZQUFZO3NCQUFyQixNQUFNO2dCQTBEUCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcUIvQyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHdpbGlvU2VydmljZSB9IGZyb20gJy4vc2VydmljZS90d2lsaW8uc2VydmljZSc7XG5pbXBvcnQgc3dhbCBmcm9tICdzd2VldGFsZXJ0Mic7XG5pbXBvcnQgeyBFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlL2V4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBrZXlwYWQgfSBmcm9tICcuLi9rZXlwYWQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IElwQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvaXAtYWRkcmVzcy5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDYWxsIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xuaW1wb3J0IHsgSW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvaW5jb21laW5nLWNhbGwtc29ja2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGlhbGJveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaWFsYm94LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlhbGJveC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGlhbGJveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgcHJpdmF0ZSBfaXNEaWFscGFkSGlkZGVuOiBib29sZWFuID0gdHJ1ZTtcbiAgLy8gTGV0IHRoZSBsaWJyYXJ5IGRlY2lkZSB0byBhdXRvLW9wZW4gb24gaW5jb21pbmcgY2FsbCB3aXRob3V0IGhvc3Qgd2lyaW5nXG4gIEBJbnB1dCgpIGF1dG9PcGVuT25JbmNvbWluZzogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNvbnRhY3RJbmZvOiBhbnk7XG4gIEBJbnB1dCgpIGRldmljZUlkOiBhbnk7XG4gIEBJbnB1dCgpIHVzZXJJZDogYW55O1xuICBASW5wdXQoKSBjYWxsQWN0aW9uOiBhbnk7XG4gIGlzTG9hZGVyc2hvdyA9IGZhbHNlO1xuICBpc0luY29taW5nQ2FsbG5vdGlmaWNhdGlvbjogYW55ID0gZmFsc2U7XG4gIG5vdGlmaWNhdGlvbkNhbGxMaXN0OiBhbnkgPSBbXTtcbiAgZGV2aWNlTnVtYmVyTGlzdDogYW55W10gPSBbXTtcbiAgbWlzc0NhbGxJbmZvOiBhbnkgPSB7fTtcbiAgY29ubmVjdGluZ0luY29taW5nQ2FsbElkOiBzdHJpbmcgPSAnJztcbiAgbmV3Q2FsbENvbmZlcmVuY2U6IGFueTtcbiAgdXNlclNldHRpbmdJbmZvOiBhbnk7XG5cbiAgQElucHV0KCkgc2V0IGlzRGlhbHBhZEhpZGRlbih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzRGlhbHBhZEhpZGRlbiA9IHZhbHVlO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIC8vIFdoZW4gZGlhbHBhZCBiZWNvbWVzIHZpc2libGUsIGVuc3VyZSBUd2lsaW8gaXMgaW5pdGlhbGl6ZWRcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVR3aWxpbygpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKSBpbmNvbWluZ0NhbGxEYXRhOiBhbnlcbiAgQElucHV0KCkgaW5jb21pbmdDYWxsbm90aWZpY2F0aW9uOiBhbnk7XG4gIEBJbnB1dCgpIHVwZGF0ZWRUd2lsaW9Ub2tlbjogc3RyaW5nID0gJyc7XG4gIGNvbmZlcmVuY2VDYWxsSW5mbzogYW55ID0ge307XG4gIGlzVmFsaWRhdGlvbk1lc3NhZ2VTaG93ID0gZmFsc2VcbiAgZ2V0IGlzRGlhbHBhZEhpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNEaWFscGFkSGlkZGVuO1xuICB9XG4gIEBPdXRwdXQoKSBjbG9zZURpYWxwYWRFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY2FsbEluaXRpYXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGVuZENhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbWluaW1pc2VFdmVudDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0luZm9FdmVudDogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gIEBPdXRwdXQoKSBpbmNvbWluZ0NhbGxJbml0aWF0ZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbmZlcmVuY2VDYWxsTGlzdDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAVmlld0NoaWxkKCdkaWFsSW5wdXQnKSBkaWFsSW5wdXRFbGVtZW50ITogRWxlbWVudFJlZjtcbiAgQE91dHB1dCgpIG51bWJlckRpYWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvLyBOZXcgb2JqZWN0IHJlZmVyZW5jZSBlYWNoIHRpbWUgQ2FuY2VsIGlzIGNsaWNrZWQsIHNvIGxpYi1jYWxsLXByb2dyZXNzJ3MgbmdPbkNoYW5nZXNcbiAgLy8gZmlyZXMgZXZlbiBpZiB0aGUgY29tcG9uZW50IHdhc24ndCBtb3VudGVkIHlldCBhdCBjbGljayB0aW1lLlxuICBjYW5jZWxDb25uZWN0aW5nQWN0aW9uOiBhbnkgPSBudWxsO1xuXG4gIGlzQ2FsbEluUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAga2V5cGFkVmFsID0ga2V5cGFkO1xuICBzaG93SW5wdXRDbGVhckJ0bjogYm9vbGVhbiA9IGZhbHNlO1xuICBkaWFsZWROdW1iZXI6IHN0cmluZyA9ICcnO1xuICBjb250YWN0TGlzdDogYW55W10gPSBbXTtcbiAgZmlsdGVyZWRDb250YWN0TGlzdDogYW55W10gPSBbXTtcbiAgY2FsbGVySWRMaXN0OiBhbnlbXSA9IFtdO1xuICBzZWxlY3RlZENhbGxlcklkOiBhbnk7XG4gIGlzQ2FsbGVySWRIaWRkZW46IGJvb2xlYW4gPSB0cnVlO1xuICBpc1RyaWFsUGVyaW9kT3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1BheW1lbnREdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGVybWluYXRlQ2FsbCA9IGZhbHNlO1xuICB0b2FzdFRpbWVvdXQgPSA3MDAwO1xuICBjYWxsTnVtYmVyVG9hc3QgPSB7XG4gICAgc2hvdzogZmFsc2UsXG4gICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxuICAgIG51bWJlcjogJycsXG4gICAgZGlzcGxheU51bTogJydcbiAgfVxuICBjYWxsRGF0YTogYW55ID0ge1xuICAgIHBob25lOiAnJyxcbiAgICBkaXNwbGF5TnVtOiAnJyxcbiAgICBkaWFsOiBmYWxzZSxcbiAgICBuYW1lOiAnJyxcbiAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcbiAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gICAgZXh0TnVtOiAnJ1xuICB9O1xuICBsYXN0RGlhbGVkOiB7IG5hbWU/OiBzdHJpbmc7IGltYWdlPzogc3RyaW5nOyBudW1iZXI6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIHNhbml0aXplZE51bTogYW55O1xuICBkaWFsQWxlcnQgPSB7XG4gICAgbXNnOiAnJyxcbiAgICBzaG93OiBmYWxzZVxuICB9XG4gIHRva2VuPzogc3RyaW5nO1xuICBzaG93RGVkaWNhdGVkUG9wdXA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbmV3SW5jb21pbmdDYWxsczogYW55ID0gW107XG4gIGluY29taW5nQ2FsbHNMaXN0OiBhbnkgPSBbXTtcbiAgbmV3SW5jb21pbmdDYWxsRGF0YT86IENhbGw7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBjYWxsUHJlZmVyZW5jZTogYW55O1xuICBzaGFrZURlZGljYXRlZEJ0bjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1NtYXJ0RGlhbENhbGw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIC8vIFNldCBvbmNlIHRoZSB1c2VyIGNvbmZpcm1zIGFuIGludGVudGlvbmFsIHJlbG9hZCB2aWEgb3VyIGN1c3RvbSBtb2RhbCxcbiAgLy8gc28gdGhlIG5hdGl2ZSBiZWZvcmV1bmxvYWQgcHJvbXB0IGlzIG5vdCBzaG93biBvbiB0b3Agb2YgaXQuXG4gIHByaXZhdGUgaXNSZWxvYWRDb25maXJtZWQgPSBmYWxzZTtcbiAgbnVsbFBhcnRpY2lwYW50Q2FsbExpc3Q6IGFueSA9W11cbiAgY29udGFjdE5hbWVGb3JMb2FkZXIgPSAnJztcbiAgY29udGFjdEltZ0ZvckxvYWRlciA9ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJztcbiAgaW5jb21pbmdGcm9tSW1hZ2UgPSAnJztcblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJywgWyckZXZlbnQnXSlcbiAgYmVmb3JlVW5sb2FkSGFuZGxlcigkZXZlbnQ6IGFueSkge1xuICAgIC8vIEFscmVhZHkgY29uZmlybWVkIHZpYSBvdXIgY3VzdG9tIG1vZGFsIC0+IHJlbG9hZCBzaWxlbnRseS5cbiAgICBpZiAodGhpcy5pc1JlbG9hZENvbmZpcm1lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgZm9yIHRoZSBicm93c2VyJ3MgcmVmcmVzaCBidXR0b24gLyB0YWIgY2xvc2UsIHdoaWNoIGNhbm5vdCBiZVxuICAgIC8vIGludGVyY2VwdGVkIHdpdGggYSBjdXN0b20gbW9kYWwuIFRyaWdnZXJzIHRoZSBuYXRpdmUgY29uZmlybWF0aW9uIHNvIHRoZVxuICAgIC8vIHVzZXIgZG9lcyBub3QgbG9zZSB0aGUgY2FsbCBhY2NpZGVudGFsbHkuIChCcm93c2VyIGNvbnRyb2xzIHRoZSB3b3JkaW5nLilcbiAgICBpZiAodGhpcy5pc0NhbGxJblByb2dyZXNzIHx8IHRoaXMuaW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xuXG4gICAgICBjb25zdCBjb25maXJtYXRpb25NZXNzYWdlID0gJ1JlbG9hZGluZyB0aGlzIHBhZ2Ugd2lsbCBkaXNjb25uZWN0IHlvdXIgYWN0aXZlIGNhbGwuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT8nO1xuICAgICAgICRldmVudC5yZXR1cm5WYWx1ZSA9IGNvbmZpcm1hdGlvbk1lc3NhZ2UgO1xuICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICByZXR1cm4gY29uZmlybWF0aW9uTWVzc2FnZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzp1bmxvYWQnKVxuICB1bmxvYWRIYW5kbGVyKCkge1xuICAgIC8vIFNraXAgaWYgd2UgYWxyZWFkeSByZW1vdmVkIHBhcnRpY2lwYW50cyBpbiB0aGUgY3VzdG9tLW1vZGFsIGZsb3cuXG4gICAgaWYgKHRoaXMuaXNSZWxvYWRDb25maXJtZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdHdpbGlvU2VydmljZTogVHdpbGlvU2VydmljZSxcbiAgICBwcml2YXRlIGV4dFNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpcFNlcnZpY2U6IElwQWRkcmVzc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBleHRlbnNpb25TZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RrOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2U6IEluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLFxuICApIHtcbiAgICAvLyBJbml0aWFsaXplIGlmIGRpYWxwYWQgaXMgdmlzaWJsZSBieSBkZWZhdWx0XG4gICAgaWYgKCF0aGlzLmlzRGlhbHBhZEhpZGRlbikge1xuICAgICAgdGhpcy5pbml0aWFsaXplVHdpbGlvKCk7XG4gICAgfVxuICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UuY3JlYXRlQXVkaW9CYXNlKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVUd2lsaW8oKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMudG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfHwgJyc7XG4gICAgICBpZiAoIXRoaXMudG9rZW4pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gYXV0aGVudGljYXRpb24gdG9rZW4gZm91bmQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgLy8gSW5pdGlhbGl6ZSBUd2lsaW8gc2VydmljZVxuICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmluaXRpYWxpemVUd2lsaW9EZXZpY2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2RldmljZUlkJykpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIEVuc3VyZSBUd2lsaW8gaXMgaW5pdGlhbGl6ZWQgZXZlbiB3aGVuIGRpYWxwYWQgc3RhcnRzIGhpZGRlbixcbiAgICAvLyBzbyB3ZSBjYW4gYXV0by1vcGVuIG9uIGluY29taW5nIGNhbGxzLlxuICAgIHRoaXMuaW5pdGlhbGl6ZVR3aWxpbygpO1xuICAgIHRoaXMuaW5jb21laW5nQ2FsbFNvY2tldFNlcnZpY2UuY29ubmVjdCh0aGlzLmRldmljZUlkKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5saXN0ZW4oKS5zdWJzY3JpYmUoYXN5bmMgKGluY29taW5nQ2FsbERhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBBIHNwZWNpYWwgbnVtYmVyIGFkZGVkIHRvIGEgbm9ybWFsIGNhbGwgZmFpbHMgb24gQkUgKGVycm9yIGFscmVhZHkgc2hvd24pLCBidXQgdGhlIHNvY2tldFxuICAgICAgICAvLyBzdGlsbCBzZW5kcyB0aGF0IHBhcnRpY2lwYW50IHdpdGhvdXQgYW4gaXNMZWZ0IGtleSwgc28gaXQgc2hvd2VkIHVwIGFzIGFjdGl2ZS4gVHJlYXQgaXQgYXMgbGVmdC5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5jb21pbmdDYWxsRGF0YSkpIHtcbiAgICAgICAgICBpbmNvbWluZ0NhbGxEYXRhLmZvckVhY2goKGNhbGxJbmZvOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNhbGxJbmZvPy5wYXJ0aWNpcGFudHM/LmZvckVhY2goKHBhcnRpY2lwYW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHBhcnRpY2lwYW50Py5zcGVjaWFsQ2FsbCA9PT0gdHJ1ZSAmJiBwYXJ0aWNpcGFudD8uaXNMZWZ0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudC5pc0xlZnQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuY29uZmVyZW5jZUNhbGxJbmZvID0gaW5jb21pbmdDYWxsRGF0YTtcbiAgICAgICAgdGhpcy5jb25mZXJlbmNlQ2FsbExpc3QuZW1pdChpbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgdGhpcy50b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB8fCAnJztcbiAgICAgICAgaWYgKHRoaXMudG9rZW4gPT0gJ2xvZ291dCcpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5kZXZpY2U/LmRpc2Nvbm5lY3RBbGwoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmlsdGVyIG91dCBjb25mZXJlbmNlcyB3aXRoIG5vIHBhcnRpY2lwYW50c1xuICAgICAgICBpbmNvbWluZ0NhbGxEYXRhID0gaW5jb21pbmdDYWxsRGF0YT8ubGVuZ3RoID4gMFxuICAgICAgICAgID8gaW5jb21pbmdDYWxsRGF0YS5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJ0aWNpcGFudHM/Lmxlbmd0aCA+IDApXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgLy8gQWxsIGNvbmZlcmVuY2VJZHMgcmVjZWl2ZWQgZnJvbSBzb2NrZXQgdGhpcyB0aWNrXG4gICAgICAgIGNvbnN0IHNvY2tldENvbmZlcmVuY2VJZHM6IHN0cmluZ1tdID0gaW5jb21pbmdDYWxsRGF0YS5tYXAoKGM6IGFueSkgPT4gYy5jb25mZXJlbmNlSWQpO1xuXG4gICAgICAgIGluY29taW5nQ2FsbERhdGEuZm9yRWFjaCgoY2FsbEluZm86IGFueSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIFdFIGFyZSBhbiBhY3RpdmUgcGFydGljaXBhbnQgaW4gdGhpcyBjb25mZXJlbmNlXG4gICAgICAgICAgY29uc3Qgb3VyTnVtYmVyID0gY2FsbEluZm8/LnBhcnRpY2lwYW50cy5maW5kKChyZXNEYXRhOiBhbnkpID0+XG4gICAgICAgICAgICAoKHRoaXMuZGV2aWNlTnVtYmVyTGlzdC5pbmNsdWRlcyhyZXNEYXRhPy5mcm9tKSAmJiByZXNEYXRhPy5kaXJlY3Rpb24gPT0gJ291dGdvaW5nLWNhbGwnICYmIHJlc0RhdGE/LmNsaWVudCAmJiAocmVzRGF0YT8uaG9zdCAmJiBjYWxsSW5mby5jYWxsU291cmNlID09ICdEaWFscGFkJyB8fCAhcmVzRGF0YT8uaG9zdCkpIHx8XG4gICAgICAgICAgICAgICh0aGlzLmRldmljZU51bWJlckxpc3QuaW5jbHVkZXMocmVzRGF0YT8udG8pICYmIHJlc0RhdGE/LmRpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcgJiYgcmVzRGF0YT8uY2xpZW50KVxuICAgICAgICAgICAgKSAmJiAhcmVzRGF0YT8uaXNMZWZ0KTtcblxuICAgICAgICAgIC8vIE1hdGNoIHRoZSBBQ1RJVkUgY29uZmVyZW5jZSBlbnRyeSBvbmx5IOKAlCBuZXZlciBhIHBlbmRpbmcgaW5jb21pbmctY2FsbFxuICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiwgd2hpY2ggY2FuIHNoYXJlIHRoaXMgY29uZmVyZW5jZUlkIGJ1dCBtdXN0IG5vdCBiZSBvdmVyd3JpdHRlblxuICAgICAgICAgIC8vIHdpdGggc29ja2V0IGRhdGEgKGl0IGlzIGtleWVkL21hbmFnZWQgc2VwYXJhdGVseSBieSBwYXJ0aWNpcGFudElkKS5cbiAgICAgICAgICBjb25zdCBjYWxsSW5kZXggPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbmRJbmRleCgocmVzOiBhbnkpID0+IHJlcy5jb25mZXJlbmNlSWQgPT0gY2FsbEluZm8uY29uZmVyZW5jZUlkICYmICFyZXM/Ll9pc05vdGlmaWNhdGlvbik7XG5cbiAgICAgICAgICBpZiAob3VyTnVtYmVyPy5pZCkge1xuICAgICAgICAgICAgLy8gV2UgYXJlIGluIHRoaXMgY2FsbCDigJQgdXBkYXRlIGV4aXN0aW5nIG9yIGFkZCBuZXdcbiAgICAgICAgICAgIGlmIChjYWxsSW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0W2NhbGxJbmRleF0gPSB7IC4uLnRoaXMuaW5jb21pbmdDYWxsc0xpc3RbY2FsbEluZGV4XSwgLi4uY2FsbEluZm8gfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QucHVzaCh7IC4uLmNhbGxJbmZvIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBXZSBhcmUgTk9UIGEgcGFydGljaXBhbnQg4oCUIHJlbW92ZSBmcm9tIGluY29taW5nQ2FsbHNMaXN0IG9ubHkgaWYgaXQgaXMgTk9UIGFuIGluY29taW5nLWNhbGwgbm90aWZpY2F0aW9uXG4gICAgICAgICAgICBpZiAoY2FsbEluZGV4ID4gLTEgJiYgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdFtjYWxsSW5kZXhdPy5jYWxsRGlyZWN0aW9uICE9PSAnaW5jb21pbmctY2FsbCcpIHtcbiAgICAgICAgICAgICAgLy8gRklYOiBzcGxpY2UoaW5kZXgsIGRlbGV0ZUNvdW50KSDigJQgd2FzIGluY29ycmVjdGx5IHNwbGljZSgxLCBjYWxsSW5kZXgpXG4gICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3Quc3BsaWNlKGNhbGxJbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gUmVtb3ZlIGFjdGl2ZS1jYWxsIGVudHJpZXMgd2hvc2UgY29uZmVyZW5jZUlkIGlzIG5vIGxvbmdlciBpbiB0aGUgc29ja2V0XG4gICAgICAgIC8vIGJ1dCBrZWVwIGluY29taW5nLWNhbGwgbm90aWZpY2F0aW9ucyAodGhleSBhcmUgbWFuYWdlZCBieSBub3RpZmljYXRpb25DYWxsTGlzdCBleHBpcnkpXG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcigocmVzOiBhbnkpID0+XG4gICAgICAgICAgc29ja2V0Q29uZmVyZW5jZUlkcy5pbmNsdWRlcyhyZXMuY29uZmVyZW5jZUlkKSB8fCByZXMuY2FsbERpcmVjdGlvbiA9PT0gJ2luY29taW5nLWNhbGwnXG4gICAgICAgICk7XG4gICAgICAgIC8vIFJlbW92ZSBleHBpcmVkIG5vdGlmaWNhdGlvbiBlbnRyaWVzXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LmZpbHRlcihcbiAgICAgICAgICAocmVzOiBhbnkpID0+IHJlcy5lbmRUaW1lID49IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICk7XG4gICAgICAgIC8vIE1lcmdlIG5vdGlmaWNhdGlvbkNhbGxMaXN0IE9OQ0UgKG5vdCBpbnNpZGUgZm9yRWFjaCkuIEEgcGVuZGluZyBpbmNvbWluZy1jYWxsXG4gICAgICAgIC8vIG5vdGlmaWNhdGlvbiBpcyBpZGVudGlmaWVkIGJ5IGl0cyBPV04gcGFydGljaXBhbnRJZCDigJQgbmV2ZXIgYnkgY29uZmVyZW5jZUlkIOKAlFxuICAgICAgICAvLyBiZWNhdXNlIGl0IGNhbiBsZWdpdGltYXRlbHkgc2hhcmUgdGhlIGNvbmZlcmVuY2VJZCBvZiBhIGNvbmZlcmVuY2Ugd2UgYXJlIGFscmVhZHlcbiAgICAgICAgLy8gaW4gKGUuZy4gd2hlbiBhIHNlY29uZCBvbmUgb2Ygb3VyIG51bWJlcnMgaXMgaW52aXRlZCBpbnRvIHRoYXQgc2FtZSBjb25mZXJlbmNlKS5cbiAgICAgICAgLy8gT25seSBza2lwIGEgbm90aWZpY2F0aW9uIGlmIGFuIGlkZW50aWNhbCBvbmUgKHNhbWUgcGFydGljaXBhbnRJZCkgaXMgYWxyZWFkeSBwcmVzZW50LlxuICAgICAgICBjb25zdCBleGlzdGluZ05vdGlmaWNhdGlvblBhcnRpY2lwYW50SWRzID0gbmV3IFNldChcbiAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0XG4gICAgICAgICAgICAuZmlsdGVyKChyOiBhbnkpID0+IHI/Ll9pc05vdGlmaWNhdGlvbilcbiAgICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gcj8ucGFydGljaXBhbnRJZClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uc1RvQWRkID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maWx0ZXIoXG4gICAgICAgICAgKG46IGFueSkgPT4gIWV4aXN0aW5nTm90aWZpY2F0aW9uUGFydGljaXBhbnRJZHMuaGFzKG4/LnBhcnRpY2lwYW50SWQpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSBbLi4udGhpcy5pbmNvbWluZ0NhbGxzTGlzdCwgLi4ubm90aWZpY2F0aW9uc1RvQWRkXTtcbiAgICAgICAgLy8gRmluYWwgZGVkdXBsaWNhdGlvbi4gQWN0aXZlIGNvbmZlcmVuY2UgZW50cmllcyBhcmUga2V5ZWQgYnkgY29uZmVyZW5jZUlkIChzb2NrZXQgZGF0YVxuICAgICAgICAvLyB3aW5zIOKAlCBsYXN0IHdyaXRlIHdpbnMpLiBQZW5kaW5nIGluY29taW5nLWNhbGwgbm90aWZpY2F0aW9ucyBhcmUga2V5ZWQgaW4gYSBTRVBBUkFURVxuICAgICAgICAvLyBuYW1lc3BhY2UgYnkgcGFydGljaXBhbnRJZCwgc28gYSBub3RpZmljYXRpb24gYW5kIGFuIGFjdGl2ZSBjb25mZXJlbmNlIHRoYXQgc2hhcmUgdGhlXG4gICAgICAgIC8vIHNhbWUgY29uZmVyZW5jZUlkIEJPVEggc3Vydml2ZSAodGhlIHNlY29uZC1udW1iZXIgc2NlbmFyaW8pIGluc3RlYWQgb2YgcmVwbGFjaW5nIGVhY2ggb3RoZXIuXG4gICAgICAgIGNvbnN0IHNlZW4gPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCkge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGl0ZW0/Ll9pc05vdGlmaWNhdGlvblxuICAgICAgICAgICAgPyBgbm90aWY6JHtpdGVtPy5wYXJ0aWNpcGFudElkfWBcbiAgICAgICAgICAgIDogYGNvbmY6JHtpdGVtPy5jb25mZXJlbmNlSWR9YDtcbiAgICAgICAgICBzZWVuLnNldChrZXksIGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaW5hbExpc3QgPSBBcnJheS5mcm9tKHNlZW4udmFsdWVzKCkpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBhbnkgbm90aWZpY2F0aW9uIGVudHJ5IGlmIGFuIGFjdGl2ZSBjb25mZXJlbmNlIHdpdGggdGhlIHNhbWUgY29uZmVyZW5jZUlkIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIC8vIGFkZGVkIGZvciA3NDcyIGJ1Z1xuICAgICAgICBjb25zdCBhY3RpdmVDb25mZXJlbmNlSWRzID0gbmV3IFNldChcbiAgICAgICAgICBmaW5hbExpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+ICFpdGVtLl9pc05vdGlmaWNhdGlvbikubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0uY29uZmVyZW5jZUlkKVxuICAgICAgICApO1xuICAgICAgICBmaW5hbExpc3QgPSBmaW5hbExpc3QuZmlsdGVyKFxuICAgICAgICAgIChpdGVtOiBhbnkpID0+ICEoaXRlbS5faXNOb3RpZmljYXRpb24gJiYgYWN0aXZlQ29uZmVyZW5jZUlkcy5oYXMoaXRlbS5jb25mZXJlbmNlSWQpKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gZmluYWxMaXN0O1xuXG4gICAgICAgIGlmICh0aGlzLmluY29taW5nQ2FsbHNMaXN0Py5sZW5ndGggJiYgaW5jb21pbmdDYWxsRGF0YT8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxub3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNkay5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaGFzUGVuZGluZ05vdGlmaWNhdGlvbnMgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnNvbWUoXG4gICAgICAgICAgICAocmVzOiBhbnkpID0+IHJlcz8uX2lzTm90aWZpY2F0aW9uIHx8IHJlcz8uY2FsbERpcmVjdGlvbiA9PT0gJ2luY29taW5nLWNhbGwnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBoYXNBY2NlcHRlZENhbGxzID0gdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3Q/Lmxlbmd0aCA+IDA7XG5cbiAgICAgICAgICBpZiAoKGhhc0FjY2VwdGVkQ2FsbHMgfHwgaGFzUGVuZGluZ05vdGlmaWNhdGlvbnMpICYmIHRoaXMuaW5jb21pbmdDYWxsc0xpc3Q/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzSW5jb21pbmdDYWxsbm90aWZpY2F0aW9uICYmICF0aGlzLnR3aWxpb1NlcnZpY2UuaXNBd2FpdGluZ1NwZWNpYWxDYWxsQ29uZmlybSkge1xuICAgICAgICAgICAgLy8gR2VudWluZWx5IGlkbGU6IG5vIGFuc3dlcmVkIGNhbGxzIGFuZCBubyByaW5naW5nIG5vdGlmaWNhdGlvbnMg4oaSIGZ1bGwgcmVzZXQuXG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhID0gW107XG4gICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gW107XG4gICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnMzQ0Jyk7XG4gICAgICAgICAgICAgIGlmICghdGhpcy50d2lsaW9TZXJ2aWNlLmFjY2VwdGVkQ2FsbExpc3Q/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5kZXZpY2U/LmRpc2Nvbm5lY3RBbGwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2Uuc3BhcmVEZXZpY2U/LmRpc2Nvbm5lY3RBbGwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuYWNjZXB0ZWRDYWxsTGlzdCA9IFtdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy50b2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKSB8fCAnJztcbiAgICAgIHRoaXMuZ2V0Q29udGFjdExpc3QoKTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5pc0xvYWRlcnNob3cuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0xvYWRlcnNob3cgPSByZXM7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8vIEZJWDogLmZpbHRlcigpIHJldHVybnMgYSBuZXcgYXJyYXkg4oCUIG11c3QgYXNzaWduIGJhY2sgdG8gYWN0dWFsbHkgbXV0YXRlIHRoZSBsaXN0c1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmlzQWNjZXB0SUluY29taW5nQ2FsbC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIC8vIGByZXNgIGlzIGVpdGhlciBhIHBsYWluIGNvbmZlcmVuY2VJZCAobGVnYWN5KSBvciB7IGNvbmZlcmVuY2VJZCwgcGFydGljaXBhbnRJZCB9LlxuICAgICAgICBjb25zdCBhY2NlcHRlZENvbmZlcmVuY2VJZCA9IHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gcmVzIDogcmVzPy5jb25mZXJlbmNlSWQ7XG4gICAgICAgIGNvbnN0IGFjY2VwdGVkUGFydGljaXBhbnRJZCA9IHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gbnVsbCA6IHJlcz8ucGFydGljaXBhbnRJZDtcblxuICAgICAgICBpZiAoYWNjZXB0ZWRQYXJ0aWNpcGFudElkICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0ID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maWx0ZXIoXG4gICAgICAgICAgICAoY2FsbDogYW55KSA9PiBjYWxsPy5wYXJ0aWNpcGFudElkICE9IGFjY2VwdGVkUGFydGljaXBhbnRJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IHRoaXMuaW5jb21pbmdDYWxsc0xpc3QuZmlsdGVyKFxuICAgICAgICAgICAgKGNhbGw6IGFueSkgPT5cbiAgICAgICAgICAgICAgISgoY2FsbD8ucGFydGljaXBhbnRJZCA9PSBhY2NlcHRlZFBhcnRpY2lwYW50SWQgfHwgY2FsbD8uaWQgPT0gYWNjZXB0ZWRQYXJ0aWNpcGFudElkKSAmJlxuICAgICAgICAgICAgICAgIGNhbGw/LmNhbGxEaXJlY3Rpb24gPT0gJ2luY29taW5nLWNhbGwnKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGVnYWN5IGZhbGxiYWNrOiByZW1vdmUgYnkgY29uZmVyZW5jZUlkLlxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LmZpbHRlcigoY2FsbDogYW55KSA9PiBjYWxsPy5jb25mZXJlbmNlSWQgIT0gYWNjZXB0ZWRDb25mZXJlbmNlSWQpO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcihcbiAgICAgICAgICAgIChjYWxsOiBhbnkpID0+IGNhbGw/LmNvbmZlcmVuY2VJZCAhPSBhY2NlcHRlZENvbmZlcmVuY2VJZCB8fCBjYWxsPy5jYWxsRGlyZWN0aW9uICE9ICdpbmNvbWluZy1jYWxsJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZC5zdWJzY3JpYmUoKGNhbGxJZCkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZCA9IGNhbGxJZDtcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3ViMSA9IHRoaXMudHdpbGlvU2VydmljZS5kaWFsTnVtYmVyRnJvbU90aGVyTW9kdWxlLnN1YnNjcmliZSgoY29udGFjdDogYW55KSA9PiB7XG4gICAgICAgIGlmIChjb250YWN0Lm51bWJlcikge1xuICAgICAgICAgIHRoaXMuaXNTbWFydERpYWxDYWxsID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGNvbnRhY3QuaXNEaWFsRnJvbUhpc3RvcnkpIHtcbiAgICAgICAgICAgIC8vaGFuZGxlIGRpYWxpbmcgZnJvbSBoaXN0b3J5IHBhZ2VcbiAgICAgICAgICAgIGlmIChjb250YWN0LmNhbGxlcklkID09ICdzbWFydERpYWxpbmcnKSB7XG5cbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0geyBudW1iZXI6IGNvbnRhY3QuZnJvbSB9O1xuICAgICAgICAgICAgICB0aGlzLmlzU21hcnREaWFsQ2FsbCA9IHRydWU7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IGNvbnRhY3QubmFtZTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0LmltZztcbiAgICAgICAgICAgICAgdGhpcy5vdXRnb2luZ0NvbnRhY3ROYW1lID0gY29udGFjdC5uYW1lO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmZyb20gPSBjb250YWN0LmZyb207XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNvbnRhY3QpO1xuICAgICAgICAgICAgICAvLyB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnB1c2goY29udGFjdClcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWF0ZUNhbGwoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckNhbGxTZXR0aW5nKCk7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnMjgyJywgY29udGFjdClcbiAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oY29udGFjdCk7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250YWN0LmNhbGxlcklkID09ICdhbHdheXNBc2snIHx8IGNvbnRhY3QuY2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpIHtcbiAgICAgICAgICAgICAgdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IGNvbnRhY3QubmFtZTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0LmltZztcbiAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWF0ZUNhbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gaGFuZGxlIGluY29taW5nIGNhbGwgKG1hbmFnZWQgaW50ZXJuYWxseTsgaG9zdCBuZWVkIG5vdCBwYXNzIGluY29taW5nQ2FsbERhdGEpXG4gICAgICBjb25zdCBzdWIyID0gdGhpcy50d2lsaW9TZXJ2aWNlLmN1cnJlbnRDYWxsLnN1YnNjcmliZSgoaW5jb21pbmdDYWxsRGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpbmNvbWluZ0NhbGxEYXRhKSB7XG4gICAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzU2hvd0luY29taW5nQ2FsbCA9IHRydWU7XG4gICAgICAgICAgaWYgKHRoaXMuYXV0b09wZW5PbkluY29taW5nICYmIHRoaXMuX2lzRGlhbHBhZEhpZGRlbikge1xuICAgICAgICAgICAgdGhpcy5faXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuaXNDYWxsSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzLnB1c2goaW5jb21pbmdDYWxsRGF0YSk7XG4gICAgICAgICAgICB0aGlzLmdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhKTtcblxuICAgICAgICAgICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbmNvbWluZ0NhbGxEYXRhWydpc0ZpcnN0Q2FsbCddID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IGluY29taW5nQ2FsbERhdGEucGFyYW1ldGVyc1snRnJvbSddO1xuICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YSk7XG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCduYW1lJyk7XG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ2ltYWdlJykgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5pc0luY29taW5nQ2FsbCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzdWIzID0gdGhpcy50d2lsaW9TZXJ2aWNlLmluY29taW5nQ2FsbE5vdGlmaWNhdGlvbi5zdWJzY3JpYmUoKG5vdGlmaWNhdGlvbjogYW55KSA9PiB7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QuZmluZEluZGV4KChyZXNJbmZvOiBhbnkpPT4gcmVzSW5mbz8uY29uZmVyZW5jZUlkID09IG5vdGlmaWNhdGlvbj8uY29uZmVyZW5jZUlkKVxuICAgICAgICAgIGlmKGluZGV4ID09IC0xKSB7XG4gICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5pc0luY29taW5nQ2FsbG5vdGlmaWNhdGlvbiA9IHRydWU7XG4gICAgICAgICAgbGV0IGNhbGxlckluZm86IGFueTtcbiAgICAgICAgICBsZXQgbnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzKSA9PiByZXMubnVtYmVyKVxuICAgICAgICAgICAgaWYgKCFudW1iZXJMaXN0LmluY2x1ZGVzKG5vdGlmaWNhdGlvbj8uZnJvbU51bWJlcikpIHtcbiAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbj8uYzJjQnVzaW5lc3MgIT0gJ2ZhbHNlJyAmJiBub3RpZmljYXRpb24/LnBhcnRpY2lwYW50SWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4dGVuc2lvblNlcnZpY2UuZ2V0VXNlckluZm9ybWF0aW9uKG5vdGlmaWNhdGlvbj8ucGFydGljaXBhbnRJZCkuc3Vic2NyaWJlKChyZXNJbmZvOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNhbGxlckluZm8gPSByZXNJbmZvPy5jMmNJbmZvcm1hdGlvbiB8fCB7fTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsTm90aWZpY2F0aW9uKGNhbGxlckluZm8sIG5vdGlmaWNhdGlvbik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbE5vdGlmaWNhdGlvbih7fSwgbm90aWZpY2F0aW9uKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0Zyb21JbWFnZSA9ICcnO1xuICAgICAgICAgICAgaWYobm90aWZpY2F0aW9uPy5mcm9tSW1hZ2Upe1xuICAgICAgICAgICAgICB0aGlzLmluY29taW5nRnJvbUltYWdlID0gbm90aWZpY2F0aW9uPy5mcm9tSW1hZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2RrLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHN1YjEpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWIyKTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc3ViMyk7XG4gICAgICB0aGlzLmdldFVzZXJTZXR0aW5ncygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgfVxuICB9XG5cbiAgZ2V0VXNlckluZm9ybWF0aW9uKGluY29taW5nQ2FsbERhdGE6IGFueSkge1xuICAgIGxldCBkYXRhID0gdGhpcy5mcm9tRW50cmllcyhBcnJheS5mcm9tKGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5lbnRyaWVzKCkpKTtcbiAgICBpZihkYXRhWyd0d2lsaW9BdXRoSWQnXSkge1xuICAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihkYXRhWyd0d2lsaW9BdXRoSWQnXSkuc3Vic2NyaWJlKFxuICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgaW5jb21pbmdDYWxsRGF0YVsndXNlckluZm8nXSA9IHJlc3BvbnNlXG4gICAgICAgICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gZW50cmllcy5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRHJhZ0VsZW1lbnQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snaW5jb21pbmdDYWxsbm90aWZpY2F0aW9uJ10/LmN1cnJlbnRWYWx1ZSAmJiB0aGlzLmluY29taW5nQ2FsbG5vdGlmaWNhdGlvbiAmJiB0aGlzLmluY29taW5nQ2FsbG5vdGlmaWNhdGlvbj8uZGF0YT8uY29udGVudCAhPSBcIlZvaWNlbWFpbFwiKSB7XG4gICAgICAvLyBDYXB0dXJlIHNuYXBzaG90IGltbWVkaWF0ZWx5IHNvIGFzeW5jIGNhbGxiYWNrcyBhbHdheXMgdXNlIHRoaXMgY2FsbCdzIGRhdGEsXG4gICAgICAvLyBub3Qgd2hhdGV2ZXIgdGhpcy5pbmNvbWluZ0NhbGxub3RpZmljYXRpb24gcG9pbnRzIHRvIHdoZW4gdGhleSBldmVudHVhbGx5IHJ1bi5cbiAgICAgIGNvbnNvbGUubG9nKCdub3RpZmljYXRpb25mcm9tQkUnLCB0aGlzLmluY29taW5nQ2FsbG5vdGlmaWNhdGlvbik7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuaW5jb21pbmdDYWxsbm90aWZpY2F0aW9uO1xuICAgICAgbGV0IGluZGV4ID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maW5kSW5kZXgoKHJlc0luZm86IGFueSk9PiByZXNJbmZvPy5jb25mZXJlbmNlSWQgPT0gc25hcHNob3Q/LmRhdGE/LmRhdGE/LmNvbmZlcmVuY2VJZClcbiAgICAgIC8vIGluY29taW5nIGNhbGwgZGV0YWlsIGZyb20gbm90aWZhY3Rpb25cbiAgICAgIGlmIChpbmRleCA9PSAtMSAmJiBzbmFwc2hvdD8uZGF0YT8uY29udGVudCA9PSBcIkluY29taW5nQ2FsbFwiICYmIHNuYXBzaG90Py5kYXRhPy5kYXRhPy5zdGF0dXMgIT0gXCJyZWplY3RlZFwiICYmIHNuYXBzaG90Py5kYXRhPy5kYXRhPy5zdGF0dXMgIT0gXCJhY2NlcHRlZFwiKSB7XG4gICAgICAgIC8vIHRoaXMuaXNJbmNvbWluZ0NhbGxub3RpZmljYXRpb24gPSB0cnVlO1xuICAgICAgICAvLyBsZXQgY2FsbGVySW5mbzogYW55O1xuICAgICAgICAvLyBsZXQgbnVtYmVyTGlzdCA9IHRoaXMuY2FsbGVySWRMaXN0Lm1hcCgocmVzKSA9PiByZXMubnVtYmVyKVxuICAgICAgICAvLyBpZiAoIW51bWJlckxpc3QuaW5jbHVkZXMoc25hcHNob3QuZGF0YS5kYXRhPy5mcm9tTnVtYmVyKSkge1xuICAgICAgICAvLyAgIGlmIChzbmFwc2hvdC5kYXRhPy5kYXRhPy5jMmNCdXNpbmVzcyAhPSAnZmFsc2UnICYmIHNuYXBzaG90LmRhdGEuZGF0YT8ucGFydGljaXBhbnRJZCkge1xuICAgICAgICAvLyAgICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbihzbmFwc2hvdC5kYXRhLmRhdGE/LnBhcnRpY2lwYW50SWQpLnN1YnNjcmliZSgocmVzSW5mbzogYW55KSA9PiB7XG4gICAgICAgIC8vICAgICAgIGNhbGxlckluZm8gPSByZXNJbmZvPy5jMmNJbmZvcm1hdGlvbiB8fCB7fTtcbiAgICAgICAgLy8gICAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24oY2FsbGVySW5mbywgc25hcHNob3QpO1xuICAgICAgICAvLyAgICAgfSlcbiAgICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgdGhpcy5pbmNvbWluZ0NhbGxOb3RpZmljYXRpb24oe30sIHNuYXBzaG90KTtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdGhpcy5pbmNvbWluZ0Zyb21JbWFnZSA9ICcnO1xuICAgICAgICAvLyBpZihzbmFwc2hvdC5kYXRhLmRhdGE/LmZyb21JbWFnZSl7XG4gICAgICAgIC8vICAgdGhpcy5pbmNvbWluZ0Zyb21JbWFnZSA9IHNuYXBzaG90LmRhdGEuZGF0YT8uZnJvbUltYWdlXG4gICAgICAgIC8vIH1cbiAgICAgIH0gZWxzZSBpZiAoc25hcHNob3Q/LmRhdGE/LmNvbnRlbnQgPT0gXCJNaXNzZWQgQ2FsbFwiIHx8IHNuYXBzaG90Py5kYXRhPy5kYXRhPy5zdGF0dXMgPT0gXCJyZWplY3RlZFwiIHx8IHNuYXBzaG90Py5kYXRhPy5kYXRhPy5zdGF0dXMgPT0gXCJhY2NlcHRlZFwiKSB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LmZpbHRlcigoY2FsbDogYW55KSA9PiBjYWxsPy5wYXJ0aWNpcGFudElkICE9IHNuYXBzaG90Py5kYXRhPy5kYXRhPy5yZWNvcmRJZCAmJiBjYWxsPy5wYXJ0aWNpcGFudElkICE9IHNuYXBzaG90Py5kYXRhPy5kYXRhPy5wYXJ0aWNpcGFudElkKTtcbiAgICAgICAgdGhpcy5taXNzQ2FsbEluZm8gPSBzbmFwc2hvdDtcbiAgICAgICAgbGV0IGluY29taW5nQ2FsbEluZGV4ID0gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5maW5kSW5kZXgoKGNhbGw6IGFueSkgPT4gKGNhbGw/LnBhcnRpY2lwYW50SWQgPT0gc25hcHNob3Q/LmRhdGE/LmRhdGE/LnJlY29yZElkIHx8IGNhbGwucGFydGljaXBhbnRJZCA9PSBzbmFwc2hvdD8uZGF0YT8uZGF0YT8ucGFydGljaXBhbnRJZCkgJiYgY2FsbD8uY2FsbERpcmVjdGlvbiA9PSAnaW5jb21pbmctY2FsbCcpO1xuICAgICAgICAgIGlmIChpbmNvbWluZ0NhbGxJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnaW5jb21pbmdDYWxsSW5kZXgnLCBpbmNvbWluZ0NhbGxJbmRleCwgc25hcHNob3QpO1xuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5zcGxpY2UoaW5jb21pbmdDYWxsSW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xuICAgICAgICAgICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0aGlzLmNvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZCA9PSBzbmFwc2hvdD8uZGF0YT8uZGF0YT8ucmVjb3JkSWQgfHwgdGhpcy5jb25uZWN0aW5nSW5jb21pbmdDYWxsSWQgPT0gc25hcHNob3Q/LmRhdGE/LmRhdGE/LnBhcnRpY2lwYW50SWQgJiYgc25hcHNob3Q/LmRhdGE/LmRhdGE/LnN0YXR1cyAhPSBcImFjY2VwdGVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc0Nvbm5lY3RpbmdJbmNvbWluZ0NhbGxJZC5uZXh0KCcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5sb2coJ3Rlc3QnLCB0aGlzLmluY29taW5nQ2FsbHNMaXN0KTtcbiAgICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNTaG93SW5jb21pbmdDYWxsID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5pbmNvbWVpbmdDYWxsU29ja2V0U2VydmljZS5wYXVzZSgpO1xuICAgICAgICAgIHRoaXMuaXNJbmNvbWluZ0NhbGxub3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNkay5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJzU5MCcsIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QpO1xuICAgICAgfVxuICAgICAgbGV0IGNhbGxFbmRJbmRleCA9IHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QuZmluZEluZGV4KChjYWxsOiBhbnkpID0+IGNhbGw/LnBhcnRpY2lwYW50SWQgPT09IHNuYXBzaG90Py5kYXRhPy5kYXRhPy5yZWNvcmRJZCB8fCBjYWxsPy5wYXJ0aWNpcGFudElkID09PSBzbmFwc2hvdD8uZGF0YT8uZGF0YT8ucGFydGljaXBhbnRJZCk7XG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LnNwbGljZShjYWxsRW5kSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJ25vdGlmaWNhdGlvbkNhbGxMaXN0JywgdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdCk7XG4gICAgICBsZXQgcGFyZW50Q2FsbDogc3RyaW5nW10gPSBbXVxuICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3Q/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0ID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maWx0ZXIoKHJlczogYW55KSA9PiByZXMuZW5kVGltZSA+PSAobmV3IERhdGUoKS5nZXRUaW1lKCkpKTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5mb3JFYWNoKChjYWxsOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgbGV0IGluZm8gPSBpdGVtLnBhcnRpY2lwYW50cy5maW5kKChyZXNJbmZvOiBhbnkpID0+IHJlc0luZm8/LmlkID09PSBjYWxsPy5wYXJ0aWNpcGFudElkICYmIGNhbGw/LmNhbGxEaXJlY3Rpb24gIT09ICdpbmNvbWluZycpXG4gICAgICAgICAgICBpZiAoaW5mbykge1xuICAgICAgICAgICAgICBwYXJlbnRDYWxsLnB1c2goaW5mby5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudENhbGw/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdCA9IHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+ICFwYXJlbnRDYWxsLmluY2x1ZGVzKGl0ZW0/LnBhcnRpY2lwYW50SWQpKTtcbiAgICAgICAgY29uc29sZS5sb2coJy4uLi4uJywgdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdClcbiAgICAgIH1cbiAgICAgIC8vIE1lcmdlIG5vdGlmaWNhdGlvbkNhbGxMaXN0IGludG8gaW5jb21pbmdDYWxsc0xpc3Qgd2l0aG91dCBkdXBsaWNhdGluZyBlbnRyaWVzIHRoYXQgYXJlIGFscmVhZHkgcHJlc2VudC5cbiAgICAgIGNvbnN0IGV4aXN0aW5nUGFydGljaXBhbnRJZHMgPSBuZXcgU2V0KHRoaXMuaW5jb21pbmdDYWxsc0xpc3QubWFwKChjOiBhbnkpID0+IGM/LnBhcnRpY2lwYW50SWQpKTtcbiAgICAgIGNvbnN0IG5ld0l0ZW1zID0gdGhpcy5ub3RpZmljYXRpb25DYWxsTGlzdC5maWx0ZXIoKG46IGFueSkgPT4gIWV4aXN0aW5nUGFydGljaXBhbnRJZHMuaGFzKG4/LnBhcnRpY2lwYW50SWQpKTtcbiAgICAgIGlmIChuZXdJdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IFsuLi50aGlzLmluY29taW5nQ2FsbHNMaXN0LCAuLi5uZXdJdGVtc107XG4gICAgICB9XG4gICAgICB0aGlzLmNkay5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydkZXZpY2VJZCddKSB7XG4gICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuZGV2aWNlSWQgPSBjaGFuZ2VzWydkZXZpY2VJZCddLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuZXh0U2VydmljZS5nZXRJcEluZm8oKTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3VwZGF0ZWRUd2lsaW9Ub2tlbiddPy5jdXJyZW50VmFsdWUgJiYgdGhpcy51cGRhdGVkVHdpbGlvVG9rZW4pIHtcbiAgICAgIGlmKHRoaXMudHdpbGlvU2VydmljZS5pbmNvbWluZ0NhbGxUb2tlbiAhPSB0aGlzLnVwZGF0ZWRUd2lsaW9Ub2tlbikge1xuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaW5jb21pbmdDYWxsVG9rZW4gPSB0aGlzLnVwZGF0ZWRUd2lsaW9Ub2tlbjtcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLnRva2VuSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaW5pdGlhbGl6ZVR3aWxpb0RldmljZSh0aGlzLmRldmljZUlkIHx8IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkZXZpY2VJZCcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3VzZXJJZCddPy5jdXJyZW50VmFsdWUgJiYgdGhpcy51c2VySWQpIHtcbiAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS51c2VySWQgPSB0aGlzLnVzZXJJZDtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2NvbnRhY3RJbmZvJ10/LmN1cnJlbnRWYWx1ZSAmJiB0aGlzLmNvbnRhY3RJbmZvKSB7XG4gICAgICBsZXQgY29udGFjdCA9IHRoaXMuY29udGFjdEluZm87XG4gICAgICB0aGlzLmlzVmFsaWRhdGlvbk1lc3NhZ2VTaG93ID0gdHJ1ZTtcbiAgICAgIGlmIChjb250YWN0Lm51bWJlciAmJiAhdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5pc1NtYXJ0RGlhbENhbGwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaWFsZWROdW1iZXIgPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgaWYgKGNvbnRhY3QuaXNEaWFsRnJvbUhpc3RvcnkpIHtcbiAgICAgICAgICAvL2hhbmRsZSBkaWFsaW5nIGZyb20gaGlzdG9yeSBwYWdlXG4gICAgICAgICAgaWYgKGNvbnRhY3QuY2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpIHtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0geyBudW1iZXI6IGNvbnRhY3QuZnJvbSB9O1xuICAgICAgICAgICAgdGhpcy5pc1NtYXJ0RGlhbENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IGNvbnRhY3QubmFtZTtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gY29udGFjdC5pbWc7XG4gICAgICAgICAgICB0aGlzLm91dGdvaW5nQ29udGFjdE5hbWUgPSBjb250YWN0Lm5hbWU7XG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmZyb20gPSBjb250YWN0LmZyb207XG4gICAgICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oY29udGFjdCk7XG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlQ2FsbCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNvbnRhY3QpO1xuICAgICAgICAgICAgdGhpcy5kaWFsZWROdW1iZXIgPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjb250YWN0LmNhbGxlcklkID09ICdhbHdheXNBc2snIHx8IGNvbnRhY3QuY2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0VXNlckNhbGxTZXR0aW5nKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgdGhpcy5kaWFsZWROdW1iZXIgPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IGNvbnRhY3QubmFtZTtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gY29udGFjdC5pbWc7XG4gICAgICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5pbml0aWF0ZUNhbGwoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChjb250YWN0Lm51bWJlciAmJiB0aGlzLmluY29taW5nQ2FsbHNMaXN0Lmxlbmd0aCkge1xuICAgICAgICAvLyBIYW5kbGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgaW5jb21pbmcgY2FsbHNcbiAgICAgICAgdGhpcy5uZXdDYWxsQ29uZmVyZW5jZSA9IGNvbnRhY3Q7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpc0RpYWxwYWRIaWRkZW4nXSAmJiAhdGhpcy5pc0RpYWxwYWRIaWRkZW4pIHtcbiAgICAgIHRoaXMuZ2V0Q29udGFjdExpc3QoKTtcbiAgICAgIHRoaXMuZ2V0VXNlckNhbGxTZXR0aW5nKCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5kaWFsSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDApO1xuICAgICAgaWYgKCF0aGlzLmluY29taW5nQ2FsbHNMaXN0Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmluY29taW5nQ2FsbERhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDYWxsSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxscy5wdXNoKHRoaXMuaW5jb21pbmdDYWxsRGF0YSk7XG4gICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24odGhpcy5pbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IHRoaXMuaW5jb21pbmdDYWxsRGF0YS5wYXJhbWV0ZXJzWydGcm9tJ107XG4gICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24odGhpcy5pbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSB0aGlzLmluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ25hbWUnKTtcbiAgICAgICAgICB0aGlzLmNhbGxEYXRhLmltZyA9IHRoaXMuaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gICAgICAgICAgdGhpcy5jYWxsRGF0YS5pc0luY29taW5nQ2FsbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxEYXRhLm9uKCdjYW5jZWwnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJzUyMycpO1xuICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGF0YS5kaXNjb25uZWN0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaW5jb21pbmdDYWxsRGF0YS5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnNTI2Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snY2FsbEFjdGlvbiddPy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmNhbGxBY3Rpb24/LnR5cGUgPT0gJ3JlSm9pbicpIHtcbiAgICAgICAgdGhpcy5leHRTZXJ2aWNlLmdldElwSW5mbygpO1xuICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmKHRoaXMuY2FsbEFjdGlvbj8uY29uZmVyZW5jZUlkKSB7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRSZW1vdmVQYXJ0aWNpcGFudHMoJ2FsbCcsIHRoaXMuY2FsbEFjdGlvbj8uY29uZmVyZW5jZUlkKS5zdWJzY3JpYmUoKHJlcykgPT4geyB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIHJlZ2lzdGVyRHJhZ0VsZW1lbnQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVsbW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyYWdwYXJlbnQxJyk7XG4gICAgICBpZiAoIWVsbW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RyYWcgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgcG9zMSA9IDAsIHBvczIgPSAwLCBwb3MzID0gMCwgcG9zNCA9IDA7XG5cbiAgICAgIGNvbnN0IGRyYWdNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHBvczMgPSBlLmNsaWVudFg7XG4gICAgICAgIHBvczQgPSBlLmNsaWVudFk7XG5cbiAgICAgICAgY29uc3Qgb25Nb3VzZU1vdmUgPSAobW92ZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiBlbGVtZW50RHJhZyhtb3ZlRXZlbnQpO1xuICAgICAgICBjb25zdCBvbk1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbGVtZW50RHJhZyA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcG9zMSA9IHBvczMgLSBlLmNsaWVudFg7XG4gICAgICAgIHBvczIgPSBwb3M0IC0gZS5jbGllbnRZO1xuICAgICAgICBwb3MzID0gZS5jbGllbnRYO1xuICAgICAgICBwb3M0ID0gZS5jbGllbnRZO1xuXG4gICAgICAgIGVsbW50LnN0eWxlLnRvcCA9IChlbG1udC5vZmZzZXRUb3AgLSBwb3MyKSArICdweCc7XG4gICAgICAgIGVsbW50LnN0eWxlLmxlZnQgPSAoZWxtbnQub2Zmc2V0TGVmdCAtIHBvczEpICsgJ3B4JztcbiAgICAgIH07XG5cbiAgICAgIC8vIENoZWNrIGZvciBoZWFkZXIgZWxlbWVudFxuICAgICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxtbnQuaWQgKyAnaGVhZGVyJyk7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGhlYWRlci5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbG1udC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbmNvbWluZ0NhbGxOb3RpZmljYXRpb24oY2FsbGVySW5mbzogYW55LCBub3RpZmljYXRpb246IGFueSkge1xuICAgIGlmKCFub3RpZmljYXRpb24/LmNvbmZlcmVuY2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgaW5jb21pbmdDYWxsOiBhbnkgPSB7XG4gICAgICBjb25mZXJlbmNlSWQ6IG5vdGlmaWNhdGlvbj8uY29uZmVyZW5jZUlkLFxuICAgICAgaXNBY3RpdmU6IHRydWUsXG4gICAgICBpc0luY29taW5nQ2FsbDogdHJ1ZSxcbiAgICAgIC8vIENsaWVudC1vbmx5IG1hcmtlcjogdGhpcyBlbnRyeSBpcyBhIHBlbmRpbmcgaW5jb21pbmctY2FsbCBub3RpZmljYXRpb24sIE5PVCBhblxuICAgICAgLy8gYWN0aXZlIHNvY2tldCBjb25mZXJlbmNlLiBVc2VkIHRvIGRlZHVwZSBieSBwYXJ0aWNpcGFudElkIGluc3RlYWQgb2YgY29uZmVyZW5jZUlkLFxuICAgICAgLy8gc28gYSBub3RpZmljYXRpb24gY2FuIGNvZXhpc3Qgd2l0aCBhbiBhY3RpdmUgY29uZmVyZW5jZSB0aGF0IHNoYXJlcyBpdHMgY29uZmVyZW5jZUlkLlxuICAgICAgX2lzTm90aWZpY2F0aW9uOiB0cnVlLFxuICAgICAgcGFydGljaXBhbnRJZDogbm90aWZpY2F0aW9uPy5wYXJ0aWNpcGFudElkLFxuICAgICAgY2FsbERpcmVjdGlvbjogXCJpbmNvbWluZy1jYWxsXCIsXG4gICAgICBwYXJ0aWNpcGFudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGRpcmVjdGlvbjogXCJpbmNvbWluZy1jYWxsXCIsIGJ1c2luZXNzTnVtYmVyOiBub3RpZmljYXRpb24uYzJjQnVzaW5lc3MsIGltZzogbm90aWZpY2F0aW9uLmZyb21JbWFnZSB8fCBub3RpZmljYXRpb24uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLCBpc0luY29taW5nQ2FsbDogdHJ1ZSwgaXNIb2xkOiBmYWxzZSwgaXNDb25mZXJlbmNlOiBmYWxzZSwgaXNBY2NlcHRDYWxsOiBmYWxzZSwgZGlhbDogdHJ1ZSwgcGhvbmU6IG5vdGlmaWNhdGlvbi5mcm9tTnVtYmVyLCB0bzogbm90aWZpY2F0aW9uLnRvTnVtYmVyLFxuICAgICAgICAgIGZyb206IG5vdGlmaWNhdGlvbi5mcm9tTnVtYmVyLCBmcm9tTmFtZTogbm90aWZpY2F0aW9uLmZyb21OYW1lLCBwYXJ0aWNpcGFudElkOiBub3RpZmljYXRpb24ucGFydGljaXBhbnRJZCwgbmFtZTogbm90aWZpY2F0aW9uLmZyb21OYW1lLCB0aW1lOiAnJywgaWQ6IG5vdGlmaWNhdGlvbi5wYXJ0aWNpcGFudElkLCBjb25mZXJlbmNlSWQ6IG5vdGlmaWNhdGlvbi5jb25mZXJlbmNlSWQsIGNsaWVudFNpZDogbm90aWZpY2F0aW9uLmNsaWVudFNpZCwgY2FsbFN0YXR1czogJ3JpbmdpbmcnXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgfVxuICAgIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QgPSBhd2FpdCB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LmZpbHRlcigocmVzOiBhbnkpID0+IHJlcz8uZW5kVGltZSA+IG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcblxuICAgIGlmIChjYWxsZXJJbmZvKSB7XG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWydlbWFpbCddID0gY2FsbGVySW5mby5lbWFpbDtcbiAgICAgIGluY29taW5nQ2FsbC5wYXJ0aWNpcGFudHNbMF1bJ25hbWUnXSA9IGNhbGxlckluZm8ubmFtZTtcbiAgICAgIGluY29taW5nQ2FsbC5wYXJ0aWNpcGFudHNbMF1bJ2ltYWdlJ10gPSBjYWxsZXJJbmZvLmltYWdlO1xuICAgICAgaW5jb21pbmdDYWxsLnBhcnRpY2lwYW50c1swXVsnZXh0ZW5zaW9uJ10gPSBjYWxsZXJJbmZvLmV4dGVuc2lvbjtcbiAgICAgIGluY29taW5nQ2FsbC5wYXJ0aWNpcGFudHNbMF1bJ3VzZXJJbmZvSWQnXSA9IGNhbGxlckluZm8uaWQ7XG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWydtZXNzYWdlJ10gPSBjYWxsZXJJbmZvLm1lc3NhZ2U7XG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWydub3RlJ10gPSBjYWxsZXJJbmZvLm5vdGU7XG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWydudW1iZXInXSA9IGNhbGxlckluZm8ubnVtYmVyO1xuICAgICAgaW5jb21pbmdDYWxsLnBhcnRpY2lwYW50c1swXVsncG9pbnROYW1lJ10gPSBjYWxsZXJJbmZvLnBvaW50TmFtZTtcbiAgICAgIGluY29taW5nQ2FsbC5wYXJ0aWNpcGFudHNbMF1bJ3NvZnRwaG9uZVR3aWxpb0F1dGhJZCddID0gY2FsbGVySW5mby5zb2Z0cGhvbmVUd2lsaW9BdXRoSWQ7XG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWydzb3VyY2VOYW1lJ10gPSBjYWxsZXJJbmZvLnNvdXJjZU5hbWU7XG4gICAgICBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRzWzBdWydzdWJqZWN0J10gPSBjYWxsZXJJbmZvLnN1YmplY3Q7XG4gICAgfVxuICAgIGluY29taW5nQ2FsbFsnZW5kVGltZSddID0gKG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgNDUgKiAxMDAwKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LnB1c2goaW5jb21pbmdDYWxsKTtcbiAgICAvLyBPbmx5IGFkZCB0aGlzIHNwZWNpZmljIGNhbGwgaWYgbm90IGFscmVhZHkgcHJlc2VudCwgcHJldmVudGluZyBkdXBsaWNhdGVzIHdoZW5cbiAgICAvLyBtdWx0aXBsZSBjYWxscyBhcnJpdmUgc2ltdWx0YW5lb3VzbHkgYW5kIG5vdGlmaWNhdGlvbkNhbGxMaXN0IGhhcyBwcmlvciBlbnRyaWVzLlxuICAgIGNvbnN0IGFscmVhZHlJbkxpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnNvbWUoKGM6IGFueSkgPT4gYz8ucGFydGljaXBhbnRJZCA9PT0gaW5jb21pbmdDYWxsLnBhcnRpY2lwYW50SWQpO1xuICAgIGlmICghYWxyZWFkeUluTGlzdCkge1xuICAgICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IFsuLi50aGlzLmluY29taW5nQ2FsbHNMaXN0LCBpbmNvbWluZ0NhbGxdO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHRoZSByaW5nIGZvciB0aGlzIGluY29taW5nIGNhbGwgKHVubGVzcyB0aGUgdXNlciBoYXMgbXV0ZWQgaW5jb21pbmcgY2FsbHMpLlxuXG4gICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGlmIChub3RpZmljYXRpb24/LnBhcnRpY2lwYW50SWQpIHtcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICB0aGlzLmNkay5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFkZE51bWJlcihudW06IGFueSkge1xuICAgIGlmIChudW0gPT0gJyMnIHx8IG51bSA9PSAnKicgfHwgbnVtID09ICcrJyB8fCBOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHtcbiAgICAgIGlmIChudW0gPT0gJyMnKSB7XG4gICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1oYXNoLS5tcDNgKS5wbGF5KCk7XG4gICAgICB9IGVsc2UgaWYgKG51bSA9PSAnKicpIHtcbiAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLXN0YXItLm1wM2ApLnBsYXkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi0ke251bX0tLm1wM2ApLnBsYXkoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kaWFsZWROdW1iZXIgKz0gbnVtO1xuICAgICAgdGhpcy5zaG93SW5wdXRDbGVhckJ0biA9IHRydWU7XG5cbiAgICAgIHRoaXMubnVtYmVyRGlhbGVkLmVtaXQodGhpcy5kaWFsZWROdW1iZXIpO1xuXG4gICAgICB0aGlzLm9uRGlhbElucHV0Q2hhbmdlKHRoaXMuZGlhbGVkTnVtYmVyKVxuICAgIH0gZWxzZSBpZiAobnVtID09PSAndm9pY2VtYWlsJykge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydleHRlbnNpb24vdm9pY2VtYWlsLycgKyB0aGlzLnRva2VuXSk7XG4gICAgfVxuICB9XG5cbiAgaGlkZURpYWxwYWQoKSB7XG4gICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSB0cnVlO1xuICAgIHRoaXMuY2xvc2VEaWFscGFkRXZlbnQuZW1pdCgpO1xuICAgIHRoaXMuY2xlYXJBbGxEaWFsZWQoKTtcbiAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcbiAgfVxuXG4gIG9uRGlhbElucHV0Q2hhbmdlKGlucHV0VmFsOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXBkYXRlZCByZWdleCB0byBpbmNsdWRlIHgsIFgsIGV4dC4sIEV4dC4sIGFuZCAsXG4gICAgICBjb25zdCBpc051bWVyaWNJbnB1dCA9IC9eW1xcZFxccytcXC1dKyQvLnRlc3QoaW5wdXRWYWwpO1xuICAgICAgbGV0IG1haW5OdW1iZXIgPSBpbnB1dFZhbDtcbiAgICAgIFxuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3IgZXh0ZW5zaW9uIGluZGljYXRvcnMgYW5kIHNwbGl0IHRoZSBpbnB1dFxuICAgICAgY29uc3QgZXh0TWF0Y2ggPSBpbnB1dFZhbC5tYXRjaCgvKHh8WHxleHRcXC58RXh0XFwufCwpKC4qKS8pO1xuICAgICAgaWYgKGV4dE1hdGNoKSB7XG4gICAgICAgIG1haW5OdW1iZXIgPSBpbnB1dFZhbC5zdWJzdHJpbmcoMCwgZXh0TWF0Y2guaW5kZXgpLnRyaW0oKTtcbiAgICAgICAgdGhpcy5jYWxsRGF0YS5leHROdW0gPSBleHRNYXRjaFsyXS50cmltKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNhbml0aXplZE51bSA9IGlzTnVtZXJpY0lucHV0ID8gbWFpbk51bWJlci5yZXBsYWNlKC9bXFxzXFwtXSsvZywgJycpIDogbWFpbk51bWJlcjtcbiAgICAgIFxuICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IGlzTnVtZXJpY0lucHV0ID8gdGhpcy5zYW5pdGl6ZWROdW0gOiAnJztcbiAgICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSBpbnB1dFZhbC5sZW5ndGggPiAwO1xuICAgICAgXG4gICAgICAgIFxuICAgICAgICAvLyBlbWl0IGN1cnJlbnQgbnVtYmVyIHdoZW5ldmVyIGlucHV0IGNoYW5nZXNcbiAgICAgICAgdGhpcy5udW1iZXJEaWFsZWQuZW1pdCh0aGlzLmRpYWxlZE51bWJlcik7XG4gICAgICAgIFxuICAgICAgICBpZiAoaW5wdXRWYWwubGVuZ3RoID4gMikge1xuICAgICAgICB0aGlzLmlzVmFsaWRhdGlvbk1lc3NhZ2VTaG93ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IFtdO1xuICAgICAgICB0aGlzLmNvbnRhY3RMaXN0LmZvckVhY2goY29udGFjdCA9PiB7XG4gICAgICAgICAgaWYgKGlzTnVtZXJpY0lucHV0KSB7XG4gICAgICAgICAgICBjb250YWN0Lm51bWJlcnNMaXN0LmZvckVhY2goKG51bTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChudW0ubnVtYmVyLmluY2x1ZGVzKHRoaXMuc2FuaXRpemVkTnVtKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdC5wdXNoKHsgLi4uY29udGFjdCwgc2VsZWN0ZWROdW1iZXI6IG51bSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gYCR7Y29udGFjdC5maXJzdE5hbWV9ICR7Y29udGFjdC5taWRkbGVOYW1lfSAke2NvbnRhY3QubGFzdE5hbWV9YC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGZ1bGxOYW1lLmluY2x1ZGVzKHRoaXMuc2FuaXRpemVkTnVtLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgIGNvbnRhY3QubnVtYmVyc0xpc3QuZm9yRWFjaCgobnVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QucHVzaCh7IC4uLmNvbnRhY3QsIHNlbGVjdGVkTnVtYmVyOiBudW0gfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEZpcnN0TGV0dGVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUgPyBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gIH1cbiAgY2xlYXJJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kaWFsZWROdW1iZXIgPSB0aGlzLmRpYWxlZE51bWJlci5zbGljZSgwLCAtMSk7XG4gICAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gdGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoICE9PSAwO1xuXG4gICAgICB0aGlzLm9uRGlhbElucHV0Q2hhbmdlKHRoaXMuZGlhbGVkTnVtYmVyKVxuICAgIH1cbiAgfVxuICBjbGVhckFsbERpYWxlZCgpIHtcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9ICcnO1xuICAgIHRoaXMuc2FuaXRpemVkTnVtID0gJyc7XG4gICAgdGhpcy5zaG93SW5wdXRDbGVhckJ0biA9IGZhbHNlO1xuICB9XG4gIGdldENhbGxlcklkTGlzdCgpIHtcbiAgICB0aGlzLmV4dFNlcnZpY2UuZGlzcGxheUlEKHRoaXMudG9rZW4gfHwgJycpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY2FsbGVySWRMaXN0ID0gcmVzLmNhbGxlcklkTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS52b2ljZUZlYXR1cmUgPT09IHRydWUpO1xuICAgICAgdGhpcy5kZXZpY2VOdW1iZXJMaXN0ID0gdGhpcy5jYWxsZXJJZExpc3QubWFwKChyZXM6IGFueSkgPT4gcmVzLm51bWJlcik7XG4gICAgICBpZiAodGhpcy5jYWxsZXJJZExpc3QubGVuZ3RoID09IDEpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0gdGhpcy5jYWxsZXJJZExpc3RbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5jYWxsUHJlZmVyZW5jZSA9PT0gJ2Fsd2F5c0FzaycgfHwgdGhpcy5jYWxsUHJlZmVyZW5jZSA9PT0gJ3NtYXJ0RGlhbGluZycpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IHRoaXMuY2FsbGVySWRMaXN0LmZpbmQoaXRlbSA9PiAoaXRlbS5udW1iZXIgPT0gdGhpcy5jYWxsUHJlZmVyZW5jZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgZ2V0Q29udGFjdExpc3QoKSB7XG4gICAgdGhpcy50d2lsaW9TZXJ2aWNlLmdldENvbnRhY3RMaXN0KCkuc3Vic2NyaWJlKChyZXNwOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXNwLnJlc3BvbnNlID09ICdTdWNjZXNzJykge1xuICAgICAgICB0aGlzLmNvbnRhY3RMaXN0ID0gcmVzcC5waG9uZUJvb2s7XG4gICAgICB9XG4gICAgfSwgZXJyID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycilcbiAgICB9KVxuICB9XG4gIGdldEZ1bGxOYW1lKGNvbnRhY3Q6IGFueSk6IHN0cmluZyB7XG4gICAgbGV0IGZ1bGxOYW1lID0gY29udGFjdC5maXJzdE5hbWUgfHwgJyc7XG4gICAgaWYgKGNvbnRhY3QubWlkZGxlTmFtZSkge1xuICAgICAgZnVsbE5hbWUgKz0gYCAke2NvbnRhY3QubWlkZGxlTmFtZX1gO1xuICAgIH1cbiAgICBpZiAoY29udGFjdC5sYXN0TmFtZSkge1xuICAgICAgZnVsbE5hbWUgKz0gYCAke2NvbnRhY3QubGFzdE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bGxOYW1lLnRyaW0oKTtcbiAgfVxuXG5cbiAgdG9nZ2xlQ2FsbGVySWREaXYoKSB7XG4gICAgdGhpcy5pc0NhbGxlcklkSGlkZGVuID0gIXRoaXMuaXNDYWxsZXJJZEhpZGRlbjtcbiAgfVxuICBvdXRnb2luZ0NvbnRhY3ROYW1lOnN0cmluZyA9ICcnO1xuICBvbkNvbnRhY3RTZWxlY3QoY29udGFjdDogYW55KSB7XG4gICAgdGhpcy5kaWFsZWROdW1iZXIgPSBjb250YWN0LnNlbGVjdGVkTnVtYmVyLm51bWJlcjtcbiAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSB0aGlzLmdldEZ1bGxOYW1lKGNvbnRhY3QpO1xuICAgIHRoaXMub3V0Z29pbmdDb250YWN0TmFtZSA9IHRoaXMuY2FsbERhdGEubmFtZTtcbiAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGNvbnRhY3QuaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xuICAgIHRoaXMub25EaWFsSW5wdXRDaGFuZ2UodGhpcy5kaWFsZWROdW1iZXIpO1xuICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IFtdO1xuICAgIHRoaXMuaXNWYWxpZGF0aW9uTWVzc2FnZVNob3cgPSB0cnVlO1xuICB9XG5cbiAgZW5kQ2FsbCgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcblxuICAgICAgLy8gUmVzZXQgY2FsbCBkYXRhXG4gICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICBwaG9uZTogJycsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcbiAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgICAgICBkaWFsOiBmYWxzZSxcbiAgICAgICAgZGlzcGxheU51bTogJycsXG4gICAgICAgIGV4dE51bTogJydcbiAgICAgIH07XG5cbiAgICAgIC8vIFJlc2V0IGRpYWxlZCBudW1iZXJcbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gJyc7XG4gICAgICB0aGlzLnNhbml0aXplZE51bSA9ICcnO1xuICAgICAgY29uc29sZS5sb2coJzc5NScpO1xuICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmRldmljZS5kaXNjb25uZWN0QWxsKClcbiAgICAgIC8vIEVtaXQgZW5kIGNhbGwgZXZlbnRcbiAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBFdmVuIGlmIHRoZXJlJ3MgYW4gZXJyb3IsIHRyeSB0byByZXNldCB0aGUgc3RhdGVcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgICAgICAgcGhvbmU6ICcnLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcbiAgICAgICAgZGlhbDogZmFsc2UsXG4gICAgICAgIGRpc3BsYXlOdW06ICcnLFxuICAgICAgICBleHROdW06ICcnXG4gICAgICB9O1xuICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbmNlbHMgYW4gb3V0Z29pbmcgY2FsbCB3aGlsZSBpdCBpcyBzdGlsbCBjb25uZWN0aW5nICh0aGUgXCJDb25uZWN0aW5nLi4uXCIgbG9hZGVyIHNob3duXG4gIC8vIGJlZm9yZSB0aGUgY2FsbCBoYXMgam9pbmVkIHRoZSBjb25mZXJlbmNlKS4gZW5kQ2FsbCgpIGNhbid0IGJlIHJldXNlZCBoZXJlIGJlY2F1c2UgaXRcbiAgLy8gZGlzY29ubmVjdHMgdHdpbGlvU2VydmljZS5kZXZpY2UsIHdoaWNoIGhhbmRsZXMgaW5jb21pbmcgY2FsbHMsIG5vdCB0aGUgb3V0Z29pbmcgY2FsbFxuICAvLyBjcmVhdGVkIGJ5IGNhbGwtcHJvZ3Jlc3MncyBvd24gZGV2aWNlL2NhbGwgaW5zdGFuY2UuXG4gIGNhbmNlbENvbm5lY3RpbmdDYWxsKCkge1xuICAgIC8vIERyaXZlIHRoZSBjaGlsZCB2aWEgYW4gQElucHV0IHJhdGhlciB0aGFuIEBWaWV3Q2hpbGQ6IHRoaXMgZGVsaXZlcnMgZXZlbiBpZlxuICAgIC8vIGxpYi1jYWxsLXByb2dyZXNzIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0IGF0IGNsaWNrIHRpbWUsIHNpbmNlIEFuZ3VsYXIgYXBwbGllc1xuICAgIC8vIHRoZSBib3VuZCB2YWx1ZSBhcyBzb29uIGFzIHRoZSBjb21wb25lbnQgZG9lcyBtb3VudC5cbiAgICB0aGlzLmNhbmNlbENvbm5lY3RpbmdBY3Rpb24gPSB7IHRzOiBEYXRlLm5vdygpIH07XG4gICAgdGhpcy5pc0xvYWRlcnNob3cgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcbiAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgcGhvbmU6ICcnLFxuICAgICAgbmFtZTogJycsXG4gICAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcbiAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcbiAgICAgIGRpYWw6IGZhbHNlLFxuICAgICAgZGlzcGxheU51bTogJycsXG4gICAgICBleHROdW06ICcnXG4gICAgfTtcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9ICcnO1xuICAgIHRoaXMuc2FuaXRpemVkTnVtID0gJyc7XG4gIH1cblxuICBhc3luYyBpbml0aWF0ZUNhbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5kaWFsZWROdW1iZXIgJiYgdGhpcy5sYXN0RGlhbGVkKSB7XG4gICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gdGhpcy5sYXN0RGlhbGVkLm51bWJlcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNJbnZhbGlkID0gYXdhaXQgdGhpcy5pc0ludmFsaWROdW1iZXIoKTtcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXZlTGFzdERpYWxlZCgpO1xuICAgICAgdGhpcy5pc1NhdmVkQ29udGFjdERpYWxsZWQoKTtcblxuICAgICAgdGhpcy5pc1BheW1lbnREdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGF5bWVudER1ZScpID09PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XG4gICAgICBpZiAodGhpcy5pc1BheW1lbnREdWUpIHtcbiAgICAgICAgc3dhbCgnV2FybmluZycsICdQbGVhc2Ugbm90ZSB0aGF0IHlvdXIgcGF5bWVudCBpcyBkdWUsIFRvIGNvbnRpbnVlIG9uIHlvdXIgc2VydmljZXMga2luZGx5IHN1YnNjcmliZSB0byB1c2UgdW5pbnRlcnJ1cHRlZCBzZXJ2aWNlcy4nKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzVHJpYWxQZXJpb2RPdmVyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RyaWFsT3ZlcicpID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuXG4gICAgICBpZiAodGhpcy5zYW5pdGl6ZWROdW0gPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xuICAgICAgICBzd2FsKCdFcnJvcicsICdZb3UgY2FuIG5vdCBkaWFsIHRoaXMgbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzUGVybWlzc2lvbiA9IGF3YWl0IHRoaXMuY2hlY2tNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNrRm9yTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzTG9hZGVyc2hvdyA9IHRydWU7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCkge1xuICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdTZWxlY3QgYSBDMkMgbnVtYmVyIHRvIGNhbGwnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xuICAgICAgICB9LCAzMDAwKTtcbiAgICAgICAgdGhpcy5pc0xvYWRlcnNob3cgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gTW91bnQgbGliLWNhbGwtcHJvZ3Jlc3Mgbm93IChub3QgYWZ0ZXIgZ2V0VG9OdW1iZXIncyBhd2FpdCkgc28gaXQncyByZWFkeVxuICAgICAgLy8gdG8gcmVjZWl2ZSBjYWxsRGF0YS9jYW5jZWxDb25uZWN0aW5nQWN0aW9uIGFzIHNvb24gYXMgdGhlIENhbmNlbCBidXR0b24gYXBwZWFycy5cbiAgICAgIC8vIFJlc2V0IGZpcnN0OiBhIHN0YWxlIG5vbi1udWxsIHZhbHVlIGhlcmUgd291bGQgbG9vayBsaWtlIGEgZnJlc2ggY2FuY2VsIHRvIHRoZVxuICAgICAgLy8gZnJlc2hseS1tb3VudGVkIGNoaWxkJ3MgbmdPbkNoYW5nZXMsIHNpbmNlICpuZ0lmIGRlc3Ryb3lzL3JlY3JlYXRlcyBpdCBwZXIgY2FsbC5cbiAgICAgIHRoaXMuY2FuY2VsQ29ubmVjdGluZ0FjdGlvbiA9IG51bGw7XG4gICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgLy8gQ2xlYXIgZGlzcGxheU51bSBpZiB2YWx1ZSBpcyBib3VuZCBmcm9tIHByZXZpb3VzIGNhbGxcbiAgICAgIHRoaXMuY2FsbERhdGEuZGlzcGxheU51bSA9ICcnO1xuXG4gICAgICAvLyBHZXQgbnVtYmVyIHRvIGJlIGRpYWxlZCBmcm9tIGJhY2tlbmRcbiAgICAgIGF3YWl0IHRoaXMuZ2V0VG9OdW1iZXIodGhpcy5zYW5pdGl6ZWROdW0pO1xuICAgICAgaWYgKHRoaXMudGVybWluYXRlQ2FsbCkge1xuICAgICAgICB0aGlzLnRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgY2FsbCBkYXRhIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgICAgICAgLi4udGhpcy5jYWxsRGF0YSxcbiAgICAgICAgcGhvbmU6IHRoaXMuc2FuaXRpemVkTnVtLFxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gICAgICAgIGRpYWw6IHRydWUsXG4gICAgICAgIGZyb206IHRoaXMuaXNTbWFydERpYWxDYWxsID8gdGhpcy5jYWxsRGF0YS5mcm9tIDogdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcixcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZ2V0VXNlclNldHRpbmdzKCk7XG4gICAgICB0aGlzLmNhbGxJbml0aWF0ZWQuZW1pdCh7IC4uLnRoaXMuY2FsbERhdGEgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBpbml0aWF0ZUNhbGw6JywgZSk7XG4gICAgICB0aGlzLmlzTG9hZGVyc2hvdyA9IGZhbHNlO1xuICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdGYWlsZWQgdG8gaW5pdGlhdGUgY2FsbC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGlzSW52YWxpZE51bWJlcigpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2FuaXRpemVkTnVtID09ICcnKSB7XG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWxpZE51bWJlclBhdHRlcm4gPSAvXlsrXFxkXFxzKCktXSokLzsgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHZhbGlkIGNoYXJhY3RlcnNcbiAgICAgIGNvbnN0IHBob25lTnVtYmVyID0gdGhpcy5zYW5pdGl6ZWROdW07XG4gICAgICBpZiAoIXZhbGlkTnVtYmVyUGF0dGVybi50ZXN0KHBob25lTnVtYmVyKSkge1xuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYodGhpcy5zYW5pdGl6ZWROdW0ubGVuZ3RoID4gMTUpe1xuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gUmV0dXJuIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIG1lYW5pbmcgdGhlIG51bWJlciBpcyBpbnZhbGlkXG4gICAgfVxuICB9XG5cbiAgc2F2ZUxhc3REaWFsZWQoKSB7XG4gICAgY29uc3QgY29udGFjdCA9IHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdC5maW5kKChjOiBhbnkpID0+IGMubnVtYmVyc0xpc3Quc29tZSgobjogYW55KSA9PiBuLm51bWJlciA9PT0gdGhpcy5kaWFsZWROdW1iZXIpKTtcbiAgICBpZiAoY29udGFjdCkge1xuICAgICAgdGhpcy5sYXN0RGlhbGVkID0ge1xuICAgICAgICBuYW1lOiBjb250YWN0Lm5hbWUsXG4gICAgICAgIGltYWdlOiBjb250YWN0LmltYWdlLFxuICAgICAgICBudW1iZXI6IHRoaXMuZGlhbGVkTnVtYmVyXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5kaWFsZWROdW1iZXIpIHtcbiAgICAgICAgdGhpcy5sYXN0RGlhbGVkID0geyBudW1iZXI6IHRoaXMuZGlhbGVkTnVtYmVyIH07XG4gICAgICB9XG5cbiAgICB9XG4gIH1cbiAgaXNTYXZlZENvbnRhY3REaWFsbGVkKCkge1xuICAgIGxldCBwaG9uZU51bSA9IHRoaXMuc2FuaXRpemVkTnVtLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIGxldCBjb250YWN0ID0gdGhpcy5jb250YWN0TGlzdC5maWx0ZXIoKGNvbnRhY3Q6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIGNvbnRhY3QubnVtYmVyc0xpc3Quc29tZSgobnVtOiBhbnkpID0+IG51bS5udW1iZXIgPT09IHBob25lTnVtKVxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKGNvbnRhY3QpO1xuICAgIGlmIChjb250YWN0Lmxlbmd0aCkge1xuICAgICAgXG4gICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBgJHtjb250YWN0WzBdLmZpcnN0TmFtZX0gJHtjb250YWN0WzBdLm1pZGRsZU5hbWV9ICR7Y29udGFjdFswXS5sYXN0TmFtZX1gLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLmNvbnRhY3ROYW1lRm9yTG9hZGVyID0gdGhpcy5jYWxsRGF0YS5uYW1lO1xuICAgICAgdGhpcy5vdXRnb2luZ0NvbnRhY3ROYW1lID0gdGhpcy5jb250YWN0TmFtZUZvckxvYWRlcjtcbiAgICAgIFxuICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0WzBdLmltYWdlIHx8ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJztcbiAgICAgIHRoaXMuY29udGFjdEltZ0ZvckxvYWRlciA9IHRoaXMuY2FsbERhdGEuaW1nO1xuICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IHRoaXMuc2FuaXRpemVkTnVtO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLmNvbnRhY3ROYW1lRm9yTG9hZGVyID0gJyc7XG4gICAgICAgdGhpcy5vdXRnb2luZ0NvbnRhY3ROYW1lID0gJyc7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzaG93RGlhbEFsZXJ0KG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHRoaXMuZGlhbEFsZXJ0ID0ge1xuICAgICAgbXNnOiBtZXNzYWdlLFxuICAgICAgc2hvdzogdHJ1ZVxuICAgIH07XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRpYWxBbGVydC5zaG93ID0gZmFsc2U7XG4gICAgfSwgMzAwMCk7XG4gIH1cbiAgYXN5bmMgaXNDYWxsZXJJZFNldCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGtuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpO1xuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLmV4dFNlcnZpY2UuZmV0Y2hDYWxsZXJJZCh0a24gfHwgJycpLnRvUHJvbWlzZSgpO1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0cmlhbE92ZXInLCByZXMudHJpYWxPdmVyKTtcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlLmlzVHJpYWxPdmVyLm5leHQocmVzLnRyaWFsT3Zlcik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwYXltZW50RHVlJywgcmVzLnBheW1lbnREdWUpO1xuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNQYXltZW50RHVlLm5leHQocmVzLnBheW1lbnREdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlcy5jYWxsZXJpZCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FsbGVySUQnLCByZXMuY2FsbGVyaWQpO1xuICAgICAgICB0aGlzLmV4dFNlcnZpY2UuY2hhbmdlTWVzc2FnZShyZXMuY2FsbGVyaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhbGxlcklEJywgJ05vdCBzZXQnKTtcbiAgICAgICAgdGhpcy5leHRTZXJ2aWNlLmNoYW5nZU1lc3NhZ2UoJ05vdCBzZXQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhbGxlcklEJykgIT09ICdOb3Qgc2V0Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGFzeW5jIGNoZWNrTWljcm9waG9uZVBlcm1pc3Npb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSk7XG4gICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB0cmFjay5zdG9wKCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5uYW1lID09PSAnTm90QWxsb3dlZEVycm9yJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFzeW5jIGFza0Zvck1pY3JvcGhvbmVQZXJtaXNzaW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2godHJhY2sgPT4gdHJhY2suc3RvcCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVXNlciBkZW5pZWQgbWljcm9waG9uZSBwZXJtaXNzaW9uOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgLy8gYmVsb3cgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSBjb3VudHJ5IGNvZGUgd2l0aCBudW1iZXIgZnJvbSBzZXJ2ZXIgXG4gIGFzeW5jIGdldFRvTnVtYmVyKGRpYWxlZE51bWJlcjogc3RyaW5nKSB7XG4gICAgaWYgKGRpYWxlZE51bWJlclswXSAhPT0gJysnKSB7XG4gICAgICAvLyB0aGlzIGlzIGNhc2Ugd2hlbiB1c2VyIGdlb2xvY2F0aW9uIGRpYWwgY29kZSBpcyBvblxuICAgICAgbGV0IGlwQWRkcmVzczogYW55ID0gYXdhaXQgdGhpcy5pcFNlcnZpY2UuZ2V0SXBBZGRyZXNzSW5mbygpLnRvUHJvbWlzZSgpO1xuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCB0aGlzLnR3aWxpb1NlcnZpY2UuZ2V0VG9OdW1iZXIoZGlhbGVkTnVtYmVyLCBpcEFkZHJlc3MuYWRkcmVzcy5jb3VudHJ5Q29kZSkudG9Qcm9taXNlKCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgdGhpcy50b2FzdFRpbWVvdXQgPSByZXMudGltZUludGVydmFsICogMTAwMDtcbiAgICAgICAgYXdhaXQgdGhpcy5zaG93TnVtYmVyVG9hc3QocmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaXNBbGVydEVuYWJsZSgpIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2lzQWxlcnRFbmFibGUnKTtcbiAgfVxuICBhc3luYyBzaG93TnVtYmVyVG9hc3QoZGF0YTogYW55KSB7XG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IHRydWU7XG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3QubnVtYmVyID0gZGF0YS50b051bWJlcjtcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtID0gZGF0YS5kaXNwbGF5TnVtYmVyO1xuICAgIHRoaXMuY2FsbERhdGEuZGlzcGxheU51bSA9IGRhdGEuZGlzcGxheU51bWJlcjtcbiAgICBhd2FpdCB0aGlzLmRlbGF5KHRoaXMudG9hc3RUaW1lb3V0KTtcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9IGRhdGEudG9OdW1iZXI7XG4gICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBkYXRhLnRvTnVtYmVyO1xuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0LnNob3cgPSBmYWxzZTtcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5udW1iZXIgPSAnJztcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtID0gJyc7XG4gIH1cbiAgZGVsYXkobXM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxuICBpc01pbmltaXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBvbk1pbmltaXNlKGlzTWluaW1pc2VkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc01pbmltaXNlZCA9IGlzTWluaW1pc2VkO1xuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KGlzTWluaW1pc2VkKTtcbiAgfVxuICBoYW5kbGVOdW1iZXJQYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhIHx8ICh3aW5kb3cgYXMgYW55KS5jbGlwYm9hcmREYXRhO1xuICAgIGNvbnN0IHBhc3RlZERhdGEgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcblxuICAgIC8vIExvZyB0aGUgcGFzdGVkIGNvbnRlbnQgdG8gdGhlIGNvbnNvbGVcbiAgICBpZiAocGFzdGVkRGF0YSkge1xuICAgICAgdGhpcy5kaWFsZWROdW1iZXIgPSBwYXN0ZWREYXRhLnRyaW0oKTtcbiAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gcGFzdGVkRGF0YS50cmltKCk7XG5cbiAgICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSB0cnVlO1xuICAgICAgdGhpcy5vbkRpYWxJbnB1dENoYW5nZSh0aGlzLmRpYWxlZE51bWJlcik7XG4gICAgfVxuICB9XG5cbiAgb25Mb2FkZXJzaG93KGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoZXZlbnQgfHwgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmlzTG9hZGVyc2hvdyA9IGV2ZW50O1xuICAgIH1cbiAgfVxuICBvbkVudGVyKG51bTogc3RyaW5nKSB7XG4gICAgdGhpcy5kaWFsZWROdW1iZXIgPSB0aGlzLmRpYWxlZE51bWJlciArIG51bTtcbiAgICB0aGlzLnNhbml0aXplZE51bSA9IHRoaXMuZGlhbGVkTnVtYmVyO1xuICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSB0cnVlO1xuICAgIHRoaXMubnVtYmVyRGlhbGVkLmVtaXQodGhpcy5kaWFsZWROdW1iZXIpO1xuICB9XG5cbiAgZ2V0VXNlckNhbGxTZXR0aW5nKCkge1xuICAgIGNvbnN0IHRrbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKTtcbiAgICB0aGlzLmV4dFNlcnZpY2UuZmV0Y2hDYWxsZXJJZCh0a24gfHwgJycpLnN1YnNjcmliZSgocmVzcDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIHRoaXMuY2FsbFByZWZlcmVuY2UgPSByZXNwLmNhbGxlcmlkO1xuICAgICAgICB0aGlzLmdldENhbGxlcklkTGlzdCgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgb25EZWRpY2F0ZWROdW1TZWxlY3QoaWQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IGlkO1xuICAgIHRoaXMuaXNDYWxsZXJJZEhpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5leHRTZXJ2aWNlLnNldENhbGxlcklkKGlkKTtcbiAgfVxuICBjYW5jZWxEaWFsTnVtYmVyKCkge1xuICAgIHRoaXMudGVybWluYXRlQ2FsbCA9IHRydWU7XG4gICAgdGhpcy5jYWxsTnVtYmVyVG9hc3Quc2hvdyA9IGZhbHNlO1xuICB9XG5cbiAgaGFuZGxlRGl2S2V5ZG93bihldjogYW55KSB7XG4gICAgaWYgKHRoaXMuZGlhbGVkTnVtYmVyLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmRpYWxJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBpZiAoZXYua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgZGlhbHBhZCBpcyBvcGVuXG4gICAgICBpZiAoIXRoaXMuaXNEaWFscGFkSGlkZGVuKSB7XG4gICAgICAgIGlmICh0aGlzLmRpYWxlZE51bWJlci5sZW5ndGggPiAyICYmIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCkge1xuICAgICAgICAgIHRoaXMuaW5pdGlhdGVDYWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2FsbGVySWQpIHtcbiAgICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZTtcbiAgICAgICAgICB9LCAxMDAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgb25DYWxsQnRuTW91c2VFbnRlcihldjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2FsbGVySWQgfHwgKHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9PSAnYWx3YXlzQXNrJykgfHwgKHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9PSAnc21hcnREaWFsaW5nJykpIHtcbiAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSB0cnVlO1xuICAgIH1cblxuICB9XG4gIG9uQ2FsbEJ0bk1vdXNlTGVhdmUoZXY6IGFueSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENhbGxlcklkIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ2Fsd2F5c0FzaycpIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpKSB7XG4gICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZW5kSW5jb21pbmdDYWxsKGluY29taW5nQ2FsbDogYW55KSB7XG4gICAgY29uc29sZS5sb2coJzExMDEnKVxuICAgIHRoaXMubm90aWZpY2F0aW9uQ2FsbExpc3QgPSB0aGlzLm5vdGlmaWNhdGlvbkNhbGxMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5wYXJ0aWNpcGFudElkICE9PSBpbmNvbWluZ0NhbGwucGFydGljaXBhbnRJZCk7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IHRoaXMuaW5jb21pbmdDYWxsc0xpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LnBhcnRpY2lwYW50SWQgIT09IGluY29taW5nQ2FsbC5wYXJ0aWNpcGFudElkKTtcbiAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XG4gICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG4gIGFjY2VwdE5ld0luY29taW5nQ2FsbChjYWxsOiBDYWxsKSB7XG4gICAgLy9maXJzdCBjdXQgdGhlIGN1cnJlbnQgY2FsbFxuICAgIHRoaXMubmV3SW5jb21pbmdDYWxsRGF0YSA9IGNhbGw7XG4gIH1cbiAgcmVqZWN0TmV3SW5jb21pbmdDYWxsKGNhbGw6IENhbGwpIHtcbiAgICBjYWxsLnJlamVjdCgpO1xuICAgIHRoaXMubmV3SW5jb21pbmdDYWxscyA9IHRoaXMubmV3SW5jb21pbmdDYWxscy5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJhbWV0ZXJzLkNhbGxTaWQgIT09IGNhbGwucGFyYW1ldGVyc1snQ2FsbFNpZCddKTtcbiAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS5wYXJhbWV0ZXJzLkNhbGxTaWQgIT09IGNhbGwucGFyYW1ldGVyc1snQ2FsbFNpZCddKTtcbiAgfVxuICBuZXdJbmNvbWluZ0NhbGxJbml0aWF0ZWQoKSB7XG4gICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICB0aGlzLm5ld0luY29taW5nQ2FsbHMgPSBbXTtcbiAgICB0aGlzLmluY29taW5nQ2FsbEluaXRpYXRlZC5lbWl0KCk7XG4gIH1cbiAgaW5jb21pbmdDYWxsc05ld0luZm8oZGF0YTogYW55KSB7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IGRhdGE7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTmV3SW5mb0V2ZW50LmVtaXQoZGF0YSk7XG4gIH1cblxuICBnZXRVc2VyU2V0dGluZ3MoKSB7XG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJTZXR0aW5ncygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09IDIwMCkge1xuICAgICAgICB0aGlzLnVzZXJTZXR0aW5nSW5mbyA9IHJlcy51c2VyU2V0dGluZztcbiAgICAgICAgdGhpcy5jZGsuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gYWxsIHN1YnNjcmlwdGlvbnNcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICAvLyBTdG9wIHJpbmdpbmcgaWYgYW4gaW5jb21pbmcgY2FsbCB3YXMgcGVuZGluZyB3aGVuIHRoZSBjb21wb25lbnQgaXMgdG9ybiBkb3duIChlLmcuIGxvZ291dCkuXG4gICAgICB0aGlzLmluY29tZWluZ0NhbGxTb2NrZXRTZXJ2aWNlLnBhdXNlKCk7XG4gICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0ID0gW107XG5cbiAgICAgIC8vIENsZWFuIHVwIFR3aWxpbyBkZXZpY2Ugd2hlbiBjb21wb25lbnQgaXMgZGVzdHJveWVkXG4gICAgICBpZiAodGhpcy50d2lsaW9TZXJ2aWNlWydkZXZpY2UnXSkge1xuICAgICAgICBjb25zb2xlLmxvZygnMTQwMicpO1xuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2VbJ2RldmljZSddLmRpc2Nvbm5lY3RBbGwoKTtcbiAgICAgICAgdGhpcy50d2lsaW9TZXJ2aWNlWydkZXZpY2UnXS5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICB0aGlzLnR3aWxpb1NlcnZpY2Uuc2V0SW5jb21pbmdNdXRlZCh0cnVlKTtcblxuICAgICAgLy8gRW5kIGFueSBhY3RpdmUgY2FsbFxuICAgICAgaWYgKHRoaXMuaXNDYWxsSW5Qcm9ncmVzcykge1xuICAgICAgICB0aGlzLmVuZENhbGwoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgYW55IHRpbWVvdXRzIG9yIGludGVydmFscyBpZiB0aGV5IGV4aXN0XG4gICAgICBpZiAodGhpcy50b2FzdFRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG9hc3RUaW1lb3V0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGNvbXBvbmVudCBjbGVhbnVwOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgaWQ9XCJkcmFncGFyZW50MVwiIFtuZ1N0eWxlXT1cInsnZGlzcGxheSc6aXNEaWFscGFkSGlkZGVuID8gJ25vbmUnOiAnYmxvY2snfVwiPlxuICA8bGliLWNhbGwtcHJvZ3Jlc3MgKm5nSWY9XCJpc0NhbGxJblByb2dyZXNzXCIgKGVuZENhbGxFdmVudCk9XCJlbmRDYWxsKClcIiAobWluaW1pc2VFdmVudCk9XCJvbk1pbmltaXNlKCRldmVudClcIlxuICAgIChtdXRlQWxsU3RhdHVzRXZlbnQpPVwic2hvd0RpYWxBbGVydCgkZXZlbnQpXCJcbiAgICAoaW5jb21pbmdDYWxsSW5pdGlhdGVkKT1cIm5ld0luY29taW5nQ2FsbEluaXRpYXRlZCgpXCIgW25ld0luY29taW5nQ2FsbERhdGFdPVwibmV3SW5jb21pbmdDYWxsRGF0YVwiXG4gICAgW2RldmljZUlkXT1cImRldmljZUlkXCIgW25ld0luY29taW5nQ2FsbHNMaXN0XT1cImluY29taW5nQ2FsbHNMaXN0XCIgW21pc3NDYWxsSW5mb109XCJtaXNzQ2FsbEluZm9cIlxuICAgIChpbmNvbWluZ0NhbGxzTmV3SW5mbyk9XCJpbmNvbWluZ0NhbGxzTmV3SW5mbygkZXZlbnQpXCIgW3NlbGVjdGVkQ2FsbGVySWRdPVwic2VsZWN0ZWRDYWxsZXJJZFwiXG4gICAgW2NhbGxlcklkTGlzdF09XCJjYWxsZXJJZExpc3RcIiBbY2FsbEFjdGlvbl09XCJjYWxsQWN0aW9uXCIgW2NvbmZlcmVuY2VDYWxsSW5mb109XCJjb25mZXJlbmNlQ2FsbEluZm9cIlxuICAgIFtuZXdDYWxsQ29uZmVyZW5jZV09XCJuZXdDYWxsQ29uZmVyZW5jZVwiIFt1c2VyU2V0dGluZ0luZm9dPVwidXNlclNldHRpbmdJbmZvXCJcbiAgICBbY2FuY2VsQ29ubmVjdGluZ0FjdGlvbl09XCJjYW5jZWxDb25uZWN0aW5nQWN0aW9uXCJcbiAgICBbb3V0Z29pbmdDb250YWN0TmFtZV09XCJvdXRnb2luZ0NvbnRhY3ROYW1lXCJcbiAgICBbaW5jb21pbmdGcm9tSW1hZ2VdPVwiaW5jb21pbmdGcm9tSW1hZ2VcIlxuICAgIChlbmRJbmNvbWluZ0NhbGxFdmVudCk9XCJlbmRJbmNvbWluZ0NhbGwoJGV2ZW50KVwiIChpc0xvYWRlcnNob3duKT1cIm9uTG9hZGVyc2hvdygkZXZlbnQpXCIgW2NhbGxEYXRhXT1cImNhbGxEYXRhXCI+XG4gIDwvbGliLWNhbGwtcHJvZ3Jlc3M+XG5cbiAgICA8ZGl2IGNsYXNzPVwibG9hZGVyLXdyYXBwZXIgb3V0Z29pbmctY2FsbC1sb2FkZXJcIiAqbmdJZj1cImlzTG9hZGVyc2hvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImFjdGl2ZS1jYWxsXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBwb3NpdGlvbjogcmVsYXRpdmU7XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWFuaW1hdGlvbiBjYWxsLWFuaW1hdGlvbi1wbGF5XCI+XG4gICAgICAgICAgPGltZyBjbGFzcz1cImF2YXRhci1pbWdcIiBbc3JjXT1cImNvbnRhY3RJbWdGb3JMb2FkZXJcIiBhbHQ9XCJcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxlckRldGFpbHNcIj5cbiAgICAgICAgICA8aDEgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7XCI+Q29ubmVjdGluZy4uLjwvaDE+XG4gICAgICAgICAgPHAgc3R5bGU9XCJ0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcIj57eyBjb250YWN0TmFtZUZvckxvYWRlciB8fCBkaWFsZWROdW1iZXIgfX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1hY3Rpb24tYnRuc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbGwtYnRuIGVuZC1jYWxsLWJ0blwiIGRpc2FibGVkIHN0eWxlPVwidmlzaWJpbGl0eTogaGlkZGVuO1wiIChjbGljayk9XCJjYW5jZWxDb25uZWN0aW5nQ2FsbCgpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPiBjYWxsX2VuZCA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3BlY2lhbCBDYWxsIENoYXJnZXMgTW9kYWwgKGZpcnN0IGNhbGw6IHNob3duIG92ZXIgdGhlIFwiQ29ubmVjdGluZy4uLlwiIGxvYWRlciwgc2FtZSBwb3NpdGlvbiBhcyAubG9hZGVyLXdyYXBwZXIpLlxuICAgICAgICAgV2hlbiBhIGNhbGwgc2NyZWVuIGlzIGFscmVhZHkgb3BlbiwgbGliLWNhbGwtcHJvZ3Jlc3Mgc2hvd3MgdGhpcyBtb2RhbCBpbnN0ZWFkLiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibG9hZGVyLXdyYXBwZXIgc3BlY2lhbC1jYWxsLW1vZGFsLXdyYXBwZXJcIiAqbmdJZj1cInR3aWxpb1NlcnZpY2Uuc3BlY2lhbENhbGxDb25maXJtICYmICF0d2lsaW9TZXJ2aWNlLnNwZWNpYWxDYWxsQ29uZmlybS5pbkNhbGxTY3JlZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzcGVjaWFsLWNhbGwtbW9kYWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndhcm5pbmctaWNvblwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPndhcm5pbmc8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aDM+Q2FsbCBDaGFyZ2VzPC9oMz5cbiAgICAgICAgPHAgKm5nSWY9XCJ0d2lsaW9TZXJ2aWNlLnNwZWNpYWxDYWxsQ29uZmlybT8ubWVzc2FnZVwiPnt7IHR3aWxpb1NlcnZpY2Uuc3BlY2lhbENhbGxDb25maXJtPy5tZXNzYWdlIH19PC9wPlxuICAgICAgICA8cCAqbmdJZj1cIiF0d2lsaW9TZXJ2aWNlLnNwZWNpYWxDYWxsQ29uZmlybT8ubWVzc2FnZVwiPlxuICAgICAgICAgIEFkZGl0aW9uYWwgY2hhcmdlcyBhcHBseSB0byB0aGlzIGNhbGwuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndhcm5pbmctYWN0aW9uc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWwtYnRuXCIgKGNsaWNrKT1cInR3aWxpb1NlcnZpY2UucmVzb2x2ZVNwZWNpYWxDYWxsQ29uZmlybShmYWxzZSlcIj5cbiAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJwcm9jZWVkLWJ0blwiIChjbGljayk9XCJ0d2lsaW9TZXJ2aWNlLnJlc29sdmVTcGVjaWFsQ2FsbENvbmZpcm0odHJ1ZSlcIj5cbiAgICAgICAgICAgIFByb2NlZWRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7J21pbmktZGlhbHBhZCc6IGlzTWluaW1pc2VkfVwiXG4gICAgKm5nSWY9XCIoIWlzQ2FsbEluUHJvZ3Jlc3MgJiYgIWluY29taW5nQ2FsbHNMaXN0Lmxlbmd0aCkgJiYgIWlzTG9hZGVyc2hvd1wiIHRhYmluZGV4PVwiMFwiIChrZXlkb3duKT1cImhhbmRsZURpdktleWRvd24oJGV2ZW50KVwiPlxuICAgIDxkaXYgaWQ9XCJ0b3BQYW5lbFwiIFtuZ1N0eWxlXT1cInsnaGVpZ2h0JzogY2FsbGVySWRMaXN0Lmxlbmd0aCA/ICc0MCUnIDogJzM5JSd9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1hbGVydHNcIiAqbmdJZj1cImRpYWxBbGVydC5zaG93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJuby1zZWxlY3Rpb24tYWxlcnRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj57e2RpYWxBbGVydC5tc2d9fTwvcD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRpbWVzXCIgKGNsaWNrKT1cInNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2VcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1hbGVydHNcIiAqbmdJZj1cImNhbGxOdW1iZXJUb2FzdC5zaG93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsYm94LXBvcDEgYWxlcnQgZmFkZSBzaG93XCIgW25nQ2xhc3NdPVwiY2FsbE51bWJlclRvYXN0LnR5cGVcIiByb2xlPVwiYWxlcnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTEgbXktYXV0byB0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgWW91J3IgY2FsbGluZyA8c3Ryb25nPnt7Y2FsbE51bWJlclRvYXN0LmRpc3BsYXlOdW19fTwvc3Ryb25nPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kaXNjIHAtMCBweC0xXCIgKGNsaWNrKT1cImNhbmNlbERpYWxOdW1iZXIoKVwiPkNhbmNlbCBDYWxsPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAwIDE4cHhcIiAocGFzdGUpPVwiaGFuZGxlTnVtYmVyUGFzdGUoJGV2ZW50KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG10LTJcIj5cbiAgICAgICAgICA8cD48L3A+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cImhpZGVEaWFscGFkKClcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0cHhcIiB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0cHhcIiBmaWxsPVwiI2ZmZmZmZlwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJtMjU2LTIwMC01Ni01NiAyMjQtMjI0LTIyNC0yMjQgNTYtNTYgMjI0IDIyNCAyMjQtMjI0IDU2IDU2LTIyNCAyMjQgMjI0IDIyNC01NiA1Ni0yMjQtMjI0LTIyNCAyMjRaXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ib3hcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiAjZGlhbElucHV0IHBsYWNlaG9sZGVyPVwiRW50ZXIgYSBuYW1lIG9yIG51bWJlclwiIHRhYmluZGV4PVwiMVwiIFsobmdNb2RlbCldPVwiZGlhbGVkTnVtYmVyXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGlhbElucHV0Q2hhbmdlKCRldmVudClcIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiXCIgaWQ9XCJpbnB1dC1jbGVhci1idG5cIiAoY2xpY2spPVwiY2xlYXJJbnB1dCgpXCIgKm5nSWY9XCJzaG93SW5wdXRDbGVhckJ0blwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjUwcHhcIiBoZWlnaHQ9XCIzMHB4XCIgdmlld0JveD1cIjAgMTAgNDAgNjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmVyc2lvbj1cIjEuMVwiIGJhc2VQcm9maWxlPVwiZnVsbFwiXG4gICAgICAgICAgICAgIGVuYWJsZS1iYWNrZ3JvdW5kPVwibmV3IDAgMCA3Ni4wMCA3Ni4wMFwiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjNWQ2MDYxXCIgZmlsbC1vcGFjaXR5PVwiMVwiIHN0cm9rZS13aWR0aD1cIjAuMlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICBkPVwiTSA0Ny41MjgyLDQyLjk0OTdMIDQyLjU3ODQsMzhMIDQ3LjUyODIsMzMuMDUwMkwgNDQuOTQ5NywzMC40NzE4TCA0MCwzNS40MjE2TCAzNS4wNTAyLDMwLjQ3MThMIDMyLjQ3MTgsMzMuMDUwMkwgMzcuNDIxNiwzOEwgMzIuNDcxOCw0Mi45NDk3TCAzNS4wNTAyLDQ1LjUyODJMIDQwLDQwLjU3ODRMIDQ0Ljk0OTcsNDUuNTI4MkwgNDcuNTI4Miw0Mi45NDk3IFogTSAxOC4wMTQ3LDQxLjUzNTVMIDI2Ljk2NDYsNTAuNDg1NEMgMjguMDY4Myw1MS41ODkgMjksNTIgMzEsNTJMIDUyLDUyQyA1NC43NjE0LDUyIDU3LDQ5Ljc2MTQgNTcsNDdMIDU3LDI5QyA1NywyNi4yMzg2IDU0Ljc2MTQsMjQgNTIsMjRMIDMxLDI0QyAyOSwyNCAyOC4wNjgzLDI0LjQxMTMgMjYuOTY0NiwyNS41MTQ5TCAxOC4wMTQ3LDM0LjQ2NDVDIDE2LjA2MjEsMzYuNDE3MSAxNi4wNjIxLDM5LjU4MjkgMTguMDE0Nyw0MS41MzU1IFogTSAzMSw0OUMgMzAsNDkgMjkuNjA0OCw0OC44ODI4IDI5LjA4Niw0OC4zNjQxTCAyMC4xMzYxLDM5LjQxNDJDIDE5LjM1NSwzOC42MzMyIDE5LjM1NSwzNy4zNjY5IDIwLjEzNjEsMzYuNTg1OEwgMjkuMDg2LDI3LjYzNjJDIDI5LjYwNDgsMjcuMTE3NSAzMCwyNyAzMSwyNy4wMDAxTCA1MiwyNy4wMDAxQyA1My4xMDQ2LDI3LjAwMDEgNTQsMjcuODk1NSA1NCwyOS4wMDAxTCA1NCw0Ny4wMDAxQyA1NCw0OC4xMDQ2IDUzLjEwNDYsNDkuMDAwMSA1Miw0OS4wMDAxTCAzMSw0OSBaIFwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1pbmZvLWljb25cIiBwbGFjZW1lbnQ9XCJib3R0b20tcmlnaHRcIiB0b29sdGlwQ2xhc3M9XCJpbnB1dC10b29sdGlwXCJcbiAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJGb3IgZXh0ZW5zaW9uIGRpYWxpbmcsIHVzZSBmb3JtYXRzIGxpa2UgKzEyMzQ1Njc4OTEwIHgxMjMsKzEyMzQ1Njc4OTEwIGV4dC4xMjMsICsxMjM0NTY3ODkxMCwxMjNcIj48aVxuICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJndWlkZVwiICpuZ0lmPVwiY2FsbGVySWRMaXN0Lmxlbmd0aCAmJiAhKGRpYWxlZE51bWJlci5sZW5ndGggPiAyKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3VpZGV0ZXh0XCI+UGxlYXNlIGVudGVyIGEgbnVtYmVyIG9yIHNlbGVjdCBhIHNhdmVkIGNvbnRhY3Q8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiaGVpZ2h0OiAxMTlweDsgb3ZlcmZsb3c6IGF1dG87XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtY2FyZFwiICpuZ0Zvcj1cImxldCBjb250YWN0IG9mIGZpbHRlcmVkQ29udGFjdExpc3RcIiAoY2xpY2spPVwib25Db250YWN0U2VsZWN0KGNvbnRhY3QpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbWdcIj5cbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImNvbnRhY3QuaW1hZ2VcIiBhbHQ9XCJ1c2VyIGltYWdlXCIgbG9hZGluZz1cImxhenlcIiAqbmdJZj1cImNvbnRhY3QuaW1hZ2UgZWxzZSBhbHBoYU5hbWVcIiAvPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FscGhhTmFtZT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnRhY3QtYWxwaGEtaW1nXCI+e3tnZXRGaXJzdExldHRlcihjb250YWN0LmZpcnN0TmFtZSl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDRweFwiIGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tnZXRGdWxsTmFtZShjb250YWN0KSB9fTwvcD5cbiAgICAgICAgICAgICAgPHA+e3tjb250YWN0LnNlbGVjdGVkTnVtYmVyLm51bWJlcn19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtY2FyZFwiICpuZ0lmPVwiIWZpbHRlcmVkQ29udGFjdExpc3QubGVuZ3RoICYmIGRpYWxlZE51bWJlci5sZW5ndGggPiAyICYmICFpc1ZhbGlkYXRpb25NZXNzYWdlU2hvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLWNvbnRhY3QtbWVzc2FnZVwiPlxuICAgICAgICAgICAgICBObyBDb250YWN0cyBGb3VuZFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cIndhdmVzXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICAgICAgdmlld0JveD1cIjAgMjQgMTUwIDI4XCIgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIiBzaGFwZS1yZW5kZXJpbmc9XCJhdXRvXCI+XG4gICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICA8cGF0aCBpZD1cImdlbnRsZS13YXZlXCIgZD1cIk0tMTYwIDQ0YzMwIDAgNTgtMTggODgtMThzIDU4IDE4IDg4IDE4IDU4LTE4IDg4LTE4IDU4IDE4IDg4IDE4IHY0NGgtMzUyelwiIC8+XG4gICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDxnIGNsYXNzPVwicGFyYWxsYXhcIj5cbiAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCIwXCIgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC43KVwiIC8+XG4gICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIiB4PVwiNDhcIiB5PVwiM1wiIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNSlcIiAvPlxuICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjdcIiBmaWxsPVwiI2ZmZlwiIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJidG4tY29udGFpbmVyXCIgKm5nSWY9XCIhaXNNaW5pbWlzZWRcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJkaWFsLWJ0blwiICpuZ0Zvcj1cImxldCBrZXkgb2Yga2V5cGFkVmFsO2xldCBpID0gaW5kZXhcIiAoa2V5ZG93bi5lbnRlcik9XCJvbkVudGVyKGtleS5udW0pXCJcbiAgICAgICAgW25nU3R5bGVdPVwieydtYXJnaW4tdG9wJzoga2V5LnRleHQgPT09ICcrJyA/ICczcHgnIDogJzAnfVwiIFt0YWJpbmRleF09XCJkaWFsZWROdW1iZXIubGVuZ3RoID8gJzAnOiBpKzJcIiBsb25nUHJlc3NcbiAgICAgICAgKGxvbmdQcmVzcyk9XCJhZGROdW1iZXIoa2V5LnRleHQpXCIgc2hvcnRQcmVzcyAoc2hvcnRQcmVzcyk9XCJhZGROdW1iZXIoa2V5Lm51bSlcIj5cbiAgICAgICAge3trZXkubnVtfX1cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJrZXkubnVtID09IDE7ZWxzZSBvdGhlclRoYW5PbmVcIiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgdm9pY2VtYWlsXCI+XG4gICAgICAgICAgdm9pY2VtYWlsXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNvdGhlclRoYW5PbmU+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tYWxiaGFiZXRzXCIgW25nQ2xhc3NdPVwieydwbHVzU2lnbic6IGtleS50ZXh0ID09PSAnKyd9XCI+e3trZXkudGV4dCA/IGtleS50ZXh0IDpcbiAgICAgICAgICAgICcmbmJzcDsnfX08L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbC1idG4tY29udGFpbmVyXCIgKm5nSWY9XCIhaXNNaW5pbWlzZWRcIiAobW91c2VlbnRlcik9XCJvbkNhbGxCdG5Nb3VzZUVudGVyKCRldmVudClcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwib25DYWxsQnRuTW91c2VMZWF2ZSgkZXZlbnQpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1idG5cIiAoY2xpY2spPVwiaW5pdGlhdGVDYWxsKClcIiBbdGFiaW5kZXhdPVwiZGlhbGVkTnVtYmVyLmxlbmd0aCA/ICcyJzogJzE1J1wiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsncG9pbnRlci1ldmVudHMnOiBkaWFsZWROdW1iZXIubGVuZ3RoICYmIHNlbGVjdGVkQ2FsbGVySWQgPyAnYXV0bycgOiAnbm9uZScsICdvcGFjaXR5JzogZGlhbGVkTnVtYmVyLmxlbmd0aCAmJiBzZWxlY3RlZENhbGxlcklkID8gJzEnIDogJzAuNSd9XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+XG4gICAgICAgICAgY2FsbFxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiY2FsbGVySWRMaXN0Lmxlbmd0aCAmJiAhaXNNaW5pbWlzZWRcIiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2hvd25DYWxsZXJJZFwiICpuZ0lmPVwic2VsZWN0ZWRDYWxsZXJJZDsgZWxzZSBhc2tCbG9ja1wiIChjbGljayk9XCJ0b2dnbGVDYWxsZXJJZERpdigpXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiJ2ZpIGZpLScgKyBzZWxlY3RlZENhbGxlcklkPy5pc29Db2RlPy50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxuICAgICAgICAgIHt7c2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjYXNrQmxvY2s+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaG93bkNhbGxlcklkXCIgKGNsaWNrKT1cInRvZ2dsZUNhbGxlcklkRGl2KClcIiBbbmdDbGFzc109XCJ7ICd0aWx0LXNoYWtpbmcnOiBzaGFrZURlZGljYXRlZEJ0biB9XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aDUgY2xhc3M9XCJtYi0wXCI+U2VsZWN0IEMyQyBudW1iZXI8L2g1PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hbmdsZS1kb3duIG1sLTIgdGV4dC1ibHVlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjJweFwiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPGRpdiBjbGFzcz1cImd1aWRlMlwiICpuZ0lmPVwic2hha2VEZWRpY2F0ZWRCdG5cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJndWlkZXRleHRcIj5QbGVhc2Ugc2VsZWN0IGEgbnVtYmVyIGZyb20gYmVsb3cgZHJvcGRvd248L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoOyBlbHNlIG5vQ2FsbGVySWRNZXNzYWdlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbGVyLWlkLWxpc3QtY29udGFpbmVyXCIgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoICYmICFpc01pbmltaXNlZFwiIGlkPVwiY2FsbGVySWRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ7J3Zpc2libGUnOiAhaXNDYWxsZXJJZEhpZGRlbn1cIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlblwiPlxuICAgICAgICAgIDwhLS0gPGg0PlNlbGVjdCBDMkMgU29mdHBob25lIE51bWJlcjwvaDQ+IC0tPlxuICAgICAgICAgIDxoND5NYWtlIG91dGdvaW5nIGNhbGwgdXNpbmc8L2g0PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCIgKGNsaWNrKT1cImlzQ2FsbGVySWRIaWRkZW4gPSB0cnVlXCI+XG4gICAgICAgICAgICBjbG9zZVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYWxsZXJJZCBvZiBjYWxsZXJJZExpc3RcIj5cbiAgICAgICAgICAgIDxsaSBbbmdDbGFzc109XCJ7J3NlbGVjdGVkQ2FsbGVySWRDbGFzcyc6IGNhbGxlcklkPy5udW1iZXIgPT0gc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkRlZGljYXRlZE51bVNlbGVjdChjYWxsZXJJZClcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCInZmkgZmktJyArIGNhbGxlcklkPy5pc29Db2RlPy50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIHt7Y2FsbGVySWQ/Lm51bWJlcn19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c3Bhbj57e2NhbGxlcklkPy5jb3VudHJ5TmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjbm9DYWxsZXJJZE1lc3NhZ2U+XG4gICAgICA8c3BhbiBjbGFzcz1cIm5vLWNhbGxlci1pZC1tZXNzYWdlXCI+VG8gbWFrZSBhbnkgdm9pY2UgY2FsbHMsIHBsZWFzZSA8YVxuICAgICAgICAgIHJvdXRlckxpbms9XCIvZXh0ZW5zaW9uL2RlZGljYXRlZG51bWJlci97e3Rva2VufX1cIiBjbGFzcz1cImNsaWNrLWhlcmUtbGlua1wiXG4gICAgICAgICAgdGl0bGU9XCJTZXR0aW5ncyA+IEMyQyBOdW1iZXJcIj5zdWJzY3JpYmU8L2E+IHRvIGEgdm9pY2UgY2FwYWJsZSBDMkMgTnVtYmVyLlxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cImRlZGljYXRlZC1vdmVybGF5XCIgKm5nSWY9XCJzaG93RGVkaWNhdGVkUG9wdXBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGRlZGljYXRlZE51bVBvcHVwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBjaG9vc2VEZWRpY2F0ZWRIZWFkZXJcIj5cbiAgICAgICAgICA8aDU+Q2hvb3NlIEMyQyBOdW1iZXI8L2g1PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCBkaWFsLWNsb3NlLWJ0blwiIChjbGljayk9XCJzaG93RGVkaWNhdGVkUG9wdXAgPSBmYWxzZVwiPmNsb3NlPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkZWRpY2F0ZWROdW1MaXN0XCI+XG4gICAgICAgICAgPHVsPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FsbGVySWQgb2YgY2FsbGVySWRMaXN0XCI+XG4gICAgICAgICAgICAgIDxsaSBbbmdDbGFzc109XCJ7J3NlbGVjdGVkQ2FsbGVySWRDbGFzcyc6IGNhbGxlcklkPy5udW1iZXIgPT0gc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dEZWRpY2F0ZWRQb3B1cCA9IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIidmaSBmaS0nICsgY2FsbGVySWQ/Lmlzb0NvZGU/LnRvTG93ZXJDYXNlKClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICB7e2NhbGxlcklkPy5udW1iZXJ9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7Y2FsbGVySWQ/LmNvdW50cnlOYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|