tango-app-ui-manage-settings 3.7.32 → 3.7.33
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/esm2022/lib/components/configurations/report-configuration/custom-report-schedule/custom-report-schedule.component.mjs +21 -9
- package/esm2022/lib/components/configurations/report-configuration/report-configuration.component.mjs +30 -4
- package/fesm2022/tango-app-ui-manage-settings.mjs +49 -11
- package/fesm2022/tango-app-ui-manage-settings.mjs.map +1 -1
- package/lib/components/configurations/report-configuration/custom-report-schedule/custom-report-schedule.component.d.ts +3 -0
- package/lib/components/configurations/report-configuration/report-configuration.component.d.ts +4 -0
- package/package.json +1 -1
|
@@ -99,6 +99,17 @@ export class CustomReportScheduleComponent {
|
|
|
99
99
|
}
|
|
100
100
|
selectFrequency(value) {
|
|
101
101
|
this.frequency = value;
|
|
102
|
+
// Does Not Repeat: a past day carried over from a monthly selection is not
|
|
103
|
+
// selectable — drop it so the picker never shows a disabled day as chosen.
|
|
104
|
+
if (value === 'once') {
|
|
105
|
+
this.datesOfMonth = this.datesOfMonth.filter((d) => !this.isDateDisabled(d)).slice(0, 1);
|
|
106
|
+
this.onceDate = this.datesOfMonth.length ? this.deriveNextOccurrence(this.datesOfMonth[0]) : '';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** 'Does Not Repeat' sends on a day of the CURRENT month, so days already past
|
|
110
|
+
* can't be chosen. */
|
|
111
|
+
isDateDisabled(date) {
|
|
112
|
+
return this.frequency === 'once' && date < new Date().getDate();
|
|
102
113
|
}
|
|
103
114
|
get scheduleLabel() {
|
|
104
115
|
switch (this.frequency) {
|
|
@@ -122,6 +133,9 @@ export class CustomReportScheduleComponent {
|
|
|
122
133
|
return this.daysOfWeek.includes(day);
|
|
123
134
|
}
|
|
124
135
|
toggleDate(date) {
|
|
136
|
+
if (this.isDateDisabled(date)) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
125
139
|
if (this.frequency === 'once') {
|
|
126
140
|
this.datesOfMonth = [date];
|
|
127
141
|
this.onceDate = this.deriveNextOccurrence(date);
|
|
@@ -175,12 +189,10 @@ export class CustomReportScheduleComponent {
|
|
|
175
189
|
}
|
|
176
190
|
get multiSelectLabel() {
|
|
177
191
|
if (this.frequency === 'weekly') {
|
|
178
|
-
//
|
|
179
|
-
//
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
const names = [...this.daysOfWeek].sort((a, b) => a - b).map((d) => DAY_NAMES[d]);
|
|
183
|
-
return names.length <= 3 ? names.join(', ') : `${names.slice(0, 2).join(', ')} +${names.length - 2}`;
|
|
192
|
+
// Per Figma the trigger shows a COUNT ("2 Days"); the helper line below
|
|
193
|
+
// the row spells out which days.
|
|
194
|
+
const count = this.daysOfWeek.length;
|
|
195
|
+
return count ? `${count} Day${count === 1 ? '' : 's'}` : 'Choose Day';
|
|
184
196
|
}
|
|
185
197
|
if (this.frequency === 'monthly' || this.frequency === 'once') {
|
|
186
198
|
const count = this.datesOfMonth.length;
|
|
@@ -334,12 +346,12 @@ export class CustomReportScheduleComponent {
|
|
|
334
346
|
});
|
|
335
347
|
}
|
|
336
348
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomReportScheduleComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.ClientApiService }, { token: i3.ToastService }], target: i0.ɵɵFactoryTarget.Component });
|
|
337
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomReportScheduleComponent, selector: "lib-custom-report-schedule", inputs: { template: "template" }, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 mb-6 d-flex align-items-center justify-content-between\">\n <span class=\"header\">Custom Report Configuration</span>\n <span class=\"cursor-pointer\" (click)=\"onCancel()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </span>\n </div>\n\n <div class=\"col-12 mb-5\">\n <label class=\"form-label\">Enter Report Name <span class=\"alert-required\"></span></label>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"reportName\" autocomplete=\"off\" placeholder=\"Enter Report Name\">\n <div *ngIf=\"nameError\" class=\"text-danger mt-3\">{{ nameError }}</div>\n </div>\n\n <div class=\"col-12 mb-5\">\n <label class=\"form-label\">Schedule <span class=\"alert-required\"></span></label>\n <div class=\"d-flex align-items-start flex-wrap schedule-row\">\n <div class=\"dropdown me-3 mb-3\" ngbDropdown>\n <button type=\"button\" class=\"btn btn-outline dropdown-toggle form-control schedule-select\"\n id=\"scheduleDropdown\" ngbDropdownToggle>\n {{ scheduleLabel }}\n </button>\n <ul class=\"dropdown-menu\" ngbDropdownMenu aria-labelledby=\"scheduleDropdown\">\n <li><a class=\"dropdown-item\" (click)=\"selectFrequency('daily')\">Daily</a></li>\n <li><a class=\"dropdown-item\" (click)=\"selectFrequency('weekly')\">Weekly</a></li>\n <li><a class=\"dropdown-item\" (click)=\"selectFrequency('monthly')\">Monthly</a></li>\n <li><a class=\"dropdown-item\" (click)=\"selectFrequency('once')\">Does Not Repeat</a></li>\n </ul>\n </div>\n\n <div *ngIf=\"frequency === 'weekly'\" class=\"dropdown me-3 mb-3\" ngbDropdown [autoClose]=\"'outside'\">\n <button type=\"button\" class=\"btn btn-outline dropdown-toggle form-control schedule-select\"\n id=\"chooseDayDropdown\" ngbDropdownToggle>\n {{ multiSelectLabel }}\n </button>\n <ul class=\"dropdown-menu checkbox-dropdown-menu\" ngbDropdownMenu aria-labelledby=\"chooseDayDropdown\">\n <li *ngFor=\"let day of dayOptions\" class=\"form-check px-4 py-2\">\n <input class=\"form-check-input\" type=\"checkbox\" [id]=\"'day-' + day.value\"\n [checked]=\"isDaySelected(day.value)\" (change)=\"toggleDay(day.value)\">\n <label class=\"form-check-label\" [for]=\"'day-' + day.value\">{{ day.label }}</label>\n </li>\n </ul>\n </div>\n\n <div *ngIf=\"frequency === 'monthly' || frequency === 'once'\" class=\"dropdown me-3 mb-3\" ngbDropdown [autoClose]=\"'outside'\">\n <button type=\"button\" class=\"btn btn-outline dropdown-toggle form-control schedule-select\"\n id=\"chooseDateDropdown\" ngbDropdownToggle>\n {{ multiSelectLabel }}\n </button>\n <ul class=\"dropdown-menu checkbox-dropdown-menu\" ngbDropdownMenu aria-labelledby=\"chooseDateDropdown\">\n <li *ngFor=\"let date of dateOptions\" class=\"form-check px-4 py-2\">\n <input class=\"form-check-input\" [type]=\"frequency === 'once' ? 'radio' : 'checkbox'\"\n [name]=\"frequency === 'once' ? 'onceDate' : null\" [id]=\"'date-' + date\"\n [checked]=\"isDateSelected(date)\" (change)=\"toggleDate(date)\">\n <label class=\"form-check-label\" [for]=\"'date-' + date\">{{ date }}</label>\n </li>\n </ul>\n </div>\n\n <div class=\"d-flex align-items-center mb-3\">\n <span class=\"mx-2 at-label\">at</span>\n <select class=\"form-select time-input\" [(ngModel)]=\"time\">\n <option *ngFor=\"let opt of timeOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n </div>\n <div *ngIf=\"helperText\" class=\"helper-text mt-1\">{{ helperText }}</div>\n </div>\n\n <div class=\"col-12 mb-5\">\n <label class=\"form-label\">File Type <span class=\"alert-required\"></span></label>\n <div class=\"dropdown\" ngbDropdown>\n <button type=\"button\" class=\"btn btn-outline dropdown-toggle form-control w-100 text-start\"\n id=\"fileTypeDropdown\" ngbDropdownToggle>\n {{ fileTypeLabel }}\n </button>\n <ul class=\"dropdown-menu w-100\" ngbDropdownMenu aria-labelledby=\"fileTypeDropdown\">\n <li><a class=\"dropdown-item\" (click)=\"selectFileType('csv')\">CSV</a></li>\n <li><a class=\"dropdown-item\" (click)=\"selectFileType('xlsx')\">XLSX</a></li>\n </ul>\n </div>\n </div>\n\n <div class=\"col-md-12 mb-5\">\n <label class=\"form-label\">Receivers Email <span class=\"alert-required\"></span></label>\n <div class=\"outer-container\">\n <div class=\"input-container form-control receivers-box\">\n <ng-container *ngFor=\"let email of emailList; let i = index\">\n <span class=\"chip\">\n <span class=\"me-3\">{{ email }}</span>\n <span (click)=\"removeChip(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </span>\n </span>\n </ng-container>\n <input class=\"emailinput\" (keydown)=\"onKeyDown($event)\" type=\"text\">\n </div>\n </div>\n <div *ngIf=\"emailValidation.includes(false)\" class=\"text-danger mt-3\">Invalid Email Format</div>\n </div>\n\n <div class=\"col-12 mt-10\">\n <div class=\"row\">\n <div class=\"col\">\n <a type=\"button\" class=\"btn btn-outline w-100\" (click)=\"onCancel()\">Cancel</a>\n </div>\n <div class=\"col\">\n <button type=\"button\" class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center\"\n (click)=\"onSubmit()\" [disabled]=\"isSaveDisabled\">\n <span class=\"me-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M14 5.33333V11.4667C14 12.5868 14 13.1469 13.7821 13.5747C13.5903 13.951 13.2843 14.257 12.9081 14.4488C12.4803 14.6667 11.9201 14.6667 10.8 14.6667H5.2C4.07989 14.6667 3.51984 14.6667 3.09202 14.4488C2.71569 14.257 2.40973 13.951 2.21799 13.5747C2 13.1469 2 12.5868 2 11.4667V4.53333C2 3.41323 2 2.85318 2.21799 2.42535C2.40973 2.04903 2.71569 1.74307 3.09202 1.55133C3.51984 1.33333 4.07989 1.33333 5.2 1.33333H9.33333M14 5.33333L9.33333 1.33333M14 5.33333H10.6667C9.93029 5.33333 9.33333 4.73638 9.33333 4V1.33333\"\n stroke=\"white\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Save</span>\n </button>\n </div>\n </div>\n </div>\n</div>", styles: [":host{padding:1.5rem}::ng-deep .custom-report-schedule-modal .modal-dialog{max-width:580px;width:90%}.header{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.emailinput{border:none;outline:none;background:none;box-shadow:none;min-height:44px!important}.emailinput:focus,.emailinput:active{border:none;outline:none;background:none;box-shadow:none}.form-control{display:block;height:45px;padding:.5rem 1rem;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control[disabled],.disabled{background-color:#f9fafb!important}small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px;display:block;margin-top:6px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px;height:25px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.receivers-box{min-height:88px;align-content:flex-start}.schedule-row .schedule-select{min-width:160px;width:auto;text-align:left;display:inline-flex;align-items:center;justify-content:space-between}.schedule-row .at-label{color:var(--Gray-500, #667085);font-size:14px;font-weight:500}.schedule-row .time-input{width:auto;min-width:110px}.helper-text{color:var(--Gray-500, #667085);font-size:13px;font-weight:400;line-height:18px}.checkbox-dropdown-menu{max-height:260px;overflow-y:auto;min-width:180px;background:var(--White, #FFF);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.checkbox-dropdown-menu .form-check{display:flex;align-items:center;margin-bottom:0}.checkbox-dropdown-menu .form-check .form-check-input{margin-top:0;margin-right:.5rem;float:none;margin-left:0;flex-shrink:0;cursor:pointer}.checkbox-dropdown-menu .form-check .form-check-label{cursor:pointer}.dropdown-toggle:after{margin-left:.5rem}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i1.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i1.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.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: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
349
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CustomReportScheduleComponent, selector: "lib-custom-report-schedule", inputs: { template: "template" }, ngImport: i0, template: "<!-- Same markup/classes as the Reports page's \"Custom Report Configuration\" modal\n (tango-analyse-report custom-report-view #scheduleModal), per Figma, so both popups\n look identical; only the bindings differ (this component's own field/method names). -->\n<div class=\"card border-0 schedule-config-modal\">\n <div class=\"card-body\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span class=\"header fw-bold\">Custom Report Configuration</span>\n <span class=\"cursor-pointer schedule-close\" (click)=\"onCancel()\" title=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#101828\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-name\">Enter Report Name</label>\n <input type=\"text\" id=\"schedule-name\" class=\"form-control mt-2 schedule-field\" [(ngModel)]=\"reportName\" autocomplete=\"off\" />\n <div *ngIf=\"nameError\" class=\"text-danger mt-2\">{{ nameError }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">Schedule</label>\n <div class=\"d-flex align-items-center mt-2 schedule-row-gap\">\n <div ngbDropdown class=\"d-inline-block schedule-freq\" [class.flex-grow-1]=\"frequency === 'daily'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle>\n <span>{{ scheduleLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('daily')\">Daily</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('weekly')\">Weekly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('monthly')\">Monthly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('once')\">Does Not Repeat</button>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'weekly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!daysOfWeek.length\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let day of dayOptions\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [id]=\"'day-' + day.value\"\n [checked]=\"isDaySelected(day.value)\" (change)=\"toggleDay(day.value)\" />\n <label class=\"form-check-label cursor-pointer\" [for]=\"'day-' + day.value\">{{ day.label }}</label>\n </div>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly' || frequency === 'once'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let date of dateOptions\">\n <!-- Does Not Repeat: days already past this month are disabled. -->\n <input class=\"form-check-input\" type=\"checkbox\" [id]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [checked]=\"isDateSelected(date)\" (change)=\"toggleDate(date)\" />\n <label class=\"form-check-label\" [for]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [class.text-muted]=\"isDateDisabled(date)\"\n [title]=\"isDateDisabled(date) ? 'Past dates cannot be scheduled' : ''\">{{ date }}</label>\n </div>\n </div>\n </div>\n\n <span class=\"sub-header mb-0 schedule-at\">at</span>\n <div class=\"time-field\">\n <select class=\"schedule-select time-select\" [(ngModel)]=\"time\">\n <option *ngFor=\"let opt of timeOptions\" [value]=\"opt.value\">{{ opt.value }}</option>\n </select>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"time-icon\">\n <path d=\"M10 5V10L13.3333 11.6667M18.3333 10C18.3333 14.6024 14.6024 18.3333 10 18.3333C5.39763 18.3333 1.66667 14.6024 1.66667 10C1.66667 5.39763 5.39763 1.66667 10 1.66667C14.6024 1.66667 18.3333 5.39763 18.3333 10Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n <div class=\"schedule-helper mt-2\" *ngIf=\"helperText\">{{ helperText }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">File Type</label>\n <div ngbDropdown class=\"d-block mt-2\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!fileType\">\n <span>{{ fileTypeLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('csv')\">CSV</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('xlsx')\">XLSX</button>\n </div>\n </div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-receivers\">Receivers Email</label>\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">×</span>\n </span>\n <!-- autocomplete=\"off\": Chrome otherwise autofills the just-added address back\n into the field (blue autofill background) after Enter clears it. -->\n <input type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n (keydown)=\"onKeyDown($event)\" />\n </div>\n <div *ngIf=\"emailValidation.includes(false)\" class=\"text-danger mt-2\">Invalid Email Format</div>\n </div>\n\n <div class=\"d-flex justify-content-between mt-8\">\n <button type=\"button\" class=\"btn schedule-btn-cancel w-50 me-2\" (click)=\"onCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary schedule-btn-save w-50 ms-2 d-flex align-items-center justify-content-center\"\n [disabled]=\"isSaveDisabled\" (click)=\"onSubmit()\">\n <svg *ngIf=\"!isSaveDisabled\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-2\">\n <path d=\"M17.5 17.5V11.6667C17.5 11.2246 17.3244 10.8007 17.0118 10.4882C16.6993 10.1756 16.2754 10 15.8333 10H4.16667C3.72464 10 3.30072 10.1756 2.98816 10.4882C2.67559 10.8007 2.5 11.2246 2.5 11.6667V17.5M17.5 17.5H2.5M17.5 17.5V6.16667C17.5 5.69996 17.5 5.4666 17.4092 5.28834C17.3293 5.13154 17.2018 5.00405 17.045 4.92416C16.8668 4.83333 16.6334 4.83333 16.1667 4.83333H12.5M2.5 17.5V4.16667C2.5 3.69996 2.5 3.4666 2.59083 3.28834C2.67072 3.13154 2.79821 3.00405 2.95501 2.92416C3.13327 2.83333 3.36662 2.83333 3.83333 2.83333H10.8333M12.5 4.83333V2.83333M12.5 4.83333H10.8333M12.5 2.83333H10.8333M10.8333 2.83333V4.83333M6.66667 6.66667H9.16667\"\n stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Save\n </button>\n </div>\n </div>\n</div>", styles: ["::ng-deep .custom-report-schedule-modal .modal-dialog{max-width:580px;width:90%}.header{color:var(--Gray-900, #101828)!important;font-size:18px!important;line-height:28px!important}.sub-header{color:var(--Gray-500, #667085)!important;font-size:14px!important;line-height:20px}.schedule-email-input{min-width:160px;outline:none;box-shadow:none}.schedule-email-input:focus{outline:none;box-shadow:none}.schedule-row-gap{gap:10px}.dropdown-field{min-width:120px;width:auto;text-align:left}.checkbox-dropdown-menu{max-height:220px;overflow-y:auto;min-width:160px}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-700, #344054)}.checkbox-dropdown-menu .form-check-label.text-muted{color:var(--Gray-400, #98A2B3)!important}.checkbox-dropdown-menu .form-check-input{float:none;margin-left:0;flex-shrink:0}.schedule-helper{color:var(--Gray-500, #667085);font-size:13px;line-height:18px}.schedule-receivers-box{min-height:88px;align-content:flex-start;gap:6px}.schedule-receivers-box .badge{font-size:14px!important;font-weight:500;line-height:20px;padding:4px 10px!important}.schedule-email-input{font-size:14px;line-height:20px}.schedule-receivers-box .badge .cursor-pointer{font-size:18px;line-height:1;color:var(--Gray-500, #667085)}.schedule-receivers-box .badge .cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer{font-size:26px;line-height:1;color:var(--Gray-500, #667085)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-close{display:inline-flex}.schedule-field,.schedule-field-box{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px!important;background:#fff!important;box-shadow:0 1px 2px #1018280d!important;font-size:14px;color:var(--Gray-900, #101828)}.schedule-field{height:44px}.schedule-select{display:flex;align-items:center;justify-content:space-between;gap:8px;height:44px;padding:0 14px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;box-shadow:0 1px 2px #1018280d;color:var(--Gray-900, #101828);font-size:14px;line-height:20px;text-align:left;cursor:pointer}.schedule-select:after{display:none}.schedule-select.is-placeholder>span:first-child{color:var(--Gray-500, #667085)}.schedule-chevron{flex-shrink:0}.schedule-freq,.schedule-pick{min-width:150px}.schedule-at{flex-shrink:0}.schedule-row-gap{gap:12px}.time-field{position:relative;min-width:130px}.time-field .time-select{appearance:none;-webkit-appearance:none;width:100%;padding-right:40px}.time-field .time-icon{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none}.schedule-receivers-box{min-height:104px}.schedule-btn-cancel{height:44px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.schedule-btn-cancel:hover{background:var(--Gray-50, #F9FAFB)}.schedule-btn-save{height:44px;border-radius:8px;font-size:14px;font-weight:600}.schedule-btn-save:disabled{background:#8fd6ff!important;border-color:#8fd6ff!important;color:#fff!important;opacity:1!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]{width:20px!important;height:20px!important;appearance:none;-webkit-appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:6px!important;background-color:#fff!important;background-image:none;background-repeat:no-repeat;background-position:center;background-size:20px 20px;box-shadow:none!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:checked{border:1px solid #00A3FF!important;background-color:#eaf8ff!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M14.6666 6.5L8.24992 12.9167L5.33325 10' stroke='%2300A3FF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:disabled{background-color:var(--Gray-100, #F2F4F7)!important;border-color:var(--Gray-200, #E4E7EC)!important;cursor:not-allowed;opacity:1}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i1.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i1.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i1.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["tabindex", "disabled"] }, { kind: "directive", type: i1.NgbDropdownButtonItem, selector: "button[ngbDropdownItem]" }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.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: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
338
350
|
}
|
|
339
351
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomReportScheduleComponent, decorators: [{
|
|
340
352
|
type: Component,
|
|
341
|
-
args: [{ selector: 'lib-custom-report-schedule', template: "<div class=\"row\">\n <div class=\"col-12 mb-6 d-flex align-items-center justify-content-between\">\n <span class=\"header\">Custom Report Configuration</span>\n <span class=\"cursor-pointer\" (click)=\"onCancel()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </span>\n </div>\n\n <div class=\"col-12 mb-5\">\n <label class=\"form-label\">Enter Report Name <span class=\"alert-required\"></span></label>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"reportName\" autocomplete=\"off\" placeholder=\"Enter Report Name\">\n <div *ngIf=\"nameError\" class=\"text-danger mt-3\">{{ nameError }}</div>\n </div>\n\n <div class=\"col-12 mb-5\">\n <label class=\"form-label\">Schedule <span class=\"alert-required\"></span></label>\n <div class=\"d-flex align-items-start flex-wrap schedule-row\">\n <div class=\"dropdown me-3 mb-3\" ngbDropdown>\n <button type=\"button\" class=\"btn btn-outline dropdown-toggle form-control schedule-select\"\n id=\"scheduleDropdown\" ngbDropdownToggle>\n {{ scheduleLabel }}\n </button>\n <ul class=\"dropdown-menu\" ngbDropdownMenu aria-labelledby=\"scheduleDropdown\">\n <li><a class=\"dropdown-item\" (click)=\"selectFrequency('daily')\">Daily</a></li>\n <li><a class=\"dropdown-item\" (click)=\"selectFrequency('weekly')\">Weekly</a></li>\n <li><a class=\"dropdown-item\" (click)=\"selectFrequency('monthly')\">Monthly</a></li>\n <li><a class=\"dropdown-item\" (click)=\"selectFrequency('once')\">Does Not Repeat</a></li>\n </ul>\n </div>\n\n <div *ngIf=\"frequency === 'weekly'\" class=\"dropdown me-3 mb-3\" ngbDropdown [autoClose]=\"'outside'\">\n <button type=\"button\" class=\"btn btn-outline dropdown-toggle form-control schedule-select\"\n id=\"chooseDayDropdown\" ngbDropdownToggle>\n {{ multiSelectLabel }}\n </button>\n <ul class=\"dropdown-menu checkbox-dropdown-menu\" ngbDropdownMenu aria-labelledby=\"chooseDayDropdown\">\n <li *ngFor=\"let day of dayOptions\" class=\"form-check px-4 py-2\">\n <input class=\"form-check-input\" type=\"checkbox\" [id]=\"'day-' + day.value\"\n [checked]=\"isDaySelected(day.value)\" (change)=\"toggleDay(day.value)\">\n <label class=\"form-check-label\" [for]=\"'day-' + day.value\">{{ day.label }}</label>\n </li>\n </ul>\n </div>\n\n <div *ngIf=\"frequency === 'monthly' || frequency === 'once'\" class=\"dropdown me-3 mb-3\" ngbDropdown [autoClose]=\"'outside'\">\n <button type=\"button\" class=\"btn btn-outline dropdown-toggle form-control schedule-select\"\n id=\"chooseDateDropdown\" ngbDropdownToggle>\n {{ multiSelectLabel }}\n </button>\n <ul class=\"dropdown-menu checkbox-dropdown-menu\" ngbDropdownMenu aria-labelledby=\"chooseDateDropdown\">\n <li *ngFor=\"let date of dateOptions\" class=\"form-check px-4 py-2\">\n <input class=\"form-check-input\" [type]=\"frequency === 'once' ? 'radio' : 'checkbox'\"\n [name]=\"frequency === 'once' ? 'onceDate' : null\" [id]=\"'date-' + date\"\n [checked]=\"isDateSelected(date)\" (change)=\"toggleDate(date)\">\n <label class=\"form-check-label\" [for]=\"'date-' + date\">{{ date }}</label>\n </li>\n </ul>\n </div>\n\n <div class=\"d-flex align-items-center mb-3\">\n <span class=\"mx-2 at-label\">at</span>\n <select class=\"form-select time-input\" [(ngModel)]=\"time\">\n <option *ngFor=\"let opt of timeOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n </div>\n <div *ngIf=\"helperText\" class=\"helper-text mt-1\">{{ helperText }}</div>\n </div>\n\n <div class=\"col-12 mb-5\">\n <label class=\"form-label\">File Type <span class=\"alert-required\"></span></label>\n <div class=\"dropdown\" ngbDropdown>\n <button type=\"button\" class=\"btn btn-outline dropdown-toggle form-control w-100 text-start\"\n id=\"fileTypeDropdown\" ngbDropdownToggle>\n {{ fileTypeLabel }}\n </button>\n <ul class=\"dropdown-menu w-100\" ngbDropdownMenu aria-labelledby=\"fileTypeDropdown\">\n <li><a class=\"dropdown-item\" (click)=\"selectFileType('csv')\">CSV</a></li>\n <li><a class=\"dropdown-item\" (click)=\"selectFileType('xlsx')\">XLSX</a></li>\n </ul>\n </div>\n </div>\n\n <div class=\"col-md-12 mb-5\">\n <label class=\"form-label\">Receivers Email <span class=\"alert-required\"></span></label>\n <div class=\"outer-container\">\n <div class=\"input-container form-control receivers-box\">\n <ng-container *ngFor=\"let email of emailList; let i = index\">\n <span class=\"chip\">\n <span class=\"me-3\">{{ email }}</span>\n <span (click)=\"removeChip(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M9 3L3 9M3 3L9 9\" stroke=\"#667085\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </span>\n </span>\n </ng-container>\n <input class=\"emailinput\" (keydown)=\"onKeyDown($event)\" type=\"text\">\n </div>\n </div>\n <div *ngIf=\"emailValidation.includes(false)\" class=\"text-danger mt-3\">Invalid Email Format</div>\n </div>\n\n <div class=\"col-12 mt-10\">\n <div class=\"row\">\n <div class=\"col\">\n <a type=\"button\" class=\"btn btn-outline w-100\" (click)=\"onCancel()\">Cancel</a>\n </div>\n <div class=\"col\">\n <button type=\"button\" class=\"btn btn-primary w-100 d-flex align-items-center justify-content-center\"\n (click)=\"onSubmit()\" [disabled]=\"isSaveDisabled\">\n <span class=\"me-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M14 5.33333V11.4667C14 12.5868 14 13.1469 13.7821 13.5747C13.5903 13.951 13.2843 14.257 12.9081 14.4488C12.4803 14.6667 11.9201 14.6667 10.8 14.6667H5.2C4.07989 14.6667 3.51984 14.6667 3.09202 14.4488C2.71569 14.257 2.40973 13.951 2.21799 13.5747C2 13.1469 2 12.5868 2 11.4667V4.53333C2 3.41323 2 2.85318 2.21799 2.42535C2.40973 2.04903 2.71569 1.74307 3.09202 1.55133C3.51984 1.33333 4.07989 1.33333 5.2 1.33333H9.33333M14 5.33333L9.33333 1.33333M14 5.33333H10.6667C9.93029 5.33333 9.33333 4.73638 9.33333 4V1.33333\"\n stroke=\"white\" stroke-width=\"1.33\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Save</span>\n </button>\n </div>\n </div>\n </div>\n</div>", styles: [":host{padding:1.5rem}::ng-deep .custom-report-schedule-modal .modal-dialog{max-width:580px;width:90%}.header{color:var(--Gray-900, #101828);font-size:18px;font-weight:600;line-height:28px}.emailinput{border:none;outline:none;background:none;box-shadow:none;min-height:44px!important}.emailinput:focus,.emailinput:active{border:none;outline:none;background:none;box-shadow:none}.form-control{display:block;height:45px;padding:.5rem 1rem;font-size:1.1rem;font-weight:400;color:var(--Gray-500, #667085);-webkit-appearance:none;appearance:none;border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control[disabled],.disabled{background-color:#f9fafb!important}small{color:var(--Error-500, #F04438)!important;font-size:14px!important;font-weight:400!important;line-height:20px;display:block;margin-top:6px}.outer-container{position:relative}.outer-container .form-control{padding-top:0;padding-bottom:0}.outer-container .input-container{border:1px solid black;height:100%;width:100%;display:flex;flex-wrap:wrap}.outer-container .input-container input{all:unset;flex:1;min-width:50px}.outer-container .input-container .chip{margin:10px 0 10px 10px;padding:3px 10px;border-radius:16px;background:var(--Gray-100, #F2F4F7);color:var(--Gray-700, #344054);font-family:Inter;font-size:14px;font-weight:500;line-height:20px;height:25px}.outer-container .input-container .chip:nth-child(1){margin-left:0}.receivers-box{min-height:88px;align-content:flex-start}.schedule-row .schedule-select{min-width:160px;width:auto;text-align:left;display:inline-flex;align-items:center;justify-content:space-between}.schedule-row .at-label{color:var(--Gray-500, #667085);font-size:14px;font-weight:500}.schedule-row .time-input{width:auto;min-width:110px}.helper-text{color:var(--Gray-500, #667085);font-size:13px;font-weight:400;line-height:18px}.checkbox-dropdown-menu{max-height:260px;overflow-y:auto;min-width:180px;background:var(--White, #FFF);border:1px solid var(--Gray-200, #EAECF0);border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808}.checkbox-dropdown-menu .form-check{display:flex;align-items:center;margin-bottom:0}.checkbox-dropdown-menu .form-check .form-check-input{margin-top:0;margin-right:.5rem;float:none;margin-left:0;flex-shrink:0;cursor:pointer}.checkbox-dropdown-menu .form-check .form-check-label{cursor:pointer}.dropdown-toggle:after{margin-left:.5rem}\n"] }]
|
|
353
|
+
args: [{ selector: 'lib-custom-report-schedule', template: "<!-- Same markup/classes as the Reports page's \"Custom Report Configuration\" modal\n (tango-analyse-report custom-report-view #scheduleModal), per Figma, so both popups\n look identical; only the bindings differ (this component's own field/method names). -->\n<div class=\"card border-0 schedule-config-modal\">\n <div class=\"card-body\">\n <div class=\"d-flex align-items-center justify-content-between\">\n <span class=\"header fw-bold\">Custom Report Configuration</span>\n <span class=\"cursor-pointer schedule-close\" (click)=\"onCancel()\" title=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#101828\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-name\">Enter Report Name</label>\n <input type=\"text\" id=\"schedule-name\" class=\"form-control mt-2 schedule-field\" [(ngModel)]=\"reportName\" autocomplete=\"off\" />\n <div *ngIf=\"nameError\" class=\"text-danger mt-2\">{{ nameError }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">Schedule</label>\n <div class=\"d-flex align-items-center mt-2 schedule-row-gap\">\n <div ngbDropdown class=\"d-inline-block schedule-freq\" [class.flex-grow-1]=\"frequency === 'daily'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle>\n <span>{{ scheduleLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('daily')\">Daily</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('weekly')\">Weekly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('monthly')\">Monthly</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFrequency('once')\">Does Not Repeat</button>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'weekly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!daysOfWeek.length\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let day of dayOptions\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" [id]=\"'day-' + day.value\"\n [checked]=\"isDaySelected(day.value)\" (change)=\"toggleDay(day.value)\" />\n <label class=\"form-check-label cursor-pointer\" [for]=\"'day-' + day.value\">{{ day.label }}</label>\n </div>\n </div>\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly' || frequency === 'once'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\">\n <span>{{ multiSelectLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"checkbox-dropdown-menu\">\n <div class=\"form-check form-check-custom form-check-solid px-3 py-1\" *ngFor=\"let date of dateOptions\">\n <!-- Does Not Repeat: days already past this month are disabled. -->\n <input class=\"form-check-input\" type=\"checkbox\" [id]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [disabled]=\"isDateDisabled(date)\"\n [checked]=\"isDateSelected(date)\" (change)=\"toggleDate(date)\" />\n <label class=\"form-check-label\" [for]=\"'date-' + date\"\n [class.cursor-pointer]=\"!isDateDisabled(date)\"\n [class.text-muted]=\"isDateDisabled(date)\"\n [title]=\"isDateDisabled(date) ? 'Past dates cannot be scheduled' : ''\">{{ date }}</label>\n </div>\n </div>\n </div>\n\n <span class=\"sub-header mb-0 schedule-at\">at</span>\n <div class=\"time-field\">\n <select class=\"schedule-select time-select\" [(ngModel)]=\"time\">\n <option *ngFor=\"let opt of timeOptions\" [value]=\"opt.value\">{{ opt.value }}</option>\n </select>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"time-icon\">\n <path d=\"M10 5V10L13.3333 11.6667M18.3333 10C18.3333 14.6024 14.6024 18.3333 10 18.3333C5.39763 18.3333 1.66667 14.6024 1.66667 10C1.66667 5.39763 5.39763 1.66667 10 1.66667C14.6024 1.66667 18.3333 5.39763 18.3333 10Z\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </div>\n <div class=\"schedule-helper mt-2\" *ngIf=\"helperText\">{{ helperText }}</div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\">File Type</label>\n <div ngbDropdown class=\"d-block mt-2\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!fileType\">\n <span>{{ fileTypeLabel }}</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"schedule-chevron\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <div ngbDropdownMenu class=\"w-100\">\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('csv')\">CSV</button>\n <button type=\"button\" ngbDropdownItem (click)=\"selectFileType('xlsx')\">XLSX</button>\n </div>\n </div>\n </div>\n\n <div class=\"mt-6\">\n <label class=\"sub-header\" for=\"schedule-receivers\">Receivers Email</label>\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">×</span>\n </span>\n <!-- autocomplete=\"off\": Chrome otherwise autofills the just-added address back\n into the field (blue autofill background) after Enter clears it. -->\n <input type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n (keydown)=\"onKeyDown($event)\" />\n </div>\n <div *ngIf=\"emailValidation.includes(false)\" class=\"text-danger mt-2\">Invalid Email Format</div>\n </div>\n\n <div class=\"d-flex justify-content-between mt-8\">\n <button type=\"button\" class=\"btn schedule-btn-cancel w-50 me-2\" (click)=\"onCancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary schedule-btn-save w-50 ms-2 d-flex align-items-center justify-content-center\"\n [disabled]=\"isSaveDisabled\" (click)=\"onSubmit()\">\n <svg *ngIf=\"!isSaveDisabled\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" class=\"me-2\">\n <path d=\"M17.5 17.5V11.6667C17.5 11.2246 17.3244 10.8007 17.0118 10.4882C16.6993 10.1756 16.2754 10 15.8333 10H4.16667C3.72464 10 3.30072 10.1756 2.98816 10.4882C2.67559 10.8007 2.5 11.2246 2.5 11.6667V17.5M17.5 17.5H2.5M17.5 17.5V6.16667C17.5 5.69996 17.5 5.4666 17.4092 5.28834C17.3293 5.13154 17.2018 5.00405 17.045 4.92416C16.8668 4.83333 16.6334 4.83333 16.1667 4.83333H12.5M2.5 17.5V4.16667C2.5 3.69996 2.5 3.4666 2.59083 3.28834C2.67072 3.13154 2.79821 3.00405 2.95501 2.92416C3.13327 2.83333 3.36662 2.83333 3.83333 2.83333H10.8333M12.5 4.83333V2.83333M12.5 4.83333H10.8333M12.5 2.83333H10.8333M10.8333 2.83333V4.83333M6.66667 6.66667H9.16667\"\n stroke=\"currentColor\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Save\n </button>\n </div>\n </div>\n</div>", styles: ["::ng-deep .custom-report-schedule-modal .modal-dialog{max-width:580px;width:90%}.header{color:var(--Gray-900, #101828)!important;font-size:18px!important;line-height:28px!important}.sub-header{color:var(--Gray-500, #667085)!important;font-size:14px!important;line-height:20px}.schedule-email-input{min-width:160px;outline:none;box-shadow:none}.schedule-email-input:focus{outline:none;box-shadow:none}.schedule-row-gap{gap:10px}.dropdown-field{min-width:120px;width:auto;text-align:left}.checkbox-dropdown-menu{max-height:220px;overflow-y:auto;min-width:160px}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-700, #344054)}.checkbox-dropdown-menu .form-check-label.text-muted{color:var(--Gray-400, #98A2B3)!important}.checkbox-dropdown-menu .form-check-input{float:none;margin-left:0;flex-shrink:0}.schedule-helper{color:var(--Gray-500, #667085);font-size:13px;line-height:18px}.schedule-receivers-box{min-height:88px;align-content:flex-start;gap:6px}.schedule-receivers-box .badge{font-size:14px!important;font-weight:500;line-height:20px;padding:4px 10px!important}.schedule-email-input{font-size:14px;line-height:20px}.schedule-receivers-box .badge .cursor-pointer{font-size:18px;line-height:1;color:var(--Gray-500, #667085)}.schedule-receivers-box .badge .cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer{font-size:26px;line-height:1;color:var(--Gray-500, #667085)}.schedule-config-modal .card-body>.d-flex:first-child>.cursor-pointer:hover{color:var(--Gray-700, #344054)}.schedule-close{display:inline-flex}.schedule-field,.schedule-field-box{border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:8px!important;background:#fff!important;box-shadow:0 1px 2px #1018280d!important;font-size:14px;color:var(--Gray-900, #101828)}.schedule-field{height:44px}.schedule-select{display:flex;align-items:center;justify-content:space-between;gap:8px;height:44px;padding:0 14px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;box-shadow:0 1px 2px #1018280d;color:var(--Gray-900, #101828);font-size:14px;line-height:20px;text-align:left;cursor:pointer}.schedule-select:after{display:none}.schedule-select.is-placeholder>span:first-child{color:var(--Gray-500, #667085)}.schedule-chevron{flex-shrink:0}.schedule-freq,.schedule-pick{min-width:150px}.schedule-at{flex-shrink:0}.schedule-row-gap{gap:12px}.time-field{position:relative;min-width:130px}.time-field .time-select{appearance:none;-webkit-appearance:none;width:100%;padding-right:40px}.time-field .time-icon{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none}.schedule-receivers-box{min-height:104px}.schedule-btn-cancel{height:44px;background:#fff;border:1px solid var(--Gray-300, #D0D5DD);border-radius:8px;color:var(--Gray-700, #344054);font-size:14px;font-weight:600}.schedule-btn-cancel:hover{background:var(--Gray-50, #F9FAFB)}.schedule-btn-save{height:44px;border-radius:8px;font-size:14px;font-weight:600}.schedule-btn-save:disabled{background:#8fd6ff!important;border-color:#8fd6ff!important;color:#fff!important;opacity:1!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]{width:20px!important;height:20px!important;appearance:none;-webkit-appearance:none;border:1px solid var(--Gray-300, #D0D5DD)!important;border-radius:6px!important;background-color:#fff!important;background-image:none;background-repeat:no-repeat;background-position:center;background-size:20px 20px;box-shadow:none!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:checked{border:1px solid #00A3FF!important;background-color:#eaf8ff!important;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M14.6666 6.5L8.24992 12.9167L5.33325 10' stroke='%2300A3FF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E\")!important}.checkbox-dropdown-menu .form-check.form-check-custom .form-check-input[type=checkbox]:disabled{background-color:var(--Gray-100, #F2F4F7)!important;border-color:var(--Gray-200, #E4E7EC)!important;cursor:not-allowed;opacity:1}\n"] }]
|
|
342
354
|
}], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.ClientApiService }, { type: i3.ToastService }], propDecorators: { template: [{
|
|
343
355
|
type: Input
|
|
344
356
|
}] } });
|
|
345
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQUt6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUV6Rzs7aURBRWlEO0FBQ2pELE1BQU0scUJBQXFCLEdBQXVDLENBQUMsR0FBRyxFQUFFO0lBQ3RFLE1BQU0sT0FBTyxHQUF1QyxFQUFFLENBQUM7SUFDdkQsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFB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LEtBQUssRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksZ0NBQWdDLENBQUMsQ0FBQztZQUN6RyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F6VFUsNkJBQTZCOzRGQUE3Qiw2QkFBNkIsb0dDL0IxQywyMVBBK0hNOzs0RkRoR08sNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDRCQUE0Qjs2SUFLN0IsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuXG5jb25zdCBEQVlfTkFNRVMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG5jb25zdCBNT05USF9OQU1FUyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLyoqIFNjaGVkdWxlIHNlbmQtdGltZSBzbG90czogMzAtbWludXRlIHN0ZXBzLCByZXN0cmljdGVkIHRvIDA5OjAw4oCTMjE6MDAg4oCUIHRoZVxuICogIHNhbWUgcHJvZHVjdCBydWxlIGFzIHRoZSByZXBvcnRzIHBhZ2UncyBzY2hlZHVsZSBtb2RhbC4gVmFsdWVzIHN0YXkgSEg6bW1cbiAqICAodGhlIEFQSSBjb250cmFjdCk7IGxhYmVscyByZW5kZXIgMTItaG91ci4gKi9cbmNvbnN0IFNDSEVEVUxFX1RJTUVfT1BUSU9OUzogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9ICgoKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChsZXQgaG91ciA9IDk7IGhvdXIgPD0gMjE7IGhvdXIrKykge1xuICAgIGZvciAoY29uc3QgbWludXRlIG9mIGhvdXIgPT09IDIxID8gWzBdIDogWzAsIDMwXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBgJHtTdHJpbmcoaG91cikucGFkU3RhcnQoMiwgJzAnKX06JHtTdHJpbmcobWludXRlKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICBjb25zdCBob3VyMTIgPSAoKGhvdXIgKyAxMSkgJSAxMikgKyAxO1xuICAgICAgb3B0aW9ucy5wdXNoKHsgdmFsdWUsIGxhYmVsOiBgJHtob3VyMTJ9OiR7U3RyaW5nKG1pbnV0ZSkucGFkU3RhcnQoMiwgJzAnKX0gJHtob3VyIDwgMTIgPyAnQU0nIDogJ1BNJ31gIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn0pKCk7XG5cbnR5cGUgRnJlcXVlbmN5ID0gJ2RhaWx5JyB8ICd3ZWVrbHknIHwgJ21vbnRobHknIHwgJ29uY2UnO1xudHlwZSBGaWxlVHlwZSA9ICdjc3YnIHwgJ3hsc3gnIHwgJyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXN0b20tcmVwb3J0LXNjaGVkdWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVwb3J0U2NoZWR1bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0ZW1wbGF0ZTogYW55O1xuXG4gIHJlcG9ydE5hbWU6IHN0cmluZyA9ICcnO1xuICBuYW1lRXJyb3I6IHN0cmluZyA9ICcnO1xuXG4gIGZyZXF1ZW5jeTogRnJlcXVlbmN5ID0gJ2RhaWx5JztcbiAgdGltZTogc3RyaW5nID0gJzA5OjAwJztcbiAgZGF5c09mV2VlazogbnVtYmVyW10gPSBbXTtcbiAgZGF0ZXNPZk1vbnRoOiBudW1iZXJbXSA9IFtdO1xuICBvbmNlRGF0ZTogc3RyaW5nID0gJyc7XG4gIGZpbGVUeXBlOiBGaWxlVHlwZSA9ICd4bHN4JztcblxuICBlbWFpbExpc3Q6IGFueVtdID0gW107XG4gIGVtYWlsVmFsaWRhdGlvbjogYW55W10gPSBbXTtcbiAgc2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZGF5T3B0aW9ucyA9IERBWV9OQU1FUy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoeyB2YWx1ZTogaW5kZXgsIGxhYmVsOiBuYW1lIH0pKTtcbiAgcmVhZG9ubHkgZGF0ZU9wdGlvbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAzMSB9LCAoXywgaSkgPT4gaSArIDEpO1xuICByZWFkb25seSB0aW1lT3B0aW9ucyA9IFNDSEVEVUxFX1RJTUVfT1BUSU9OUztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCwgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXI6IFRvYXN0U2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcbiAgICAgIHRoaXMucmVwb3J0TmFtZSA9IHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJztcbiAgICAgIGNvbnN0IHNjaGVkdWxlID0gdGhpcy50ZW1wbGF0ZT8uc2NoZWR1bGUgfHwge307XG4gICAgICB0aGlzLmZyZXF1ZW5jeSA9IHNjaGVkdWxlLmZyZXF1ZW5jeSB8fCAnZGFpbHknO1xuICAgICAgLy8gQSBzdG9yZWQgdGltZSBvdXRzaWRlIHRoZSBhbGxvd2VkIHNsb3RzIChvbGRlciBzY2hlZHVsZXMsIGZyZWUtdHlwZWRcbiAgICAgIC8vIHZhbHVlcykgc25hcHMgYmFjayB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbiBzaG93aW5nIGFuIGVtcHR5IHNlbGVjdC5cbiAgICAgIGNvbnN0IHN0b3JlZFRpbWUgPSBzY2hlZHVsZS50aW1lIHx8ICcwOTowMCc7XG4gICAgICB0aGlzLnRpbWUgPSBTQ0hFRFVMRV9USU1FX09QVElPTlMuc29tZSgob3B0KSA9PiBvcHQudmFsdWUgPT09IHN0b3JlZFRpbWUpID8gc3RvcmVkVGltZSA6ICcwOTowMCc7XG4gICAgICB0aGlzLmRheXNPZldlZWsgPSBbLi4uKHNjaGVkdWxlLmRheXNPZldlZWsgfHwgW10pXTtcbiAgICAgIHRoaXMub25jZURhdGUgPSBzY2hlZHVsZS5vbmNlRGF0ZSB8fCAnJztcbiAgICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnICYmIHRoaXMub25jZURhdGUpIHtcbiAgICAgICAgY29uc3QgZGF5ID0gTnVtYmVyKHRoaXMub25jZURhdGUuc3BsaXQoJy0nKVsyXSk7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gZGF5ID8gW2RheV0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gWy4uLihzY2hlZHVsZS5kYXRlc09mTW9udGggfHwgW10pXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsZVR5cGUgPSBzY2hlZHVsZS5maWxlVHlwZSB8fCAneGxzeCc7XG4gICAgICB0aGlzLmVtYWlsTGlzdCA9IFsuLi4oc2NoZWR1bGUucmVjZWl2ZXJzIHx8IFtdKV07XG4gICAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgICAgdGhpcy5lbWFpbExpc3QuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7IHRoaXMuZW1haWxWYWxpZGF0b3IoZWxlbWVudCk7IH0pO1xuICAgIH1cbiAgfVxuXG4gIGVtYWlsVmFsaWRhdG9yKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xuICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KHZhbHVlKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbi5wdXNoKHZhbGlkKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdCYWNrc3BhY2UnICYmIGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJycgJiYgdGhpcy5lbWFpbExpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVtYWlsTGlzdC5wb3AoKTtcbiAgICAgIHRoaXMuZW1haWxWYWxpZGF0aW9uLnBvcCgpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcbiAgICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgdGhpcy5lbWFpbExpc3QucHVzaChldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBFbnRlciBWYWxpZCBFbWFpbC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGlwKGk6IG51bWJlcikge1xuICAgIHRoaXMuZW1haWxMaXN0LnNwbGljZShpLCAxKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgIHRoaXMuZW1haWxMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4geyB0aGlzLmVtYWlsVmFsaWRhdG9yKGVsZW1lbnQpOyB9KTtcbiAgfVxuXG4gIHNlbGVjdEZyZXF1ZW5jeSh2YWx1ZTogRnJlcXVlbmN5KSB7XG4gICAgdGhpcy5mcmVxdWVuY3kgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBzY2hlZHVsZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmZyZXF1ZW5jeSkge1xuICAgICAgY2FzZSAnZGFpbHknOiByZXR1cm4gJ0RhaWx5JztcbiAgICAgIGNhc2UgJ3dlZWtseSc6IHJldHVybiAnV2Vla2x5JztcbiAgICAgIGNhc2UgJ21vbnRobHknOiByZXR1cm4gJ01vbnRobHknO1xuICAgICAgY2FzZSAnb25jZSc6IHJldHVybiAnRG9lcyBOb3QgUmVwZWF0JztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnRGFpbHknO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZURheShkYXk6IG51bWJlcikge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuZGF5c09mV2Vlay5pbmRleE9mKGRheSk7XG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICB0aGlzLmRheXNPZldlZWsuc3BsaWNlKGlkeCwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF5c09mV2Vlay5wdXNoKGRheSk7XG4gICAgfVxuICB9XG5cbiAgaXNEYXlTZWxlY3RlZChkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRheXNPZldlZWsuaW5jbHVkZXMoZGF5KTtcbiAgfVxuXG4gIHRvZ2dsZURhdGUoZGF0ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScpIHtcbiAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gW2RhdGVdO1xuICAgICAgdGhpcy5vbmNlRGF0ZSA9IHRoaXMuZGVyaXZlTmV4dE9jY3VycmVuY2UoZGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlkeCA9IHRoaXMuZGF0ZXNPZk1vbnRoLmluZGV4T2YoZGF0ZSk7XG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICB0aGlzLmRhdGVzT2ZNb250aC5zcGxpY2UoaWR4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRlc09mTW9udGgucHVzaChkYXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYSBkYXktb2YtbW9udGggKDEtMzEpLCByZXR1cm5zIHRoZSBuZXh0IG9jY3VycmVuY2UgYXMgJ1lZWVktTU0tREQnLlxuICAgKiBUb2RheSBxdWFsaWZpZXMgaWYgaXQgaXMgdGhhdCBkYXk7IG90aGVyd2lzZSBhZHZhbmNlcyB0byB0aGUgbmV4dCBjYWxlbmRhclxuICAgKiBtb250aCB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHRoYXQgZGF5IChlLmcuIDMxIGNob3NlbiBvbiBGZWIgMTAgLT4gTWFyIDMxKS5cbiAgICovXG4gIHByaXZhdGUgZGVyaXZlTmV4dE9jY3VycmVuY2UoZGF5T2ZNb250aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICBpZiAodG9kYXkuZ2V0RGF0ZSgpID09PSBkYXlPZk1vbnRoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0lzb0RhdGUodG9kYXkpO1xuICAgIH1cblxuICAgIGxldCB5ZWFyID0gdG9kYXkuZ2V0RnVsbFllYXIoKTtcbiAgICBsZXQgbW9udGggPSB0b2RheS5nZXRNb250aCgpO1xuICAgIGlmICh0b2RheS5nZXREYXRlKCkgPiBkYXlPZk1vbnRoKSB7XG4gICAgICBtb250aCArPSAxO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgY29uc3QgZGF5c0luTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcbiAgICAgIGlmIChkYXlPZk1vbnRoIDw9IGRheXNJbk1vbnRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvSXNvRGF0ZShuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5T2ZNb250aCkpO1xuICAgICAgfVxuICAgICAgbW9udGggKz0gMTtcbiAgICAgIGlmIChtb250aCA+IDExKSB7XG4gICAgICAgIG1vbnRoID0gMDtcbiAgICAgICAgeWVhciArPSAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIHRvSXNvRGF0ZShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX1gO1xuICB9XG5cbiAgaXNEYXRlU2VsZWN0ZWQoZGF0ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0ZXNPZk1vbnRoLmluY2x1ZGVzKGRhdGUpO1xuICB9XG5cbiAgZ2V0IG11bHRpU2VsZWN0TGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICd3ZWVrbHknKSB7XG4gICAgICAvLyBTaG93cyBXSElDSCBkYXlzIGFyZSBzZWxlY3RlZCwgbm90IGp1c3QgaG93IG1hbnkg4oCUICdTdW5kYXksIE1vbmRheSc7XG4gICAgICAvLyBiZXlvbmQgdGhyZWUgZGF5cyBpdCBjb21wYWN0cyB0byAnU3VuZGF5LCBNb25kYXkgK04nIHRvIGZpdCB0aGUgdHJpZ2dlci5cbiAgICAgIGlmICghdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aCkgcmV0dXJuICdDaG9vc2UgRGF5JztcbiAgICAgIGNvbnN0IG5hbWVzID0gWy4uLnRoaXMuZGF5c09mV2Vla10uc29ydCgoYSwgYikgPT4gYSAtIGIpLm1hcCgoZCkgPT4gREFZX05BTUVTW2RdKTtcbiAgICAgIHJldHVybiBuYW1lcy5sZW5ndGggPD0gMyA/IG5hbWVzLmpvaW4oJywgJykgOiBgJHtuYW1lcy5zbGljZSgwLCAyKS5qb2luKCcsICcpfSArJHtuYW1lcy5sZW5ndGggLSAyfWA7XG4gICAgfVxuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ21vbnRobHknIHx8IHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXRlc09mTW9udGgubGVuZ3RoO1xuICAgICAgaWYgKCFjb3VudCkgcmV0dXJuICdDaG9vc2UgRGF0ZSc7XG4gICAgICByZXR1cm4gYCR7Y291bnR9IERhdGUke2NvdW50ID4gMSA/ICdzJyA6ICcnfWA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHNlbGVjdEZpbGVUeXBlKHZhbHVlOiBGaWxlVHlwZSkge1xuICAgIHRoaXMuZmlsZVR5cGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBmaWxlVHlwZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmlsZVR5cGUgPT09ICdjc3YnKSByZXR1cm4gJ0NTVic7XG4gICAgaWYgKHRoaXMuZmlsZVR5cGUgPT09ICd4bHN4JykgcmV0dXJuICdYTFNYJztcbiAgICByZXR1cm4gJ0Nob29zZSBGaWxlJztcbiAgfVxuXG4gIHByaXZhdGUgb3JkaW5hbChuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcobikucGFkU3RhcnQoMiwgJzAnKTtcbiAgfVxuXG4gIGdldCBoZWxwZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmZyZXF1ZW5jeSkge1xuICAgICAgY2FzZSAnZGFpbHknOlxuICAgICAgICByZXR1cm4gJ1JlcG9ydCBzZW50IGRhaWx5JztcbiAgICAgIGNhc2UgJ3dlZWtseSc6IHtcbiAgICAgICAgaWYgKCF0aGlzLmRheXNPZldlZWsubGVuZ3RoKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLmRheXNPZldlZWtdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBzb3J0ZWQubWFwKChkKSA9PiBEQVlfTkFNRVNbZF0pO1xuICAgICAgICBjb25zdCBqb2luZWQgPSBuYW1lcy5sZW5ndGggPiAxXG4gICAgICAgICAgPyBgJHtuYW1lcy5zbGljZSgwLCAtMSkuam9pbignLCAnKX0gYW5kICR7bmFtZXNbbmFtZXMubGVuZ3RoIC0gMV19YFxuICAgICAgICAgIDogbmFtZXNbMF07XG4gICAgICAgIHJldHVybiBgUmVwb3J0IHdpbGwgYmUgc2VudCBldmVyeSAke2pvaW5lZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnbW9udGhseSc6IHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGVzT2ZNb250aC5sZW5ndGgpIHJldHVybiAnJztcbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnRoaXMuZGF0ZXNPZk1vbnRoXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGNvbnN0IGpvaW5lZCA9IHNvcnRlZC5tYXAoKGQpID0+IGAke3RoaXMub3JkaW5hbChkKX0ke3RoaXMuZGF5U3VmZml4KGQpfWApLmpvaW4oJywgJyk7XG4gICAgICAgIHJldHVybiBgUmVwb3J0cyB3aWxsIGJlIHNlbnQgb24gJHtqb2luZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29uY2UnOiB7XG4gICAgICAgIGlmICghdGhpcy5vbmNlRGF0ZSkgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gYFJlcG9ydCB3aWxsIGJlIHNlbnQgb25jZSBvbiAke3RoaXMuZm9ybWF0T25jZURhdGUodGhpcy5vbmNlRGF0ZSl9YDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRheVN1ZmZpeChuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChuID49IDExICYmIG4gPD0gMTMpIHJldHVybiAndGgnO1xuICAgIHN3aXRjaCAobiAlIDEwKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiAnc3QnO1xuICAgICAgY2FzZSAyOiByZXR1cm4gJ25kJztcbiAgICAgIGNhc2UgMzogcmV0dXJuICdyZCc7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ3RoJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE9uY2VEYXRlKGRhdGVTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBkYXRlU3RyLnNwbGl0KCctJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIGRhdGVTdHI7XG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gcGFydHM7XG4gICAgY29uc3QgbW9udGhOYW1lID0gTU9OVEhfTkFNRVNbTnVtYmVyKG1vbnRoKSAtIDFdIHx8ICcnO1xuICAgIHJldHVybiBgJHtkYXl9ICR7bW9udGhOYW1lfSwgJHt5ZWFyfWA7XG4gIH1cblxuICBnZXQgaXNTYXZlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2F2aW5nKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucmVwb3J0TmFtZT8udHJpbSgpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuZmlsZVR5cGUpIHJldHVybiB0cnVlO1xuICAgIGlmICghdGhpcy5lbWFpbExpc3QubGVuZ3RoIHx8IHRoaXMuZW1haWxWYWxpZGF0aW9uLmluY2x1ZGVzKGZhbHNlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnd2Vla2x5JyAmJiAhdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScgJiYgIXRoaXMuZGF0ZXNPZk1vbnRoLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScgJiYgIXRoaXMub25jZURhdGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCkge1xuICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTY2hlZHVsZVBheWxvYWQoKTogYW55IHtcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgZnJlcXVlbmN5OiB0aGlzLmZyZXF1ZW5jeSxcbiAgICAgIHRpbWU6IHRoaXMudGltZSB8fCAnMDk6MDAnLFxuICAgICAgZmlsZVR5cGU6IHRoaXMuZmlsZVR5cGUsXG4gICAgICByZWNlaXZlcnM6IHRoaXMuZW1haWxMaXN0XG4gICAgfTtcbiAgICBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICd3ZWVrbHknKSB7XG4gICAgICBwYXlsb2FkLmRheXNPZldlZWsgPSB0aGlzLmRheXNPZldlZWs7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ21vbnRobHknKSB7XG4gICAgICBwYXlsb2FkLmRhdGVzT2ZNb250aCA9IHRoaXMuZGF0ZXNPZk1vbnRoO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICdvbmNlJykge1xuICAgICAgaWYgKHRoaXMuZGF0ZXNPZk1vbnRoLmxlbmd0aCkge1xuICAgICAgICB0aGlzLm9uY2VEYXRlID0gdGhpcy5kZXJpdmVOZXh0T2NjdXJyZW5jZSh0aGlzLmRhdGVzT2ZNb250aFswXSk7XG4gICAgICB9XG4gICAgICBwYXlsb2FkLm9uY2VEYXRlID0gdGhpcy5vbmNlRGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBvblN1Ym1pdCgpIHtcbiAgICBpZiAodGhpcy5pc1NhdmVEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5hbWVFcnJvciA9ICcnO1xuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IG5hbWVDaGFuZ2VkID0gdGhpcy5yZXBvcnROYW1lLnRyaW0oKSAhPT0gKHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJyk7XG4gICAgaWYgKG5hbWVDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlQ3VzdG9tUmVwb3J0VGVtcGxhdGUodGhpcy50ZW1wbGF0ZT8uX2lkLCB7IHRlbXBsYXRlTmFtZTogdGhpcy5yZXBvcnROYW1lLnRyaW0oKSB9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZlU2NoZWR1bGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGVycj8uc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZUVycm9yID0gJ1JlcG9ydCBuYW1lIGFscmVhZHkgZXhpc3RzLiBDaG9vc2UgYSBkaWZmZXJlbnQgbmFtZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciB1cGRhdGluZyByZXBvcnQgbmFtZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2F2ZVNjaGVkdWxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlU2NoZWR1bGUoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5idWlsZFNjaGVkdWxlUGF5bG9hZCgpO1xuICAgIHRoaXMuYXBpU2VydmljZS51cGRhdGVDdXN0b21SZXBvcnRTY2hlZHVsZSh0aGlzLnRlbXBsYXRlPy5faWQsIHBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSh7IHR5cGU6ICdzYXZlJyB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciB1cGRhdGluZyByZXBvcnQgc2NoZWR1bGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTYgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImhlYWRlclwiPkN1c3RvbSBSZXBvcnQgQ29uZmlndXJhdGlvbjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDVMNSAxNU01IDVMMTUgMTVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi01XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5FbnRlciBSZXBvcnQgTmFtZSA8c3BhbiBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkXCI+PC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJyZXBvcnROYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBSZXBvcnQgTmFtZVwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibmFtZUVycm9yXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBtdC0zXCI+e3sgbmFtZUVycm9yIH19PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlNjaGVkdWxlIDxzcGFuIGNsYXNzPVwiYWxlcnQtcmVxdWlyZWRcIj48L3NwYW4+PC9sYWJlbD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LXdyYXAgc2NoZWR1bGUtcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24gbWUtMyBtYi0zXCIgbmdiRHJvcGRvd24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZHJvcGRvd24tdG9nZ2xlIGZvcm0tY29udHJvbCBzY2hlZHVsZS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICBpZD1cInNjaGVkdWxlRHJvcGRvd25cIiBuZ2JEcm9wZG93blRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAge3sgc2NoZWR1bGVMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBuZ2JEcm9wZG93bk1lbnUgYXJpYS1sYWJlbGxlZGJ5PVwic2NoZWR1bGVEcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNlbGVjdEZyZXF1ZW5jeSgnZGFpbHknKVwiPkRhaWx5PC9hPjwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCd3ZWVrbHknKVwiPldlZWtseTwvYT48L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNlbGVjdEZyZXF1ZW5jeSgnbW9udGhseScpXCI+TW9udGhseTwvYT48L2xpPlxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cInNlbGVjdEZyZXF1ZW5jeSgnb25jZScpXCI+RG9lcyBOb3QgUmVwZWF0PC9hPjwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZnJlcXVlbmN5ID09PSAnd2Vla2x5J1wiIGNsYXNzPVwiZHJvcGRvd24gbWUtMyBtYi0zXCIgbmdiRHJvcGRvd24gW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBkcm9wZG93bi10b2dnbGUgZm9ybS1jb250cm9sIHNjaGVkdWxlLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiY2hvb3NlRGF5RHJvcGRvd25cIiBuZ2JEcm9wZG93blRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAge3sgbXVsdGlTZWxlY3RMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgY2hlY2tib3gtZHJvcGRvd24tbWVudVwiIG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJjaG9vc2VEYXlEcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlPcHRpb25zXCIgY2xhc3M9XCJmb3JtLWNoZWNrIHB4LTQgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInZGF5LScgKyBkYXkudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzRGF5U2VsZWN0ZWQoZGF5LnZhbHVlKVwiIChjaGFuZ2UpPVwidG9nZ2xlRGF5KGRheS52YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidkYXktJyArIGRheS52YWx1ZVwiPnt7IGRheS5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZnJlcXVlbmN5ID09PSAnbW9udGhseScgfHwgZnJlcXVlbmN5ID09PSAnb25jZSdcIiBjbGFzcz1cImRyb3Bkb3duIG1lLTMgbWItM1wiIG5nYkRyb3Bkb3duIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZHJvcGRvd24tdG9nZ2xlIGZvcm0tY29udHJvbCBzY2hlZHVsZS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICBpZD1cImNob29zZURhdGVEcm9wZG93blwiIG5nYkRyb3Bkb3duVG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICB7eyBtdWx0aVNlbGVjdExhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudSBjaGVja2JveC1kcm9wZG93bi1tZW51XCIgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImNob29zZURhdGVEcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGRhdGUgb2YgZGF0ZU9wdGlvbnNcIiBjbGFzcz1cImZvcm0tY2hlY2sgcHgtNCBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgW3R5cGVdPVwiZnJlcXVlbmN5ID09PSAnb25jZScgPyAncmFkaW8nIDogJ2NoZWNrYm94J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZnJlcXVlbmN5ID09PSAnb25jZScgPyAnb25jZURhdGUnIDogbnVsbFwiIFtpZF09XCInZGF0ZS0nICsgZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNEYXRlU2VsZWN0ZWQoZGF0ZSlcIiAoY2hhbmdlKT1cInRvZ2dsZURhdGUoZGF0ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidkYXRlLScgKyBkYXRlXCI+e3sgZGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0yIGF0LWxhYmVsXCI+YXQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IHRpbWUtaW5wdXRcIiBbKG5nTW9kZWwpXT1cInRpbWVcIj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiB0aW1lT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImhlbHBlclRleHRcIiBjbGFzcz1cImhlbHBlci10ZXh0IG10LTFcIj57eyBoZWxwZXJUZXh0IH19PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTVcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkZpbGUgVHlwZSA8c3BhbiBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkXCI+PC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiIG5nYkRyb3Bkb3duPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgZHJvcGRvd24tdG9nZ2xlIGZvcm0tY29udHJvbCB3LTEwMCB0ZXh0LXN0YXJ0XCJcbiAgICAgICAgICAgICAgICBpZD1cImZpbGVUeXBlRHJvcGRvd25cIiBuZ2JEcm9wZG93blRvZ2dsZT5cbiAgICAgICAgICAgICAgICB7eyBmaWxlVHlwZUxhYmVsIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgdy0xMDBcIiBuZ2JEcm9wZG93bk1lbnUgYXJpYS1sYWJlbGxlZGJ5PVwiZmlsZVR5cGVEcm9wZG93blwiPlxuICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwic2VsZWN0RmlsZVR5cGUoJ2NzdicpXCI+Q1NWPC9hPjwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJzZWxlY3RGaWxlVHlwZSgneGxzeCcpXCI+WExTWDwvYT48L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyIG1iLTVcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlJlY2VpdmVycyBFbWFpbCA8c3BhbiBjbGFzcz1cImFsZXJ0LXJlcXVpcmVkXCI+PC9zcGFuPjwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvdXRlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1jb250YWluZXIgZm9ybS1jb250cm9sIHJlY2VpdmVycy1ib3hcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbWFpbCBvZiBlbWFpbExpc3Q7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTNcIj57eyBlbWFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJyZW1vdmVDaGlwKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOSAzTDMgOU0zIDNMOSA5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZW1haWxpbnB1dFwiIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgdHlwZT1cInRleHRcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImVtYWlsVmFsaWRhdGlvbi5pbmNsdWRlcyhmYWxzZSlcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTNcIj5JbnZhbGlkIEVtYWlsIEZvcm1hdDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtdC0xMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHctMTAwXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2E+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB3LTEwMCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TdWJtaXQoKVwiIFtkaXNhYmxlZF09XCJpc1NhdmVEaXNhYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTQgNS4zMzMzM1YxMS40NjY3QzE0IDEyLjU4NjggMTQgMTMuMTQ2OSAxMy43ODIxIDEzLjU3NDdDMTMuNTkwMyAxMy45NTEgMTMuMjg0MyAxNC4yNTcgMTIuOTA4MSAxNC40NDg4QzEyLjQ4MDMgMTQuNjY2NyAxMS45MjAxIDE0LjY2NjcgMTAuOCAxNC42NjY3SDUuMkM0LjA3OTg5IDE0LjY2NjcgMy41MTk4NCAxNC42NjY3IDMuMDkyMDIgMTQuNDQ4OEMyLjcxNTY5IDE0LjI1NyAyLjQwOTczIDEzLjk1MSAyLjIxNzk5IDEzLjU3NDdDMiAxMy4xNDY5IDIgMTIuNTg2OCAyIDExLjQ2NjdWNC41MzMzM0MyIDMuNDEzMjMgMiAyLjg1MzE4IDIuMjE3OTkgMi40MjUzNUMyLjQwOTczIDIuMDQ5MDMgMi43MTU2OSAxLjc0MzA3IDMuMDkyMDIgMS41NTEzM0MzLjUxOTg0IDEuMzMzMzMgNC4wNzk4OSAxLjMzMzMzIDUuMiAxLjMzMzMzSDkuMzMzMzNNMTQgNS4zMzMzM0w5LjMzMzMzIDEuMzMzMzNNMTQgNS4zMzMzM0gxMC42NjY3QzkuOTMwMjkgNS4zMzMzMyA5LjMzMzMzIDQuNzM2MzggOS4zMzMzMyA0VjEuMzMzMzNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+U2F2ZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQUt6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUV6Rzs7aURBRWlEO0FBQ2pELE1BQU0scUJBQXFCLEdBQXVDLENBQUMsR0FBRyxFQUFFO0lBQ3RFLE1BQU0sT0FBTyxHQUF1QyxFQUFFLENBQUM7SUFDdkQsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFB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TSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQy9FLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksZ0NBQWdDLENBQUMsQ0FBQztZQUN6RyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F2VVUsNkJBQTZCOzRGQUE3Qiw2QkFBNkIsb0dDL0IxQyx1MFNBcUlNOzs0RkR0R08sNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDRCQUE0Qjs2SUFLN0IsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuXG5jb25zdCBEQVlfTkFNRVMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG5jb25zdCBNT05USF9OQU1FUyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLyoqIFNjaGVkdWxlIHNlbmQtdGltZSBzbG90czogMzAtbWludXRlIHN0ZXBzLCByZXN0cmljdGVkIHRvIDA5OjAw4oCTMjE6MDAg4oCUIHRoZVxuICogIHNhbWUgcHJvZHVjdCBydWxlIGFzIHRoZSByZXBvcnRzIHBhZ2UncyBzY2hlZHVsZSBtb2RhbC4gVmFsdWVzIHN0YXkgSEg6bW1cbiAqICAodGhlIEFQSSBjb250cmFjdCk7IGxhYmVscyByZW5kZXIgMTItaG91ci4gKi9cbmNvbnN0IFNDSEVEVUxFX1RJTUVfT1BUSU9OUzogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9ICgoKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChsZXQgaG91ciA9IDk7IGhvdXIgPD0gMjE7IGhvdXIrKykge1xuICAgIGZvciAoY29uc3QgbWludXRlIG9mIGhvdXIgPT09IDIxID8gWzBdIDogWzAsIDMwXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBgJHtTdHJpbmcoaG91cikucGFkU3RhcnQoMiwgJzAnKX06JHtTdHJpbmcobWludXRlKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICBjb25zdCBob3VyMTIgPSAoKGhvdXIgKyAxMSkgJSAxMikgKyAxO1xuICAgICAgb3B0aW9ucy5wdXNoKHsgdmFsdWUsIGxhYmVsOiBgJHtob3VyMTJ9OiR7U3RyaW5nKG1pbnV0ZSkucGFkU3RhcnQoMiwgJzAnKX0gJHtob3VyIDwgMTIgPyAnQU0nIDogJ1BNJ31gIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn0pKCk7XG5cbnR5cGUgRnJlcXVlbmN5ID0gJ2RhaWx5JyB8ICd3ZWVrbHknIHwgJ21vbnRobHknIHwgJ29uY2UnO1xudHlwZSBGaWxlVHlwZSA9ICdjc3YnIHwgJ3hsc3gnIHwgJyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXN0b20tcmVwb3J0LXNjaGVkdWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVwb3J0U2NoZWR1bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0ZW1wbGF0ZTogYW55O1xuXG4gIHJlcG9ydE5hbWU6IHN0cmluZyA9ICcnO1xuICBuYW1lRXJyb3I6IHN0cmluZyA9ICcnO1xuXG4gIGZyZXF1ZW5jeTogRnJlcXVlbmN5ID0gJ2RhaWx5JztcbiAgdGltZTogc3RyaW5nID0gJzA5OjAwJztcbiAgZGF5c09mV2VlazogbnVtYmVyW10gPSBbXTtcbiAgZGF0ZXNPZk1vbnRoOiBudW1iZXJbXSA9IFtdO1xuICBvbmNlRGF0ZTogc3RyaW5nID0gJyc7XG4gIGZpbGVUeXBlOiBGaWxlVHlwZSA9ICd4bHN4JztcblxuICBlbWFpbExpc3Q6IGFueVtdID0gW107XG4gIGVtYWlsVmFsaWRhdGlvbjogYW55W10gPSBbXTtcbiAgc2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZGF5T3B0aW9ucyA9IERBWV9OQU1FUy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoeyB2YWx1ZTogaW5kZXgsIGxhYmVsOiBuYW1lIH0pKTtcbiAgcmVhZG9ubHkgZGF0ZU9wdGlvbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAzMSB9LCAoXywgaSkgPT4gaSArIDEpO1xuICByZWFkb25seSB0aW1lT3B0aW9ucyA9IFNDSEVEVUxFX1RJTUVfT1BUSU9OUztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCwgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXI6IFRvYXN0U2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcbiAgICAgIHRoaXMucmVwb3J0TmFtZSA9IHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJztcbiAgICAgIGNvbnN0IHNjaGVkdWxlID0gdGhpcy50ZW1wbGF0ZT8uc2NoZWR1bGUgfHwge307XG4gICAgICB0aGlzLmZyZXF1ZW5jeSA9IHNjaGVkdWxlLmZyZXF1ZW5jeSB8fCAnZGFpbHknO1xuICAgICAgLy8gQSBzdG9yZWQgdGltZSBvdXRzaWRlIHRoZSBhbGxvd2VkIHNsb3RzIChvbGRlciBzY2hlZHVsZXMsIGZyZWUtdHlwZWRcbiAgICAgIC8vIHZhbHVlcykgc25hcHMgYmFjayB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbiBzaG93aW5nIGFuIGVtcHR5IHNlbGVjdC5cbiAgICAgIGNvbnN0IHN0b3JlZFRpbWUgPSBzY2hlZHVsZS50aW1lIHx8ICcwOTowMCc7XG4gICAgICB0aGlzLnRpbWUgPSBTQ0hFRFVMRV9USU1FX09QVElPTlMuc29tZSgob3B0KSA9PiBvcHQudmFsdWUgPT09IHN0b3JlZFRpbWUpID8gc3RvcmVkVGltZSA6ICcwOTowMCc7XG4gICAgICB0aGlzLmRheXNPZldlZWsgPSBbLi4uKHNjaGVkdWxlLmRheXNPZldlZWsgfHwgW10pXTtcbiAgICAgIHRoaXMub25jZURhdGUgPSBzY2hlZHVsZS5vbmNlRGF0ZSB8fCAnJztcbiAgICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnICYmIHRoaXMub25jZURhdGUpIHtcbiAgICAgICAgY29uc3QgZGF5ID0gTnVtYmVyKHRoaXMub25jZURhdGUuc3BsaXQoJy0nKVsyXSk7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gZGF5ID8gW2RheV0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gWy4uLihzY2hlZHVsZS5kYXRlc09mTW9udGggfHwgW10pXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsZVR5cGUgPSBzY2hlZHVsZS5maWxlVHlwZSB8fCAneGxzeCc7XG4gICAgICB0aGlzLmVtYWlsTGlzdCA9IFsuLi4oc2NoZWR1bGUucmVjZWl2ZXJzIHx8IFtdKV07XG4gICAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgICAgdGhpcy5lbWFpbExpc3QuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7IHRoaXMuZW1haWxWYWxpZGF0b3IoZWxlbWVudCk7IH0pO1xuICAgIH1cbiAgfVxuXG4gIGVtYWlsVmFsaWRhdG9yKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xuICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KHZhbHVlKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbi5wdXNoKHZhbGlkKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdCYWNrc3BhY2UnICYmIGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJycgJiYgdGhpcy5lbWFpbExpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVtYWlsTGlzdC5wb3AoKTtcbiAgICAgIHRoaXMuZW1haWxWYWxpZGF0aW9uLnBvcCgpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcbiAgICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgdGhpcy5lbWFpbExpc3QucHVzaChldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBFbnRlciBWYWxpZCBFbWFpbC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGlwKGk6IG51bWJlcikge1xuICAgIHRoaXMuZW1haWxMaXN0LnNwbGljZShpLCAxKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgIHRoaXMuZW1haWxMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4geyB0aGlzLmVtYWlsVmFsaWRhdG9yKGVsZW1lbnQpOyB9KTtcbiAgfVxuXG4gIHNlbGVjdEZyZXF1ZW5jeSh2YWx1ZTogRnJlcXVlbmN5KSB7XG4gICAgdGhpcy5mcmVxdWVuY3kgPSB2YWx1ZTtcbiAgICAvLyBEb2VzIE5vdCBSZXBlYXQ6IGEgcGFzdCBkYXkgY2FycmllZCBvdmVyIGZyb20gYSBtb250aGx5IHNlbGVjdGlvbiBpcyBub3RcbiAgICAvLyBzZWxlY3RhYmxlIOKAlCBkcm9wIGl0IHNvIHRoZSBwaWNrZXIgbmV2ZXIgc2hvd3MgYSBkaXNhYmxlZCBkYXkgYXMgY2hvc2VuLlxuICAgIGlmICh2YWx1ZSA9PT0gJ29uY2UnKSB7XG4gICAgICB0aGlzLmRhdGVzT2ZNb250aCA9IHRoaXMuZGF0ZXNPZk1vbnRoLmZpbHRlcigoZCkgPT4gIXRoaXMuaXNEYXRlRGlzYWJsZWQoZCkpLnNsaWNlKDAsIDEpO1xuICAgICAgdGhpcy5vbmNlRGF0ZSA9IHRoaXMuZGF0ZXNPZk1vbnRoLmxlbmd0aCA/IHRoaXMuZGVyaXZlTmV4dE9jY3VycmVuY2UodGhpcy5kYXRlc09mTW9udGhbMF0pIDogJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqICdEb2VzIE5vdCBSZXBlYXQnIHNlbmRzIG9uIGEgZGF5IG9mIHRoZSBDVVJSRU5UIG1vbnRoLCBzbyBkYXlzIGFscmVhZHkgcGFzdFxuICAgKiAgY2FuJ3QgYmUgY2hvc2VuLiAqL1xuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mcmVxdWVuY3kgPT09ICdvbmNlJyAmJiBkYXRlIDwgbmV3IERhdGUoKS5nZXREYXRlKCk7XG4gIH1cblxuICBnZXQgc2NoZWR1bGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5mcmVxdWVuY3kpIHtcbiAgICAgIGNhc2UgJ2RhaWx5JzogcmV0dXJuICdEYWlseSc7XG4gICAgICBjYXNlICd3ZWVrbHknOiByZXR1cm4gJ1dlZWtseSc7XG4gICAgICBjYXNlICdtb250aGx5JzogcmV0dXJuICdNb250aGx5JztcbiAgICAgIGNhc2UgJ29uY2UnOiByZXR1cm4gJ0RvZXMgTm90IFJlcGVhdCc7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ0RhaWx5JztcbiAgICB9XG4gIH1cblxuICB0b2dnbGVEYXkoZGF5OiBudW1iZXIpIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLmRheXNPZldlZWsuaW5kZXhPZihkYXkpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgdGhpcy5kYXlzT2ZXZWVrLnNwbGljZShpZHgsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRheXNPZldlZWsucHVzaChkYXkpO1xuICAgIH1cbiAgfVxuXG4gIGlzRGF5U2VsZWN0ZWQoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXlzT2ZXZWVrLmluY2x1ZGVzKGRheSk7XG4gIH1cblxuICB0b2dnbGVEYXRlKGRhdGU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnKSB7XG4gICAgICB0aGlzLmRhdGVzT2ZNb250aCA9IFtkYXRlXTtcbiAgICAgIHRoaXMub25jZURhdGUgPSB0aGlzLmRlcml2ZU5leHRPY2N1cnJlbmNlKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpZHggPSB0aGlzLmRhdGVzT2ZNb250aC5pbmRleE9mKGRhdGUpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgdGhpcy5kYXRlc09mTW9udGguc3BsaWNlKGlkeCwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoLnB1c2goZGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgZGF5LW9mLW1vbnRoICgxLTMxKSwgcmV0dXJucyB0aGUgbmV4dCBvY2N1cnJlbmNlIGFzICdZWVlZLU1NLUREJy5cbiAgICogVG9kYXkgcXVhbGlmaWVzIGlmIGl0IGlzIHRoYXQgZGF5OyBvdGhlcndpc2UgYWR2YW5jZXMgdG8gdGhlIG5leHQgY2FsZW5kYXJcbiAgICogbW9udGggdGhhdCBhY3R1YWxseSBjb250YWlucyB0aGF0IGRheSAoZS5nLiAzMSBjaG9zZW4gb24gRmViIDEwIC0+IE1hciAzMSkuXG4gICAqL1xuICBwcml2YXRlIGRlcml2ZU5leHRPY2N1cnJlbmNlKGRheU9mTW9udGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuXG4gICAgaWYgKHRvZGF5LmdldERhdGUoKSA9PT0gZGF5T2ZNb250aCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9Jc29EYXRlKHRvZGF5KTtcbiAgICB9XG5cbiAgICBsZXQgeWVhciA9IHRvZGF5LmdldEZ1bGxZZWFyKCk7XG4gICAgbGV0IG1vbnRoID0gdG9kYXkuZ2V0TW9udGgoKTtcbiAgICBpZiAodG9kYXkuZ2V0RGF0ZSgpID4gZGF5T2ZNb250aCkge1xuICAgICAgbW9udGggKz0gMTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKCk7XG4gICAgICBpZiAoZGF5T2ZNb250aCA8PSBkYXlzSW5Nb250aCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0lzb0RhdGUobmV3IERhdGUoeWVhciwgbW9udGgsIGRheU9mTW9udGgpKTtcbiAgICAgIH1cbiAgICAgIG1vbnRoICs9IDE7XG4gICAgICBpZiAobW9udGggPiAxMSkge1xuICAgICAgICBtb250aCA9IDA7XG4gICAgICAgIHllYXIgKz0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0lzb0RhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcbiAgfVxuXG4gIGlzRGF0ZVNlbGVjdGVkKGRhdGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGVzT2ZNb250aC5pbmNsdWRlcyhkYXRlKTtcbiAgfVxuXG4gIGdldCBtdWx0aVNlbGVjdExhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnd2Vla2x5Jykge1xuICAgICAgLy8gUGVyIEZpZ21hIHRoZSB0cmlnZ2VyIHNob3dzIGEgQ09VTlQgKFwiMiBEYXlzXCIpOyB0aGUgaGVscGVyIGxpbmUgYmVsb3dcbiAgICAgIC8vIHRoZSByb3cgc3BlbGxzIG91dCB3aGljaCBkYXlzLlxuICAgICAgY29uc3QgY291bnQgPSB0aGlzLmRheXNPZldlZWsubGVuZ3RoO1xuICAgICAgcmV0dXJuIGNvdW50ID8gYCR7Y291bnR9IERheSR7Y291bnQgPT09IDEgPyAnJyA6ICdzJ31gIDogJ0Nob29zZSBEYXknO1xuICAgIH1cbiAgICBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICdtb250aGx5JyB8fCB0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnKSB7XG4gICAgICBjb25zdCBjb3VudCA9IHRoaXMuZGF0ZXNPZk1vbnRoLmxlbmd0aDtcbiAgICAgIGlmICghY291bnQpIHJldHVybiAnQ2hvb3NlIERhdGUnO1xuICAgICAgcmV0dXJuIGAke2NvdW50fSBEYXRlJHtjb3VudCA+IDEgPyAncycgOiAnJ31gO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzZWxlY3RGaWxlVHlwZSh2YWx1ZTogRmlsZVR5cGUpIHtcbiAgICB0aGlzLmZpbGVUeXBlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZmlsZVR5cGVMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbGVUeXBlID09PSAnY3N2JykgcmV0dXJuICdDU1YnO1xuICAgIGlmICh0aGlzLmZpbGVUeXBlID09PSAneGxzeCcpIHJldHVybiAnWExTWCc7XG4gICAgcmV0dXJuICdDaG9vc2UgRmlsZSc7XG4gIH1cblxuICBwcml2YXRlIG9yZGluYWwobjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJyk7XG4gIH1cblxuICBnZXQgaGVscGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAodGhpcy5mcmVxdWVuY3kpIHtcbiAgICAgIGNhc2UgJ2RhaWx5JzpcbiAgICAgICAgcmV0dXJuICdSZXBvcnQgc2VudCBkYWlseSc7XG4gICAgICBjYXNlICd3ZWVrbHknOiB7XG4gICAgICAgIGlmICghdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aCkgcmV0dXJuICcnO1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4udGhpcy5kYXlzT2ZXZWVrXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gc29ydGVkLm1hcCgoZCkgPT4gREFZX05BTUVTW2RdKTtcbiAgICAgICAgY29uc3Qgam9pbmVkID0gbmFtZXMubGVuZ3RoID4gMVxuICAgICAgICAgID8gYCR7bmFtZXMuc2xpY2UoMCwgLTEpLmpvaW4oJywgJyl9IGFuZCAke25hbWVzW25hbWVzLmxlbmd0aCAtIDFdfWBcbiAgICAgICAgICA6IG5hbWVzWzBdO1xuICAgICAgICByZXR1cm4gYFJlcG9ydCB3aWxsIGJlIHNlbnQgZXZlcnkgJHtqb2luZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ21vbnRobHknOiB7XG4gICAgICAgIGlmICghdGhpcy5kYXRlc09mTW9udGgubGVuZ3RoKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLmRhdGVzT2ZNb250aF0uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBjb25zdCBqb2luZWQgPSBzb3J0ZWQubWFwKChkKSA9PiBgJHt0aGlzLm9yZGluYWwoZCl9JHt0aGlzLmRheVN1ZmZpeChkKX1gKS5qb2luKCcsICcpO1xuICAgICAgICByZXR1cm4gYFJlcG9ydHMgd2lsbCBiZSBzZW50IG9uICR7am9pbmVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdvbmNlJzoge1xuICAgICAgICBpZiAoIXRoaXMub25jZURhdGUpIHJldHVybiAnJztcbiAgICAgICAgcmV0dXJuIGBSZXBvcnQgd2lsbCBiZSBzZW50IG9uY2Ugb24gJHt0aGlzLmZvcm1hdE9uY2VEYXRlKHRoaXMub25jZURhdGUpfWA7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkYXlTdWZmaXgobjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobiA+PSAxMSAmJiBuIDw9IDEzKSByZXR1cm4gJ3RoJztcbiAgICBzd2l0Y2ggKG4gJSAxMCkge1xuICAgICAgY2FzZSAxOiByZXR1cm4gJ3N0JztcbiAgICAgIGNhc2UgMjogcmV0dXJuICduZCc7XG4gICAgICBjYXNlIDM6IHJldHVybiAncmQnO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICd0aCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRPbmNlRGF0ZShkYXRlU3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzID0gZGF0ZVN0ci5zcGxpdCgnLScpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBkYXRlU3RyO1xuICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IHBhcnRzO1xuICAgIGNvbnN0IG1vbnRoTmFtZSA9IE1PTlRIX05BTUVTW051bWJlcihtb250aCkgLSAxXSB8fCAnJztcbiAgICByZXR1cm4gYCR7ZGF5fSAke21vbnRoTmFtZX0sICR7eWVhcn1gO1xuICB9XG5cbiAgZ2V0IGlzU2F2ZURpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNhdmluZykgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLnJlcG9ydE5hbWU/LnRyaW0oKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLmZpbGVUeXBlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuZW1haWxMaXN0Lmxlbmd0aCB8fCB0aGlzLmVtYWlsVmFsaWRhdGlvbi5pbmNsdWRlcyhmYWxzZSkpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ3dlZWtseScgJiYgIXRoaXMuZGF5c09mV2Vlay5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ21vbnRobHknICYmICF0aGlzLmRhdGVzT2ZNb250aC5sZW5ndGgpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnICYmICF0aGlzLm9uY2VEYXRlKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvbkNhbmNlbCgpIHtcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2NoZWR1bGVQYXlsb2FkKCk6IGFueSB7XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIGZyZXF1ZW5jeTogdGhpcy5mcmVxdWVuY3ksXG4gICAgICB0aW1lOiB0aGlzLnRpbWUgfHwgJzA5OjAwJyxcbiAgICAgIGZpbGVUeXBlOiB0aGlzLmZpbGVUeXBlLFxuICAgICAgcmVjZWl2ZXJzOiB0aGlzLmVtYWlsTGlzdFxuICAgIH07XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnd2Vla2x5Jykge1xuICAgICAgcGF5bG9hZC5kYXlzT2ZXZWVrID0gdGhpcy5kYXlzT2ZXZWVrO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICdtb250aGx5Jykge1xuICAgICAgcGF5bG9hZC5kYXRlc09mTW9udGggPSB0aGlzLmRhdGVzT2ZNb250aDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScpIHtcbiAgICAgIGlmICh0aGlzLmRhdGVzT2ZNb250aC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5vbmNlRGF0ZSA9IHRoaXMuZGVyaXZlTmV4dE9jY3VycmVuY2UodGhpcy5kYXRlc09mTW9udGhbMF0pO1xuICAgICAgfVxuICAgICAgcGF5bG9hZC5vbmNlRGF0ZSA9IHRoaXMub25jZURhdGU7XG4gICAgfVxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgb25TdWJtaXQoKSB7XG4gICAgaWYgKHRoaXMuaXNTYXZlRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5uYW1lRXJyb3IgPSAnJztcbiAgICB0aGlzLnNhdmluZyA9IHRydWU7XG5cbiAgICBjb25zdCBuYW1lQ2hhbmdlZCA9IHRoaXMucmVwb3J0TmFtZS50cmltKCkgIT09ICh0aGlzLnRlbXBsYXRlPy50ZW1wbGF0ZU5hbWUgfHwgJycpO1xuICAgIGlmIChuYW1lQ2hhbmdlZCkge1xuICAgICAgdGhpcy5hcGlTZXJ2aWNlLnVwZGF0ZUN1c3RvbVJlcG9ydFRlbXBsYXRlKHRoaXMudGVtcGxhdGU/Ll9pZCwgeyB0ZW1wbGF0ZU5hbWU6IHRoaXMucmVwb3J0TmFtZS50cmltKCkgfSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2ZVNjaGVkdWxlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIGlmIChlcnI/LnN0YXR1cyA9PT0gNDA5KSB7XG4gICAgICAgICAgICB0aGlzLm5hbWVFcnJvciA9ICdSZXBvcnQgbmFtZSBhbHJlYWR5IGV4aXN0cy4gQ2hvb3NlIGEgZGlmZmVyZW50IG5hbWUnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ZXIuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3I/LmVycm9yIHx8IGVyci5lcnJvcj8ubWVzc2FnZSB8fCAnRXJyb3IgdXBkYXRpbmcgcmVwb3J0IG5hbWUnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNhdmVTY2hlZHVsZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2F2ZVNjaGVkdWxlKCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuYnVpbGRTY2hlZHVsZVBheWxvYWQoKTtcbiAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlQ3VzdG9tUmVwb3J0U2NoZWR1bGUodGhpcy50ZW1wbGF0ZT8uX2lkLCBwYXJhbXMpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoeyB0eXBlOiAnc2F2ZScgfSk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRvYXN0ZXIuZ2V0RXJyb3JUb2FzdChlcnIuZXJyb3I/LmVycm9yIHx8IGVyci5lcnJvcj8ubWVzc2FnZSB8fCAnRXJyb3IgdXBkYXRpbmcgcmVwb3J0IHNjaGVkdWxlJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0iLCI8IS0tIFNhbWUgbWFya3VwL2NsYXNzZXMgYXMgdGhlIFJlcG9ydHMgcGFnZSdzIFwiQ3VzdG9tIFJlcG9ydCBDb25maWd1cmF0aW9uXCIgbW9kYWxcbiAgICAgKHRhbmdvLWFuYWx5c2UtcmVwb3J0IGN1c3RvbS1yZXBvcnQtdmlldyAjc2NoZWR1bGVNb2RhbCksIHBlciBGaWdtYSwgc28gYm90aCBwb3B1cHNcbiAgICAgbG9vayBpZGVudGljYWw7IG9ubHkgdGhlIGJpbmRpbmdzIGRpZmZlciAodGhpcyBjb21wb25lbnQncyBvd24gZmllbGQvbWV0aG9kIG5hbWVzKS4gLS0+XG48ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItMCBzY2hlZHVsZS1jb25maWctbW9kYWxcIj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImhlYWRlciBmdy1ib2xkXCI+Q3VzdG9tIFJlcG9ydCBDb25maWd1cmF0aW9uPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBzY2hlZHVsZS1jbG9zZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgdGl0bGU9XCJDbG9zZVwiPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTE1IDVMNSAxNU01IDVMMTUgMTVcIiBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXQtNlwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwic3ViLWhlYWRlclwiIGZvcj1cInNjaGVkdWxlLW5hbWVcIj5FbnRlciBSZXBvcnQgTmFtZTwvbGFiZWw+XG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNjaGVkdWxlLW5hbWVcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtdC0yIHNjaGVkdWxlLWZpZWxkXCIgWyhuZ01vZGVsKV09XCJyZXBvcnROYW1lXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cbiAgICAgIDxkaXYgKm5nSWY9XCJuYW1lRXJyb3JcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTJcIj57eyBuYW1lRXJyb3IgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCI+U2NoZWR1bGU8L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBzY2hlZHVsZS1yb3ctZ2FwXCI+XG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWlubGluZS1ibG9jayBzY2hlZHVsZS1mcmVxXCIgW2NsYXNzLmZsZXgtZ3Jvdy0xXT1cImZyZXF1ZW5jeSA9PT0gJ2RhaWx5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGU+XG4gICAgICAgICAgICA8c3Bhbj57eyBzY2hlZHVsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJzY2hlZHVsZS1jaGV2cm9uXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdkYWlseScpXCI+RGFpbHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCd3ZWVrbHknKVwiPldlZWtseTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbmdiRHJvcGRvd25JdGVtIChjbGljayk9XCJzZWxlY3RGcmVxdWVuY3koJ21vbnRobHknKVwiPk1vbnRobHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdvbmNlJylcIj5Eb2VzIE5vdCBSZXBlYXQ8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgc2NoZWR1bGUtcGlja1wiICpuZ0lmPVwiZnJlcXVlbmN5ID09PSAnd2Vla2x5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGUgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFkYXlzT2ZXZWVrLmxlbmd0aFwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgbXVsdGlTZWxlY3RMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwic2NoZWR1bGUtY2hldnJvblwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41TDEwIDEyLjVMMTUgNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBjbGFzcz1cImNoZWNrYm94LWRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWQgcHgtMyBweS0xXCIgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlPcHRpb25zXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwiJ2RheS0nICsgZGF5LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzRGF5U2VsZWN0ZWQoZGF5LnZhbHVlKVwiIChjaGFuZ2UpPVwidG9nZ2xlRGF5KGRheS52YWx1ZSlcIiAvPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIGN1cnNvci1wb2ludGVyXCIgW2Zvcl09XCInZGF5LScgKyBkYXkudmFsdWVcIj57eyBkYXkubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd24gW2F1dG9DbG9zZV09XCInb3V0c2lkZSdcIiBjbGFzcz1cImQtaW5saW5lLWJsb2NrIHNjaGVkdWxlLXBpY2tcIiAqbmdJZj1cImZyZXF1ZW5jeSA9PT0gJ21vbnRobHknIHx8IGZyZXF1ZW5jeSA9PT0gJ29uY2UnXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBuZ2JEcm9wZG93blRvZ2dsZSBbY2xhc3MuaXMtcGxhY2Vob2xkZXJdPVwiIWRhdGVzT2ZNb250aC5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG11bHRpU2VsZWN0TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInNjaGVkdWxlLWNoZXZyb25cIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDcuNUwxMCAxMi41TDE1IDcuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgY2xhc3M9XCJjaGVja2JveC1kcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkIHB4LTMgcHktMVwiICpuZ0Zvcj1cImxldCBkYXRlIG9mIGRhdGVPcHRpb25zXCI+XG4gICAgICAgICAgICAgIDwhLS0gRG9lcyBOb3QgUmVwZWF0OiBkYXlzIGFscmVhZHkgcGFzdCB0aGlzIG1vbnRoIGFyZSBkaXNhYmxlZC4gLS0+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBbaWRdPVwiJ2RhdGUtJyArIGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1wb2ludGVyXT1cIiFpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNEYXRlU2VsZWN0ZWQoZGF0ZSlcIiAoY2hhbmdlKT1cInRvZ2dsZURhdGUoZGF0ZSlcIiAvPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgW2Zvcl09XCInZGF0ZS0nICsgZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWlzRGF0ZURpc2FibGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50ZXh0LW11dGVkXT1cImlzRGF0ZURpc2FibGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJpc0RhdGVEaXNhYmxlZChkYXRlKSA/ICdQYXN0IGRhdGVzIGNhbm5vdCBiZSBzY2hlZHVsZWQnIDogJydcIj57eyBkYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8c3BhbiBjbGFzcz1cInN1Yi1oZWFkZXIgbWItMCBzY2hlZHVsZS1hdFwiPmF0PC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3QgdGltZS1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cInRpbWVcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiB0aW1lT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQudmFsdWUgfX08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInRpbWUtaWNvblwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMCA1VjEwTDEzLjMzMzMgMTEuNjY2N00xOC4zMzMzIDEwQzE4LjMzMzMgMTQuNjAyNCAxNC42MDI0IDE4LjMzMzMgMTAgMTguMzMzM0M1LjM5NzYzIDE4LjMzMzMgMS42NjY2NyAxNC42MDI0IDEuNjY2NjcgMTBDMS42NjY2NyA1LjM5NzYzIDUuMzk3NjMgMS42NjY2NyAxMCAxLjY2NjY3QzE0LjYwMjQgMS42NjY2NyAxOC4zMzMzIDUuMzk3NjMgMTguMzMzMyAxMFpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzY2hlZHVsZS1oZWxwZXIgbXQtMlwiICpuZ0lmPVwiaGVscGVyVGV4dFwiPnt7IGhlbHBlclRleHQgfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCI+RmlsZSBUeXBlPC9sYWJlbD5cbiAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWJsb2NrIG10LTJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBuZ2JEcm9wZG93blRvZ2dsZSBbY2xhc3MuaXMtcGxhY2Vob2xkZXJdPVwiIWZpbGVUeXBlXCI+XG4gICAgICAgICAgPHNwYW4+e3sgZmlsZVR5cGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInNjaGVkdWxlLWNoZXZyb25cIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrKT1cInNlbGVjdEZpbGVUeXBlKCdjc3YnKVwiPkNTVjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RmlsZVR5cGUoJ3hsc3gnKVwiPlhMU1g8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCIgZm9yPVwic2NoZWR1bGUtcmVjZWl2ZXJzXCI+UmVjZWl2ZXJzIEVtYWlsPC9sYWJlbD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbXQtMiBkLWZsZXggZmxleC13cmFwIGFsaWduLWl0ZW1zLXN0YXJ0IHNjaGVkdWxlLXJlY2VpdmVycy1ib3ggc2NoZWR1bGUtZmllbGQtYm94XCI+XG4gICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBlbWFpbCBvZiBlbWFpbExpc3Q7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0IGQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAge3sgZW1haWwgfX1cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIG1zLTJcIiAoY2xpY2spPVwicmVtb3ZlQ2hpcChpKVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPCEtLSBhdXRvY29tcGxldGU9XCJvZmZcIjogQ2hyb21lIG90aGVyd2lzZSBhdXRvZmlsbHMgdGhlIGp1c3QtYWRkZWQgYWRkcmVzcyBiYWNrXG4gICAgICAgICAgICAgaW50byB0aGUgZmllbGQgKGJsdWUgYXV0b2ZpbGwgYmFja2dyb3VuZCkgYWZ0ZXIgRW50ZXIgY2xlYXJzIGl0LiAtLT5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJlbWFpbFwiIGlkPVwic2NoZWR1bGUtcmVjZWl2ZXJzXCIgY2xhc3M9XCJib3JkZXItMCBmbGV4LWdyb3ctMSBzY2hlZHVsZS1lbWFpbC1pbnB1dFwiXG4gICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJlbWFpbFZhbGlkYXRpb24uaW5jbHVkZXMoZmFsc2UpXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBtdC0yXCI+SW52YWxpZCBFbWFpbCBGb3JtYXQ8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtOFwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gc2NoZWR1bGUtYnRuLWNhbmNlbCB3LTUwIG1lLTJcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgc2NoZWR1bGUtYnRuLXNhdmUgdy01MCBtcy0yIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NhdmVEaXNhYmxlZFwiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+XG4gICAgICAgIDxzdmcgKm5nSWY9XCIhaXNTYXZlRGlzYWJsZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJtZS0yXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0xNy41IDE3LjVWMTEuNjY2N0MxNy41IDExLjIyNDYgMTcuMzI0NCAxMC44MDA3IDE3LjAxMTggMTAuNDg4MkMxNi42OTkzIDEwLjE3NTYgMTYuMjc1NCAxMCAxNS44MzMzIDEwSDQuMTY2NjdDMy43MjQ2NCAxMCAzLjMwMDcyIDEwLjE3NTYgMi45ODgxNiAxMC40ODgyQzIuNjc1NTkgMTAuODAwNyAyLjUgMTEuMjI0NiAyLjUgMTEuNjY2N1YxNy41TTE3LjUgMTcuNUgyLjVNMTcuNSAxNy41VjYuMTY2NjdDMTcuNSA1LjY5OTk2IDE3LjUgNS40NjY2IDE3LjQwOTIgNS4yODgzNEMxNy4zMjkzIDUuMTMxNTQgMTcuMjAxOCA1LjAwNDA1IDE3LjA0NSA0LjkyNDE2QzE2Ljg2NjggNC44MzMzMyAxNi42MzM0IDQuODMzMzMgMTYuMTY2NyA0LjgzMzMzSDEyLjVNMi41IDE3LjVWNC4xNjY2N0MyLjUgMy42OTk5NiAyLjUgMy40NjY2IDIuNTkwODMgMy4yODgzNEMyLjY3MDcyIDMuMTMxNTQgMi43OTgyMSAzLjAwNDA1IDIuOTU1MDEgMi45MjQxNkMzLjEzMzI3IDIuODMzMzMgMy4zNjY2MiAyLjgzMzMzIDMuODMzMzMgMi44MzMzM0gxMC44MzMzTTEyLjUgNC44MzMzM1YyLjgzMzMzTTEyLjUgNC44MzMzM0gxMC44MzMzTTEyLjUgMi44MzMzM0gxMC44MzMzTTEwLjgzMzMgMi44MzMzM1Y0LjgzMzMzTTYuNjY2NjcgNi42NjY2N0g5LjE2NjY3XCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgU2F2ZVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
|