tango-app-ui-manage-settings 3.7.38 → 3.7.39

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.
@@ -359,12 +359,12 @@ export class CustomReportScheduleComponent {
359
359
  });
360
360
  }
361
361
  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 });
362
- 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\"\n [disabled]=\"!editMode\" 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 [disabled]=\"!editMode\">\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\" [disabled]=\"!editMode\">\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 <!-- Does Not Repeat: a real date picker, future dates only (min = tomorrow;\n today itself is restricted -- product rule 2026-08-31). -->\n <div class=\"schedule-pick\" *ngIf=\"frequency === 'once'\">\n <input type=\"date\" class=\"schedule-select w-100\" [min]=\"minOnceDate\" [disabled]=\"!editMode\" [(ngModel)]=\"onceDate\" />\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\" [disabled]=\"!editMode\">\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\" [disabled]=\"!editMode\">\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 <!-- Always rendered: the appearing/disappearing helper line resized the\n centered modal and made it jump on every selection (QA 2026-09-01). -->\n <div class=\"schedule-helper mt-2\">{{ helperText }}&nbsp;</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\" [disabled]=\"!editMode\">\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 <span class=\"schedule-required\">*</span></label>\n <!-- Clicking anywhere in the box focuses the email input (user request 2026-09-01). -->\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\"\n [class.schedule-box-disabled]=\"!editMode\"\n (click)=\"editMode && emailInputEl.focus()\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span *ngIf=\"editMode\" class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">&times;</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 #emailInputEl type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n [disabled]=\"!editMode\"\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 <!-- View mode (existing schedule): pale-blue Edit unlocks the fields. -->\n <button *ngIf=\"!editMode\" type=\"button\" class=\"btn schedule-btn-edit w-50 ms-2 d-flex align-items-center justify-content-center\"\n (click)=\"editMode = true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 19 19\" fill=\"none\" class=\"me-2\">\n <path d=\"M8.25 2.51777H2.41667C1.97464 2.51777 1.55072 2.69336 1.23816 3.00592C0.925595 3.31848 0.75 3.74241 0.75 4.18443V15.8511C0.75 16.2931 0.925595 16.7171 1.23816 17.0296C1.55072 17.3422 1.97464 17.5178 2.41667 17.5178H14.0833C14.5254 17.5178 14.9493 17.3422 15.2618 17.0296C15.5744 16.7171 15.75 16.2931 15.75 15.8511V10.0178M14.5 1.26777C14.8315 0.936246 15.2812 0.75 15.75 0.75C16.2188 0.75 16.6685 0.936246 17 1.26777C17.3315 1.59929 17.5178 2.04893 17.5178 2.51777C17.5178 2.98661 17.3315 3.43625 17 3.76777L9.08333 11.6844L5.75 12.5178L6.58333 9.18443L14.5 1.26777Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Edit\n </button>\n <button *ngIf=\"editMode\" 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:260px;overflow-y:auto;min-width:240px;padding:6px 0}.checkbox-dropdown-menu .form-check{padding-top:7px!important;padding-bottom:7px!important}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-900, #101828);font-size:14px;font-weight:500;line-height:20px;margin-left:10px}.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{min-height:18px;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;flex:1 1 0}.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)!important;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}.schedule-btn-edit{height:44px;border:0;border-radius:8px;background:var(--Blue-light-50, #E6F5FE);color:#009bf3;font-size:14px;font-weight:600}.schedule-btn-edit:hover{background:#d6eefd}.schedule-select:disabled,.schedule-select[disabled],.schedule-field:disabled{background:#f9fafb!important;color:var(--Gray-500, #667085)!important;cursor:not-allowed}.schedule-box-disabled{background:#f9fafb!important}.schedule-required{color:var(--Error-500, #F04438)}.schedule-email-input:-webkit-autofill,.schedule-email-input:-webkit-autofill:hover,.schedule-email-input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 1000px #fff inset;box-shadow:0 0 0 1000px #fff inset;-webkit-text-fill-color:var(--Gray-900, #101828);caret-color:var(--Gray-900, #101828);transition:background-color 9999s ease-in-out 0s}::ng-deep .custom-report-schedule-modal .modal-content,::ng-deep .custom-report-schedule-modal .modal-content:focus,::ng-deep .custom-report-schedule-modal .modal-content:focus-visible{outline:none!important}.schedule-receivers-box{cursor:text}.schedule-config-modal>.card-body{margin-bottom:8px}\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"] }] });
362
+ 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\"\n [disabled]=\"!editMode\" 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 [disabled]=\"!editMode\">\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\" [disabled]=\"!editMode\">\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 <!-- Does Not Repeat: a real date picker, future dates only (min = tomorrow;\n today itself is restricted -- product rule 2026-08-31). -->\n <div class=\"schedule-pick\" *ngIf=\"frequency === 'once'\">\n <input type=\"date\" class=\"schedule-select w-100\" [min]=\"minOnceDate\" [disabled]=\"!editMode\" [(ngModel)]=\"onceDate\" />\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\" [disabled]=\"!editMode\">\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\" [disabled]=\"!editMode\">\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 <!-- Always rendered: the appearing/disappearing helper line resized the\n centered modal and made it jump on every selection (QA 2026-09-01). -->\n <div class=\"schedule-helper mt-2\">{{ helperText }}&nbsp;</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\" [disabled]=\"!editMode\">\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 <span class=\"schedule-required\">*</span></label>\n <!-- Clicking anywhere in the box focuses the email input (user request 2026-09-01). -->\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\"\n [class.schedule-box-disabled]=\"!editMode\"\n (click)=\"editMode && emailInputEl.focus()\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span *ngIf=\"editMode\" class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">&times;</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 #emailInputEl type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n [disabled]=\"!editMode\"\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 <!-- View mode (existing schedule): pale-blue Edit unlocks the fields. -->\n <button *ngIf=\"!editMode\" type=\"button\" class=\"btn schedule-btn-edit w-50 ms-2 d-flex align-items-center justify-content-center\"\n (click)=\"editMode = true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 19 19\" fill=\"none\" class=\"me-2\">\n <path d=\"M8.25 2.51777H2.41667C1.97464 2.51777 1.55072 2.69336 1.23816 3.00592C0.925595 3.31848 0.75 3.74241 0.75 4.18443V15.8511C0.75 16.2931 0.925595 16.7171 1.23816 17.0296C1.55072 17.3422 1.97464 17.5178 2.41667 17.5178H14.0833C14.5254 17.5178 14.9493 17.3422 15.2618 17.0296C15.5744 16.7171 15.75 16.2931 15.75 15.8511V10.0178M14.5 1.26777C14.8315 0.936246 15.2812 0.75 15.75 0.75C16.2188 0.75 16.6685 0.936246 17 1.26777C17.3315 1.59929 17.5178 2.04893 17.5178 2.51777C17.5178 2.98661 17.3315 3.43625 17 3.76777L9.08333 11.6844L5.75 12.5178L6.58333 9.18443L14.5 1.26777Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Edit\n </button>\n <button *ngIf=\"editMode\" 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=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\" class=\"me-2\">\r\n <!-- Design asset Icon (11).svg -->\r\n <path d=\"M12.6667 16V9.33333H4.33333V16M4.33333 1V5.16667H11M14.3333 16H2.66667C2.22464 16 1.80072 15.8244 1.48816 15.5118C1.17559 15.1993 1 14.7754 1 14.3333V2.66667C1 2.22464 1.17559 1.80072 1.48816 1.48816C1.80072 1.17559 2.22464 1 2.66667 1H11.8333L16 5.16667V14.3333C16 14.7754 15.8244 15.1993 15.5118 15.5118C15.1993 15.8244 14.7754 16 14.3333 16Z\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\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:260px;overflow-y:auto;min-width:240px;padding:6px 0}.checkbox-dropdown-menu .form-check{padding-top:7px!important;padding-bottom:7px!important}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-900, #101828);font-size:14px;font-weight:500;line-height:20px;margin-left:10px}.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{min-height:18px;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;flex:1 1 0}.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)!important;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}.schedule-btn-edit{height:44px;border:0;border-radius:8px;background:var(--Blue-light-50, #E6F5FE);color:#009bf3;font-size:14px;font-weight:600}.schedule-btn-edit:hover{background:#d6eefd}.schedule-select:disabled,.schedule-select[disabled],.schedule-field:disabled{background:#f9fafb!important;color:var(--Gray-500, #667085)!important;cursor:not-allowed}.schedule-box-disabled{background:#f9fafb!important}.schedule-required{color:var(--Error-500, #F04438)}.schedule-email-input:-webkit-autofill,.schedule-email-input:-webkit-autofill:hover,.schedule-email-input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 1000px #fff inset;box-shadow:0 0 0 1000px #fff inset;-webkit-text-fill-color:var(--Gray-900, #101828);caret-color:var(--Gray-900, #101828);transition:background-color 9999s ease-in-out 0s}::ng-deep .custom-report-schedule-modal .modal-content,::ng-deep .custom-report-schedule-modal .modal-content:focus,::ng-deep .custom-report-schedule-modal .modal-content:focus-visible{outline:none!important}.schedule-receivers-box{cursor:text}.schedule-config-modal>.card-body{margin-bottom:8px}\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"] }] });
363
363
  }
364
364
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CustomReportScheduleComponent, decorators: [{
365
365
  type: Component,
366
- 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\"\n [disabled]=\"!editMode\" 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 [disabled]=\"!editMode\">\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\" [disabled]=\"!editMode\">\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 <!-- Does Not Repeat: a real date picker, future dates only (min = tomorrow;\n today itself is restricted -- product rule 2026-08-31). -->\n <div class=\"schedule-pick\" *ngIf=\"frequency === 'once'\">\n <input type=\"date\" class=\"schedule-select w-100\" [min]=\"minOnceDate\" [disabled]=\"!editMode\" [(ngModel)]=\"onceDate\" />\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\" [disabled]=\"!editMode\">\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\" [disabled]=\"!editMode\">\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 <!-- Always rendered: the appearing/disappearing helper line resized the\n centered modal and made it jump on every selection (QA 2026-09-01). -->\n <div class=\"schedule-helper mt-2\">{{ helperText }}&nbsp;</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\" [disabled]=\"!editMode\">\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 <span class=\"schedule-required\">*</span></label>\n <!-- Clicking anywhere in the box focuses the email input (user request 2026-09-01). -->\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\"\n [class.schedule-box-disabled]=\"!editMode\"\n (click)=\"editMode && emailInputEl.focus()\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span *ngIf=\"editMode\" class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">&times;</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 #emailInputEl type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n [disabled]=\"!editMode\"\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 <!-- View mode (existing schedule): pale-blue Edit unlocks the fields. -->\n <button *ngIf=\"!editMode\" type=\"button\" class=\"btn schedule-btn-edit w-50 ms-2 d-flex align-items-center justify-content-center\"\n (click)=\"editMode = true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 19 19\" fill=\"none\" class=\"me-2\">\n <path d=\"M8.25 2.51777H2.41667C1.97464 2.51777 1.55072 2.69336 1.23816 3.00592C0.925595 3.31848 0.75 3.74241 0.75 4.18443V15.8511C0.75 16.2931 0.925595 16.7171 1.23816 17.0296C1.55072 17.3422 1.97464 17.5178 2.41667 17.5178H14.0833C14.5254 17.5178 14.9493 17.3422 15.2618 17.0296C15.5744 16.7171 15.75 16.2931 15.75 15.8511V10.0178M14.5 1.26777C14.8315 0.936246 15.2812 0.75 15.75 0.75C16.2188 0.75 16.6685 0.936246 17 1.26777C17.3315 1.59929 17.5178 2.04893 17.5178 2.51777C17.5178 2.98661 17.3315 3.43625 17 3.76777L9.08333 11.6844L5.75 12.5178L6.58333 9.18443L14.5 1.26777Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Edit\n </button>\n <button *ngIf=\"editMode\" 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:260px;overflow-y:auto;min-width:240px;padding:6px 0}.checkbox-dropdown-menu .form-check{padding-top:7px!important;padding-bottom:7px!important}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-900, #101828);font-size:14px;font-weight:500;line-height:20px;margin-left:10px}.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{min-height:18px;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;flex:1 1 0}.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)!important;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}.schedule-btn-edit{height:44px;border:0;border-radius:8px;background:var(--Blue-light-50, #E6F5FE);color:#009bf3;font-size:14px;font-weight:600}.schedule-btn-edit:hover{background:#d6eefd}.schedule-select:disabled,.schedule-select[disabled],.schedule-field:disabled{background:#f9fafb!important;color:var(--Gray-500, #667085)!important;cursor:not-allowed}.schedule-box-disabled{background:#f9fafb!important}.schedule-required{color:var(--Error-500, #F04438)}.schedule-email-input:-webkit-autofill,.schedule-email-input:-webkit-autofill:hover,.schedule-email-input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 1000px #fff inset;box-shadow:0 0 0 1000px #fff inset;-webkit-text-fill-color:var(--Gray-900, #101828);caret-color:var(--Gray-900, #101828);transition:background-color 9999s ease-in-out 0s}::ng-deep .custom-report-schedule-modal .modal-content,::ng-deep .custom-report-schedule-modal .modal-content:focus,::ng-deep .custom-report-schedule-modal .modal-content:focus-visible{outline:none!important}.schedule-receivers-box{cursor:text}.schedule-config-modal>.card-body{margin-bottom:8px}\n"] }]
366
+ 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\"\n [disabled]=\"!editMode\" 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 [disabled]=\"!editMode\">\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\" [disabled]=\"!editMode\">\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 <!-- Does Not Repeat: a real date picker, future dates only (min = tomorrow;\n today itself is restricted -- product rule 2026-08-31). -->\n <div class=\"schedule-pick\" *ngIf=\"frequency === 'once'\">\n <input type=\"date\" class=\"schedule-select w-100\" [min]=\"minOnceDate\" [disabled]=\"!editMode\" [(ngModel)]=\"onceDate\" />\n </div>\n\n <div ngbDropdown [autoClose]=\"'outside'\" class=\"d-inline-block schedule-pick\" *ngIf=\"frequency === 'monthly'\">\n <button type=\"button\" class=\"schedule-select w-100\" ngbDropdownToggle [class.is-placeholder]=\"!datesOfMonth.length\" [disabled]=\"!editMode\">\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\" [disabled]=\"!editMode\">\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 <!-- Always rendered: the appearing/disappearing helper line resized the\n centered modal and made it jump on every selection (QA 2026-09-01). -->\n <div class=\"schedule-helper mt-2\">{{ helperText }}&nbsp;</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\" [disabled]=\"!editMode\">\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 <span class=\"schedule-required\">*</span></label>\n <!-- Clicking anywhere in the box focuses the email input (user request 2026-09-01). -->\n <div class=\"form-control mt-2 d-flex flex-wrap align-items-start schedule-receivers-box schedule-field-box\"\n [class.schedule-box-disabled]=\"!editMode\"\n (click)=\"editMode && emailInputEl.focus()\">\n <span *ngFor=\"let email of emailList; let i = index\" class=\"badge badge-light d-inline-flex align-items-center\">\n {{ email }}\n <span *ngIf=\"editMode\" class=\"cursor-pointer ms-2\" (click)=\"removeChip(i)\">&times;</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 #emailInputEl type=\"email\" id=\"schedule-receivers\" class=\"border-0 flex-grow-1 schedule-email-input\"\n autocomplete=\"off\" autocapitalize=\"off\" spellcheck=\"false\"\n [disabled]=\"!editMode\"\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 <!-- View mode (existing schedule): pale-blue Edit unlocks the fields. -->\n <button *ngIf=\"!editMode\" type=\"button\" class=\"btn schedule-btn-edit w-50 ms-2 d-flex align-items-center justify-content-center\"\n (click)=\"editMode = true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 19 19\" fill=\"none\" class=\"me-2\">\n <path d=\"M8.25 2.51777H2.41667C1.97464 2.51777 1.55072 2.69336 1.23816 3.00592C0.925595 3.31848 0.75 3.74241 0.75 4.18443V15.8511C0.75 16.2931 0.925595 16.7171 1.23816 17.0296C1.55072 17.3422 1.97464 17.5178 2.41667 17.5178H14.0833C14.5254 17.5178 14.9493 17.3422 15.2618 17.0296C15.5744 16.7171 15.75 16.2931 15.75 15.8511V10.0178M14.5 1.26777C14.8315 0.936246 15.2812 0.75 15.75 0.75C16.2188 0.75 16.6685 0.936246 17 1.26777C17.3315 1.59929 17.5178 2.04893 17.5178 2.51777C17.5178 2.98661 17.3315 3.43625 17 3.76777L9.08333 11.6844L5.75 12.5178L6.58333 9.18443L14.5 1.26777Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n Edit\n </button>\n <button *ngIf=\"editMode\" 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=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\" class=\"me-2\">\r\n <!-- Design asset Icon (11).svg -->\r\n <path d=\"M12.6667 16V9.33333H4.33333V16M4.33333 1V5.16667H11M14.3333 16H2.66667C2.22464 16 1.80072 15.8244 1.48816 15.5118C1.17559 15.1993 1 14.7754 1 14.3333V2.66667C1 2.22464 1.17559 1.80072 1.48816 1.48816C1.80072 1.17559 2.22464 1 2.66667 1H11.8333L16 5.16667V14.3333C16 14.7754 15.8244 15.1993 15.5118 15.5118C15.1993 15.8244 14.7754 16 14.3333 16Z\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\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:260px;overflow-y:auto;min-width:240px;padding:6px 0}.checkbox-dropdown-menu .form-check{padding-top:7px!important;padding-bottom:7px!important}.checkbox-dropdown-menu .form-check-label{color:var(--Gray-900, #101828);font-size:14px;font-weight:500;line-height:20px;margin-left:10px}.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{min-height:18px;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;flex:1 1 0}.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)!important;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}.schedule-btn-edit{height:44px;border:0;border-radius:8px;background:var(--Blue-light-50, #E6F5FE);color:#009bf3;font-size:14px;font-weight:600}.schedule-btn-edit:hover{background:#d6eefd}.schedule-select:disabled,.schedule-select[disabled],.schedule-field:disabled{background:#f9fafb!important;color:var(--Gray-500, #667085)!important;cursor:not-allowed}.schedule-box-disabled{background:#f9fafb!important}.schedule-required{color:var(--Error-500, #F04438)}.schedule-email-input:-webkit-autofill,.schedule-email-input:-webkit-autofill:hover,.schedule-email-input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 1000px #fff inset;box-shadow:0 0 0 1000px #fff inset;-webkit-text-fill-color:var(--Gray-900, #101828);caret-color:var(--Gray-900, #101828);transition:background-color 9999s ease-in-out 0s}::ng-deep .custom-report-schedule-modal .modal-content,::ng-deep .custom-report-schedule-modal .modal-content:focus,::ng-deep .custom-report-schedule-modal .modal-content:focus-visible{outline:none!important}.schedule-receivers-box{cursor:text}.schedule-config-modal>.card-body{margin-bottom:8px}\n"] }]
367
367
  }], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.ClientApiService }, { type: i3.ToastService }], propDecorators: { template: [{
368
368
  type: Input
369
369
  }] } });
370
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQUt6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUV6Rzs7aURBRWlEO0FBQ2pELE1BQU0scUJBQXFCLEdBQXVDLENBQUMsR0FBRyxFQUFFO0lBQ3RFLE1BQU0sT0FBTyxHQUF1QyxFQUFFLENBQUM7SUFDdkQsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFB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QUFZO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQy9FLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksZ0NBQWdDLENBQUMsQ0FBQztZQUN6RyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0FyVlUsNkJBQTZCOzRGQUE3Qiw2QkFBNkIsb0dDL0IxQyxtOFdBMkpNOzs0RkQ1SE8sNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDRCQUE0Qjs2SUFLN0IsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuXG5jb25zdCBEQVlfTkFNRVMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG5jb25zdCBNT05USF9OQU1FUyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLyoqIFNjaGVkdWxlIHNlbmQtdGltZSBzbG90czogMzAtbWludXRlIHN0ZXBzLCByZXN0cmljdGVkIHRvIDA5OjAw4oCTMjE6MDAg4oCUIHRoZVxuICogIHNhbWUgcHJvZHVjdCBydWxlIGFzIHRoZSByZXBvcnRzIHBhZ2UncyBzY2hlZHVsZSBtb2RhbC4gVmFsdWVzIHN0YXkgSEg6bW1cbiAqICAodGhlIEFQSSBjb250cmFjdCk7IGxhYmVscyByZW5kZXIgMTItaG91ci4gKi9cbmNvbnN0IFNDSEVEVUxFX1RJTUVfT1BUSU9OUzogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9ICgoKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChsZXQgaG91ciA9IDk7IGhvdXIgPD0gMjE7IGhvdXIrKykge1xuICAgIGZvciAoY29uc3QgbWludXRlIG9mIGhvdXIgPT09IDIxID8gWzBdIDogWzAsIDMwXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBgJHtTdHJpbmcoaG91cikucGFkU3RhcnQoMiwgJzAnKX06JHtTdHJpbmcobWludXRlKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICBjb25zdCBob3VyMTIgPSAoKGhvdXIgKyAxMSkgJSAxMikgKyAxO1xuICAgICAgb3B0aW9ucy5wdXNoKHsgdmFsdWUsIGxhYmVsOiBgJHtob3VyMTJ9OiR7U3RyaW5nKG1pbnV0ZSkucGFkU3RhcnQoMiwgJzAnKX0gJHtob3VyIDwgMTIgPyAnQU0nIDogJ1BNJ31gIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn0pKCk7XG5cbnR5cGUgRnJlcXVlbmN5ID0gJ2RhaWx5JyB8ICd3ZWVrbHknIHwgJ21vbnRobHknIHwgJ29uY2UnO1xudHlwZSBGaWxlVHlwZSA9ICdjc3YnIHwgJ3hsc3gnIHwgJyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXN0b20tcmVwb3J0LXNjaGVkdWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVwb3J0U2NoZWR1bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0ZW1wbGF0ZTogYW55O1xuXG4gIHJlcG9ydE5hbWU6IHN0cmluZyA9ICcnO1xuICBuYW1lRXJyb3I6IHN0cmluZyA9ICcnO1xuXG4gIGZyZXF1ZW5jeTogRnJlcXVlbmN5ID0gJ2RhaWx5JztcbiAgdGltZTogc3RyaW5nID0gJzA5OjAwJztcbiAgZGF5c09mV2VlazogbnVtYmVyW10gPSBbXTtcbiAgZGF0ZXNPZk1vbnRoOiBudW1iZXJbXSA9IFtdO1xuICBvbmNlRGF0ZTogc3RyaW5nID0gJyc7XG4gIGZpbGVUeXBlOiBGaWxlVHlwZSA9ICd4bHN4JztcblxuICBlbWFpbExpc3Q6IGFueVtdID0gW107XG4gIGVtYWlsVmFsaWRhdGlvbjogYW55W10gPSBbXTtcbiAgc2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBGaWdtYSAyMDI2LTA4LTMxOiBhbiBhbHJlYWR5LXNjaGVkdWxlZCByZXBvcnQgb3BlbnMgUkVBRC1PTkxZOyBFZGl0IHVubG9ja3MuICovXG4gIGVkaXRNb2RlID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZGF5T3B0aW9ucyA9IERBWV9OQU1FUy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoeyB2YWx1ZTogaW5kZXgsIGxhYmVsOiBuYW1lIH0pKTtcbiAgcmVhZG9ubHkgZGF0ZU9wdGlvbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAzMSB9LCAoXywgaSkgPT4gaSArIDEpO1xuICByZWFkb25seSB0aW1lT3B0aW9ucyA9IFNDSEVEVUxFX1RJTUVfT1BUSU9OUztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCwgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXI6IFRvYXN0U2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcbiAgICAgIHRoaXMucmVwb3J0TmFtZSA9IHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJztcbiAgICAgIGNvbnN0IHNjaGVkdWxlID0gdGhpcy50ZW1wbGF0ZT8uc2NoZWR1bGUgfHwge307XG4gICAgICB0aGlzLmVkaXRNb2RlID0gIXNjaGVkdWxlLmVuYWJsZWQ7XG4gICAgICB0aGlzLmZyZXF1ZW5jeSA9IHNjaGVkdWxlLmZyZXF1ZW5jeSB8fCAnZGFpbHknO1xuICAgICAgLy8gQSBzdG9yZWQgdGltZSBvdXRzaWRlIHRoZSBhbGxvd2VkIHNsb3RzIChvbGRlciBzY2hlZHVsZXMsIGZyZWUtdHlwZWRcbiAgICAgIC8vIHZhbHVlcykgc25hcHMgYmFjayB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbiBzaG93aW5nIGFuIGVtcHR5IHNlbGVjdC5cbiAgICAgIGNvbnN0IHN0b3JlZFRpbWUgPSBzY2hlZHVsZS50aW1lIHx8ICcwOTowMCc7XG4gICAgICB0aGlzLnRpbWUgPSBTQ0hFRFVMRV9USU1FX09QVElPTlMuc29tZSgob3B0KSA9PiBvcHQudmFsdWUgPT09IHN0b3JlZFRpbWUpID8gc3RvcmVkVGltZSA6ICcwOTowMCc7XG4gICAgICB0aGlzLmRheXNPZldlZWsgPSBbLi4uKHNjaGVkdWxlLmRheXNPZldlZWsgfHwgW10pXTtcbiAgICAgIHRoaXMub25jZURhdGUgPSBzY2hlZHVsZS5vbmNlRGF0ZSB8fCAnJztcbiAgICAgIC8vIERlZmF1bHQgdG8gdGhlIE5FWFQgZGF0ZSAodG9tb3Jyb3cpIHdoZW4gbm90aGluZyB2YWxpZCBpcyBzdG9yZWQgKHVzZXJcbiAgICAgIC8vIHJlcXVlc3QgMjAyNi0wOC0zMSkgLS0gdGhlIHBpY2tlciBuZXZlciBvcGVucyBlbXB0eS5cbiAgICAgIGlmICghdGhpcy5vbmNlRGF0ZSB8fCB0aGlzLm9uY2VEYXRlIDwgdGhpcy5taW5PbmNlRGF0ZSkge1xuICAgICAgICB0aGlzLm9uY2VEYXRlID0gdGhpcy5taW5PbmNlRGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnICYmIHRoaXMub25jZURhdGUpIHtcbiAgICAgICAgY29uc3QgZGF5ID0gTnVtYmVyKHRoaXMub25jZURhdGUuc3BsaXQoJy0nKVsyXSk7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gZGF5ID8gW2RheV0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gWy4uLihzY2hlZHVsZS5kYXRlc09mTW9udGggfHwgW10pXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsZVR5cGUgPSBzY2hlZHVsZS5maWxlVHlwZSB8fCAneGxzeCc7XG4gICAgICB0aGlzLmVtYWlsTGlzdCA9IFsuLi4oc2NoZWR1bGUucmVjZWl2ZXJzIHx8IFtdKV07XG4gICAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgICAgdGhpcy5lbWFpbExpc3QuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7IHRoaXMuZW1haWxWYWxpZGF0b3IoZWxlbWVudCk7IH0pO1xuICAgIH1cbiAgfVxuXG4gIGVtYWlsVmFsaWRhdG9yKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xuICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KHZhbHVlKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbi5wdXNoKHZhbGlkKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdCYWNrc3BhY2UnICYmIGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJycgJiYgdGhpcy5lbWFpbExpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVtYWlsTGlzdC5wb3AoKTtcbiAgICAgIHRoaXMuZW1haWxWYWxpZGF0aW9uLnBvcCgpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcbiAgICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgdGhpcy5lbWFpbExpc3QucHVzaChldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBFbnRlciBWYWxpZCBFbWFpbC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGlwKGk6IG51bWJlcikge1xuICAgIHRoaXMuZW1haWxMaXN0LnNwbGljZShpLCAxKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgIHRoaXMuZW1haWxMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4geyB0aGlzLmVtYWlsVmFsaWRhdG9yKGVsZW1lbnQpOyB9KTtcbiAgfVxuXG4gIHNlbGVjdEZyZXF1ZW5jeSh2YWx1ZTogRnJlcXVlbmN5KSB7XG4gICAgdGhpcy5mcmVxdWVuY3kgPSB2YWx1ZTtcbiAgICAvLyBEb2VzIE5vdCBSZXBlYXQgcGlja3MgYSBmdWxsIGZ1dHVyZSBkYXRlIGluIGl0cyBvd24gZGF0ZSBpbnB1dCAocHJvZHVjdFxuICAgIC8vIGNoYW5nZSAyMDI2LTA4LTMxKTsgYSBzdGFsZSBub24tZnV0dXJlIHZhbHVlIG5ldmVyIHN1cnZpdmVzIHRoZSBzd2l0Y2guXG4gICAgaWYgKHZhbHVlID09PSAnb25jZScgJiYgdGhpcy5vbmNlRGF0ZSA8IHRoaXMubWluT25jZURhdGUpIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdGhlIE5FWFQgZGF0ZSAodG9tb3Jyb3cpIHJhdGhlciB0aGFuIGFuIGVtcHR5IHBpY2tlci5cbiAgICAgIHRoaXMub25jZURhdGUgPSB0aGlzLm1pbk9uY2VEYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUb21vcnJvdyAoWVlZWS1NTS1ERCk6IHRoZSBlYXJsaWVzdCBzZWxlY3RhYmxlIERvZXMtTm90LVJlcGVhdCBkYXRlIC0tXG4gICAqICB0b2RheSBpdHNlbGYgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhbGxvd2VkIChwcm9kdWN0IHJ1bGUgMjAyNi0wOC0zMSkuICovXG4gIGdldCBtaW5PbmNlRGF0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHQgPSBuZXcgRGF0ZSgpO1xuICAgIHQuc2V0RGF0ZSh0LmdldERhdGUoKSArIDEpO1xuICAgIHJldHVybiB0aGlzLnRvSXNvRGF0ZSh0KTtcbiAgfVxuXG4gIC8qKiAnRG9lcyBOb3QgUmVwZWF0JyBzZW5kcyBvbiBhIGRheSBvZiB0aGUgQ1VSUkVOVCBtb250aCwgc28gZGF5cyBhbHJlYWR5IHBhc3RcbiAgICogIGNhbid0IGJlIGNob3Nlbi4gKi9cbiAgaXNEYXRlRGlzYWJsZWQoZGF0ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScgJiYgZGF0ZSA8IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpO1xuICB9XG5cbiAgZ2V0IHNjaGVkdWxlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMuZnJlcXVlbmN5KSB7XG4gICAgICBjYXNlICdkYWlseSc6IHJldHVybiAnRGFpbHknO1xuICAgICAgY2FzZSAnd2Vla2x5JzogcmV0dXJuICdXZWVrbHknO1xuICAgICAgY2FzZSAnbW9udGhseSc6IHJldHVybiAnTW9udGhseSc7XG4gICAgICBjYXNlICdvbmNlJzogcmV0dXJuICdEb2VzIE5vdCBSZXBlYXQnO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICdEYWlseSc7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRGF5KGRheTogbnVtYmVyKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5kYXlzT2ZXZWVrLmluZGV4T2YoZGF5KTtcbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgIHRoaXMuZGF5c09mV2Vlay5zcGxpY2UoaWR4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXlzT2ZXZWVrLnB1c2goZGF5KTtcbiAgICB9XG4gIH1cblxuICBpc0RheVNlbGVjdGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF5c09mV2Vlay5pbmNsdWRlcyhkYXkpO1xuICB9XG5cbiAgdG9nZ2xlRGF0ZShkYXRlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICdvbmNlJykge1xuICAgICAgdGhpcy5kYXRlc09mTW9udGggPSBbZGF0ZV07XG4gICAgICB0aGlzLm9uY2VEYXRlID0gdGhpcy5kZXJpdmVOZXh0T2NjdXJyZW5jZShkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaWR4ID0gdGhpcy5kYXRlc09mTW9udGguaW5kZXhPZihkYXRlKTtcbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoLnNwbGljZShpZHgsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGVzT2ZNb250aC5wdXNoKGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGRheS1vZi1tb250aCAoMS0zMSksIHJldHVybnMgdGhlIG5leHQgb2NjdXJyZW5jZSBhcyAnWVlZWS1NTS1ERCcuXG4gICAqIFRvZGF5IHF1YWxpZmllcyBpZiBpdCBpcyB0aGF0IGRheTsgb3RoZXJ3aXNlIGFkdmFuY2VzIHRvIHRoZSBuZXh0IGNhbGVuZGFyXG4gICAqIG1vbnRoIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhhdCBkYXkgKGUuZy4gMzEgY2hvc2VuIG9uIEZlYiAxMCAtPiBNYXIgMzEpLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXJpdmVOZXh0T2NjdXJyZW5jZShkYXlPZk1vbnRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGlmICh0b2RheS5nZXREYXRlKCkgPT09IGRheU9mTW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvSXNvRGF0ZSh0b2RheSk7XG4gICAgfVxuXG4gICAgbGV0IHllYXIgPSB0b2RheS5nZXRGdWxsWWVhcigpO1xuICAgIGxldCBtb250aCA9IHRvZGF5LmdldE1vbnRoKCk7XG4gICAgaWYgKHRvZGF5LmdldERhdGUoKSA+IGRheU9mTW9udGgpIHtcbiAgICAgIG1vbnRoICs9IDE7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgaWYgKGRheU9mTW9udGggPD0gZGF5c0luTW9udGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Jc29EYXRlKG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXlPZk1vbnRoKSk7XG4gICAgICB9XG4gICAgICBtb250aCArPSAxO1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgbW9udGggPSAwO1xuICAgICAgICB5ZWFyICs9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgdG9Jc29EYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gIH1cblxuICBpc0RhdGVTZWxlY3RlZChkYXRlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlc09mTW9udGguaW5jbHVkZXMoZGF0ZSk7XG4gIH1cblxuICBnZXQgbXVsdGlTZWxlY3RMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ3dlZWtseScpIHtcbiAgICAgIC8vIFBlciBGaWdtYSB0aGUgdHJpZ2dlciBzaG93cyBhIENPVU5UIChcIjIgRGF5c1wiKTsgdGhlIGhlbHBlciBsaW5lIGJlbG93XG4gICAgICAvLyB0aGUgcm93IHNwZWxscyBvdXQgd2hpY2ggZGF5cy5cbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aDtcbiAgICAgIHJldHVybiBjb3VudCA/IGAke2NvdW50fSBEYXkke2NvdW50ID09PSAxID8gJycgOiAncyd9YCA6ICdDaG9vc2UgRGF5JztcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXRlc09mTW9udGgubGVuZ3RoO1xuICAgICAgaWYgKCFjb3VudCkgcmV0dXJuICdDaG9vc2UgRGF0ZSc7XG4gICAgICByZXR1cm4gYCR7Y291bnR9IERhdGUke2NvdW50ID4gMSA/ICdzJyA6ICcnfWA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHNlbGVjdEZpbGVUeXBlKHZhbHVlOiBGaWxlVHlwZSkge1xuICAgIHRoaXMuZmlsZVR5cGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBmaWxlVHlwZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmlsZVR5cGUgPT09ICdjc3YnKSByZXR1cm4gJ0NTVic7XG4gICAgaWYgKHRoaXMuZmlsZVR5cGUgPT09ICd4bHN4JykgcmV0dXJuICdYTFNYJztcbiAgICByZXR1cm4gJ0Nob29zZSBGaWxlJztcbiAgfVxuXG4gIHByaXZhdGUgb3JkaW5hbChuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcobikucGFkU3RhcnQoMiwgJzAnKTtcbiAgfVxuXG4gIGdldCBoZWxwZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmZyZXF1ZW5jeSkge1xuICAgICAgY2FzZSAnZGFpbHknOlxuICAgICAgICByZXR1cm4gJ1JlcG9ydCBzZW50IGRhaWx5JztcbiAgICAgIGNhc2UgJ3dlZWtseSc6IHtcbiAgICAgICAgaWYgKCF0aGlzLmRheXNPZldlZWsubGVuZ3RoKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLmRheXNPZldlZWtdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBzb3J0ZWQubWFwKChkKSA9PiBEQVlfTkFNRVNbZF0pO1xuICAgICAgICBjb25zdCBqb2luZWQgPSBuYW1lcy5sZW5ndGggPiAxXG4gICAgICAgICAgPyBgJHtuYW1lcy5zbGljZSgwLCAtMSkuam9pbignLCAnKX0gYW5kICR7bmFtZXNbbmFtZXMubGVuZ3RoIC0gMV19YFxuICAgICAgICAgIDogbmFtZXNbMF07XG4gICAgICAgIHJldHVybiBgUmVwb3J0IHdpbGwgYmUgc2VudCBldmVyeSAke2pvaW5lZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnbW9udGhseSc6IHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGVzT2ZNb250aC5sZW5ndGgpIHJldHVybiAnJztcbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnRoaXMuZGF0ZXNPZk1vbnRoXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGNvbnN0IGpvaW5lZCA9IHNvcnRlZC5tYXAoKGQpID0+IGAke3RoaXMub3JkaW5hbChkKX0ke3RoaXMuZGF5U3VmZml4KGQpfWApLmpvaW4oJywgJyk7XG4gICAgICAgIHJldHVybiBgUmVwb3J0cyB3aWxsIGJlIHNlbnQgb24gJHtqb2luZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29uY2UnOiB7XG4gICAgICAgIGlmICghdGhpcy5vbmNlRGF0ZSkgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gYFJlcG9ydCB3aWxsIGJlIHNlbnQgb25jZSBvbiAke3RoaXMuZm9ybWF0T25jZURhdGUodGhpcy5vbmNlRGF0ZSl9YDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRheVN1ZmZpeChuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChuID49IDExICYmIG4gPD0gMTMpIHJldHVybiAndGgnO1xuICAgIHN3aXRjaCAobiAlIDEwKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiAnc3QnO1xuICAgICAgY2FzZSAyOiByZXR1cm4gJ25kJztcbiAgICAgIGNhc2UgMzogcmV0dXJuICdyZCc7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ3RoJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE9uY2VEYXRlKGRhdGVTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBkYXRlU3RyLnNwbGl0KCctJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIGRhdGVTdHI7XG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gcGFydHM7XG4gICAgY29uc3QgbW9udGhOYW1lID0gTU9OVEhfTkFNRVNbTnVtYmVyKG1vbnRoKSAtIDFdIHx8ICcnO1xuICAgIHJldHVybiBgJHtkYXl9ICR7bW9udGhOYW1lfSwgJHt5ZWFyfWA7XG4gIH1cblxuICBnZXQgaXNTYXZlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2F2aW5nKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucmVwb3J0TmFtZT8udHJpbSgpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuZmlsZVR5cGUpIHJldHVybiB0cnVlO1xuICAgIGlmICghdGhpcy5lbWFpbExpc3QubGVuZ3RoIHx8IHRoaXMuZW1haWxWYWxpZGF0aW9uLmluY2x1ZGVzKGZhbHNlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnd2Vla2x5JyAmJiAhdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScgJiYgIXRoaXMuZGF0ZXNPZk1vbnRoLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgLy8gRG9lcyBOb3QgUmVwZWF0OiBvbmx5IGEgc3RyaWN0bHkgRlVUVVJFIGRhdGUgc2F2ZXMgKHRvZGF5L3Bhc3QgcmVzdHJpY3RlZCkuXG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScgJiYgKCF0aGlzLm9uY2VEYXRlIHx8IHRoaXMub25jZURhdGUgPCB0aGlzLm1pbk9uY2VEYXRlKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb25DYW5jZWwoKSB7XG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNjaGVkdWxlUGF5bG9hZCgpOiBhbnkge1xuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBmcmVxdWVuY3k6IHRoaXMuZnJlcXVlbmN5LFxuICAgICAgdGltZTogdGhpcy50aW1lIHx8ICcwOTowMCcsXG4gICAgICBmaWxlVHlwZTogdGhpcy5maWxlVHlwZSxcbiAgICAgIHJlY2VpdmVyczogdGhpcy5lbWFpbExpc3RcbiAgICB9O1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ3dlZWtseScpIHtcbiAgICAgIHBheWxvYWQuZGF5c09mV2VlayA9IHRoaXMuZGF5c09mV2VlaztcbiAgICB9IGVsc2UgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScpIHtcbiAgICAgIHBheWxvYWQuZGF0ZXNPZk1vbnRoID0gdGhpcy5kYXRlc09mTW9udGg7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnKSB7XG4gICAgICBwYXlsb2FkLm9uY2VEYXRlID0gdGhpcy5vbmNlRGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBvblN1Ym1pdCgpIHtcbiAgICBpZiAodGhpcy5pc1NhdmVEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5hbWVFcnJvciA9ICcnO1xuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IG5hbWVDaGFuZ2VkID0gdGhpcy5yZXBvcnROYW1lLnRyaW0oKSAhPT0gKHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJyk7XG4gICAgaWYgKG5hbWVDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlQ3VzdG9tUmVwb3J0VGVtcGxhdGUodGhpcy50ZW1wbGF0ZT8uX2lkLCB7IHRlbXBsYXRlTmFtZTogdGhpcy5yZXBvcnROYW1lLnRyaW0oKSB9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZlU2NoZWR1bGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGVycj8uc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZUVycm9yID0gJ1JlcG9ydCBuYW1lIGFscmVhZHkgZXhpc3RzLiBDaG9vc2UgYSBkaWZmZXJlbnQgbmFtZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciB1cGRhdGluZyByZXBvcnQgbmFtZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2F2ZVNjaGVkdWxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlU2NoZWR1bGUoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5idWlsZFNjaGVkdWxlUGF5bG9hZCgpO1xuICAgIHRoaXMuYXBpU2VydmljZS51cGRhdGVDdXN0b21SZXBvcnRTY2hlZHVsZSh0aGlzLnRlbXBsYXRlPy5faWQsIHBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSh7IHR5cGU6ICdzYXZlJyB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciB1cGRhdGluZyByZXBvcnQgc2NoZWR1bGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSIsIjwhLS0gU2FtZSBtYXJrdXAvY2xhc3NlcyBhcyB0aGUgUmVwb3J0cyBwYWdlJ3MgXCJDdXN0b20gUmVwb3J0IENvbmZpZ3VyYXRpb25cIiBtb2RhbFxuICAgICAodGFuZ28tYW5hbHlzZS1yZXBvcnQgY3VzdG9tLXJlcG9ydC12aWV3ICNzY2hlZHVsZU1vZGFsKSwgcGVyIEZpZ21hLCBzbyBib3RoIHBvcHVwc1xuICAgICBsb29rIGlkZW50aWNhbDsgb25seSB0aGUgYmluZGluZ3MgZGlmZmVyICh0aGlzIGNvbXBvbmVudCdzIG93biBmaWVsZC9tZXRob2QgbmFtZXMpLiAtLT5cbjxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci0wIHNjaGVkdWxlLWNvbmZpZy1tb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyIGZ3LWJvbGRcIj5DdXN0b20gUmVwb3J0IENvbmZpZ3VyYXRpb248L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHNjaGVkdWxlLWNsb3NlXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiB0aXRsZT1cIkNsb3NlXCI+XG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTUgNUw1IDE1TTUgNUwxNSAxNVwiIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCIgZm9yPVwic2NoZWR1bGUtbmFtZVwiPkVudGVyIFJlcG9ydCBOYW1lPC9sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2NoZWR1bGUtbmFtZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG10LTIgc2NoZWR1bGUtZmllbGRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydE5hbWVcIlxuICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgPGRpdiAqbmdJZj1cIm5hbWVFcnJvclwiIGNsYXNzPVwidGV4dC1kYW5nZXIgbXQtMlwiPnt7IG5hbWVFcnJvciB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm10LTZcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInN1Yi1oZWFkZXJcIj5TY2hlZHVsZTwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIHNjaGVkdWxlLXJvdy1nYXBcIj5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImQtaW5saW5lLWJsb2NrIHNjaGVkdWxlLWZyZXFcIiBbY2xhc3MuZmxleC1ncm93LTFdPVwiZnJlcXVlbmN5ID09PSAnZGFpbHknXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBuZ2JEcm9wZG93blRvZ2dsZSBbZGlzYWJsZWRdPVwiIWVkaXRNb2RlXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyBzY2hlZHVsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJzY2hlZHVsZS1jaGV2cm9uXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdkYWlseScpXCI+RGFpbHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCd3ZWVrbHknKVwiPldlZWtseTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbmdiRHJvcGRvd25JdGVtIChjbGljayk9XCJzZWxlY3RGcmVxdWVuY3koJ21vbnRobHknKVwiPk1vbnRobHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdvbmNlJylcIj5Eb2VzIE5vdCBSZXBlYXQ8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgc2NoZWR1bGUtcGlja1wiICpuZ0lmPVwiZnJlcXVlbmN5ID09PSAnd2Vla2x5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGUgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFkYXlzT2ZXZWVrLmxlbmd0aFwiIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG11bHRpU2VsZWN0TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInNjaGVkdWxlLWNoZXZyb25cIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDcuNUwxMCAxMi41TDE1IDcuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgY2xhc3M9XCJjaGVja2JveC1kcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkIHB4LTMgcHktMVwiICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5T3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgW2lkXT1cIidkYXktJyArIGRheS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0RheVNlbGVjdGVkKGRheS52YWx1ZSlcIiAoY2hhbmdlKT1cInRvZ2dsZURheShkYXkudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBjdXJzb3ItcG9pbnRlclwiIFtmb3JdPVwiJ2RheS0nICsgZGF5LnZhbHVlXCI+e3sgZGF5LmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERvZXMgTm90IFJlcGVhdDogYSByZWFsIGRhdGUgcGlja2VyLCBmdXR1cmUgZGF0ZXMgb25seSAobWluID0gdG9tb3Jyb3c7XG4gICAgICAgICAgICAgdG9kYXkgaXRzZWxmIGlzIHJlc3RyaWN0ZWQgLS0gcHJvZHVjdCBydWxlIDIwMjYtMDgtMzEpLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjaGVkdWxlLXBpY2tcIiAqbmdJZj1cImZyZXF1ZW5jeSA9PT0gJ29uY2UnXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBbbWluXT1cIm1pbk9uY2VEYXRlXCIgW2Rpc2FibGVkXT1cIiFlZGl0TW9kZVwiIFsobmdNb2RlbCldPVwib25jZURhdGVcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCIgY2xhc3M9XCJkLWlubGluZS1ibG9jayBzY2hlZHVsZS1waWNrXCIgKm5nSWY9XCJmcmVxdWVuY3kgPT09ICdtb250aGx5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGUgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFkYXRlc09mTW9udGgubGVuZ3RoXCIgW2Rpc2FibGVkXT1cIiFlZGl0TW9kZVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgbXVsdGlTZWxlY3RMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwic2NoZWR1bGUtY2hldnJvblwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41TDEwIDEyLjVMMTUgNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBjbGFzcz1cImNoZWNrYm94LWRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWQgcHgtMyBweS0xXCIgKm5nRm9yPVwibGV0IGRhdGUgb2YgZGF0ZU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPCEtLSBEb2VzIE5vdCBSZXBlYXQ6IGRheXMgYWxyZWFkeSBwYXN0IHRoaXMgbW9udGggYXJlIGRpc2FibGVkLiAtLT5cbiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInZGF0ZS0nICsgZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWlzRGF0ZURpc2FibGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0RhdGVTZWxlY3RlZChkYXRlKVwiIChjaGFuZ2UpPVwidG9nZ2xlRGF0ZShkYXRlKVwiIC8+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidkYXRlLScgKyBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCIhaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtbXV0ZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzRGF0ZURpc2FibGVkKGRhdGUpID8gJ1Bhc3QgZGF0ZXMgY2Fubm90IGJlIHNjaGVkdWxlZCcgOiAnJ1wiPnt7IGRhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ViLWhlYWRlciBtYi0wIHNjaGVkdWxlLWF0XCI+YXQ8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCI+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNjaGVkdWxlLXNlbGVjdCB0aW1lLXNlbGVjdFwiIFsobmdNb2RlbCldPVwidGltZVwiIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiB0aW1lT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQudmFsdWUgfX08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInRpbWUtaWNvblwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMCA1VjEwTDEzLjMzMzMgMTEuNjY2N00xOC4zMzMzIDEwQzE4LjMzMzMgMTQuNjAyNCAxNC42MDI0IDE4LjMzMzMgMTAgMTguMzMzM0M1LjM5NzYzIDE4LjMzMzMgMS42NjY2NyAxNC42MDI0IDEuNjY2NjcgMTBDMS42NjY2NyA1LjM5NzYzIDUuMzk3NjMgMS42NjY2NyAxMCAxLjY2NjY3QzE0LjYwMjQgMS42NjY2NyAxOC4zMzMzIDUuMzk3NjMgMTguMzMzMyAxMFpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gQWx3YXlzIHJlbmRlcmVkOiB0aGUgYXBwZWFyaW5nL2Rpc2FwcGVhcmluZyBoZWxwZXIgbGluZSByZXNpemVkIHRoZVxuICAgICAgICAgICBjZW50ZXJlZCBtb2RhbCBhbmQgbWFkZSBpdCBqdW1wIG9uIGV2ZXJ5IHNlbGVjdGlvbiAoUUEgMjAyNi0wOS0wMSkuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNjaGVkdWxlLWhlbHBlciBtdC0yXCI+e3sgaGVscGVyVGV4dCB9fSZuYnNwOzwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm10LTZcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInN1Yi1oZWFkZXJcIj5GaWxlIFR5cGU8L2xhYmVsPlxuICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImQtYmxvY2sgbXQtMlwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNjaGVkdWxlLXNlbGVjdCB3LTEwMFwiIG5nYkRyb3Bkb3duVG9nZ2xlIFtjbGFzcy5pcy1wbGFjZWhvbGRlcl09XCIhZmlsZVR5cGVcIiBbZGlzYWJsZWRdPVwiIWVkaXRNb2RlXCI+XG4gICAgICAgICAgPHNwYW4+e3sgZmlsZVR5cGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInNjaGVkdWxlLWNoZXZyb25cIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrKT1cInNlbGVjdEZpbGVUeXBlKCdjc3YnKVwiPkNTVjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RmlsZVR5cGUoJ3hsc3gnKVwiPlhMU1g8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCIgZm9yPVwic2NoZWR1bGUtcmVjZWl2ZXJzXCI+UmVjZWl2ZXJzIEVtYWlsIDxzcGFuIGNsYXNzPVwic2NoZWR1bGUtcmVxdWlyZWRcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICA8IS0tIENsaWNraW5nIGFueXdoZXJlIGluIHRoZSBib3ggZm9jdXNlcyB0aGUgZW1haWwgaW5wdXQgKHVzZXIgcmVxdWVzdCAyMDI2LTA5LTAxKS4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sIG10LTIgZC1mbGV4IGZsZXgtd3JhcCBhbGlnbi1pdGVtcy1zdGFydCBzY2hlZHVsZS1yZWNlaXZlcnMtYm94IHNjaGVkdWxlLWZpZWxkLWJveFwiXG4gICAgICAgICAgIFtjbGFzcy5zY2hlZHVsZS1ib3gtZGlzYWJsZWRdPVwiIWVkaXRNb2RlXCJcbiAgICAgICAgICAgKGNsaWNrKT1cImVkaXRNb2RlICYmIGVtYWlsSW5wdXRFbC5mb2N1cygpXCI+XG4gICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBlbWFpbCBvZiBlbWFpbExpc3Q7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0IGQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAge3sgZW1haWwgfX1cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImVkaXRNb2RlXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBtcy0yXCIgKGNsaWNrKT1cInJlbW92ZUNoaXAoaSlcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwhLS0gYXV0b2NvbXBsZXRlPVwib2ZmXCI6IENocm9tZSBvdGhlcndpc2UgYXV0b2ZpbGxzIHRoZSBqdXN0LWFkZGVkIGFkZHJlc3MgYmFja1xuICAgICAgICAgICAgIGludG8gdGhlIGZpZWxkIChibHVlIGF1dG9maWxsIGJhY2tncm91bmQpIGFmdGVyIEVudGVyIGNsZWFycyBpdC4gLS0+XG4gICAgICAgIDxpbnB1dCAjZW1haWxJbnB1dEVsIHR5cGU9XCJlbWFpbFwiIGlkPVwic2NoZWR1bGUtcmVjZWl2ZXJzXCIgY2xhc3M9XCJib3JkZXItMCBmbGV4LWdyb3ctMSBzY2hlZHVsZS1lbWFpbC1pbnB1dFwiXG4gICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRNb2RlXCJcbiAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImVtYWlsVmFsaWRhdGlvbi5pbmNsdWRlcyhmYWxzZSlcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTJcIj5JbnZhbGlkIEVtYWlsIEZvcm1hdDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtdC04XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBzY2hlZHVsZS1idG4tY2FuY2VsIHctNTAgbWUtMlwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICA8IS0tIFZpZXcgbW9kZSAoZXhpc3Rpbmcgc2NoZWR1bGUpOiBwYWxlLWJsdWUgRWRpdCB1bmxvY2tzIHRoZSBmaWVsZHMuIC0tPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0TW9kZVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBzY2hlZHVsZS1idG4tZWRpdCB3LTUwIG1zLTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRNb2RlID0gdHJ1ZVwiPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE5IDE5XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTJcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTguMjUgMi41MTc3N0gyLjQxNjY3QzEuOTc0NjQgMi41MTc3NyAxLjU1MDcyIDIuNjkzMzYgMS4yMzgxNiAzLjAwNTkyQzAuOTI1NTk1IDMuMzE4NDggMC43NSAzLjc0MjQxIDAuNzUgNC4xODQ0M1YxNS44NTExQzAuNzUgMTYuMjkzMSAwLjkyNTU5NSAxNi43MTcxIDEuMjM4MTYgMTcuMDI5NkMxLjU1MDcyIDE3LjM0MjIgMS45NzQ2NCAxNy41MTc4IDIuNDE2NjcgMTcuNTE3OEgxNC4wODMzQzE0LjUyNTQgMTcuNTE3OCAxNC45NDkzIDE3LjM0MjIgMTUuMjYxOCAxNy4wMjk2QzE1LjU3NDQgMTYuNzE3MSAxNS43NSAxNi4yOTMxIDE1Ljc1IDE1Ljg1MTFWMTAuMDE3OE0xNC41IDEuMjY3NzdDMTQuODMxNSAwLjkzNjI0NiAxNS4yODEyIDAuNzUgMTUuNzUgMC43NUMxNi4yMTg4IDAuNzUgMTYuNjY4NSAwLjkzNjI0NiAxNyAxLjI2Nzc3QzE3LjMzMTUgMS41OTkyOSAxNy41MTc4IDIuMDQ4OTMgMTcuNTE3OCAyLjUxNzc3QzE3LjUxNzggMi45ODY2MSAxNy4zMzE1IDMuNDM2MjUgMTcgMy43Njc3N0w5LjA4MzMzIDExLjY4NDRMNS43NSAxMi41MTc4TDYuNTgzMzMgOS4xODQ0M0wxNC41IDEuMjY3NzdaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICBFZGl0XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0TW9kZVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBzY2hlZHVsZS1idG4tc2F2ZSB3LTUwIG1zLTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU2F2ZURpc2FibGVkXCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIj5cbiAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1NhdmVEaXNhYmxlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTJcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTcuNVYxMS42NjY3QzE3LjUgMTEuMjI0NiAxNy4zMjQ0IDEwLjgwMDcgMTcuMDExOCAxMC40ODgyQzE2LjY5OTMgMTAuMTc1NiAxNi4yNzU0IDEwIDE1LjgzMzMgMTBINC4xNjY2N0MzLjcyNDY0IDEwIDMuMzAwNzIgMTAuMTc1NiAyLjk4ODE2IDEwLjQ4ODJDMi42NzU1OSAxMC44MDA3IDIuNSAxMS4yMjQ2IDIuNSAxMS42NjY3VjE3LjVNMTcuNSAxNy41SDIuNU0xNy41IDE3LjVWNi4xNjY2N0MxNy41IDUuNjk5OTYgMTcuNSA1LjQ2NjYgMTcuNDA5MiA1LjI4ODM0QzE3LjMyOTMgNS4xMzE1NCAxNy4yMDE4IDUuMDA0MDUgMTcuMDQ1IDQuOTI0MTZDMTYuODY2OCA0LjgzMzMzIDE2LjYzMzQgNC44MzMzMyAxNi4xNjY3IDQuODMzMzNIMTIuNU0yLjUgMTcuNVY0LjE2NjY3QzIuNSAzLjY5OTk2IDIuNSAzLjQ2NjYgMi41OTA4MyAzLjI4ODM0QzIuNjcwNzIgMy4xMzE1NCAyLjc5ODIxIDMuMDA0MDUgMi45NTUwMSAyLjkyNDE2QzMuMTMzMjcgMi44MzMzMyAzLjM2NjYyIDIuODMzMzMgMy44MzMzMyAyLjgzMzMzSDEwLjgzMzNNMTIuNSA0LjgzMzMzVjIuODMzMzNNMTIuNSA0LjgzMzMzSDEwLjgzMzNNMTIuNSAyLjgzMzMzSDEwLjgzMzNNMTAuODMzMyAyLjgzMzMzVjQuODMzMzNNNi42NjY2NyA2LjY2NjY3SDkuMTY2NjdcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICBTYXZlXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
370
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1tYW5hZ2Utc2V0dGluZ3Mvc3JjL2xpYi9jb21wb25lbnRzL2NvbmZpZ3VyYXRpb25zL3JlcG9ydC1jb25maWd1cmF0aW9uL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUvY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQUt6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pHLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUV6Rzs7aURBRWlEO0FBQ2pELE1BQU0scUJBQXFCLEdBQXVDLENBQUMsR0FBRyxFQUFFO0lBQ3RFLE1BQU0sT0FBTyxHQUF1QyxFQUFFLENBQUM7SUFDdkQsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNyQyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ2hELE1BQU0sS0FBSyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMzRztLQUNGO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQVVMLE1BQU0sT0FBTyw2QkFBNkI7SUF1QnBCO0lBQXFDO0lBQXNDO0lBdEJ0RixRQUFRLENBQU07SUFFdkIsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUN4QixTQUFTLEdBQVcsRUFBRSxDQUFDO0lBRXZCLFNBQVMsR0FBYyxPQUFPLENBQUM7SUFDL0IsSUFBSSxHQUFXLE9BQU8sQ0FBQztJQUN2QixVQUFVLEdBQWEsRUFBRSxDQUFDO0lBQzFCLFlBQVksR0FBYSxFQUFFLENBQUM7SUFDNUIsUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUN0QixRQUFRLEdBQWEsTUFBTSxDQUFDO0lBRTVCLFNBQVMsR0FBVSxFQUFFLENBQUM7SUFDdEIsZUFBZSxHQUFVLEVBQUUsQ0FBQztJQUM1QixNQUFNLEdBQVksS0FBSyxDQUFDO0lBQ3hCLG1GQUFtRjtJQUNuRixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRVIsVUFBVSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdFLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsR0FBRyxxQkFBcUIsQ0FBQztJQUU3QyxZQUFvQixXQUEyQixFQUFVLFVBQTRCLEVBQVUsT0FBcUI7UUFBaEcsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVUsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFjO0lBQUksQ0FBQztJQUV6SCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLElBQUksRUFBRSxDQUFDO1lBQ3BELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDO1lBQy9DLHVFQUF1RTtZQUN2RSx5RUFBeUU7WUFDekUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUM7WUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ2pHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDeEMseUVBQXlFO1lBQ3pFLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUNsQztZQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDOUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDeEQ7WUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0U7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVU7UUFDdkIsTUFBTSxVQUFVLEdBQUcsa0RBQWtELENBQUM7UUFDdEUsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQVU7UUFDbEIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDcEYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtZQUMxQixNQUFNLFVBQVUsR0FBRyxrREFBa0QsQ0FBQztZQUN0RSxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7YUFDekI7aUJBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtnQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQzthQUN6RDtTQUNGO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxDQUFTO1FBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBZ0I7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSxJQUFJLEtBQUssS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3hELG1FQUFtRTtZQUNuRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQ7OEVBQzBFO0lBQzFFLElBQUksV0FBVztRQUNiLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDsyQkFDdUI7SUFDdkIsY0FBYyxDQUFDLElBQVk7UUFDekIsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsRSxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3RCLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUM7WUFDN0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQztZQUMvQixLQUFLLFNBQVMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDO1lBQ2pDLEtBQUssTUFBTSxDQUFDLENBQUMsT0FBTyxpQkFBaUIsQ0FBQztZQUN0QyxPQUFPLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRCxTQUFTLENBQUMsR0FBVztRQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNoQzthQUFNO1lBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVk7UUFDckIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdCLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELE9BQU87U0FDUjtRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssb0JBQW9CLENBQUMsVUFBa0I7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNCLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUNsQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUI7UUFFRCxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLFVBQVUsRUFBRTtZQUNoQyxLQUFLLElBQUksQ0FBQyxDQUFDO1NBQ1o7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNCLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzNELElBQUksVUFBVSxJQUFJLFdBQVcsRUFBRTtnQkFDN0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQzthQUMxRDtZQUNELEtBQUssSUFBSSxDQUFDLENBQUM7WUFDWCxJQUFJLEtBQUssR0FBRyxFQUFFLEVBQUU7Z0JBQ2QsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDVixJQUFJLElBQUksQ0FBQyxDQUFDO2FBQ1g7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFVO1FBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEQsT0FBTyxHQUFHLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDL0Isd0VBQXdFO1lBQ3hFLGlDQUFpQztZQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNyQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1NBQ3ZFO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUN2QyxJQUFJLENBQUMsS0FBSztnQkFBRSxPQUFPLGFBQWEsQ0FBQztZQUNqQyxPQUFPLEdBQUcsS0FBSyxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7U0FDL0M7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBZTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEtBQUs7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzVDLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxPQUFPLENBQUMsQ0FBUztRQUN2QixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDdEIsS0FBSyxPQUFPO2dCQUNWLE9BQU8sbUJBQW1CLENBQUM7WUFDN0IsS0FBSyxRQUFRLENBQUMsQ0FBQztnQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUN2QyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDN0IsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ25FLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2IsT0FBTyw2QkFBNkIsTUFBTSxFQUFFLENBQUM7YUFDOUM7WUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0RixPQUFPLDJCQUEyQixNQUFNLEVBQUUsQ0FBQzthQUM1QztZQUNELEtBQUssTUFBTSxDQUFDLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUM5QixPQUFPLCtCQUErQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2FBQzVFO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7U0FDYjtJQUNILENBQUM7SUFFTyxTQUFTLENBQUMsQ0FBUztRQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNwQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDZCxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDO1lBQ3BCLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUM7WUFDcEIsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQztZQUNwQixPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQztTQUN0QjtJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsT0FBZTtRQUNwQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDdkMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZELE9BQU8sR0FBRyxHQUFHLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoRixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDeEUsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzNFLDhFQUE4RTtRQUM5RSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ25HLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsTUFBTSxPQUFPLEdBQVE7WUFDbkIsT0FBTyxFQUFFLElBQUk7WUFDYixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTztZQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1NBQzFCLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFO1lBQy9CLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUN0QzthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDdkMsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzFDO2FBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sRUFBRTtZQUNwQyxPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDbEM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVuQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkYsSUFBSSxXQUFXLEVBQUU7WUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDakgsSUFBSSxFQUFFLEdBQUcsRUFBRTtvQkFDVCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNwQixJQUFJLEdBQUcsRUFBRSxNQUFNLEtBQUssR0FBRyxFQUFFO3dCQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLHFEQUFxRCxDQUFDO3FCQUN4RTt5QkFBTTt3QkFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sSUFBSSw0QkFBNEIsQ0FBQyxDQUFDO3FCQUNwRztnQkFDSCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQy9FLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUksZ0NBQWdDLENBQUMsQ0FBQztZQUN6RyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0FyVlUsNkJBQTZCOzRGQUE3Qiw2QkFBNkIsb0dDL0IxQywwcldBMkpNOzs0RkQ1SE8sNkJBQTZCO2tCQUx6QyxTQUFTOytCQUNFLDRCQUE0Qjs2SUFLN0IsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuXG5jb25zdCBEQVlfTkFNRVMgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG5jb25zdCBNT05USF9OQU1FUyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLyoqIFNjaGVkdWxlIHNlbmQtdGltZSBzbG90czogMzAtbWludXRlIHN0ZXBzLCByZXN0cmljdGVkIHRvIDA5OjAw4oCTMjE6MDAg4oCUIHRoZVxuICogIHNhbWUgcHJvZHVjdCBydWxlIGFzIHRoZSByZXBvcnRzIHBhZ2UncyBzY2hlZHVsZSBtb2RhbC4gVmFsdWVzIHN0YXkgSEg6bW1cbiAqICAodGhlIEFQSSBjb250cmFjdCk7IGxhYmVscyByZW5kZXIgMTItaG91ci4gKi9cbmNvbnN0IFNDSEVEVUxFX1RJTUVfT1BUSU9OUzogeyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9ICgoKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnM6IHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChsZXQgaG91ciA9IDk7IGhvdXIgPD0gMjE7IGhvdXIrKykge1xuICAgIGZvciAoY29uc3QgbWludXRlIG9mIGhvdXIgPT09IDIxID8gWzBdIDogWzAsIDMwXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBgJHtTdHJpbmcoaG91cikucGFkU3RhcnQoMiwgJzAnKX06JHtTdHJpbmcobWludXRlKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgICBjb25zdCBob3VyMTIgPSAoKGhvdXIgKyAxMSkgJSAxMikgKyAxO1xuICAgICAgb3B0aW9ucy5wdXNoKHsgdmFsdWUsIGxhYmVsOiBgJHtob3VyMTJ9OiR7U3RyaW5nKG1pbnV0ZSkucGFkU3RhcnQoMiwgJzAnKX0gJHtob3VyIDwgMTIgPyAnQU0nIDogJ1BNJ31gIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn0pKCk7XG5cbnR5cGUgRnJlcXVlbmN5ID0gJ2RhaWx5JyB8ICd3ZWVrbHknIHwgJ21vbnRobHknIHwgJ29uY2UnO1xudHlwZSBGaWxlVHlwZSA9ICdjc3YnIHwgJ3hsc3gnIHwgJyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXN0b20tcmVwb3J0LXNjaGVkdWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1yZXBvcnQtc2NoZWR1bGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY3VzdG9tLXJlcG9ydC1zY2hlZHVsZS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVwb3J0U2NoZWR1bGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB0ZW1wbGF0ZTogYW55O1xuXG4gIHJlcG9ydE5hbWU6IHN0cmluZyA9ICcnO1xuICBuYW1lRXJyb3I6IHN0cmluZyA9ICcnO1xuXG4gIGZyZXF1ZW5jeTogRnJlcXVlbmN5ID0gJ2RhaWx5JztcbiAgdGltZTogc3RyaW5nID0gJzA5OjAwJztcbiAgZGF5c09mV2VlazogbnVtYmVyW10gPSBbXTtcbiAgZGF0ZXNPZk1vbnRoOiBudW1iZXJbXSA9IFtdO1xuICBvbmNlRGF0ZTogc3RyaW5nID0gJyc7XG4gIGZpbGVUeXBlOiBGaWxlVHlwZSA9ICd4bHN4JztcblxuICBlbWFpbExpc3Q6IGFueVtdID0gW107XG4gIGVtYWlsVmFsaWRhdGlvbjogYW55W10gPSBbXTtcbiAgc2F2aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBGaWdtYSAyMDI2LTA4LTMxOiBhbiBhbHJlYWR5LXNjaGVkdWxlZCByZXBvcnQgb3BlbnMgUkVBRC1PTkxZOyBFZGl0IHVubG9ja3MuICovXG4gIGVkaXRNb2RlID0gZmFsc2U7XG5cbiAgcmVhZG9ubHkgZGF5T3B0aW9ucyA9IERBWV9OQU1FUy5tYXAoKG5hbWUsIGluZGV4KSA9PiAoeyB2YWx1ZTogaW5kZXgsIGxhYmVsOiBuYW1lIH0pKTtcbiAgcmVhZG9ubHkgZGF0ZU9wdGlvbnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAzMSB9LCAoXywgaSkgPT4gaSArIDEpO1xuICByZWFkb25seSB0aW1lT3B0aW9ucyA9IFNDSEVEVUxFX1RJTUVfT1BUSU9OUztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCwgcHJpdmF0ZSBhcGlTZXJ2aWNlOiBDbGllbnRBcGlTZXJ2aWNlLCBwcml2YXRlIHRvYXN0ZXI6IFRvYXN0U2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcbiAgICAgIHRoaXMucmVwb3J0TmFtZSA9IHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJztcbiAgICAgIGNvbnN0IHNjaGVkdWxlID0gdGhpcy50ZW1wbGF0ZT8uc2NoZWR1bGUgfHwge307XG4gICAgICB0aGlzLmVkaXRNb2RlID0gIXNjaGVkdWxlLmVuYWJsZWQ7XG4gICAgICB0aGlzLmZyZXF1ZW5jeSA9IHNjaGVkdWxlLmZyZXF1ZW5jeSB8fCAnZGFpbHknO1xuICAgICAgLy8gQSBzdG9yZWQgdGltZSBvdXRzaWRlIHRoZSBhbGxvd2VkIHNsb3RzIChvbGRlciBzY2hlZHVsZXMsIGZyZWUtdHlwZWRcbiAgICAgIC8vIHZhbHVlcykgc25hcHMgYmFjayB0byB0aGUgZGVmYXVsdCByYXRoZXIgdGhhbiBzaG93aW5nIGFuIGVtcHR5IHNlbGVjdC5cbiAgICAgIGNvbnN0IHN0b3JlZFRpbWUgPSBzY2hlZHVsZS50aW1lIHx8ICcwOTowMCc7XG4gICAgICB0aGlzLnRpbWUgPSBTQ0hFRFVMRV9USU1FX09QVElPTlMuc29tZSgob3B0KSA9PiBvcHQudmFsdWUgPT09IHN0b3JlZFRpbWUpID8gc3RvcmVkVGltZSA6ICcwOTowMCc7XG4gICAgICB0aGlzLmRheXNPZldlZWsgPSBbLi4uKHNjaGVkdWxlLmRheXNPZldlZWsgfHwgW10pXTtcbiAgICAgIHRoaXMub25jZURhdGUgPSBzY2hlZHVsZS5vbmNlRGF0ZSB8fCAnJztcbiAgICAgIC8vIERlZmF1bHQgdG8gdGhlIE5FWFQgZGF0ZSAodG9tb3Jyb3cpIHdoZW4gbm90aGluZyB2YWxpZCBpcyBzdG9yZWQgKHVzZXJcbiAgICAgIC8vIHJlcXVlc3QgMjAyNi0wOC0zMSkgLS0gdGhlIHBpY2tlciBuZXZlciBvcGVucyBlbXB0eS5cbiAgICAgIGlmICghdGhpcy5vbmNlRGF0ZSB8fCB0aGlzLm9uY2VEYXRlIDwgdGhpcy5taW5PbmNlRGF0ZSkge1xuICAgICAgICB0aGlzLm9uY2VEYXRlID0gdGhpcy5taW5PbmNlRGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnICYmIHRoaXMub25jZURhdGUpIHtcbiAgICAgICAgY29uc3QgZGF5ID0gTnVtYmVyKHRoaXMub25jZURhdGUuc3BsaXQoJy0nKVsyXSk7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gZGF5ID8gW2RheV0gOiBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoID0gWy4uLihzY2hlZHVsZS5kYXRlc09mTW9udGggfHwgW10pXTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsZVR5cGUgPSBzY2hlZHVsZS5maWxlVHlwZSB8fCAneGxzeCc7XG4gICAgICB0aGlzLmVtYWlsTGlzdCA9IFsuLi4oc2NoZWR1bGUucmVjZWl2ZXJzIHx8IFtdKV07XG4gICAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgICAgdGhpcy5lbWFpbExpc3QuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7IHRoaXMuZW1haWxWYWxpZGF0b3IoZWxlbWVudCk7IH0pO1xuICAgIH1cbiAgfVxuXG4gIGVtYWlsVmFsaWRhdG9yKHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSQvO1xuICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KHZhbHVlKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbi5wdXNoKHZhbGlkKTtcbiAgfVxuXG4gIG9uS2V5RG93bihldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdCYWNrc3BhY2UnICYmIGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJycgJiYgdGhpcy5lbWFpbExpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVtYWlsTGlzdC5wb3AoKTtcbiAgICAgIHRoaXMuZW1haWxWYWxpZGF0aW9uLnBvcCgpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgY29uc3QgZW1haWxSZWdleCA9IC9eW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0kLztcbiAgICAgIGNvbnN0IHZhbGlkID0gZW1haWxSZWdleC50ZXN0KGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgdGhpcy5lbWFpbExpc3QucHVzaChldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgICAgdGhpcy50b2FzdGVyLmdldEVycm9yVG9hc3QoJ1BsZWFzZSBFbnRlciBWYWxpZCBFbWFpbC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGlwKGk6IG51bWJlcikge1xuICAgIHRoaXMuZW1haWxMaXN0LnNwbGljZShpLCAxKTtcbiAgICB0aGlzLmVtYWlsVmFsaWRhdGlvbiA9IFtdO1xuICAgIHRoaXMuZW1haWxMaXN0LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4geyB0aGlzLmVtYWlsVmFsaWRhdG9yKGVsZW1lbnQpOyB9KTtcbiAgfVxuXG4gIHNlbGVjdEZyZXF1ZW5jeSh2YWx1ZTogRnJlcXVlbmN5KSB7XG4gICAgdGhpcy5mcmVxdWVuY3kgPSB2YWx1ZTtcbiAgICAvLyBEb2VzIE5vdCBSZXBlYXQgcGlja3MgYSBmdWxsIGZ1dHVyZSBkYXRlIGluIGl0cyBvd24gZGF0ZSBpbnB1dCAocHJvZHVjdFxuICAgIC8vIGNoYW5nZSAyMDI2LTA4LTMxKTsgYSBzdGFsZSBub24tZnV0dXJlIHZhbHVlIG5ldmVyIHN1cnZpdmVzIHRoZSBzd2l0Y2guXG4gICAgaWYgKHZhbHVlID09PSAnb25jZScgJiYgdGhpcy5vbmNlRGF0ZSA8IHRoaXMubWluT25jZURhdGUpIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gdGhlIE5FWFQgZGF0ZSAodG9tb3Jyb3cpIHJhdGhlciB0aGFuIGFuIGVtcHR5IHBpY2tlci5cbiAgICAgIHRoaXMub25jZURhdGUgPSB0aGlzLm1pbk9uY2VEYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUb21vcnJvdyAoWVlZWS1NTS1ERCk6IHRoZSBlYXJsaWVzdCBzZWxlY3RhYmxlIERvZXMtTm90LVJlcGVhdCBkYXRlIC0tXG4gICAqICB0b2RheSBpdHNlbGYgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhbGxvd2VkIChwcm9kdWN0IHJ1bGUgMjAyNi0wOC0zMSkuICovXG4gIGdldCBtaW5PbmNlRGF0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHQgPSBuZXcgRGF0ZSgpO1xuICAgIHQuc2V0RGF0ZSh0LmdldERhdGUoKSArIDEpO1xuICAgIHJldHVybiB0aGlzLnRvSXNvRGF0ZSh0KTtcbiAgfVxuXG4gIC8qKiAnRG9lcyBOb3QgUmVwZWF0JyBzZW5kcyBvbiBhIGRheSBvZiB0aGUgQ1VSUkVOVCBtb250aCwgc28gZGF5cyBhbHJlYWR5IHBhc3RcbiAgICogIGNhbid0IGJlIGNob3Nlbi4gKi9cbiAgaXNEYXRlRGlzYWJsZWQoZGF0ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScgJiYgZGF0ZSA8IG5ldyBEYXRlKCkuZ2V0RGF0ZSgpO1xuICB9XG5cbiAgZ2V0IHNjaGVkdWxlTGFiZWwoKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMuZnJlcXVlbmN5KSB7XG4gICAgICBjYXNlICdkYWlseSc6IHJldHVybiAnRGFpbHknO1xuICAgICAgY2FzZSAnd2Vla2x5JzogcmV0dXJuICdXZWVrbHknO1xuICAgICAgY2FzZSAnbW9udGhseSc6IHJldHVybiAnTW9udGhseSc7XG4gICAgICBjYXNlICdvbmNlJzogcmV0dXJuICdEb2VzIE5vdCBSZXBlYXQnO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICdEYWlseSc7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRGF5KGRheTogbnVtYmVyKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5kYXlzT2ZXZWVrLmluZGV4T2YoZGF5KTtcbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgIHRoaXMuZGF5c09mV2Vlay5zcGxpY2UoaWR4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXlzT2ZXZWVrLnB1c2goZGF5KTtcbiAgICB9XG4gIH1cblxuICBpc0RheVNlbGVjdGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF5c09mV2Vlay5pbmNsdWRlcyhkYXkpO1xuICB9XG5cbiAgdG9nZ2xlRGF0ZShkYXRlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5mcmVxdWVuY3kgPT09ICdvbmNlJykge1xuICAgICAgdGhpcy5kYXRlc09mTW9udGggPSBbZGF0ZV07XG4gICAgICB0aGlzLm9uY2VEYXRlID0gdGhpcy5kZXJpdmVOZXh0T2NjdXJyZW5jZShkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaWR4ID0gdGhpcy5kYXRlc09mTW9udGguaW5kZXhPZihkYXRlKTtcbiAgICBpZiAoaWR4ID4gLTEpIHtcbiAgICAgIHRoaXMuZGF0ZXNPZk1vbnRoLnNwbGljZShpZHgsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGVzT2ZNb250aC5wdXNoKGRhdGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGRheS1vZi1tb250aCAoMS0zMSksIHJldHVybnMgdGhlIG5leHQgb2NjdXJyZW5jZSBhcyAnWVlZWS1NTS1ERCcuXG4gICAqIFRvZGF5IHF1YWxpZmllcyBpZiBpdCBpcyB0aGF0IGRheTsgb3RoZXJ3aXNlIGFkdmFuY2VzIHRvIHRoZSBuZXh0IGNhbGVuZGFyXG4gICAqIG1vbnRoIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhhdCBkYXkgKGUuZy4gMzEgY2hvc2VuIG9uIEZlYiAxMCAtPiBNYXIgMzEpLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXJpdmVOZXh0T2NjdXJyZW5jZShkYXlPZk1vbnRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgIGlmICh0b2RheS5nZXREYXRlKCkgPT09IGRheU9mTW9udGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvSXNvRGF0ZSh0b2RheSk7XG4gICAgfVxuXG4gICAgbGV0IHllYXIgPSB0b2RheS5nZXRGdWxsWWVhcigpO1xuICAgIGxldCBtb250aCA9IHRvZGF5LmdldE1vbnRoKCk7XG4gICAgaWYgKHRvZGF5LmdldERhdGUoKSA+IGRheU9mTW9udGgpIHtcbiAgICAgIG1vbnRoICs9IDE7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgaWYgKGRheU9mTW9udGggPD0gZGF5c0luTW9udGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9Jc29EYXRlKG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXlPZk1vbnRoKSk7XG4gICAgICB9XG4gICAgICBtb250aCArPSAxO1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgbW9udGggPSAwO1xuICAgICAgICB5ZWFyICs9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgdG9Jc29EYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gIH1cblxuICBpc0RhdGVTZWxlY3RlZChkYXRlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlc09mTW9udGguaW5jbHVkZXMoZGF0ZSk7XG4gIH1cblxuICBnZXQgbXVsdGlTZWxlY3RMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ3dlZWtseScpIHtcbiAgICAgIC8vIFBlciBGaWdtYSB0aGUgdHJpZ2dlciBzaG93cyBhIENPVU5UIChcIjIgRGF5c1wiKTsgdGhlIGhlbHBlciBsaW5lIGJlbG93XG4gICAgICAvLyB0aGUgcm93IHNwZWxscyBvdXQgd2hpY2ggZGF5cy5cbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aDtcbiAgICAgIHJldHVybiBjb3VudCA/IGAke2NvdW50fSBEYXkke2NvdW50ID09PSAxID8gJycgOiAncyd9YCA6ICdDaG9vc2UgRGF5JztcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScpIHtcbiAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5kYXRlc09mTW9udGgubGVuZ3RoO1xuICAgICAgaWYgKCFjb3VudCkgcmV0dXJuICdDaG9vc2UgRGF0ZSc7XG4gICAgICByZXR1cm4gYCR7Y291bnR9IERhdGUke2NvdW50ID4gMSA/ICdzJyA6ICcnfWA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHNlbGVjdEZpbGVUeXBlKHZhbHVlOiBGaWxlVHlwZSkge1xuICAgIHRoaXMuZmlsZVR5cGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBmaWxlVHlwZUxhYmVsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmlsZVR5cGUgPT09ICdjc3YnKSByZXR1cm4gJ0NTVic7XG4gICAgaWYgKHRoaXMuZmlsZVR5cGUgPT09ICd4bHN4JykgcmV0dXJuICdYTFNYJztcbiAgICByZXR1cm4gJ0Nob29zZSBGaWxlJztcbiAgfVxuXG4gIHByaXZhdGUgb3JkaW5hbChuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcobikucGFkU3RhcnQoMiwgJzAnKTtcbiAgfVxuXG4gIGdldCBoZWxwZXJUZXh0KCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmZyZXF1ZW5jeSkge1xuICAgICAgY2FzZSAnZGFpbHknOlxuICAgICAgICByZXR1cm4gJ1JlcG9ydCBzZW50IGRhaWx5JztcbiAgICAgIGNhc2UgJ3dlZWtseSc6IHtcbiAgICAgICAgaWYgKCF0aGlzLmRheXNPZldlZWsubGVuZ3RoKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi50aGlzLmRheXNPZldlZWtdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgY29uc3QgbmFtZXMgPSBzb3J0ZWQubWFwKChkKSA9PiBEQVlfTkFNRVNbZF0pO1xuICAgICAgICBjb25zdCBqb2luZWQgPSBuYW1lcy5sZW5ndGggPiAxXG4gICAgICAgICAgPyBgJHtuYW1lcy5zbGljZSgwLCAtMSkuam9pbignLCAnKX0gYW5kICR7bmFtZXNbbmFtZXMubGVuZ3RoIC0gMV19YFxuICAgICAgICAgIDogbmFtZXNbMF07XG4gICAgICAgIHJldHVybiBgUmVwb3J0IHdpbGwgYmUgc2VudCBldmVyeSAke2pvaW5lZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnbW9udGhseSc6IHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGVzT2ZNb250aC5sZW5ndGgpIHJldHVybiAnJztcbiAgICAgICAgY29uc3Qgc29ydGVkID0gWy4uLnRoaXMuZGF0ZXNPZk1vbnRoXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGNvbnN0IGpvaW5lZCA9IHNvcnRlZC5tYXAoKGQpID0+IGAke3RoaXMub3JkaW5hbChkKX0ke3RoaXMuZGF5U3VmZml4KGQpfWApLmpvaW4oJywgJyk7XG4gICAgICAgIHJldHVybiBgUmVwb3J0cyB3aWxsIGJlIHNlbnQgb24gJHtqb2luZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29uY2UnOiB7XG4gICAgICAgIGlmICghdGhpcy5vbmNlRGF0ZSkgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gYFJlcG9ydCB3aWxsIGJlIHNlbnQgb25jZSBvbiAke3RoaXMuZm9ybWF0T25jZURhdGUodGhpcy5vbmNlRGF0ZSl9YDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRheVN1ZmZpeChuOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChuID49IDExICYmIG4gPD0gMTMpIHJldHVybiAndGgnO1xuICAgIHN3aXRjaCAobiAlIDEwKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiAnc3QnO1xuICAgICAgY2FzZSAyOiByZXR1cm4gJ25kJztcbiAgICAgIGNhc2UgMzogcmV0dXJuICdyZCc7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ3RoJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE9uY2VEYXRlKGRhdGVTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHMgPSBkYXRlU3RyLnNwbGl0KCctJyk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIGRhdGVTdHI7XG4gICAgY29uc3QgW3llYXIsIG1vbnRoLCBkYXldID0gcGFydHM7XG4gICAgY29uc3QgbW9udGhOYW1lID0gTU9OVEhfTkFNRVNbTnVtYmVyKG1vbnRoKSAtIDFdIHx8ICcnO1xuICAgIHJldHVybiBgJHtkYXl9ICR7bW9udGhOYW1lfSwgJHt5ZWFyfWA7XG4gIH1cblxuICBnZXQgaXNTYXZlRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc2F2aW5nKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucmVwb3J0TmFtZT8udHJpbSgpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuZmlsZVR5cGUpIHJldHVybiB0cnVlO1xuICAgIGlmICghdGhpcy5lbWFpbExpc3QubGVuZ3RoIHx8IHRoaXMuZW1haWxWYWxpZGF0aW9uLmluY2x1ZGVzKGZhbHNlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnd2Vla2x5JyAmJiAhdGhpcy5kYXlzT2ZXZWVrLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScgJiYgIXRoaXMuZGF0ZXNPZk1vbnRoLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgLy8gRG9lcyBOb3QgUmVwZWF0OiBvbmx5IGEgc3RyaWN0bHkgRlVUVVJFIGRhdGUgc2F2ZXMgKHRvZGF5L3Bhc3QgcmVzdHJpY3RlZCkuXG4gICAgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnb25jZScgJiYgKCF0aGlzLm9uY2VEYXRlIHx8IHRoaXMub25jZURhdGUgPCB0aGlzLm1pbk9uY2VEYXRlKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb25DYW5jZWwoKSB7XG4gICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNjaGVkdWxlUGF5bG9hZCgpOiBhbnkge1xuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBmcmVxdWVuY3k6IHRoaXMuZnJlcXVlbmN5LFxuICAgICAgdGltZTogdGhpcy50aW1lIHx8ICcwOTowMCcsXG4gICAgICBmaWxlVHlwZTogdGhpcy5maWxlVHlwZSxcbiAgICAgIHJlY2VpdmVyczogdGhpcy5lbWFpbExpc3RcbiAgICB9O1xuICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ3dlZWtseScpIHtcbiAgICAgIHBheWxvYWQuZGF5c09mV2VlayA9IHRoaXMuZGF5c09mV2VlaztcbiAgICB9IGVsc2UgaWYgKHRoaXMuZnJlcXVlbmN5ID09PSAnbW9udGhseScpIHtcbiAgICAgIHBheWxvYWQuZGF0ZXNPZk1vbnRoID0gdGhpcy5kYXRlc09mTW9udGg7XG4gICAgfSBlbHNlIGlmICh0aGlzLmZyZXF1ZW5jeSA9PT0gJ29uY2UnKSB7XG4gICAgICBwYXlsb2FkLm9uY2VEYXRlID0gdGhpcy5vbmNlRGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBvblN1Ym1pdCgpIHtcbiAgICBpZiAodGhpcy5pc1NhdmVEaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm5hbWVFcnJvciA9ICcnO1xuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IG5hbWVDaGFuZ2VkID0gdGhpcy5yZXBvcnROYW1lLnRyaW0oKSAhPT0gKHRoaXMudGVtcGxhdGU/LnRlbXBsYXRlTmFtZSB8fCAnJyk7XG4gICAgaWYgKG5hbWVDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmFwaVNlcnZpY2UudXBkYXRlQ3VzdG9tUmVwb3J0VGVtcGxhdGUodGhpcy50ZW1wbGF0ZT8uX2lkLCB7IHRlbXBsYXRlTmFtZTogdGhpcy5yZXBvcnROYW1lLnRyaW0oKSB9KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZlU2NoZWR1bGUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGVycj8uc3RhdHVzID09PSA0MDkpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZUVycm9yID0gJ1JlcG9ydCBuYW1lIGFscmVhZHkgZXhpc3RzLiBDaG9vc2UgYSBkaWZmZXJlbnQgbmFtZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciB1cGRhdGluZyByZXBvcnQgbmFtZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2F2ZVNjaGVkdWxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlU2NoZWR1bGUoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5idWlsZFNjaGVkdWxlUGF5bG9hZCgpO1xuICAgIHRoaXMuYXBpU2VydmljZS51cGRhdGVDdXN0b21SZXBvcnRTY2hlZHVsZSh0aGlzLnRlbXBsYXRlPy5faWQsIHBhcmFtcykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbC5jbG9zZSh7IHR5cGU6ICdzYXZlJyB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3Rlci5nZXRFcnJvclRvYXN0KGVyci5lcnJvcj8uZXJyb3IgfHwgZXJyLmVycm9yPy5tZXNzYWdlIHx8ICdFcnJvciB1cGRhdGluZyByZXBvcnQgc2NoZWR1bGUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSIsIjwhLS0gU2FtZSBtYXJrdXAvY2xhc3NlcyBhcyB0aGUgUmVwb3J0cyBwYWdlJ3MgXCJDdXN0b20gUmVwb3J0IENvbmZpZ3VyYXRpb25cIiBtb2RhbFxuICAgICAodGFuZ28tYW5hbHlzZS1yZXBvcnQgY3VzdG9tLXJlcG9ydC12aWV3ICNzY2hlZHVsZU1vZGFsKSwgcGVyIEZpZ21hLCBzbyBib3RoIHBvcHVwc1xuICAgICBsb29rIGlkZW50aWNhbDsgb25seSB0aGUgYmluZGluZ3MgZGlmZmVyICh0aGlzIGNvbXBvbmVudCdzIG93biBmaWVsZC9tZXRob2QgbmFtZXMpLiAtLT5cbjxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci0wIHNjaGVkdWxlLWNvbmZpZy1tb2RhbFwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyIGZ3LWJvbGRcIj5DdXN0b20gUmVwb3J0IENvbmZpZ3VyYXRpb248L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIHNjaGVkdWxlLWNsb3NlXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiB0aXRsZT1cIkNsb3NlXCI+XG4gICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTUgNUw1IDE1TTUgNUwxNSAxNVwiIHN0cm9rZT1cIiMxMDE4MjhcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCIgZm9yPVwic2NoZWR1bGUtbmFtZVwiPkVudGVyIFJlcG9ydCBOYW1lPC9sYWJlbD5cbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic2NoZWR1bGUtbmFtZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG10LTIgc2NoZWR1bGUtZmllbGRcIiBbKG5nTW9kZWwpXT1cInJlcG9ydE5hbWVcIlxuICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgPGRpdiAqbmdJZj1cIm5hbWVFcnJvclwiIGNsYXNzPVwidGV4dC1kYW5nZXIgbXQtMlwiPnt7IG5hbWVFcnJvciB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm10LTZcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInN1Yi1oZWFkZXJcIj5TY2hlZHVsZTwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtdC0yIHNjaGVkdWxlLXJvdy1nYXBcIj5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImQtaW5saW5lLWJsb2NrIHNjaGVkdWxlLWZyZXFcIiBbY2xhc3MuZmxleC1ncm93LTFdPVwiZnJlcXVlbmN5ID09PSAnZGFpbHknXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBuZ2JEcm9wZG93blRvZ2dsZSBbZGlzYWJsZWRdPVwiIWVkaXRNb2RlXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyBzY2hlZHVsZUxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgY2xhc3M9XCJzY2hlZHVsZS1jaGV2cm9uXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdkYWlseScpXCI+RGFpbHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCd3ZWVrbHknKVwiPldlZWtseTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbmdiRHJvcGRvd25JdGVtIChjbGljayk9XCJzZWxlY3RGcmVxdWVuY3koJ21vbnRobHknKVwiPk1vbnRobHk8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RnJlcXVlbmN5KCdvbmNlJylcIj5Eb2VzIE5vdCBSZXBlYXQ8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgc2NoZWR1bGUtcGlja1wiICpuZ0lmPVwiZnJlcXVlbmN5ID09PSAnd2Vla2x5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGUgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFkYXlzT2ZXZWVrLmxlbmd0aFwiIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG11bHRpU2VsZWN0TGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInNjaGVkdWxlLWNoZXZyb25cIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk01IDcuNUwxMCAxMi41TDE1IDcuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgY2xhc3M9XCJjaGVja2JveC1kcm9wZG93bi1tZW51XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLWNoZWNrLWN1c3RvbSBmb3JtLWNoZWNrLXNvbGlkIHB4LTMgcHktMVwiICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5T3B0aW9uc1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgW2lkXT1cIidkYXktJyArIGRheS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0RheVNlbGVjdGVkKGRheS52YWx1ZSlcIiAoY2hhbmdlKT1cInRvZ2dsZURheShkYXkudmFsdWUpXCIgLz5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbCBjdXJzb3ItcG9pbnRlclwiIFtmb3JdPVwiJ2RheS0nICsgZGF5LnZhbHVlXCI+e3sgZGF5LmxhYmVsIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERvZXMgTm90IFJlcGVhdDogYSByZWFsIGRhdGUgcGlja2VyLCBmdXR1cmUgZGF0ZXMgb25seSAobWluID0gdG9tb3Jyb3c7XG4gICAgICAgICAgICAgdG9kYXkgaXRzZWxmIGlzIHJlc3RyaWN0ZWQgLS0gcHJvZHVjdCBydWxlIDIwMjYtMDgtMzEpLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNjaGVkdWxlLXBpY2tcIiAqbmdJZj1cImZyZXF1ZW5jeSA9PT0gJ29uY2UnXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJzY2hlZHVsZS1zZWxlY3Qgdy0xMDBcIiBbbWluXT1cIm1pbk9uY2VEYXRlXCIgW2Rpc2FibGVkXT1cIiFlZGl0TW9kZVwiIFsobmdNb2RlbCldPVwib25jZURhdGVcIiAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCIgY2xhc3M9XCJkLWlubGluZS1ibG9jayBzY2hlZHVsZS1waWNrXCIgKm5nSWY9XCJmcmVxdWVuY3kgPT09ICdtb250aGx5J1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0IHctMTAwXCIgbmdiRHJvcGRvd25Ub2dnbGUgW2NsYXNzLmlzLXBsYWNlaG9sZGVyXT1cIiFkYXRlc09mTW9udGgubGVuZ3RoXCIgW2Rpc2FibGVkXT1cIiFlZGl0TW9kZVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgbXVsdGlTZWxlY3RMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIGNsYXNzPVwic2NoZWR1bGUtY2hldnJvblwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTUgNy41TDEwIDEyLjVMMTUgNy41XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBjbGFzcz1cImNoZWNrYm94LWRyb3Bkb3duLW1lbnVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tY2hlY2stY3VzdG9tIGZvcm0tY2hlY2stc29saWQgcHgtMyBweS0xXCIgKm5nRm9yPVwibGV0IGRhdGUgb2YgZGF0ZU9wdGlvbnNcIj5cbiAgICAgICAgICAgICAgPCEtLSBEb2VzIE5vdCBSZXBlYXQ6IGRheXMgYWxyZWFkeSBwYXN0IHRoaXMgbW9udGggYXJlIGRpc2FibGVkLiAtLT5cbiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIFtpZF09XCInZGF0ZS0nICsgZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2xhc3MuY3Vyc29yLXBvaW50ZXJdPVwiIWlzRGF0ZURpc2FibGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0RhdGVEaXNhYmxlZChkYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0RhdGVTZWxlY3RlZChkYXRlKVwiIChjaGFuZ2UpPVwidG9nZ2xlRGF0ZShkYXRlKVwiIC8+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBbZm9yXT1cIidkYXRlLScgKyBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jdXJzb3ItcG9pbnRlcl09XCIhaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnRleHQtbXV0ZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImlzRGF0ZURpc2FibGVkKGRhdGUpID8gJ1Bhc3QgZGF0ZXMgY2Fubm90IGJlIHNjaGVkdWxlZCcgOiAnJ1wiPnt7IGRhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ViLWhlYWRlciBtYi0wIHNjaGVkdWxlLWF0XCI+YXQ8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCI+XG4gICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInNjaGVkdWxlLXNlbGVjdCB0aW1lLXNlbGVjdFwiIFsobmdNb2RlbCldPVwidGltZVwiIFtkaXNhYmxlZF09XCIhZWRpdE1vZGVcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiB0aW1lT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQudmFsdWUgfX08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInRpbWUtaWNvblwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMCA1VjEwTDEzLjMzMzMgMTEuNjY2N00xOC4zMzMzIDEwQzE4LjMzMzMgMTQuNjAyNCAxNC42MDI0IDE4LjMzMzMgMTAgMTguMzMzM0M1LjM5NzYzIDE4LjMzMzMgMS42NjY2NyAxNC42MDI0IDEuNjY2NjcgMTBDMS42NjY2NyA1LjM5NzYzIDUuMzk3NjMgMS42NjY2NyAxMCAxLjY2NjY3QzE0LjYwMjQgMS42NjY2NyAxOC4zMzMzIDUuMzk3NjMgMTguMzMzMyAxMFpcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gQWx3YXlzIHJlbmRlcmVkOiB0aGUgYXBwZWFyaW5nL2Rpc2FwcGVhcmluZyBoZWxwZXIgbGluZSByZXNpemVkIHRoZVxuICAgICAgICAgICBjZW50ZXJlZCBtb2RhbCBhbmQgbWFkZSBpdCBqdW1wIG9uIGV2ZXJ5IHNlbGVjdGlvbiAoUUEgMjAyNi0wOS0wMSkuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNjaGVkdWxlLWhlbHBlciBtdC0yXCI+e3sgaGVscGVyVGV4dCB9fSZuYnNwOzwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm10LTZcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cInN1Yi1oZWFkZXJcIj5GaWxlIFR5cGU8L2xhYmVsPlxuICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImQtYmxvY2sgbXQtMlwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNjaGVkdWxlLXNlbGVjdCB3LTEwMFwiIG5nYkRyb3Bkb3duVG9nZ2xlIFtjbGFzcy5pcy1wbGFjZWhvbGRlcl09XCIhZmlsZVR5cGVcIiBbZGlzYWJsZWRdPVwiIWVkaXRNb2RlXCI+XG4gICAgICAgICAgPHNwYW4+e3sgZmlsZVR5cGVMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cInNjaGVkdWxlLWNoZXZyb25cIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVMMTAgMTIuNUwxNSA3LjVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBuZ2JEcm9wZG93bkl0ZW0gKGNsaWNrKT1cInNlbGVjdEZpbGVUeXBlKCdjc3YnKVwiPkNTVjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAoY2xpY2spPVwic2VsZWN0RmlsZVR5cGUoJ3hsc3gnKVwiPlhMU1g8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtdC02XCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJzdWItaGVhZGVyXCIgZm9yPVwic2NoZWR1bGUtcmVjZWl2ZXJzXCI+UmVjZWl2ZXJzIEVtYWlsIDxzcGFuIGNsYXNzPVwic2NoZWR1bGUtcmVxdWlyZWRcIj4qPC9zcGFuPjwvbGFiZWw+XG4gICAgICA8IS0tIENsaWNraW5nIGFueXdoZXJlIGluIHRoZSBib3ggZm9jdXNlcyB0aGUgZW1haWwgaW5wdXQgKHVzZXIgcmVxdWVzdCAyMDI2LTA5LTAxKS4gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sIG10LTIgZC1mbGV4IGZsZXgtd3JhcCBhbGlnbi1pdGVtcy1zdGFydCBzY2hlZHVsZS1yZWNlaXZlcnMtYm94IHNjaGVkdWxlLWZpZWxkLWJveFwiXG4gICAgICAgICAgIFtjbGFzcy5zY2hlZHVsZS1ib3gtZGlzYWJsZWRdPVwiIWVkaXRNb2RlXCJcbiAgICAgICAgICAgKGNsaWNrKT1cImVkaXRNb2RlICYmIGVtYWlsSW5wdXRFbC5mb2N1cygpXCI+XG4gICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBlbWFpbCBvZiBlbWFpbExpc3Q7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJhZGdlIGJhZGdlLWxpZ2h0IGQtaW5saW5lLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAge3sgZW1haWwgfX1cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImVkaXRNb2RlXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBtcy0yXCIgKGNsaWNrKT1cInJlbW92ZUNoaXAoaSlcIj4mdGltZXM7PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwhLS0gYXV0b2NvbXBsZXRlPVwib2ZmXCI6IENocm9tZSBvdGhlcndpc2UgYXV0b2ZpbGxzIHRoZSBqdXN0LWFkZGVkIGFkZHJlc3MgYmFja1xuICAgICAgICAgICAgIGludG8gdGhlIGZpZWxkIChibHVlIGF1dG9maWxsIGJhY2tncm91bmQpIGFmdGVyIEVudGVyIGNsZWFycyBpdC4gLS0+XG4gICAgICAgIDxpbnB1dCAjZW1haWxJbnB1dEVsIHR5cGU9XCJlbWFpbFwiIGlkPVwic2NoZWR1bGUtcmVjZWl2ZXJzXCIgY2xhc3M9XCJib3JkZXItMCBmbGV4LWdyb3ctMSBzY2hlZHVsZS1lbWFpbC1pbnB1dFwiXG4gICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRNb2RlXCJcbiAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImVtYWlsVmFsaWRhdGlvbi5pbmNsdWRlcyhmYWxzZSlcIiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTJcIj5JbnZhbGlkIEVtYWlsIEZvcm1hdDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtdC04XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBzY2hlZHVsZS1idG4tY2FuY2VsIHctNTAgbWUtMlwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICA8IS0tIFZpZXcgbW9kZSAoZXhpc3Rpbmcgc2NoZWR1bGUpOiBwYWxlLWJsdWUgRWRpdCB1bmxvY2tzIHRoZSBmaWVsZHMuIC0tPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0TW9kZVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBzY2hlZHVsZS1idG4tZWRpdCB3LTUwIG1zLTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRNb2RlID0gdHJ1ZVwiPlxuICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE5IDE5XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTJcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTguMjUgMi41MTc3N0gyLjQxNjY3QzEuOTc0NjQgMi41MTc3NyAxLjU1MDcyIDIuNjkzMzYgMS4yMzgxNiAzLjAwNTkyQzAuOTI1NTk1IDMuMzE4NDggMC43NSAzLjc0MjQxIDAuNzUgNC4xODQ0M1YxNS44NTExQzAuNzUgMTYuMjkzMSAwLjkyNTU5NSAxNi43MTcxIDEuMjM4MTYgMTcuMDI5NkMxLjU1MDcyIDE3LjM0MjIgMS45NzQ2NCAxNy41MTc4IDIuNDE2NjcgMTcuNTE3OEgxNC4wODMzQzE0LjUyNTQgMTcuNTE3OCAxNC45NDkzIDE3LjM0MjIgMTUuMjYxOCAxNy4wMjk2QzE1LjU3NDQgMTYuNzE3MSAxNS43NSAxNi4yOTMxIDE1Ljc1IDE1Ljg1MTFWMTAuMDE3OE0xNC41IDEuMjY3NzdDMTQuODMxNSAwLjkzNjI0NiAxNS4yODEyIDAuNzUgMTUuNzUgMC43NUMxNi4yMTg4IDAuNzUgMTYuNjY4NSAwLjkzNjI0NiAxNyAxLjI2Nzc3QzE3LjMzMTUgMS41OTkyOSAxNy41MTc4IDIuMDQ4OTMgMTcuNTE3OCAyLjUxNzc3QzE3LjUxNzggMi45ODY2MSAxNy4zMzE1IDMuNDM2MjUgMTcgMy43Njc3N0w5LjA4MzMzIDExLjY4NDRMNS43NSAxMi41MTc4TDYuNTgzMzMgOS4xODQ0M0wxNC41IDEuMjY3NzdaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICBFZGl0XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0TW9kZVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBzY2hlZHVsZS1idG4tc2F2ZSB3LTUwIG1zLTIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU2F2ZURpc2FibGVkXCIgKGNsaWNrKT1cIm9uU3VibWl0KClcIj5cbiAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1NhdmVEaXNhYmxlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDE3IDE3XCIgZmlsbD1cIm5vbmVcIiBjbGFzcz1cIm1lLTJcIj5cclxuICAgICAgICAgICAgPCEtLSBEZXNpZ24gYXNzZXQgSWNvbiAoMTEpLnN2ZyAtLT5cclxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMi42NjY3IDE2VjkuMzMzMzNINC4zMzMzM1YxNk00LjMzMzMzIDFWNS4xNjY2N0gxMU0xNC4zMzMzIDE2SDIuNjY2NjdDMi4yMjQ2NCAxNiAxLjgwMDcyIDE1LjgyNDQgMS40ODgxNiAxNS41MTE4QzEuMTc1NTkgMTUuMTk5MyAxIDE0Ljc3NTQgMSAxNC4zMzMzVjIuNjY2NjdDMSAyLjIyNDY0IDEuMTc1NTkgMS44MDA3MiAxLjQ4ODE2IDEuNDg4MTZDMS44MDA3MiAxLjE3NTU5IDIuMjI0NjQgMSAyLjY2NjY3IDFIMTEuODMzM0wxNiA1LjE2NjY3VjE0LjMzMzNDMTYgMTQuNzc1NCAxNS44MjQ0IDE1LjE5OTMgMTUuNTExOCAxNS41MTE4QzE1LjE5OTMgMTUuODI0NCAxNC43NzU0IDE2IDE0LjMzMzMgMTZaXCIgc3Ryb2tlPVwid2hpdGVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIFNhdmVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==