tango-app-ui-analyse-trax 4.0.55 → 4.0.56

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.
@@ -93,6 +93,8 @@ export class AuditV2ConfigureComponent {
93
93
  requirePhoto = false;
94
94
  requireAcknowledgment = false;
95
95
  redoExtension = 1;
96
+ /** Advance Configuration accordion: open on load; its header folds it. */
97
+ advOpen = true;
96
98
  // ---- audit-only fields (saved on auditconfig) ----
97
99
  passFailOn = true;
98
100
  passThreshold = 75;
@@ -1038,13 +1040,13 @@ export class AuditV2ConfigureComponent {
1038
1040
  return data;
1039
1041
  }
1040
1042
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2ConfigureComponent, deps: [{ token: i1.TraxService }, { token: i2.GlobalStateService }, { token: i3.ActivatedRoute }, { token: i3.Router }, { token: i4.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1041
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2ConfigureComponent, selector: "lib-audit-v2-configure", host: { listeners: { "document:keydown.escape": "onEscape()" } }, ngImport: i0, template: "<div class=\"av2-page audit-configure\">\r\n\r\n <!-- Back + breadcrumb (as the schedule editor's back bar) -->\r\n <div class=\"cf-backbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm cf-back\" (click)=\"back()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\r\n {{ backLabel }}\r\n </button>\r\n <div class=\"cf-crumb\">\r\n <a href=\"#\" (click)=\"back($event)\">Manage Audit</a> \u203A Configure\r\n </div>\r\n </div>\r\n\r\n <!-- Title + actions -->\r\n <div class=\"cf-header\">\r\n <div class=\"cf-header-text\">\r\n <span class=\"av2-sk av2-sk--title cf-sk-title\" *ngIf=\"loading\"></span>\r\n <div class=\"cf-title\" *ngIf=\"!loading\">{{ auditName || 'Audit' }}</div>\r\n <input type=\"text\" class=\"cf-desc\" placeholder=\"Enter Audit Description\" [(ngModel)]=\"description\">\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary cf-publish\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason || publishBlockedReason\" (click)=\"publish()\">\r\n {{ saving ? 'Saving\u2026' : (published ? 'Save & Publish' : 'Publish') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost cf-draft\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason\" (click)=\"saveDraft()\">Save as Draft</button>\r\n </div>\r\n\r\n <div class=\"cf-error cf-error--page\" *ngIf=\"loadError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ loadError }}\r\n </div>\r\n\r\n <!-- Chip picker: chips + input + suggestion list (one template, used for every user list) -->\r\n <ng-template #chipPicker let-list=\"list\" let-large=\"large\">\r\n <div class=\"cf-chipbox\" [class.cf-chipbox--lg]=\"large\" [class.is-open]=\"openChips === list\" (click)=\"focusChips(list, $event)\">\r\n <span class=\"cf-chip\" [class.cf-chip--lg]=\"large\" *ngFor=\"let u of chipsOf(list); let i = index\" [title]=\"u.e\">\r\n <span [class]=\"large ? 'cf-chip-tag' : 'cf-chip-ini'\">{{ u.i }}</span>{{ u.n }}\r\n <a class=\"cf-chip-x\" (click)=\"removeChip(list, i); $event.stopPropagation()\">\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <input type=\"text\" class=\"cf-chip-input\" [class.cf-chip-input--lg]=\"large\" placeholder=\"Add user...\"\r\n [ngModel]=\"draftOf(list)\" (ngModelChange)=\"setDraft(list, $event)\" (focus)=\"focusChips(list, $event)\" (keyup.enter)=\"addChip(list)\">\r\n <div class=\"cf-suggest\" *ngIf=\"openChips === list\">\r\n <div class=\"cf-suggest-item\" *ngFor=\"let u of suggestions(list)\" (click)=\"addSuggestion(list, u, $event)\">\r\n <span class=\"cf-chip-ini\">{{ u.i }}</span>\r\n <span class=\"cf-suggest-name\">{{ u.n }}</span>\r\n <span class=\"cf-suggest-mail\">{{ u.e }}</span>\r\n </div>\r\n <div class=\"cf-suggest-empty\" *ngIf=\"!suggestions(list).length\">\r\n {{ users.length ? 'No matching user' : 'No users for this client' }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Dropdown: styled like the prototype instead of the browser's native select -->\r\n <ng-template #dropdown let-key=\"key\" let-options=\"options\">\r\n <span class=\"cf-select\" [class.is-open]=\"openSelect === key\">\r\n <button type=\"button\" class=\"cf-select-btn\" (click)=\"toggleSelect(key, $event)\">\r\n {{ selectLabel(key, options) }}\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"cf-select-menu\" *ngIf=\"openSelect === key\">\r\n <div class=\"cf-select-item\" *ngFor=\"let o of options\" [class.is-on]=\"isPicked(key, o)\"\r\n (click)=\"pick(key, o, $event)\">{{ o.label }}</div>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"cf-body\" *ngIf=\"!loadError\">\r\n <!-- Section tree -->\r\n <aside class=\"cf-left\">\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"cf-left-title\">{{ auditName || 'Audit' }}</div>\r\n\r\n <div class=\"cf-hint\" *ngIf=\"!sections.length\">No questions yet</div>\r\n <ng-container *ngFor=\"let s of sections\">\r\n <div class=\"cf-section\" [class.is-open]=\"s.open\" (click)=\"toggleSection(s)\">\r\n {{ s.label }}\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!s.open\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"cf-items\" *ngIf=\"s.open && s.items.length\">\r\n <div *ngFor=\"let it of s.items\">{{ it }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Schedule block (QA 10 Oct): audits have no one-time / repeat schedule here; visits come from Schedules. -->\r\n </ng-container>\r\n </aside>\r\n\r\n <!-- Configuration -->\r\n <div class=\"cf-right\">\r\n\r\n <section class=\"cf-card\" *ngIf=\"loading\">\r\n <lib-audit-v2-shimmer [rows]=\"4\"></lib-audit-v2-shimmer>\r\n </section>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n\r\n <!-- ===== Advance Configuration ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-head\">\r\n <span class=\"cf-block-title\">Advance Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </span>\r\n </div>\r\n\r\n <!-- Audit Owner -->\r\n <div>\r\n <div class=\"cf-label\">Audit Owner</div>\r\n <div class=\"cf-hint\">Owners get access to manage the audit</div>\r\n </div>\r\n <div class=\"cf-row\">\r\n <span class=\"cf-field\">Can be managed by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'owners', large: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Approver -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Approver</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"approverOn\" (click)=\"toggleApprover()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be able to approve the audit</div>\r\n <div class=\"cf-row\" *ngIf=\"approverOn\">\r\n <span class=\"cf-field\">To be approved by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'approvers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"approverError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ approverError }}\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so the {{ approvers.length }} approver{{ approvers.length === 1 ? '' : 's' }} added will be removed when you save. Turn Approver back on to keep {{ approvers.length === 1 ? 'it' : 'them' }}.\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && !approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so submitted audits are not sent for approval. Turn it on to add approvers or to send flags and reports to them.\r\n </div>\r\n\r\n <!-- Reminder -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Reminder</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"reminderOn\" (click)=\"toggleReminder()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be reminded in the selected interval</div>\r\n <div class=\"cf-inner\" *ngIf=\"reminderOn\">\r\n <div class=\"cf-inline\">\r\n Notify user before\r\n <span class=\"cf-reminder\" *ngFor=\"let m of reminders; let i = index\">\r\n <lib-audit-v2-select class=\"cf-reminder-select\" [value]=\"m\" [options]=\"reminderOpts[i] || []\" [searchable]=\"false\"\r\n [ariaLabel]=\"'Reminder ' + (i + 1) + ' in minutes'\" (changed)=\"setReminder(i, $event.target.value)\"></lib-audit-v2-select>\r\n <a class=\"cf-chip-x\" *ngIf=\"reminders.length > 1\" title=\"Remove reminder\" (click)=\"removeReminder(i)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <button type=\"button\" class=\"cf-icon-btn\" *ngIf=\"reminders.length < maxReminders\" title=\"Add reminder\" (click)=\"addReminder()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Send alerts {{ reminderSummary }} mins before the audit end time\r\n </div>\r\n </div>\r\n\r\n <!-- Notify Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"notifyFlagsOn\" (click)=\"toggleNotifyFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, all flags will be sent as an email</div>\r\n <ng-container *ngIf=\"notifyFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !notifySendApprover\" (click)=\"toggleSendApprover('notifySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendApprover\">\r\n <svg *ngIf=\"notifySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"notifySendCustom = !notifySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendCustom\">\r\n <svg *ngIf=\"notifySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"notifySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'notifyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-error\" *ngIf=\"notifyFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ notifyFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Notify on Recurring Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify on Recurring Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"recurringFlagsOn\" (click)=\"toggleRecurringFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">When enabled, emails are sent for recurring flags based on the configured threshold</div>\r\n\r\n <div class=\"cf-inner\" *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-inline\">\r\n Send Email if the same question is flagged\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'recurringThreshold', options: thresholdOpts }\"></ng-container>\r\n times by the same store\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Once the threshold is reached and an email is sent, the flag count resets to zero\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !recurringSendApprover\" (click)=\"toggleSendApprover('recurringSendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendApprover\">\r\n <svg *ngIf=\"recurringSendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"toggleRecurringCustom()\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendCustom\">\r\n <svg *ngIf=\"recurringSendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n <label class=\"cf-check\" (click)=\"recurringSameAsNotify = !recurringSameAsNotify\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSameAsNotify\">\r\n <svg *ngIf=\"recurringSameAsNotify\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Use same users from Notify Flags\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"recurringSendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'recurringUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-info\" *ngIf=\"recurringSameAsNotify\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n {{ notifyRecipientsLabel }}\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"recurringFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ recurringFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Daily report -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Enable - Daily Report</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"dailyReportOn\" (click)=\"toggleDailyReport()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By Enabling, compliance score will be sent as an email to the above users</div>\r\n <ng-container *ngIf=\"dailyReportOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !dailySendApprover\" (click)=\"toggleSendApprover('dailySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendApprover\">\r\n <svg *ngIf=\"dailySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"dailySendCustom = !dailySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendCustom\">\r\n <svg *ngIf=\"dailySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"dailySendCustom\">\r\n <div class=\"cf-bulkbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openDailyBulk()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n Bulk Upload\r\n </button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'dailyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <label class=\"cf-check\" (click)=\"sharePostApproval = !sharePostApproval\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"sharePostApproval\">\r\n <svg *ngIf=\"sharePostApproval\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Share Report Post Approval\r\n </label>\r\n <div class=\"cf-error\" *ngIf=\"dailyReportError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ dailyReportError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Export submission: Tango users only, as the v1 Configure (its stored value is kept for everyone else). -->\r\n <div class=\"cf-grid2\" *ngIf=\"access.isTango\">\r\n <div class=\"cf-stack cf-stack--tight\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Export Submission</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"exportSubmissionOn\" (click)=\"exportSubmissionOn = !exportSubmissionOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint\">Enable this to allow audit submitters to download their submission as a PDF file</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Redo validity -->\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Validity</div>\r\n <div class=\"cf-inline\">\r\n Redo valid for\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoValidFor', options: redoDayOpts }\"></ng-container>\r\n Day from Redo creation\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Auto create task -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Auto Create Task for Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"autoCreateTaskOn\" (click)=\"autoCreateTaskOn = !autoCreateTaskOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, a task is automatically created for every flagged question in the audit</div>\r\n\r\n <!-- Who gets the task and how long it stays open (as the Checklist Configure page) -->\r\n <div class=\"cf-autotask\" *ngIf=\"autoCreateTaskOn\">\r\n <div class=\"cf-autotask-title\">Task Assignee</div>\r\n <div class=\"cf-hint cf-hint--tight\">Choose who the flagged task is assigned to</div>\r\n <div class=\"cf-autotask-choices\">\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'submitter'\" (click)=\"taskAssignee = 'submitter'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'submitter'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Audit Submitter</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user who filled the audit</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'store'\" (click)=\"taskAssignee = 'store'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'store'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Store User</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user mapped to the flagged store</span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cf-autotask-title\">Task Validity</div>\r\n <div class=\"cf-autotask-validity\">\r\n <span>Task valid for</span>\r\n <lib-audit-v2-select class=\"cf-validity-select\" [(ngModel)]=\"taskValidity\" [options]=\"taskValidityOptions\"\r\n [searchable]=\"false\" ariaLabel=\"Task validity in days\"></lib-audit-v2-select>\r\n <span>days from task creation</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Audit Configuration ===== -->\r\n <div class=\"cf-divider-head\">\r\n <span class=\"cf-block-title\">Audit Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n </div>\r\n\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Submission &amp; Visibility</div>\r\n\r\n <!-- cf-box--open: the dispute-window and response-delay menus must not be clipped by the box -->\r\n <div class=\"cf-box cf-box--open\">\r\n <div class=\"cf-box-row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"showResponseInApp\"\r\n (click)=\"showResponseInApp = !showResponseInApp\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Show Response in Mobile App</div>\r\n <div class=\"cf-hint\">By enabling this option, store users can view the audit response in the Mobile App.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sub\" *ngIf=\"showResponseInApp\">\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Response Visibility</div>\r\n <div class=\"cf-hint\">Choose when the response becomes visible to store users</div>\r\n </div>\r\n\r\n <div class=\"cf-options\">\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'pre'\" (click)=\"responseVisibility = 'pre'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'pre'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\">Pre-approval</div>\r\n <div class=\"cf-hint\">The audit response will be visible to store users before it is approved.</div>\r\n <div class=\"cf-inline cf-inline--top\">\r\n Show response\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'respDelay', options: respDelayOpts }\"></ng-container>\r\n after submission\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'post'\" (click)=\"responseVisibility = 'post'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'post'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\" [class.cf-muted]=\"responseVisibility !== 'post'\">Post-approval</div>\r\n <div class=\"cf-hint\">Once the response is approved, it will automatically be displayed in the Mobile App. Store users cannot raise a dispute.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sep\">\r\n <ng-container *ngIf=\"responseVisibility === 'pre'\">\r\n <div class=\"cf-box-row cf-box-row--flush\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"disputeOn\" (click)=\"disputeOn = !disputeOn\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Dispute Configuration</div>\r\n <div class=\"cf-hint cf-hint--wrap\">When enabled, the store team can raise a dispute against the auditor's submission once the response becomes visible to them.</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--nested\" *ngIf=\"disputeOn\">\r\n <div class=\"cf-inline\">\r\n Dispute window\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'disputeWindow', options: dispWindowOpts }\"></ng-container>\r\n from when the response becomes visible\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes raised inside this window go to the approver. Approved disputes revise the answer and the compliance score.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"!hasApprovers\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n No approver is set, so no one can review disputes. Turn on Approver and add an approver.\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"responseVisibility === 'post'\">\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm cf-muted\">Dispute Configuration</div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes are not available when responses are shown post-approval.\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Pre-submission access -->\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pre-Submission Access</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"preSubmissionAccessOn\" (click)=\"preSubmissionAccessOn = !preSubmissionAccessOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Users added here can view Open and In Progress audits until submission. The Schedule Info tab is also visible only to these users.</div>\r\n <ng-container *ngIf=\"preSubmissionAccessOn\">\r\n <div class=\"cf-row cf-row--top\">\r\n <span class=\"cf-field\">Visible to</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'preSubmissionUsers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error cf-error--indent\" *ngIf=\"preSubmissionEmpty\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n Add at least one user\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Scoring ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Scoring</div>\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pass/Fail Score Setup</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"passFailOn\" (click)=\"passFailOn = !passFailOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Set the compliance score an audit must reach to be marked {{ passLabel }}. Anything below it is marked {{ failLabel }}.</div>\r\n <div class=\"cf-row cf-row--wrap cf-row--top\" *ngIf=\"passFailOn\">\r\n <span class=\"cf-field\">Minimum score to {{ passLabel }}</span>\r\n <label class=\"cf-num\">\r\n <input type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"passThreshold\">\r\n <span>%</span>\r\n </label>\r\n <span class=\"cf-pill cf-pill--pass\">{{ passLabel }} \u2265 {{ passThreshold }}%</span>\r\n <span class=\"cf-pill cf-pill--fail\">{{ failLabel }} &lt; {{ passThreshold }}%</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Approver Controls ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Approver Controls</div>\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Edit Submitted Audit</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"editSubmittedOn\" (click)=\"toggleEditSubmitted()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">Allow Approvers to edit submitted Audit</div>\r\n <ng-container *ngIf=\"editSubmittedOn\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'editUsers', large: true }\"></ng-container>\r\n <div class=\"cf-error\" *ngIf=\"editSubmittedError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ editSubmittedError }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Extension</div>\r\n <div class=\"cf-inline\">\r\n Extend redo up to\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoExtension', options: redoExtensionOpts }\"></ng-container>\r\n Days till approval\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== User Verification ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-title\">User Verification Configuration</div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requirePhoto\" (click)=\"requirePhoto = !requirePhoto\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require Photo Capture</div>\r\n <div class=\"cf-hint\">By enabling, users must capture their photo to complete submission</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requireAcknowledgment\" (click)=\"requireAcknowledgment = !requireAcknowledgment\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require User Acknowledgment</div>\r\n <div class=\"cf-hint\">By enabling, users must type their name as acknowledgment to complete submission</div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Daily Report > Custom: bulk upload users (as the Checklist Configure page's popup) -->\r\n <ng-container *ngIf=\"dailyBulkOpen\">\r\n <div class=\"cf-dlg-backdrop\" (click)=\"closeDailyBulk()\"></div>\r\n <div class=\"cf-dlg\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"cf-dlg-title\">\r\n <span class=\"cf-dlg-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n </span>\r\n <div class=\"cf-dlg-title\" id=\"cf-dlg-title\">Bulk Upload</div>\r\n <div class=\"cf-dlg-steps\">\r\n <div>Step 1 - <a href=\"#\" (click)=\"$event.preventDefault(); downloadDailyTemplate()\">Download the template here</a></div>\r\n <div>Step 2 - Add the Email of existing users to the template</div>\r\n <div>Step 3 - Upload it below for processing</div>\r\n </div>\r\n <div class=\"cf-dlg-note\">\r\n **Note : Only the Email column is considered - the Username is taken from the existing user list.\r\n Only existing users of this client are accepted. On upload, all the existing data will be replaced.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"dailyBulkErrors.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n <div class=\"cf-dlg-errors\">\r\n <div>The file was not uploaded. Fix {{ dailyBulkErrors.length === 1 ? 'this row' : 'these rows' }} and upload again:</div>\r\n <div *ngFor=\"let e of dailyBulkErrors.slice(0, 5)\">{{ e }}</div>\r\n <div *ngIf=\"dailyBulkErrors.length > 5\">+{{ dailyBulkErrors.length - 5 }} more</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-dlg-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"closeDailyBulk()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" (click)=\"dailyBulkFile.click()\">Upload</button>\r\n <input #dailyBulkFile type=\"file\" accept=\".xlsx\" hidden (change)=\"onDailyBulkFile($event)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.cf-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.cf-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.cf-crumb{font-size:13px;line-height:20px;color:#667085}.cf-crumb a{font-weight:600;color:#00a3ff}.cf-header{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px;display:flex;align-items:center;gap:12px}.cf-header-text{display:flex;flex-direction:column;gap:4px;min-width:0}.cf-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.cf-sk-title{margin:3px 0}.cf-desc{border:none;outline:none;padding:0;background:transparent;font-family:inherit;font-size:13px;line-height:18px;color:#344054;min-width:320px}.cf-desc::placeholder{color:#98a2b3}.cf-publish{padding:0 20px;box-shadow:0 1px 2px #1018280d}.cf-draft{padding:0 18px;box-shadow:inset 0 0 0 1px #d0d5dd,0 1px 2px #1018280d}.cf-body{display:flex;gap:16px;align-items:flex-start}.cf-left{width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px;display:flex;flex-direction:column;gap:10px;position:sticky;top:calc(var(--bs-app-header-height, 0px) + 16px);max-height:calc(100vh - var(--bs-app-header-height, 0px) - 32px);overflow-y:auto;scrollbar-width:thin}.cf-left-title{font-size:14px;line-height:20px;font-weight:600;color:#101828}.cf-section{display:flex;align-items:center;gap:8px;padding:2px 0;font-size:13px;font-weight:500;color:#344054;cursor:pointer;white-space:nowrap}.cf-section.is-open{color:#1d2939}.cf-rule{flex:1;border-top:1px solid #EAECF0}.cf-chev{display:flex;color:#98a2b3}.cf-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.cf-chev .rotate{transform:rotate(-90deg)}.cf-items{display:flex;flex-direction:column;gap:8px;padding-left:12px;font-size:13px;color:#475467}.cf-schedule-title{font-size:14px;font-weight:600;color:#101828;margin-top:6px}.cf-schedule{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#475467}.cf-schedule>div{display:flex;align-items:center;gap:6px}.cf-right{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}.cf-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px;display:flex;flex-direction:column;gap:14px}.cf-card--lg{border-radius:8px}.cf-block-head{display:flex;align-items:center;gap:12px}.cf-block-title{font-size:15px;font-weight:600;color:#101828}.cf-divider-head{display:flex;align-items:center;gap:10px;margin-top:4px}.cf-label{font-size:14px;font-weight:600;color:#101828}.cf-label-sm{font-size:13px;font-weight:600;color:#101828}.cf-muted{color:#667085}.cf-hint{font-size:12px;line-height:18px;color:#667085}.cf-hint--tight{margin-top:-8px}.cf-hint--wrap{max-width:640px;text-wrap:pretty}.cf-field{font-size:13px;font-weight:500;color:#344054;min-width:150px;flex-shrink:0}.cf-row{display:flex;align-items:center;gap:12px}.cf-row--top{margin-top:6px}.cf-row--wrap{flex-wrap:wrap}.cf-stack{display:flex;flex-direction:column;gap:8px}.cf-stack--tight,.cf-stack--sm{gap:4px}.cf-stack--xs{gap:2px}.cf-grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.cf-toggle-row{display:flex;align-items:center;gap:10px}.cf-switch{width:36px;height:20px;padding:2px;border:none;border-radius:9999px;background:#eaecf0;display:flex;align-items:center;justify-content:flex-start;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.cf-switch>span{width:16px;height:16px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #1018280d}.cf-switch.is-on{background:#00a3ff;justify-content:flex-end}.cf-switch--top{margin-top:2px}.cf-chipbox{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:8px 10px}.cf-chipbox--lg{gap:8px;padding:10px 12px}.cf-chip{display:flex;align-items:center;gap:6px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;border-radius:9999px;padding:3px 8px;font-size:12px;color:#344054;white-space:nowrap;flex-shrink:0;max-width:100%}.cf-chip--lg{gap:8px;background:#fff;padding:5px 11px;font-size:13px;color:#1d2939}.cf-chip-ini{color:#00a3ff;font-weight:600;font-size:11px}.cf-chip-tag{display:inline-flex;align-items:center;justify-content:center;padding:1px 5px;border-radius:6px;background:#eaf8ff;color:#00a3ff;font-weight:700;font-size:11px;letter-spacing:.02em}.cf-chip-x{display:flex;cursor:pointer;color:#98a2b3}.cf-chip-x:hover{color:#344054}.cf-chip-input{flex:1;min-width:100px;border:none;outline:none;background:transparent;font-family:inherit;font-size:12px;color:#101828}.cf-chip-input::placeholder{color:#98a2b3}.cf-chip-input--lg{min-width:120px;font-size:13px}.cf-inner{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:8px}.cf-inline{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-inline--top{margin-top:2px}.cf-mini{height:32px;padding:0 28px 0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 8px center;outline:none}.cf-info{display:flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#667085}.cf-info svg{flex-shrink:0}.cf-info--wrap{align-items:flex-start;max-width:560px;text-wrap:pretty}.cf-info--wrap svg{margin-top:3px}.cf-checks{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-checks-label{font-weight:500}.cf-check{display:flex;align-items:center;gap:6px;margin:0;font-size:13px;color:#344054;cursor:pointer;-webkit-user-select:none;user-select:none}.cf-check-box{width:16px;height:16px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.cf-check-box.is-on{background:#00a3ff;box-shadow:none}.cf-box{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden;display:flex;flex-direction:column}.cf-box--pad{padding:14px 16px;gap:6px;overflow:visible}.cf-box--row{padding:14px 16px;flex-direction:row;align-items:flex-start;gap:12px}.cf-box--nested{background:#fff;padding:12px 14px;gap:8px;margin-left:46px;overflow:visible}.cf-box--open{overflow:visible}.cf-box--open>.cf-box-sub:last-child{border-radius:0 0 8px 8px}.cf-box-row{padding:14px 16px;display:flex;align-items:flex-start;gap:12px}.cf-box-row--flush{padding:0;gap:10px}.cf-box-sub{border-top:1px solid #EAECF0;background:#f9fafb;padding:16px 16px 18px 64px;display:flex;flex-direction:column;gap:12px}.cf-options{display:flex;flex-direction:column;gap:10px}.cf-option{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:12px 14px;display:flex;align-items:flex-start;gap:10px;cursor:pointer}.cf-option.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.cf-box-sep{display:flex;flex-direction:column;gap:12px;padding-top:14px;border-top:1px solid #EAECF0}.cf-num{display:flex;align-items:center;gap:8px;height:36px;padding:0 6px 0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;margin:0}.cf-num input{width:52px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.cf-num span{font-size:13px;color:#667085;padding-right:6px}.cf-pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;border-radius:9999px;padding:4px 12px}.cf-pill--pass{background:#ecfdf3;color:#027a48}.cf-pill--fail{background:#fef3f2;color:#d92d20}.cf-error{display:flex;gap:6px;font-size:12px;font-weight:500;color:#d92d20;align-items:flex-start;line-height:18px;max-width:640px}.cf-error svg{flex-shrink:0;margin-top:3px}.cf-error--indent{margin-left:162px}.cf-check.is-blocked{color:#98a2b3;cursor:not-allowed}.cf-select{position:relative;display:inline-block;vertical-align:middle}.cf-select-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 10px 0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;white-space:nowrap}.cf-select-btn svg{color:#667085;transition:transform .15s ease}.is-open .cf-select-btn{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.is-open .cf-select-btn svg{transform:rotate(180deg)}.cf-select-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;min-width:100%;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-select-item{padding:8px 12px;border-radius:6px;font-size:13px;color:#344054;white-space:nowrap;cursor:pointer}.cf-select-item:hover{background:#f9fafb}.cf-select-item.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.cf-chipbox{position:relative}.cf-chipbox.is-open{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.cf-suggest{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:30;max-height:260px;overflow-y:auto;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-suggest-item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:6px;cursor:pointer}.cf-suggest-item:hover{background:#f9fafb}.cf-suggest-name{font-size:13px;color:#101828}.cf-suggest-mail{font-size:12px;color:#667085;margin-left:auto}.cf-suggest-empty{padding:8px 10px;font-size:12px;color:#667085}.cf-error--page{margin:0 0 12px}.cf-autotask{margin-top:12px;padding:14px 16px;border-radius:10px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column;gap:8px}.cf-autotask-title{font-size:14px;font-weight:600;color:#1d2939}.cf-autotask-title:not(:first-child){margin-top:6px}.cf-autotask-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 720px){.cf-autotask-choices{grid-template-columns:1fr}}.cf-choice{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;text-align:left;cursor:pointer}.cf-choice.is-on{background:#f5faff;box-shadow:inset 0 0 0 1px #66c8ff}.cf-radio{width:18px;height:18px;flex-shrink:0;margin-top:1px;border-radius:9999px;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center}.cf-radio span{width:8px;height:8px;border-radius:9999px;background:transparent}.cf-radio.is-on{box-shadow:inset 0 0 0 1px #1570ef}.cf-radio.is-on span{background:#1570ef}.cf-choice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.cf-choice-title{font-size:14px;font-weight:600;color:#101828}.cf-choice-sub{font-size:12px;color:#667085}.cf-autotask-validity{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:#344054}.cf-validity-select{width:96px}.cf-reminder{display:inline-flex;align-items:center;gap:6px}.cf-reminder-select{width:120px}.cf-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;cursor:pointer}.cf-icon-btn:hover{background:#f9fafb}.cf-bulkbar{display:flex;justify-content:flex-end;margin-bottom:-4px}.cf-bulkbar .av2-btn{display:inline-flex;align-items:center;gap:6px}.cf-dlg-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.cf-dlg{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:520px;max-width:calc(100vw - 32px);max-height:90vh;overflow-y:auto;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.cf-dlg-icon{width:40px;height:40px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.cf-dlg-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.cf-dlg-steps{display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.cf-dlg-steps a{color:#00a3ff;text-decoration:underline;cursor:pointer}.cf-dlg-note{font-size:13px;line-height:20px;font-weight:600;color:#344054}.cf-dlg-errors{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}.cf-dlg-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.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: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i8.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }] });
1043
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2ConfigureComponent, selector: "lib-audit-v2-configure", host: { listeners: { "document:keydown.escape": "onEscape()" } }, ngImport: i0, template: "<div class=\"av2-page audit-configure\">\r\n\r\n <!-- Back + breadcrumb (as the schedule editor's back bar) -->\r\n <div class=\"cf-backbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm cf-back\" (click)=\"back()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\r\n {{ backLabel }}\r\n </button>\r\n <div class=\"cf-crumb\">\r\n <a href=\"#\" (click)=\"back($event)\">Manage Audit</a> \u203A Configure\r\n </div>\r\n </div>\r\n\r\n <!-- Title + actions -->\r\n <div class=\"cf-header\">\r\n <div class=\"cf-header-text\">\r\n <span class=\"av2-sk av2-sk--title cf-sk-title\" *ngIf=\"loading\"></span>\r\n <div class=\"cf-title\" *ngIf=\"!loading\">{{ auditName || 'Audit' }}</div>\r\n <input type=\"text\" class=\"cf-desc\" placeholder=\"Enter Audit Description\" [(ngModel)]=\"description\">\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary cf-publish\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason || publishBlockedReason\" (click)=\"publish()\">\r\n {{ saving ? 'Saving\u2026' : (published ? 'Save & Publish' : 'Publish') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost cf-draft\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason\" (click)=\"saveDraft()\">Save as Draft</button>\r\n </div>\r\n\r\n <div class=\"cf-error cf-error--page\" *ngIf=\"loadError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ loadError }}\r\n </div>\r\n\r\n <!-- Chip picker: chips + input + suggestion list (one template, used for every user list) -->\r\n <ng-template #chipPicker let-list=\"list\" let-large=\"large\">\r\n <div class=\"cf-chipbox\" [class.cf-chipbox--lg]=\"large\" [class.is-open]=\"openChips === list\" (click)=\"focusChips(list, $event)\">\r\n <span class=\"cf-chip\" [class.cf-chip--lg]=\"large\" *ngFor=\"let u of chipsOf(list); let i = index\" [title]=\"u.e\">\r\n <span [class]=\"large ? 'cf-chip-tag' : 'cf-chip-ini'\">{{ u.i }}</span>{{ u.n }}\r\n <a class=\"cf-chip-x\" (click)=\"removeChip(list, i); $event.stopPropagation()\">\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <input type=\"text\" class=\"cf-chip-input\" [class.cf-chip-input--lg]=\"large\" placeholder=\"Add user...\"\r\n [ngModel]=\"draftOf(list)\" (ngModelChange)=\"setDraft(list, $event)\" (focus)=\"focusChips(list, $event)\" (keyup.enter)=\"addChip(list)\">\r\n <div class=\"cf-suggest\" *ngIf=\"openChips === list\">\r\n <div class=\"cf-suggest-item\" *ngFor=\"let u of suggestions(list)\" (click)=\"addSuggestion(list, u, $event)\">\r\n <span class=\"cf-chip-ini\">{{ u.i }}</span>\r\n <span class=\"cf-suggest-name\">{{ u.n }}</span>\r\n <span class=\"cf-suggest-mail\">{{ u.e }}</span>\r\n </div>\r\n <div class=\"cf-suggest-empty\" *ngIf=\"!suggestions(list).length\">\r\n {{ users.length ? 'No matching user' : 'No users for this client' }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Dropdown: styled like the prototype instead of the browser's native select -->\r\n <ng-template #dropdown let-key=\"key\" let-options=\"options\">\r\n <span class=\"cf-select\" [class.is-open]=\"openSelect === key\">\r\n <button type=\"button\" class=\"cf-select-btn\" (click)=\"toggleSelect(key, $event)\">\r\n {{ selectLabel(key, options) }}\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"cf-select-menu\" *ngIf=\"openSelect === key\">\r\n <div class=\"cf-select-item\" *ngFor=\"let o of options\" [class.is-on]=\"isPicked(key, o)\"\r\n (click)=\"pick(key, o, $event)\">{{ o.label }}</div>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"cf-body\" *ngIf=\"!loadError\">\r\n <!-- Section tree -->\r\n <!-- The white card runs the full height beside the configuration; the tree inside stays in view (sticky). -->\r\n <aside class=\"cf-left\">\r\n <div class=\"cf-left-inner\">\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"cf-left-title\">{{ auditName || 'Audit' }}</div>\r\n\r\n <div class=\"cf-hint\" *ngIf=\"!sections.length\">No questions yet</div>\r\n <ng-container *ngFor=\"let s of sections\">\r\n <div class=\"cf-section\" [class.is-open]=\"s.open\" (click)=\"toggleSection(s)\">\r\n {{ s.label }}\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!s.open\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"cf-items\" *ngIf=\"s.open && s.items.length\">\r\n <div *ngFor=\"let it of s.items\">{{ it }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Schedule block (QA 10 Oct): audits have no one-time / repeat schedule here; visits come from Schedules. -->\r\n </ng-container>\r\n </div>\r\n </aside>\r\n\r\n <!-- Configuration -->\r\n <div class=\"cf-right\">\r\n\r\n <section class=\"cf-card\" *ngIf=\"loading\">\r\n <lib-audit-v2-shimmer [rows]=\"4\"></lib-audit-v2-shimmer>\r\n </section>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n\r\n <!-- ===== Advance Configuration ===== -->\r\n <section class=\"cf-card\">\r\n <!-- Accordion: the header (title, rule or arrow) folds the settings below; they stay on the page while folded. -->\r\n <div class=\"cf-block-head cf-block-head--toggle\" role=\"button\" tabindex=\"0\" [attr.aria-expanded]=\"advOpen\"\r\n (click)=\"advOpen = !advOpen\" (keydown.enter)=\"advOpen = !advOpen\" (keydown.space)=\"$event.preventDefault(); advOpen = !advOpen\">\r\n <span class=\"cf-block-title\">Advance Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!advOpen\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </span>\r\n </div>\r\n\r\n <div class=\"cf-adv-body\" [hidden]=\"!advOpen\">\r\n <!-- Audit Owner -->\r\n <div>\r\n <div class=\"cf-label\">Audit Owner</div>\r\n <div class=\"cf-hint\">Owners get access to manage the audit</div>\r\n </div>\r\n <div class=\"cf-row\">\r\n <span class=\"cf-field\">Can be managed by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'owners', large: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Approver -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Approver</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"approverOn\" (click)=\"toggleApprover()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be able to approve the audit</div>\r\n <div class=\"cf-row\" *ngIf=\"approverOn\">\r\n <span class=\"cf-field\">To be approved by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'approvers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"approverError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ approverError }}\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so the {{ approvers.length }} approver{{ approvers.length === 1 ? '' : 's' }} added will be removed when you save. Turn Approver back on to keep {{ approvers.length === 1 ? 'it' : 'them' }}.\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && !approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so submitted audits are not sent for approval. Turn it on to add approvers or to send flags and reports to them.\r\n </div>\r\n\r\n <!-- Reminder -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Reminder</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"reminderOn\" (click)=\"toggleReminder()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be reminded in the selected interval</div>\r\n <div class=\"cf-inner\" *ngIf=\"reminderOn\">\r\n <div class=\"cf-inline\">\r\n Notify user before\r\n <span class=\"cf-reminder\" *ngFor=\"let m of reminders; let i = index\">\r\n <lib-audit-v2-select class=\"cf-reminder-select\" [value]=\"m\" [options]=\"reminderOpts[i] || []\" [searchable]=\"false\"\r\n [ariaLabel]=\"'Reminder ' + (i + 1) + ' in minutes'\" (changed)=\"setReminder(i, $event.target.value)\"></lib-audit-v2-select>\r\n <a class=\"cf-chip-x\" *ngIf=\"reminders.length > 1\" title=\"Remove reminder\" (click)=\"removeReminder(i)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <button type=\"button\" class=\"cf-icon-btn\" *ngIf=\"reminders.length < maxReminders\" title=\"Add reminder\" (click)=\"addReminder()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Send alerts {{ reminderSummary }} mins before the audit end time\r\n </div>\r\n </div>\r\n\r\n <!-- Notify Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"notifyFlagsOn\" (click)=\"toggleNotifyFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, all flags will be sent as an email</div>\r\n <ng-container *ngIf=\"notifyFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !notifySendApprover\" (click)=\"toggleSendApprover('notifySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendApprover\">\r\n <svg *ngIf=\"notifySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"notifySendCustom = !notifySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendCustom\">\r\n <svg *ngIf=\"notifySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"notifySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'notifyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-error\" *ngIf=\"notifyFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ notifyFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Notify on Recurring Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify on Recurring Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"recurringFlagsOn\" (click)=\"toggleRecurringFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">When enabled, emails are sent for recurring flags based on the configured threshold</div>\r\n\r\n <div class=\"cf-inner\" *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-inline\">\r\n Send Email if the same question is flagged\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'recurringThreshold', options: thresholdOpts }\"></ng-container>\r\n times by the same store\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Once the threshold is reached and an email is sent, the flag count resets to zero\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !recurringSendApprover\" (click)=\"toggleSendApprover('recurringSendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendApprover\">\r\n <svg *ngIf=\"recurringSendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"toggleRecurringCustom()\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendCustom\">\r\n <svg *ngIf=\"recurringSendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n <label class=\"cf-check\" (click)=\"recurringSameAsNotify = !recurringSameAsNotify\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSameAsNotify\">\r\n <svg *ngIf=\"recurringSameAsNotify\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Use same users from Notify Flags\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"recurringSendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'recurringUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-info\" *ngIf=\"recurringSameAsNotify\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n {{ notifyRecipientsLabel }}\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"recurringFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ recurringFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Daily report -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Enable - Daily Report</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"dailyReportOn\" (click)=\"toggleDailyReport()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By Enabling, compliance score will be sent as an email to the above users</div>\r\n <ng-container *ngIf=\"dailyReportOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !dailySendApprover\" (click)=\"toggleSendApprover('dailySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendApprover\">\r\n <svg *ngIf=\"dailySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"dailySendCustom = !dailySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendCustom\">\r\n <svg *ngIf=\"dailySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"dailySendCustom\">\r\n <div class=\"cf-bulkbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openDailyBulk()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n Bulk Upload\r\n </button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'dailyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <label class=\"cf-check\" (click)=\"sharePostApproval = !sharePostApproval\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"sharePostApproval\">\r\n <svg *ngIf=\"sharePostApproval\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Share Report Post Approval\r\n </label>\r\n <div class=\"cf-error\" *ngIf=\"dailyReportError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ dailyReportError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Export submission: Tango users only, as the v1 Configure (its stored value is kept for everyone else). -->\r\n <div class=\"cf-grid2\" *ngIf=\"access.isTango\">\r\n <div class=\"cf-stack cf-stack--tight\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Export Submission</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"exportSubmissionOn\" (click)=\"exportSubmissionOn = !exportSubmissionOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint\">Enable this to allow audit submitters to download their submission as a PDF file</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Redo validity -->\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Validity</div>\r\n <div class=\"cf-inline\">\r\n Redo valid for\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoValidFor', options: redoDayOpts }\"></ng-container>\r\n Day from Redo creation\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Auto create task -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Auto Create Task for Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"autoCreateTaskOn\" (click)=\"autoCreateTaskOn = !autoCreateTaskOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, a task is automatically created for every flagged question in the audit</div>\r\n\r\n <!-- Who gets the task and how long it stays open (as the Checklist Configure page) -->\r\n <div class=\"cf-autotask\" *ngIf=\"autoCreateTaskOn\">\r\n <div class=\"cf-autotask-title\">Task Assignee</div>\r\n <div class=\"cf-hint cf-hint--tight\">Choose who the flagged task is assigned to</div>\r\n <div class=\"cf-autotask-choices\">\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'submitter'\" (click)=\"taskAssignee = 'submitter'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'submitter'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Audit Submitter</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user who filled the audit</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'store'\" (click)=\"taskAssignee = 'store'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'store'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Store User</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user mapped to the flagged store</span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cf-autotask-title\">Task Validity</div>\r\n <div class=\"cf-autotask-validity\">\r\n <span>Task valid for</span>\r\n <lib-audit-v2-select class=\"cf-validity-select\" [(ngModel)]=\"taskValidity\" [options]=\"taskValidityOptions\"\r\n [searchable]=\"false\" ariaLabel=\"Task validity in days\"></lib-audit-v2-select>\r\n <span>days from task creation</span>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Audit Configuration ===== -->\r\n <div class=\"cf-divider-head\">\r\n <span class=\"cf-block-title\">Audit Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n </div>\r\n\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Submission &amp; Visibility</div>\r\n\r\n <!-- cf-box--open: the dispute-window and response-delay menus must not be clipped by the box -->\r\n <div class=\"cf-box cf-box--open\">\r\n <div class=\"cf-box-row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"showResponseInApp\"\r\n (click)=\"showResponseInApp = !showResponseInApp\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Show Response in Mobile App</div>\r\n <div class=\"cf-hint\">By enabling this option, store users can view the audit response in the Mobile App.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sub\" *ngIf=\"showResponseInApp\">\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Response Visibility</div>\r\n <div class=\"cf-hint\">Choose when the response becomes visible to store users</div>\r\n </div>\r\n\r\n <div class=\"cf-options\">\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'pre'\" (click)=\"responseVisibility = 'pre'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'pre'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\">Pre-approval</div>\r\n <div class=\"cf-hint\">The audit response will be visible to store users before it is approved.</div>\r\n <div class=\"cf-inline cf-inline--top\">\r\n Show response\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'respDelay', options: respDelayOpts }\"></ng-container>\r\n after submission\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'post'\" (click)=\"responseVisibility = 'post'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'post'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\" [class.cf-muted]=\"responseVisibility !== 'post'\">Post-approval</div>\r\n <div class=\"cf-hint\">Once the response is approved, it will automatically be displayed in the Mobile App. Store users cannot raise a dispute.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sep\">\r\n <ng-container *ngIf=\"responseVisibility === 'pre'\">\r\n <div class=\"cf-box-row cf-box-row--flush\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"disputeOn\" (click)=\"disputeOn = !disputeOn\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Dispute Configuration</div>\r\n <div class=\"cf-hint cf-hint--wrap\">When enabled, the store team can raise a dispute against the auditor's submission once the response becomes visible to them.</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--nested\" *ngIf=\"disputeOn\">\r\n <div class=\"cf-inline\">\r\n Dispute window\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'disputeWindow', options: dispWindowOpts }\"></ng-container>\r\n from when the response becomes visible\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes raised inside this window go to the approver. Approved disputes revise the answer and the compliance score.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"!hasApprovers\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n No approver is set, so no one can review disputes. Turn on Approver and add an approver.\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"responseVisibility === 'post'\">\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm cf-muted\">Dispute Configuration</div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes are not available when responses are shown post-approval.\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Pre-submission access -->\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pre-Submission Access</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"preSubmissionAccessOn\" (click)=\"preSubmissionAccessOn = !preSubmissionAccessOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Users added here can view Open and In Progress audits until submission. The Schedule Info tab is also visible only to these users.</div>\r\n <ng-container *ngIf=\"preSubmissionAccessOn\">\r\n <div class=\"cf-row cf-row--top\">\r\n <span class=\"cf-field\">Visible to</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'preSubmissionUsers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error cf-error--indent\" *ngIf=\"preSubmissionEmpty\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n Add at least one user\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Scoring ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Scoring</div>\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pass/Fail Score Setup</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"passFailOn\" (click)=\"passFailOn = !passFailOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Set the compliance score an audit must reach to be marked {{ passLabel }}. Anything below it is marked {{ failLabel }}.</div>\r\n <div class=\"cf-row cf-row--wrap cf-row--top\" *ngIf=\"passFailOn\">\r\n <span class=\"cf-field\">Minimum score to {{ passLabel }}</span>\r\n <label class=\"cf-num\">\r\n <input type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"passThreshold\">\r\n <span>%</span>\r\n </label>\r\n <span class=\"cf-pill cf-pill--pass\">{{ passLabel }} \u2265 {{ passThreshold }}%</span>\r\n <span class=\"cf-pill cf-pill--fail\">{{ failLabel }} &lt; {{ passThreshold }}%</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Approver Controls ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Approver Controls</div>\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Edit Submitted Audit</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"editSubmittedOn\" (click)=\"toggleEditSubmitted()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">Allow Approvers to edit submitted Audit</div>\r\n <ng-container *ngIf=\"editSubmittedOn\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'editUsers', large: true }\"></ng-container>\r\n <div class=\"cf-error\" *ngIf=\"editSubmittedError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ editSubmittedError }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Extension</div>\r\n <div class=\"cf-inline\">\r\n Extend redo up to\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoExtension', options: redoExtensionOpts }\"></ng-container>\r\n Days till approval\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== User Verification ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-title\">User Verification Configuration</div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requirePhoto\" (click)=\"requirePhoto = !requirePhoto\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require Photo Capture</div>\r\n <div class=\"cf-hint\">By enabling, users must capture their photo to complete submission</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requireAcknowledgment\" (click)=\"requireAcknowledgment = !requireAcknowledgment\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require User Acknowledgment</div>\r\n <div class=\"cf-hint\">By enabling, users must type their name as acknowledgment to complete submission</div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Daily Report > Custom: bulk upload users (as the Checklist Configure page's popup) -->\r\n <ng-container *ngIf=\"dailyBulkOpen\">\r\n <div class=\"cf-dlg-backdrop\" (click)=\"closeDailyBulk()\"></div>\r\n <div class=\"cf-dlg\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"cf-dlg-title\">\r\n <span class=\"cf-dlg-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n </span>\r\n <div class=\"cf-dlg-title\" id=\"cf-dlg-title\">Bulk Upload</div>\r\n <div class=\"cf-dlg-steps\">\r\n <div>Step 1 - <a href=\"#\" (click)=\"$event.preventDefault(); downloadDailyTemplate()\">Download the template here</a></div>\r\n <div>Step 2 - Add the Email of existing users to the template</div>\r\n <div>Step 3 - Upload it below for processing</div>\r\n </div>\r\n <div class=\"cf-dlg-note\">\r\n **Note : Only the Email column is considered - the Username is taken from the existing user list.\r\n Only existing users of this client are accepted. On upload, all the existing data will be replaced.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"dailyBulkErrors.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n <div class=\"cf-dlg-errors\">\r\n <div>The file was not uploaded. Fix {{ dailyBulkErrors.length === 1 ? 'this row' : 'these rows' }} and upload again:</div>\r\n <div *ngFor=\"let e of dailyBulkErrors.slice(0, 5)\">{{ e }}</div>\r\n <div *ngIf=\"dailyBulkErrors.length > 5\">+{{ dailyBulkErrors.length - 5 }} more</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-dlg-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"closeDailyBulk()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" (click)=\"dailyBulkFile.click()\">Upload</button>\r\n <input #dailyBulkFile type=\"file\" accept=\".xlsx\" hidden (change)=\"onDailyBulkFile($event)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.cf-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.cf-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.cf-crumb{font-size:13px;line-height:20px;color:#667085}.cf-crumb a{font-weight:600;color:#00a3ff}.cf-header{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px;display:flex;align-items:center;gap:12px}.cf-header-text{display:flex;flex-direction:column;gap:4px;min-width:0}.cf-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.cf-sk-title{margin:3px 0}.cf-desc{border:none;outline:none;padding:0;background:transparent;font-family:inherit;font-size:13px;line-height:18px;color:#344054;min-width:320px}.cf-desc::placeholder{color:#98a2b3}.cf-publish{padding:0 20px;box-shadow:0 1px 2px #1018280d}.cf-draft{padding:0 18px;box-shadow:inset 0 0 0 1px #d0d5dd,0 1px 2px #1018280d}.cf-body{display:flex;gap:16px;align-items:stretch}.cf-left{width:350px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008}.cf-left-inner{padding:16px;display:flex;flex-direction:column;gap:10px;position:sticky;top:calc(var(--bs-app-header-height, 0px) + 16px);max-height:calc(100vh - var(--bs-app-header-height, 0px) - 32px);overflow-y:auto;scrollbar-width:thin}.cf-left-title{font-size:14px;line-height:20px;font-weight:600;color:#101828}.cf-section{display:flex;align-items:center;gap:8px;padding:2px 0;font-size:13px;font-weight:500;color:#344054;cursor:pointer;white-space:nowrap}.cf-section.is-open{color:#1d2939}.cf-rule{flex:1;border-top:1px solid #EAECF0}.cf-chev{display:flex;color:#98a2b3}.cf-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.cf-chev .rotate{transform:rotate(-90deg)}.cf-items{display:flex;flex-direction:column;gap:8px;padding-left:12px;font-size:13px;color:#475467}.cf-schedule-title{font-size:14px;font-weight:600;color:#101828;margin-top:6px}.cf-schedule{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#475467}.cf-schedule>div{display:flex;align-items:center;gap:6px}.cf-right{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}.cf-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px;display:flex;flex-direction:column;gap:14px}.cf-card--lg{border-radius:8px}.cf-block-head{display:flex;align-items:center;gap:12px}.cf-block-head--toggle{cursor:pointer;-webkit-user-select:none;user-select:none}.cf-block-head--toggle:hover .cf-chev{color:#475467}.cf-block-head--toggle:focus-visible{outline:2px solid #99DBFF;outline-offset:4px;border-radius:4px}.cf-adv-body{display:flex;flex-direction:column;gap:14px}.cf-adv-body[hidden]{display:none}.cf-block-title{font-size:15px;font-weight:600;color:#101828}.cf-divider-head{display:flex;align-items:center;gap:10px;margin-top:4px}.cf-label{font-size:14px;font-weight:600;color:#101828}.cf-label-sm{font-size:13px;font-weight:600;color:#101828}.cf-muted{color:#667085}.cf-hint{font-size:12px;line-height:18px;color:#667085}.cf-hint--tight{margin-top:-8px}.cf-hint--wrap{max-width:640px;text-wrap:pretty}.cf-field{font-size:13px;font-weight:500;color:#344054;min-width:150px;flex-shrink:0}.cf-row{display:flex;align-items:center;gap:12px}.cf-row--top{margin-top:6px}.cf-row--wrap{flex-wrap:wrap}.cf-stack{display:flex;flex-direction:column;gap:8px}.cf-stack--tight,.cf-stack--sm{gap:4px}.cf-stack--xs{gap:2px}.cf-grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.cf-toggle-row{display:flex;align-items:center;gap:10px}.cf-switch{width:36px;height:20px;padding:2px;border:none;border-radius:9999px;background:#eaecf0;display:flex;align-items:center;justify-content:flex-start;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.cf-switch>span{width:16px;height:16px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #1018280d}.cf-switch.is-on{background:#00a3ff;justify-content:flex-end}.cf-switch--top{margin-top:2px}.cf-chipbox{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:8px 10px}.cf-chipbox--lg{gap:8px;padding:10px 12px}.cf-chip{display:flex;align-items:center;gap:6px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;border-radius:9999px;padding:3px 8px;font-size:12px;color:#344054;white-space:nowrap;flex-shrink:0;max-width:100%}.cf-chip--lg{gap:8px;background:#fff;padding:5px 11px;font-size:13px;color:#1d2939}.cf-chip-ini{color:#00a3ff;font-weight:600;font-size:11px}.cf-chip-tag{display:inline-flex;align-items:center;justify-content:center;padding:1px 5px;border-radius:6px;background:#eaf8ff;color:#00a3ff;font-weight:700;font-size:11px;letter-spacing:.02em}.cf-chip-x{display:flex;cursor:pointer;color:#98a2b3}.cf-chip-x:hover{color:#344054}.cf-chip-input{flex:1;min-width:100px;border:none;outline:none;background:transparent;font-family:inherit;font-size:12px;color:#101828}.cf-chip-input::placeholder{color:#98a2b3}.cf-chip-input--lg{min-width:120px;font-size:13px}.cf-inner{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:8px}.cf-inline{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-inline--top{margin-top:2px}.cf-mini{height:32px;padding:0 28px 0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 8px center;outline:none}.cf-info{display:flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#667085}.cf-info svg{flex-shrink:0}.cf-info--wrap{align-items:flex-start;max-width:560px;text-wrap:pretty}.cf-info--wrap svg{margin-top:3px}.cf-checks{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-checks-label{font-weight:500}.cf-check{display:flex;align-items:center;gap:6px;margin:0;font-size:13px;color:#344054;cursor:pointer;-webkit-user-select:none;user-select:none}.cf-check-box{width:16px;height:16px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.cf-check-box.is-on{background:#00a3ff;box-shadow:none}.cf-box{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden;display:flex;flex-direction:column}.cf-box--pad{padding:14px 16px;gap:6px;overflow:visible}.cf-box--row{padding:14px 16px;flex-direction:row;align-items:flex-start;gap:12px}.cf-box--nested{background:#fff;padding:12px 14px;gap:8px;margin-left:46px;overflow:visible}.cf-box--open{overflow:visible}.cf-box--open>.cf-box-sub:last-child{border-radius:0 0 8px 8px}.cf-box-row{padding:14px 16px;display:flex;align-items:flex-start;gap:12px}.cf-box-row--flush{padding:0;gap:10px}.cf-box-sub{border-top:1px solid #EAECF0;background:#f9fafb;padding:16px 16px 18px 64px;display:flex;flex-direction:column;gap:12px}.cf-options{display:flex;flex-direction:column;gap:10px}.cf-option{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:12px 14px;display:flex;align-items:flex-start;gap:10px;cursor:pointer}.cf-option.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.cf-box-sep{display:flex;flex-direction:column;gap:12px;padding-top:14px;border-top:1px solid #EAECF0}.cf-num{display:flex;align-items:center;gap:8px;height:36px;padding:0 6px 0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;margin:0}.cf-num input{width:52px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.cf-num span{font-size:13px;color:#667085;padding-right:6px}.cf-pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;border-radius:9999px;padding:4px 12px}.cf-pill--pass{background:#ecfdf3;color:#027a48}.cf-pill--fail{background:#fef3f2;color:#d92d20}.cf-error{display:flex;gap:6px;font-size:12px;font-weight:500;color:#d92d20;align-items:flex-start;line-height:18px;max-width:640px}.cf-error svg{flex-shrink:0;margin-top:3px}.cf-error--indent{margin-left:162px}.cf-check.is-blocked{color:#98a2b3;cursor:not-allowed}.cf-select{position:relative;display:inline-block;vertical-align:middle}.cf-select-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 10px 0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;white-space:nowrap}.cf-select-btn svg{color:#667085;transition:transform .15s ease}.is-open .cf-select-btn{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.is-open .cf-select-btn svg{transform:rotate(180deg)}.cf-select-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;min-width:100%;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-select-item{padding:8px 12px;border-radius:6px;font-size:13px;color:#344054;white-space:nowrap;cursor:pointer}.cf-select-item:hover{background:#f9fafb}.cf-select-item.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.cf-chipbox{position:relative}.cf-chipbox.is-open{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.cf-suggest{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:30;max-height:260px;overflow-y:auto;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-suggest-item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:6px;cursor:pointer}.cf-suggest-item:hover{background:#f9fafb}.cf-suggest-name{font-size:13px;color:#101828}.cf-suggest-mail{font-size:12px;color:#667085;margin-left:auto}.cf-suggest-empty{padding:8px 10px;font-size:12px;color:#667085}.cf-error--page{margin:0 0 12px}.cf-autotask{margin-top:12px;padding:14px 16px;border-radius:10px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column;gap:8px}.cf-autotask-title{font-size:14px;font-weight:600;color:#1d2939}.cf-autotask-title:not(:first-child){margin-top:6px}.cf-autotask-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 720px){.cf-autotask-choices{grid-template-columns:1fr}}.cf-choice{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;text-align:left;cursor:pointer}.cf-choice.is-on{background:#f5faff;box-shadow:inset 0 0 0 1px #66c8ff}.cf-radio{width:18px;height:18px;flex-shrink:0;margin-top:1px;border-radius:9999px;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center}.cf-radio span{width:8px;height:8px;border-radius:9999px;background:transparent}.cf-radio.is-on{box-shadow:inset 0 0 0 1px #1570ef}.cf-radio.is-on span{background:#1570ef}.cf-choice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.cf-choice-title{font-size:14px;font-weight:600;color:#101828}.cf-choice-sub{font-size:12px;color:#667085}.cf-autotask-validity{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:#344054}.cf-validity-select{width:96px}.cf-reminder{display:inline-flex;align-items:center;gap:6px}.cf-reminder-select{width:120px}.cf-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;cursor:pointer}.cf-icon-btn:hover{background:#f9fafb}.cf-bulkbar{display:flex;justify-content:flex-end;margin-bottom:-4px}.cf-bulkbar .av2-btn{display:inline-flex;align-items:center;gap:6px}.cf-dlg-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.cf-dlg{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:520px;max-width:calc(100vw - 32px);max-height:90vh;overflow-y:auto;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.cf-dlg-icon{width:40px;height:40px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.cf-dlg-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.cf-dlg-steps{display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.cf-dlg-steps a{color:#00a3ff;text-decoration:underline;cursor:pointer}.cf-dlg-note{font-size:13px;line-height:20px;font-weight:600;color:#344054}.cf-dlg-errors{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}.cf-dlg-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.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: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i8.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }] });
1042
1044
  }
1043
1045
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2ConfigureComponent, decorators: [{
1044
1046
  type: Component,
1045
- args: [{ selector: 'lib-audit-v2-configure', template: "<div class=\"av2-page audit-configure\">\r\n\r\n <!-- Back + breadcrumb (as the schedule editor's back bar) -->\r\n <div class=\"cf-backbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm cf-back\" (click)=\"back()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\r\n {{ backLabel }}\r\n </button>\r\n <div class=\"cf-crumb\">\r\n <a href=\"#\" (click)=\"back($event)\">Manage Audit</a> \u203A Configure\r\n </div>\r\n </div>\r\n\r\n <!-- Title + actions -->\r\n <div class=\"cf-header\">\r\n <div class=\"cf-header-text\">\r\n <span class=\"av2-sk av2-sk--title cf-sk-title\" *ngIf=\"loading\"></span>\r\n <div class=\"cf-title\" *ngIf=\"!loading\">{{ auditName || 'Audit' }}</div>\r\n <input type=\"text\" class=\"cf-desc\" placeholder=\"Enter Audit Description\" [(ngModel)]=\"description\">\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary cf-publish\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason || publishBlockedReason\" (click)=\"publish()\">\r\n {{ saving ? 'Saving\u2026' : (published ? 'Save & Publish' : 'Publish') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost cf-draft\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason\" (click)=\"saveDraft()\">Save as Draft</button>\r\n </div>\r\n\r\n <div class=\"cf-error cf-error--page\" *ngIf=\"loadError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ loadError }}\r\n </div>\r\n\r\n <!-- Chip picker: chips + input + suggestion list (one template, used for every user list) -->\r\n <ng-template #chipPicker let-list=\"list\" let-large=\"large\">\r\n <div class=\"cf-chipbox\" [class.cf-chipbox--lg]=\"large\" [class.is-open]=\"openChips === list\" (click)=\"focusChips(list, $event)\">\r\n <span class=\"cf-chip\" [class.cf-chip--lg]=\"large\" *ngFor=\"let u of chipsOf(list); let i = index\" [title]=\"u.e\">\r\n <span [class]=\"large ? 'cf-chip-tag' : 'cf-chip-ini'\">{{ u.i }}</span>{{ u.n }}\r\n <a class=\"cf-chip-x\" (click)=\"removeChip(list, i); $event.stopPropagation()\">\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <input type=\"text\" class=\"cf-chip-input\" [class.cf-chip-input--lg]=\"large\" placeholder=\"Add user...\"\r\n [ngModel]=\"draftOf(list)\" (ngModelChange)=\"setDraft(list, $event)\" (focus)=\"focusChips(list, $event)\" (keyup.enter)=\"addChip(list)\">\r\n <div class=\"cf-suggest\" *ngIf=\"openChips === list\">\r\n <div class=\"cf-suggest-item\" *ngFor=\"let u of suggestions(list)\" (click)=\"addSuggestion(list, u, $event)\">\r\n <span class=\"cf-chip-ini\">{{ u.i }}</span>\r\n <span class=\"cf-suggest-name\">{{ u.n }}</span>\r\n <span class=\"cf-suggest-mail\">{{ u.e }}</span>\r\n </div>\r\n <div class=\"cf-suggest-empty\" *ngIf=\"!suggestions(list).length\">\r\n {{ users.length ? 'No matching user' : 'No users for this client' }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Dropdown: styled like the prototype instead of the browser's native select -->\r\n <ng-template #dropdown let-key=\"key\" let-options=\"options\">\r\n <span class=\"cf-select\" [class.is-open]=\"openSelect === key\">\r\n <button type=\"button\" class=\"cf-select-btn\" (click)=\"toggleSelect(key, $event)\">\r\n {{ selectLabel(key, options) }}\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"cf-select-menu\" *ngIf=\"openSelect === key\">\r\n <div class=\"cf-select-item\" *ngFor=\"let o of options\" [class.is-on]=\"isPicked(key, o)\"\r\n (click)=\"pick(key, o, $event)\">{{ o.label }}</div>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"cf-body\" *ngIf=\"!loadError\">\r\n <!-- Section tree -->\r\n <aside class=\"cf-left\">\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"cf-left-title\">{{ auditName || 'Audit' }}</div>\r\n\r\n <div class=\"cf-hint\" *ngIf=\"!sections.length\">No questions yet</div>\r\n <ng-container *ngFor=\"let s of sections\">\r\n <div class=\"cf-section\" [class.is-open]=\"s.open\" (click)=\"toggleSection(s)\">\r\n {{ s.label }}\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!s.open\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"cf-items\" *ngIf=\"s.open && s.items.length\">\r\n <div *ngFor=\"let it of s.items\">{{ it }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Schedule block (QA 10 Oct): audits have no one-time / repeat schedule here; visits come from Schedules. -->\r\n </ng-container>\r\n </aside>\r\n\r\n <!-- Configuration -->\r\n <div class=\"cf-right\">\r\n\r\n <section class=\"cf-card\" *ngIf=\"loading\">\r\n <lib-audit-v2-shimmer [rows]=\"4\"></lib-audit-v2-shimmer>\r\n </section>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n\r\n <!-- ===== Advance Configuration ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-head\">\r\n <span class=\"cf-block-title\">Advance Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </span>\r\n </div>\r\n\r\n <!-- Audit Owner -->\r\n <div>\r\n <div class=\"cf-label\">Audit Owner</div>\r\n <div class=\"cf-hint\">Owners get access to manage the audit</div>\r\n </div>\r\n <div class=\"cf-row\">\r\n <span class=\"cf-field\">Can be managed by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'owners', large: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Approver -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Approver</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"approverOn\" (click)=\"toggleApprover()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be able to approve the audit</div>\r\n <div class=\"cf-row\" *ngIf=\"approverOn\">\r\n <span class=\"cf-field\">To be approved by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'approvers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"approverError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ approverError }}\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so the {{ approvers.length }} approver{{ approvers.length === 1 ? '' : 's' }} added will be removed when you save. Turn Approver back on to keep {{ approvers.length === 1 ? 'it' : 'them' }}.\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && !approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so submitted audits are not sent for approval. Turn it on to add approvers or to send flags and reports to them.\r\n </div>\r\n\r\n <!-- Reminder -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Reminder</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"reminderOn\" (click)=\"toggleReminder()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be reminded in the selected interval</div>\r\n <div class=\"cf-inner\" *ngIf=\"reminderOn\">\r\n <div class=\"cf-inline\">\r\n Notify user before\r\n <span class=\"cf-reminder\" *ngFor=\"let m of reminders; let i = index\">\r\n <lib-audit-v2-select class=\"cf-reminder-select\" [value]=\"m\" [options]=\"reminderOpts[i] || []\" [searchable]=\"false\"\r\n [ariaLabel]=\"'Reminder ' + (i + 1) + ' in minutes'\" (changed)=\"setReminder(i, $event.target.value)\"></lib-audit-v2-select>\r\n <a class=\"cf-chip-x\" *ngIf=\"reminders.length > 1\" title=\"Remove reminder\" (click)=\"removeReminder(i)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <button type=\"button\" class=\"cf-icon-btn\" *ngIf=\"reminders.length < maxReminders\" title=\"Add reminder\" (click)=\"addReminder()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Send alerts {{ reminderSummary }} mins before the audit end time\r\n </div>\r\n </div>\r\n\r\n <!-- Notify Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"notifyFlagsOn\" (click)=\"toggleNotifyFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, all flags will be sent as an email</div>\r\n <ng-container *ngIf=\"notifyFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !notifySendApprover\" (click)=\"toggleSendApprover('notifySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendApprover\">\r\n <svg *ngIf=\"notifySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"notifySendCustom = !notifySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendCustom\">\r\n <svg *ngIf=\"notifySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"notifySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'notifyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-error\" *ngIf=\"notifyFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ notifyFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Notify on Recurring Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify on Recurring Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"recurringFlagsOn\" (click)=\"toggleRecurringFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">When enabled, emails are sent for recurring flags based on the configured threshold</div>\r\n\r\n <div class=\"cf-inner\" *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-inline\">\r\n Send Email if the same question is flagged\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'recurringThreshold', options: thresholdOpts }\"></ng-container>\r\n times by the same store\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Once the threshold is reached and an email is sent, the flag count resets to zero\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !recurringSendApprover\" (click)=\"toggleSendApprover('recurringSendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendApprover\">\r\n <svg *ngIf=\"recurringSendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"toggleRecurringCustom()\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendCustom\">\r\n <svg *ngIf=\"recurringSendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n <label class=\"cf-check\" (click)=\"recurringSameAsNotify = !recurringSameAsNotify\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSameAsNotify\">\r\n <svg *ngIf=\"recurringSameAsNotify\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Use same users from Notify Flags\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"recurringSendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'recurringUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-info\" *ngIf=\"recurringSameAsNotify\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n {{ notifyRecipientsLabel }}\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"recurringFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ recurringFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Daily report -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Enable - Daily Report</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"dailyReportOn\" (click)=\"toggleDailyReport()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By Enabling, compliance score will be sent as an email to the above users</div>\r\n <ng-container *ngIf=\"dailyReportOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !dailySendApprover\" (click)=\"toggleSendApprover('dailySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendApprover\">\r\n <svg *ngIf=\"dailySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"dailySendCustom = !dailySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendCustom\">\r\n <svg *ngIf=\"dailySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"dailySendCustom\">\r\n <div class=\"cf-bulkbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openDailyBulk()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n Bulk Upload\r\n </button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'dailyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <label class=\"cf-check\" (click)=\"sharePostApproval = !sharePostApproval\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"sharePostApproval\">\r\n <svg *ngIf=\"sharePostApproval\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Share Report Post Approval\r\n </label>\r\n <div class=\"cf-error\" *ngIf=\"dailyReportError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ dailyReportError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Export submission: Tango users only, as the v1 Configure (its stored value is kept for everyone else). -->\r\n <div class=\"cf-grid2\" *ngIf=\"access.isTango\">\r\n <div class=\"cf-stack cf-stack--tight\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Export Submission</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"exportSubmissionOn\" (click)=\"exportSubmissionOn = !exportSubmissionOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint\">Enable this to allow audit submitters to download their submission as a PDF file</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Redo validity -->\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Validity</div>\r\n <div class=\"cf-inline\">\r\n Redo valid for\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoValidFor', options: redoDayOpts }\"></ng-container>\r\n Day from Redo creation\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Auto create task -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Auto Create Task for Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"autoCreateTaskOn\" (click)=\"autoCreateTaskOn = !autoCreateTaskOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, a task is automatically created for every flagged question in the audit</div>\r\n\r\n <!-- Who gets the task and how long it stays open (as the Checklist Configure page) -->\r\n <div class=\"cf-autotask\" *ngIf=\"autoCreateTaskOn\">\r\n <div class=\"cf-autotask-title\">Task Assignee</div>\r\n <div class=\"cf-hint cf-hint--tight\">Choose who the flagged task is assigned to</div>\r\n <div class=\"cf-autotask-choices\">\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'submitter'\" (click)=\"taskAssignee = 'submitter'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'submitter'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Audit Submitter</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user who filled the audit</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'store'\" (click)=\"taskAssignee = 'store'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'store'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Store User</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user mapped to the flagged store</span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cf-autotask-title\">Task Validity</div>\r\n <div class=\"cf-autotask-validity\">\r\n <span>Task valid for</span>\r\n <lib-audit-v2-select class=\"cf-validity-select\" [(ngModel)]=\"taskValidity\" [options]=\"taskValidityOptions\"\r\n [searchable]=\"false\" ariaLabel=\"Task validity in days\"></lib-audit-v2-select>\r\n <span>days from task creation</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Audit Configuration ===== -->\r\n <div class=\"cf-divider-head\">\r\n <span class=\"cf-block-title\">Audit Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n </div>\r\n\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Submission &amp; Visibility</div>\r\n\r\n <!-- cf-box--open: the dispute-window and response-delay menus must not be clipped by the box -->\r\n <div class=\"cf-box cf-box--open\">\r\n <div class=\"cf-box-row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"showResponseInApp\"\r\n (click)=\"showResponseInApp = !showResponseInApp\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Show Response in Mobile App</div>\r\n <div class=\"cf-hint\">By enabling this option, store users can view the audit response in the Mobile App.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sub\" *ngIf=\"showResponseInApp\">\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Response Visibility</div>\r\n <div class=\"cf-hint\">Choose when the response becomes visible to store users</div>\r\n </div>\r\n\r\n <div class=\"cf-options\">\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'pre'\" (click)=\"responseVisibility = 'pre'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'pre'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\">Pre-approval</div>\r\n <div class=\"cf-hint\">The audit response will be visible to store users before it is approved.</div>\r\n <div class=\"cf-inline cf-inline--top\">\r\n Show response\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'respDelay', options: respDelayOpts }\"></ng-container>\r\n after submission\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'post'\" (click)=\"responseVisibility = 'post'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'post'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\" [class.cf-muted]=\"responseVisibility !== 'post'\">Post-approval</div>\r\n <div class=\"cf-hint\">Once the response is approved, it will automatically be displayed in the Mobile App. Store users cannot raise a dispute.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sep\">\r\n <ng-container *ngIf=\"responseVisibility === 'pre'\">\r\n <div class=\"cf-box-row cf-box-row--flush\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"disputeOn\" (click)=\"disputeOn = !disputeOn\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Dispute Configuration</div>\r\n <div class=\"cf-hint cf-hint--wrap\">When enabled, the store team can raise a dispute against the auditor's submission once the response becomes visible to them.</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--nested\" *ngIf=\"disputeOn\">\r\n <div class=\"cf-inline\">\r\n Dispute window\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'disputeWindow', options: dispWindowOpts }\"></ng-container>\r\n from when the response becomes visible\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes raised inside this window go to the approver. Approved disputes revise the answer and the compliance score.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"!hasApprovers\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n No approver is set, so no one can review disputes. Turn on Approver and add an approver.\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"responseVisibility === 'post'\">\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm cf-muted\">Dispute Configuration</div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes are not available when responses are shown post-approval.\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Pre-submission access -->\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pre-Submission Access</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"preSubmissionAccessOn\" (click)=\"preSubmissionAccessOn = !preSubmissionAccessOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Users added here can view Open and In Progress audits until submission. The Schedule Info tab is also visible only to these users.</div>\r\n <ng-container *ngIf=\"preSubmissionAccessOn\">\r\n <div class=\"cf-row cf-row--top\">\r\n <span class=\"cf-field\">Visible to</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'preSubmissionUsers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error cf-error--indent\" *ngIf=\"preSubmissionEmpty\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n Add at least one user\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Scoring ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Scoring</div>\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pass/Fail Score Setup</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"passFailOn\" (click)=\"passFailOn = !passFailOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Set the compliance score an audit must reach to be marked {{ passLabel }}. Anything below it is marked {{ failLabel }}.</div>\r\n <div class=\"cf-row cf-row--wrap cf-row--top\" *ngIf=\"passFailOn\">\r\n <span class=\"cf-field\">Minimum score to {{ passLabel }}</span>\r\n <label class=\"cf-num\">\r\n <input type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"passThreshold\">\r\n <span>%</span>\r\n </label>\r\n <span class=\"cf-pill cf-pill--pass\">{{ passLabel }} \u2265 {{ passThreshold }}%</span>\r\n <span class=\"cf-pill cf-pill--fail\">{{ failLabel }} &lt; {{ passThreshold }}%</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Approver Controls ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Approver Controls</div>\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Edit Submitted Audit</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"editSubmittedOn\" (click)=\"toggleEditSubmitted()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">Allow Approvers to edit submitted Audit</div>\r\n <ng-container *ngIf=\"editSubmittedOn\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'editUsers', large: true }\"></ng-container>\r\n <div class=\"cf-error\" *ngIf=\"editSubmittedError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ editSubmittedError }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Extension</div>\r\n <div class=\"cf-inline\">\r\n Extend redo up to\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoExtension', options: redoExtensionOpts }\"></ng-container>\r\n Days till approval\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== User Verification ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-title\">User Verification Configuration</div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requirePhoto\" (click)=\"requirePhoto = !requirePhoto\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require Photo Capture</div>\r\n <div class=\"cf-hint\">By enabling, users must capture their photo to complete submission</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requireAcknowledgment\" (click)=\"requireAcknowledgment = !requireAcknowledgment\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require User Acknowledgment</div>\r\n <div class=\"cf-hint\">By enabling, users must type their name as acknowledgment to complete submission</div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Daily Report > Custom: bulk upload users (as the Checklist Configure page's popup) -->\r\n <ng-container *ngIf=\"dailyBulkOpen\">\r\n <div class=\"cf-dlg-backdrop\" (click)=\"closeDailyBulk()\"></div>\r\n <div class=\"cf-dlg\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"cf-dlg-title\">\r\n <span class=\"cf-dlg-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n </span>\r\n <div class=\"cf-dlg-title\" id=\"cf-dlg-title\">Bulk Upload</div>\r\n <div class=\"cf-dlg-steps\">\r\n <div>Step 1 - <a href=\"#\" (click)=\"$event.preventDefault(); downloadDailyTemplate()\">Download the template here</a></div>\r\n <div>Step 2 - Add the Email of existing users to the template</div>\r\n <div>Step 3 - Upload it below for processing</div>\r\n </div>\r\n <div class=\"cf-dlg-note\">\r\n **Note : Only the Email column is considered - the Username is taken from the existing user list.\r\n Only existing users of this client are accepted. On upload, all the existing data will be replaced.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"dailyBulkErrors.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n <div class=\"cf-dlg-errors\">\r\n <div>The file was not uploaded. Fix {{ dailyBulkErrors.length === 1 ? 'this row' : 'these rows' }} and upload again:</div>\r\n <div *ngFor=\"let e of dailyBulkErrors.slice(0, 5)\">{{ e }}</div>\r\n <div *ngIf=\"dailyBulkErrors.length > 5\">+{{ dailyBulkErrors.length - 5 }} more</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-dlg-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"closeDailyBulk()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" (click)=\"dailyBulkFile.click()\">Upload</button>\r\n <input #dailyBulkFile type=\"file\" accept=\".xlsx\" hidden (change)=\"onDailyBulkFile($event)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.cf-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.cf-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.cf-crumb{font-size:13px;line-height:20px;color:#667085}.cf-crumb a{font-weight:600;color:#00a3ff}.cf-header{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px;display:flex;align-items:center;gap:12px}.cf-header-text{display:flex;flex-direction:column;gap:4px;min-width:0}.cf-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.cf-sk-title{margin:3px 0}.cf-desc{border:none;outline:none;padding:0;background:transparent;font-family:inherit;font-size:13px;line-height:18px;color:#344054;min-width:320px}.cf-desc::placeholder{color:#98a2b3}.cf-publish{padding:0 20px;box-shadow:0 1px 2px #1018280d}.cf-draft{padding:0 18px;box-shadow:inset 0 0 0 1px #d0d5dd,0 1px 2px #1018280d}.cf-body{display:flex;gap:16px;align-items:flex-start}.cf-left{width:300px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px;display:flex;flex-direction:column;gap:10px;position:sticky;top:calc(var(--bs-app-header-height, 0px) + 16px);max-height:calc(100vh - var(--bs-app-header-height, 0px) - 32px);overflow-y:auto;scrollbar-width:thin}.cf-left-title{font-size:14px;line-height:20px;font-weight:600;color:#101828}.cf-section{display:flex;align-items:center;gap:8px;padding:2px 0;font-size:13px;font-weight:500;color:#344054;cursor:pointer;white-space:nowrap}.cf-section.is-open{color:#1d2939}.cf-rule{flex:1;border-top:1px solid #EAECF0}.cf-chev{display:flex;color:#98a2b3}.cf-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.cf-chev .rotate{transform:rotate(-90deg)}.cf-items{display:flex;flex-direction:column;gap:8px;padding-left:12px;font-size:13px;color:#475467}.cf-schedule-title{font-size:14px;font-weight:600;color:#101828;margin-top:6px}.cf-schedule{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#475467}.cf-schedule>div{display:flex;align-items:center;gap:6px}.cf-right{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}.cf-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px;display:flex;flex-direction:column;gap:14px}.cf-card--lg{border-radius:8px}.cf-block-head{display:flex;align-items:center;gap:12px}.cf-block-title{font-size:15px;font-weight:600;color:#101828}.cf-divider-head{display:flex;align-items:center;gap:10px;margin-top:4px}.cf-label{font-size:14px;font-weight:600;color:#101828}.cf-label-sm{font-size:13px;font-weight:600;color:#101828}.cf-muted{color:#667085}.cf-hint{font-size:12px;line-height:18px;color:#667085}.cf-hint--tight{margin-top:-8px}.cf-hint--wrap{max-width:640px;text-wrap:pretty}.cf-field{font-size:13px;font-weight:500;color:#344054;min-width:150px;flex-shrink:0}.cf-row{display:flex;align-items:center;gap:12px}.cf-row--top{margin-top:6px}.cf-row--wrap{flex-wrap:wrap}.cf-stack{display:flex;flex-direction:column;gap:8px}.cf-stack--tight,.cf-stack--sm{gap:4px}.cf-stack--xs{gap:2px}.cf-grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.cf-toggle-row{display:flex;align-items:center;gap:10px}.cf-switch{width:36px;height:20px;padding:2px;border:none;border-radius:9999px;background:#eaecf0;display:flex;align-items:center;justify-content:flex-start;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.cf-switch>span{width:16px;height:16px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #1018280d}.cf-switch.is-on{background:#00a3ff;justify-content:flex-end}.cf-switch--top{margin-top:2px}.cf-chipbox{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:8px 10px}.cf-chipbox--lg{gap:8px;padding:10px 12px}.cf-chip{display:flex;align-items:center;gap:6px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;border-radius:9999px;padding:3px 8px;font-size:12px;color:#344054;white-space:nowrap;flex-shrink:0;max-width:100%}.cf-chip--lg{gap:8px;background:#fff;padding:5px 11px;font-size:13px;color:#1d2939}.cf-chip-ini{color:#00a3ff;font-weight:600;font-size:11px}.cf-chip-tag{display:inline-flex;align-items:center;justify-content:center;padding:1px 5px;border-radius:6px;background:#eaf8ff;color:#00a3ff;font-weight:700;font-size:11px;letter-spacing:.02em}.cf-chip-x{display:flex;cursor:pointer;color:#98a2b3}.cf-chip-x:hover{color:#344054}.cf-chip-input{flex:1;min-width:100px;border:none;outline:none;background:transparent;font-family:inherit;font-size:12px;color:#101828}.cf-chip-input::placeholder{color:#98a2b3}.cf-chip-input--lg{min-width:120px;font-size:13px}.cf-inner{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:8px}.cf-inline{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-inline--top{margin-top:2px}.cf-mini{height:32px;padding:0 28px 0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 8px center;outline:none}.cf-info{display:flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#667085}.cf-info svg{flex-shrink:0}.cf-info--wrap{align-items:flex-start;max-width:560px;text-wrap:pretty}.cf-info--wrap svg{margin-top:3px}.cf-checks{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-checks-label{font-weight:500}.cf-check{display:flex;align-items:center;gap:6px;margin:0;font-size:13px;color:#344054;cursor:pointer;-webkit-user-select:none;user-select:none}.cf-check-box{width:16px;height:16px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.cf-check-box.is-on{background:#00a3ff;box-shadow:none}.cf-box{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden;display:flex;flex-direction:column}.cf-box--pad{padding:14px 16px;gap:6px;overflow:visible}.cf-box--row{padding:14px 16px;flex-direction:row;align-items:flex-start;gap:12px}.cf-box--nested{background:#fff;padding:12px 14px;gap:8px;margin-left:46px;overflow:visible}.cf-box--open{overflow:visible}.cf-box--open>.cf-box-sub:last-child{border-radius:0 0 8px 8px}.cf-box-row{padding:14px 16px;display:flex;align-items:flex-start;gap:12px}.cf-box-row--flush{padding:0;gap:10px}.cf-box-sub{border-top:1px solid #EAECF0;background:#f9fafb;padding:16px 16px 18px 64px;display:flex;flex-direction:column;gap:12px}.cf-options{display:flex;flex-direction:column;gap:10px}.cf-option{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:12px 14px;display:flex;align-items:flex-start;gap:10px;cursor:pointer}.cf-option.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.cf-box-sep{display:flex;flex-direction:column;gap:12px;padding-top:14px;border-top:1px solid #EAECF0}.cf-num{display:flex;align-items:center;gap:8px;height:36px;padding:0 6px 0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;margin:0}.cf-num input{width:52px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.cf-num span{font-size:13px;color:#667085;padding-right:6px}.cf-pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;border-radius:9999px;padding:4px 12px}.cf-pill--pass{background:#ecfdf3;color:#027a48}.cf-pill--fail{background:#fef3f2;color:#d92d20}.cf-error{display:flex;gap:6px;font-size:12px;font-weight:500;color:#d92d20;align-items:flex-start;line-height:18px;max-width:640px}.cf-error svg{flex-shrink:0;margin-top:3px}.cf-error--indent{margin-left:162px}.cf-check.is-blocked{color:#98a2b3;cursor:not-allowed}.cf-select{position:relative;display:inline-block;vertical-align:middle}.cf-select-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 10px 0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;white-space:nowrap}.cf-select-btn svg{color:#667085;transition:transform .15s ease}.is-open .cf-select-btn{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.is-open .cf-select-btn svg{transform:rotate(180deg)}.cf-select-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;min-width:100%;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-select-item{padding:8px 12px;border-radius:6px;font-size:13px;color:#344054;white-space:nowrap;cursor:pointer}.cf-select-item:hover{background:#f9fafb}.cf-select-item.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.cf-chipbox{position:relative}.cf-chipbox.is-open{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.cf-suggest{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:30;max-height:260px;overflow-y:auto;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-suggest-item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:6px;cursor:pointer}.cf-suggest-item:hover{background:#f9fafb}.cf-suggest-name{font-size:13px;color:#101828}.cf-suggest-mail{font-size:12px;color:#667085;margin-left:auto}.cf-suggest-empty{padding:8px 10px;font-size:12px;color:#667085}.cf-error--page{margin:0 0 12px}.cf-autotask{margin-top:12px;padding:14px 16px;border-radius:10px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column;gap:8px}.cf-autotask-title{font-size:14px;font-weight:600;color:#1d2939}.cf-autotask-title:not(:first-child){margin-top:6px}.cf-autotask-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 720px){.cf-autotask-choices{grid-template-columns:1fr}}.cf-choice{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;text-align:left;cursor:pointer}.cf-choice.is-on{background:#f5faff;box-shadow:inset 0 0 0 1px #66c8ff}.cf-radio{width:18px;height:18px;flex-shrink:0;margin-top:1px;border-radius:9999px;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center}.cf-radio span{width:8px;height:8px;border-radius:9999px;background:transparent}.cf-radio.is-on{box-shadow:inset 0 0 0 1px #1570ef}.cf-radio.is-on span{background:#1570ef}.cf-choice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.cf-choice-title{font-size:14px;font-weight:600;color:#101828}.cf-choice-sub{font-size:12px;color:#667085}.cf-autotask-validity{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:#344054}.cf-validity-select{width:96px}.cf-reminder{display:inline-flex;align-items:center;gap:6px}.cf-reminder-select{width:120px}.cf-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;cursor:pointer}.cf-icon-btn:hover{background:#f9fafb}.cf-bulkbar{display:flex;justify-content:flex-end;margin-bottom:-4px}.cf-bulkbar .av2-btn{display:inline-flex;align-items:center;gap:6px}.cf-dlg-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.cf-dlg{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:520px;max-width:calc(100vw - 32px);max-height:90vh;overflow-y:auto;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.cf-dlg-icon{width:40px;height:40px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.cf-dlg-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.cf-dlg-steps{display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.cf-dlg-steps a{color:#00a3ff;text-decoration:underline;cursor:pointer}.cf-dlg-note{font-size:13px;line-height:20px;font-weight:600;color:#344054}.cf-dlg-errors{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}.cf-dlg-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:4px}\n"] }]
1047
+ args: [{ selector: 'lib-audit-v2-configure', template: "<div class=\"av2-page audit-configure\">\r\n\r\n <!-- Back + breadcrumb (as the schedule editor's back bar) -->\r\n <div class=\"cf-backbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm cf-back\" (click)=\"back()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\r\n {{ backLabel }}\r\n </button>\r\n <div class=\"cf-crumb\">\r\n <a href=\"#\" (click)=\"back($event)\">Manage Audit</a> \u203A Configure\r\n </div>\r\n </div>\r\n\r\n <!-- Title + actions -->\r\n <div class=\"cf-header\">\r\n <div class=\"cf-header-text\">\r\n <span class=\"av2-sk av2-sk--title cf-sk-title\" *ngIf=\"loading\"></span>\r\n <div class=\"cf-title\" *ngIf=\"!loading\">{{ auditName || 'Audit' }}</div>\r\n <input type=\"text\" class=\"cf-desc\" placeholder=\"Enter Audit Description\" [(ngModel)]=\"description\">\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary cf-publish\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason || publishBlockedReason\" (click)=\"publish()\">\r\n {{ saving ? 'Saving\u2026' : (published ? 'Save & Publish' : 'Publish') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost cf-draft\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason\" (click)=\"saveDraft()\">Save as Draft</button>\r\n </div>\r\n\r\n <div class=\"cf-error cf-error--page\" *ngIf=\"loadError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ loadError }}\r\n </div>\r\n\r\n <!-- Chip picker: chips + input + suggestion list (one template, used for every user list) -->\r\n <ng-template #chipPicker let-list=\"list\" let-large=\"large\">\r\n <div class=\"cf-chipbox\" [class.cf-chipbox--lg]=\"large\" [class.is-open]=\"openChips === list\" (click)=\"focusChips(list, $event)\">\r\n <span class=\"cf-chip\" [class.cf-chip--lg]=\"large\" *ngFor=\"let u of chipsOf(list); let i = index\" [title]=\"u.e\">\r\n <span [class]=\"large ? 'cf-chip-tag' : 'cf-chip-ini'\">{{ u.i }}</span>{{ u.n }}\r\n <a class=\"cf-chip-x\" (click)=\"removeChip(list, i); $event.stopPropagation()\">\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <input type=\"text\" class=\"cf-chip-input\" [class.cf-chip-input--lg]=\"large\" placeholder=\"Add user...\"\r\n [ngModel]=\"draftOf(list)\" (ngModelChange)=\"setDraft(list, $event)\" (focus)=\"focusChips(list, $event)\" (keyup.enter)=\"addChip(list)\">\r\n <div class=\"cf-suggest\" *ngIf=\"openChips === list\">\r\n <div class=\"cf-suggest-item\" *ngFor=\"let u of suggestions(list)\" (click)=\"addSuggestion(list, u, $event)\">\r\n <span class=\"cf-chip-ini\">{{ u.i }}</span>\r\n <span class=\"cf-suggest-name\">{{ u.n }}</span>\r\n <span class=\"cf-suggest-mail\">{{ u.e }}</span>\r\n </div>\r\n <div class=\"cf-suggest-empty\" *ngIf=\"!suggestions(list).length\">\r\n {{ users.length ? 'No matching user' : 'No users for this client' }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Dropdown: styled like the prototype instead of the browser's native select -->\r\n <ng-template #dropdown let-key=\"key\" let-options=\"options\">\r\n <span class=\"cf-select\" [class.is-open]=\"openSelect === key\">\r\n <button type=\"button\" class=\"cf-select-btn\" (click)=\"toggleSelect(key, $event)\">\r\n {{ selectLabel(key, options) }}\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"cf-select-menu\" *ngIf=\"openSelect === key\">\r\n <div class=\"cf-select-item\" *ngFor=\"let o of options\" [class.is-on]=\"isPicked(key, o)\"\r\n (click)=\"pick(key, o, $event)\">{{ o.label }}</div>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"cf-body\" *ngIf=\"!loadError\">\r\n <!-- Section tree -->\r\n <!-- The white card runs the full height beside the configuration; the tree inside stays in view (sticky). -->\r\n <aside class=\"cf-left\">\r\n <div class=\"cf-left-inner\">\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"cf-left-title\">{{ auditName || 'Audit' }}</div>\r\n\r\n <div class=\"cf-hint\" *ngIf=\"!sections.length\">No questions yet</div>\r\n <ng-container *ngFor=\"let s of sections\">\r\n <div class=\"cf-section\" [class.is-open]=\"s.open\" (click)=\"toggleSection(s)\">\r\n {{ s.label }}\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!s.open\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"cf-items\" *ngIf=\"s.open && s.items.length\">\r\n <div *ngFor=\"let it of s.items\">{{ it }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Schedule block (QA 10 Oct): audits have no one-time / repeat schedule here; visits come from Schedules. -->\r\n </ng-container>\r\n </div>\r\n </aside>\r\n\r\n <!-- Configuration -->\r\n <div class=\"cf-right\">\r\n\r\n <section class=\"cf-card\" *ngIf=\"loading\">\r\n <lib-audit-v2-shimmer [rows]=\"4\"></lib-audit-v2-shimmer>\r\n </section>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n\r\n <!-- ===== Advance Configuration ===== -->\r\n <section class=\"cf-card\">\r\n <!-- Accordion: the header (title, rule or arrow) folds the settings below; they stay on the page while folded. -->\r\n <div class=\"cf-block-head cf-block-head--toggle\" role=\"button\" tabindex=\"0\" [attr.aria-expanded]=\"advOpen\"\r\n (click)=\"advOpen = !advOpen\" (keydown.enter)=\"advOpen = !advOpen\" (keydown.space)=\"$event.preventDefault(); advOpen = !advOpen\">\r\n <span class=\"cf-block-title\">Advance Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!advOpen\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </span>\r\n </div>\r\n\r\n <div class=\"cf-adv-body\" [hidden]=\"!advOpen\">\r\n <!-- Audit Owner -->\r\n <div>\r\n <div class=\"cf-label\">Audit Owner</div>\r\n <div class=\"cf-hint\">Owners get access to manage the audit</div>\r\n </div>\r\n <div class=\"cf-row\">\r\n <span class=\"cf-field\">Can be managed by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'owners', large: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Approver -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Approver</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"approverOn\" (click)=\"toggleApprover()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be able to approve the audit</div>\r\n <div class=\"cf-row\" *ngIf=\"approverOn\">\r\n <span class=\"cf-field\">To be approved by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'approvers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"approverError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ approverError }}\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so the {{ approvers.length }} approver{{ approvers.length === 1 ? '' : 's' }} added will be removed when you save. Turn Approver back on to keep {{ approvers.length === 1 ? 'it' : 'them' }}.\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && !approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so submitted audits are not sent for approval. Turn it on to add approvers or to send flags and reports to them.\r\n </div>\r\n\r\n <!-- Reminder -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Reminder</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"reminderOn\" (click)=\"toggleReminder()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be reminded in the selected interval</div>\r\n <div class=\"cf-inner\" *ngIf=\"reminderOn\">\r\n <div class=\"cf-inline\">\r\n Notify user before\r\n <span class=\"cf-reminder\" *ngFor=\"let m of reminders; let i = index\">\r\n <lib-audit-v2-select class=\"cf-reminder-select\" [value]=\"m\" [options]=\"reminderOpts[i] || []\" [searchable]=\"false\"\r\n [ariaLabel]=\"'Reminder ' + (i + 1) + ' in minutes'\" (changed)=\"setReminder(i, $event.target.value)\"></lib-audit-v2-select>\r\n <a class=\"cf-chip-x\" *ngIf=\"reminders.length > 1\" title=\"Remove reminder\" (click)=\"removeReminder(i)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <button type=\"button\" class=\"cf-icon-btn\" *ngIf=\"reminders.length < maxReminders\" title=\"Add reminder\" (click)=\"addReminder()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Send alerts {{ reminderSummary }} mins before the audit end time\r\n </div>\r\n </div>\r\n\r\n <!-- Notify Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"notifyFlagsOn\" (click)=\"toggleNotifyFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, all flags will be sent as an email</div>\r\n <ng-container *ngIf=\"notifyFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !notifySendApprover\" (click)=\"toggleSendApprover('notifySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendApprover\">\r\n <svg *ngIf=\"notifySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"notifySendCustom = !notifySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendCustom\">\r\n <svg *ngIf=\"notifySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"notifySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'notifyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-error\" *ngIf=\"notifyFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ notifyFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Notify on Recurring Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify on Recurring Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"recurringFlagsOn\" (click)=\"toggleRecurringFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">When enabled, emails are sent for recurring flags based on the configured threshold</div>\r\n\r\n <div class=\"cf-inner\" *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-inline\">\r\n Send Email if the same question is flagged\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'recurringThreshold', options: thresholdOpts }\"></ng-container>\r\n times by the same store\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Once the threshold is reached and an email is sent, the flag count resets to zero\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !recurringSendApprover\" (click)=\"toggleSendApprover('recurringSendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendApprover\">\r\n <svg *ngIf=\"recurringSendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"toggleRecurringCustom()\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendCustom\">\r\n <svg *ngIf=\"recurringSendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n <label class=\"cf-check\" (click)=\"recurringSameAsNotify = !recurringSameAsNotify\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSameAsNotify\">\r\n <svg *ngIf=\"recurringSameAsNotify\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Use same users from Notify Flags\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"recurringSendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'recurringUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-info\" *ngIf=\"recurringSameAsNotify\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n {{ notifyRecipientsLabel }}\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"recurringFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ recurringFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Daily report -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Enable - Daily Report</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"dailyReportOn\" (click)=\"toggleDailyReport()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By Enabling, compliance score will be sent as an email to the above users</div>\r\n <ng-container *ngIf=\"dailyReportOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !dailySendApprover\" (click)=\"toggleSendApprover('dailySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendApprover\">\r\n <svg *ngIf=\"dailySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"dailySendCustom = !dailySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendCustom\">\r\n <svg *ngIf=\"dailySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"dailySendCustom\">\r\n <div class=\"cf-bulkbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openDailyBulk()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n Bulk Upload\r\n </button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'dailyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <label class=\"cf-check\" (click)=\"sharePostApproval = !sharePostApproval\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"sharePostApproval\">\r\n <svg *ngIf=\"sharePostApproval\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Share Report Post Approval\r\n </label>\r\n <div class=\"cf-error\" *ngIf=\"dailyReportError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ dailyReportError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Export submission: Tango users only, as the v1 Configure (its stored value is kept for everyone else). -->\r\n <div class=\"cf-grid2\" *ngIf=\"access.isTango\">\r\n <div class=\"cf-stack cf-stack--tight\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Export Submission</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"exportSubmissionOn\" (click)=\"exportSubmissionOn = !exportSubmissionOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint\">Enable this to allow audit submitters to download their submission as a PDF file</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Redo validity -->\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Validity</div>\r\n <div class=\"cf-inline\">\r\n Redo valid for\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoValidFor', options: redoDayOpts }\"></ng-container>\r\n Day from Redo creation\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Auto create task -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Auto Create Task for Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"autoCreateTaskOn\" (click)=\"autoCreateTaskOn = !autoCreateTaskOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, a task is automatically created for every flagged question in the audit</div>\r\n\r\n <!-- Who gets the task and how long it stays open (as the Checklist Configure page) -->\r\n <div class=\"cf-autotask\" *ngIf=\"autoCreateTaskOn\">\r\n <div class=\"cf-autotask-title\">Task Assignee</div>\r\n <div class=\"cf-hint cf-hint--tight\">Choose who the flagged task is assigned to</div>\r\n <div class=\"cf-autotask-choices\">\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'submitter'\" (click)=\"taskAssignee = 'submitter'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'submitter'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Audit Submitter</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user who filled the audit</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'store'\" (click)=\"taskAssignee = 'store'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'store'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Store User</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user mapped to the flagged store</span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cf-autotask-title\">Task Validity</div>\r\n <div class=\"cf-autotask-validity\">\r\n <span>Task valid for</span>\r\n <lib-audit-v2-select class=\"cf-validity-select\" [(ngModel)]=\"taskValidity\" [options]=\"taskValidityOptions\"\r\n [searchable]=\"false\" ariaLabel=\"Task validity in days\"></lib-audit-v2-select>\r\n <span>days from task creation</span>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Audit Configuration ===== -->\r\n <div class=\"cf-divider-head\">\r\n <span class=\"cf-block-title\">Audit Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n </div>\r\n\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Submission &amp; Visibility</div>\r\n\r\n <!-- cf-box--open: the dispute-window and response-delay menus must not be clipped by the box -->\r\n <div class=\"cf-box cf-box--open\">\r\n <div class=\"cf-box-row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"showResponseInApp\"\r\n (click)=\"showResponseInApp = !showResponseInApp\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Show Response in Mobile App</div>\r\n <div class=\"cf-hint\">By enabling this option, store users can view the audit response in the Mobile App.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sub\" *ngIf=\"showResponseInApp\">\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Response Visibility</div>\r\n <div class=\"cf-hint\">Choose when the response becomes visible to store users</div>\r\n </div>\r\n\r\n <div class=\"cf-options\">\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'pre'\" (click)=\"responseVisibility = 'pre'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'pre'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\">Pre-approval</div>\r\n <div class=\"cf-hint\">The audit response will be visible to store users before it is approved.</div>\r\n <div class=\"cf-inline cf-inline--top\">\r\n Show response\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'respDelay', options: respDelayOpts }\"></ng-container>\r\n after submission\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'post'\" (click)=\"responseVisibility = 'post'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'post'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\" [class.cf-muted]=\"responseVisibility !== 'post'\">Post-approval</div>\r\n <div class=\"cf-hint\">Once the response is approved, it will automatically be displayed in the Mobile App. Store users cannot raise a dispute.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sep\">\r\n <ng-container *ngIf=\"responseVisibility === 'pre'\">\r\n <div class=\"cf-box-row cf-box-row--flush\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"disputeOn\" (click)=\"disputeOn = !disputeOn\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Dispute Configuration</div>\r\n <div class=\"cf-hint cf-hint--wrap\">When enabled, the store team can raise a dispute against the auditor's submission once the response becomes visible to them.</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--nested\" *ngIf=\"disputeOn\">\r\n <div class=\"cf-inline\">\r\n Dispute window\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'disputeWindow', options: dispWindowOpts }\"></ng-container>\r\n from when the response becomes visible\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes raised inside this window go to the approver. Approved disputes revise the answer and the compliance score.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"!hasApprovers\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n No approver is set, so no one can review disputes. Turn on Approver and add an approver.\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"responseVisibility === 'post'\">\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm cf-muted\">Dispute Configuration</div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes are not available when responses are shown post-approval.\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Pre-submission access -->\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pre-Submission Access</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"preSubmissionAccessOn\" (click)=\"preSubmissionAccessOn = !preSubmissionAccessOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Users added here can view Open and In Progress audits until submission. The Schedule Info tab is also visible only to these users.</div>\r\n <ng-container *ngIf=\"preSubmissionAccessOn\">\r\n <div class=\"cf-row cf-row--top\">\r\n <span class=\"cf-field\">Visible to</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'preSubmissionUsers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error cf-error--indent\" *ngIf=\"preSubmissionEmpty\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n Add at least one user\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Scoring ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Scoring</div>\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pass/Fail Score Setup</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"passFailOn\" (click)=\"passFailOn = !passFailOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Set the compliance score an audit must reach to be marked {{ passLabel }}. Anything below it is marked {{ failLabel }}.</div>\r\n <div class=\"cf-row cf-row--wrap cf-row--top\" *ngIf=\"passFailOn\">\r\n <span class=\"cf-field\">Minimum score to {{ passLabel }}</span>\r\n <label class=\"cf-num\">\r\n <input type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"passThreshold\">\r\n <span>%</span>\r\n </label>\r\n <span class=\"cf-pill cf-pill--pass\">{{ passLabel }} \u2265 {{ passThreshold }}%</span>\r\n <span class=\"cf-pill cf-pill--fail\">{{ failLabel }} &lt; {{ passThreshold }}%</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Approver Controls ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Approver Controls</div>\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Edit Submitted Audit</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"editSubmittedOn\" (click)=\"toggleEditSubmitted()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">Allow Approvers to edit submitted Audit</div>\r\n <ng-container *ngIf=\"editSubmittedOn\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'editUsers', large: true }\"></ng-container>\r\n <div class=\"cf-error\" *ngIf=\"editSubmittedError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ editSubmittedError }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Extension</div>\r\n <div class=\"cf-inline\">\r\n Extend redo up to\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoExtension', options: redoExtensionOpts }\"></ng-container>\r\n Days till approval\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== User Verification ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-title\">User Verification Configuration</div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requirePhoto\" (click)=\"requirePhoto = !requirePhoto\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require Photo Capture</div>\r\n <div class=\"cf-hint\">By enabling, users must capture their photo to complete submission</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requireAcknowledgment\" (click)=\"requireAcknowledgment = !requireAcknowledgment\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require User Acknowledgment</div>\r\n <div class=\"cf-hint\">By enabling, users must type their name as acknowledgment to complete submission</div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Daily Report > Custom: bulk upload users (as the Checklist Configure page's popup) -->\r\n <ng-container *ngIf=\"dailyBulkOpen\">\r\n <div class=\"cf-dlg-backdrop\" (click)=\"closeDailyBulk()\"></div>\r\n <div class=\"cf-dlg\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"cf-dlg-title\">\r\n <span class=\"cf-dlg-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n </span>\r\n <div class=\"cf-dlg-title\" id=\"cf-dlg-title\">Bulk Upload</div>\r\n <div class=\"cf-dlg-steps\">\r\n <div>Step 1 - <a href=\"#\" (click)=\"$event.preventDefault(); downloadDailyTemplate()\">Download the template here</a></div>\r\n <div>Step 2 - Add the Email of existing users to the template</div>\r\n <div>Step 3 - Upload it below for processing</div>\r\n </div>\r\n <div class=\"cf-dlg-note\">\r\n **Note : Only the Email column is considered - the Username is taken from the existing user list.\r\n Only existing users of this client are accepted. On upload, all the existing data will be replaced.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"dailyBulkErrors.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n <div class=\"cf-dlg-errors\">\r\n <div>The file was not uploaded. Fix {{ dailyBulkErrors.length === 1 ? 'this row' : 'these rows' }} and upload again:</div>\r\n <div *ngFor=\"let e of dailyBulkErrors.slice(0, 5)\">{{ e }}</div>\r\n <div *ngIf=\"dailyBulkErrors.length > 5\">+{{ dailyBulkErrors.length - 5 }} more</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-dlg-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"closeDailyBulk()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" (click)=\"dailyBulkFile.click()\">Upload</button>\r\n <input #dailyBulkFile type=\"file\" accept=\".xlsx\" hidden (change)=\"onDailyBulkFile($event)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}.cf-backbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.cf-back{display:inline-flex;align-items:center;gap:4px;flex-shrink:0}.cf-crumb{font-size:13px;line-height:20px;color:#667085}.cf-crumb a{font-weight:600;color:#00a3ff}.cf-header{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px;display:flex;align-items:center;gap:12px}.cf-header-text{display:flex;flex-direction:column;gap:4px;min-width:0}.cf-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.cf-sk-title{margin:3px 0}.cf-desc{border:none;outline:none;padding:0;background:transparent;font-family:inherit;font-size:13px;line-height:18px;color:#344054;min-width:320px}.cf-desc::placeholder{color:#98a2b3}.cf-publish{padding:0 20px;box-shadow:0 1px 2px #1018280d}.cf-draft{padding:0 18px;box-shadow:inset 0 0 0 1px #d0d5dd,0 1px 2px #1018280d}.cf-body{display:flex;gap:16px;align-items:stretch}.cf-left{width:350px;flex-shrink:0;background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008}.cf-left-inner{padding:16px;display:flex;flex-direction:column;gap:10px;position:sticky;top:calc(var(--bs-app-header-height, 0px) + 16px);max-height:calc(100vh - var(--bs-app-header-height, 0px) - 32px);overflow-y:auto;scrollbar-width:thin}.cf-left-title{font-size:14px;line-height:20px;font-weight:600;color:#101828}.cf-section{display:flex;align-items:center;gap:8px;padding:2px 0;font-size:13px;font-weight:500;color:#344054;cursor:pointer;white-space:nowrap}.cf-section.is-open{color:#1d2939}.cf-rule{flex:1;border-top:1px solid #EAECF0}.cf-chev{display:flex;color:#98a2b3}.cf-chev svg{transition:transform .15s cubic-bezier(.4,0,.2,1)}.cf-chev .rotate{transform:rotate(-90deg)}.cf-items{display:flex;flex-direction:column;gap:8px;padding-left:12px;font-size:13px;color:#475467}.cf-schedule-title{font-size:14px;font-weight:600;color:#101828;margin-top:6px}.cf-schedule{display:flex;flex-direction:column;gap:6px;font-size:13px;color:#475467}.cf-schedule>div{display:flex;align-items:center;gap:6px}.cf-right{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}.cf-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px;display:flex;flex-direction:column;gap:14px}.cf-card--lg{border-radius:8px}.cf-block-head{display:flex;align-items:center;gap:12px}.cf-block-head--toggle{cursor:pointer;-webkit-user-select:none;user-select:none}.cf-block-head--toggle:hover .cf-chev{color:#475467}.cf-block-head--toggle:focus-visible{outline:2px solid #99DBFF;outline-offset:4px;border-radius:4px}.cf-adv-body{display:flex;flex-direction:column;gap:14px}.cf-adv-body[hidden]{display:none}.cf-block-title{font-size:15px;font-weight:600;color:#101828}.cf-divider-head{display:flex;align-items:center;gap:10px;margin-top:4px}.cf-label{font-size:14px;font-weight:600;color:#101828}.cf-label-sm{font-size:13px;font-weight:600;color:#101828}.cf-muted{color:#667085}.cf-hint{font-size:12px;line-height:18px;color:#667085}.cf-hint--tight{margin-top:-8px}.cf-hint--wrap{max-width:640px;text-wrap:pretty}.cf-field{font-size:13px;font-weight:500;color:#344054;min-width:150px;flex-shrink:0}.cf-row{display:flex;align-items:center;gap:12px}.cf-row--top{margin-top:6px}.cf-row--wrap{flex-wrap:wrap}.cf-stack{display:flex;flex-direction:column;gap:8px}.cf-stack--tight,.cf-stack--sm{gap:4px}.cf-stack--xs{gap:2px}.cf-grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.cf-toggle-row{display:flex;align-items:center;gap:10px}.cf-switch{width:36px;height:20px;padding:2px;border:none;border-radius:9999px;background:#eaecf0;display:flex;align-items:center;justify-content:flex-start;flex-shrink:0;cursor:pointer;transition:background .15s cubic-bezier(.4,0,.2,1)}.cf-switch>span{width:16px;height:16px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #1018280d}.cf-switch.is-on{background:#00a3ff;justify-content:flex-end}.cf-switch--top{margin-top:2px}.cf-chipbox{flex:1;min-width:0;display:flex;flex-wrap:wrap;gap:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;padding:8px 10px}.cf-chipbox--lg{gap:8px;padding:10px 12px}.cf-chip{display:flex;align-items:center;gap:6px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;border-radius:9999px;padding:3px 8px;font-size:12px;color:#344054;white-space:nowrap;flex-shrink:0;max-width:100%}.cf-chip--lg{gap:8px;background:#fff;padding:5px 11px;font-size:13px;color:#1d2939}.cf-chip-ini{color:#00a3ff;font-weight:600;font-size:11px}.cf-chip-tag{display:inline-flex;align-items:center;justify-content:center;padding:1px 5px;border-radius:6px;background:#eaf8ff;color:#00a3ff;font-weight:700;font-size:11px;letter-spacing:.02em}.cf-chip-x{display:flex;cursor:pointer;color:#98a2b3}.cf-chip-x:hover{color:#344054}.cf-chip-input{flex:1;min-width:100px;border:none;outline:none;background:transparent;font-family:inherit;font-size:12px;color:#101828}.cf-chip-input::placeholder{color:#98a2b3}.cf-chip-input--lg{min-width:120px;font-size:13px}.cf-inner{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:14px 16px;display:flex;flex-direction:column;gap:8px}.cf-inline{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-inline--top{margin-top:2px}.cf-mini{height:32px;padding:0 28px 0 10px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 8px center;outline:none}.cf-info{display:flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#667085}.cf-info svg{flex-shrink:0}.cf-info--wrap{align-items:flex-start;max-width:560px;text-wrap:pretty}.cf-info--wrap svg{margin-top:3px}.cf-checks{display:flex;align-items:center;gap:16px;flex-wrap:wrap;font-size:13px;color:#344054}.cf-checks-label{font-weight:500}.cf-check{display:flex;align-items:center;gap:6px;margin:0;font-size:13px;color:#344054;cursor:pointer;-webkit-user-select:none;user-select:none}.cf-check-box{width:16px;height:16px;border-radius:4px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.cf-check-box.is-on{background:#00a3ff;box-shadow:none}.cf-box{border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;overflow:hidden;display:flex;flex-direction:column}.cf-box--pad{padding:14px 16px;gap:6px;overflow:visible}.cf-box--row{padding:14px 16px;flex-direction:row;align-items:flex-start;gap:12px}.cf-box--nested{background:#fff;padding:12px 14px;gap:8px;margin-left:46px;overflow:visible}.cf-box--open{overflow:visible}.cf-box--open>.cf-box-sub:last-child{border-radius:0 0 8px 8px}.cf-box-row{padding:14px 16px;display:flex;align-items:flex-start;gap:12px}.cf-box-row--flush{padding:0;gap:10px}.cf-box-sub{border-top:1px solid #EAECF0;background:#f9fafb;padding:16px 16px 18px 64px;display:flex;flex-direction:column;gap:12px}.cf-options{display:flex;flex-direction:column;gap:10px}.cf-option{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;padding:12px 14px;display:flex;align-items:flex-start;gap:10px;cursor:pointer}.cf-option.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.cf-box-sep{display:flex;flex-direction:column;gap:12px;padding-top:14px;border-top:1px solid #EAECF0}.cf-num{display:flex;align-items:center;gap:8px;height:36px;padding:0 6px 0 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;margin:0}.cf-num input{width:52px;border:none;outline:none;background:transparent;font-family:inherit;font-size:14px;font-weight:600;color:#101828}.cf-num span{font-size:13px;color:#667085;padding-right:6px}.cf-pill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;border-radius:9999px;padding:4px 12px}.cf-pill--pass{background:#ecfdf3;color:#027a48}.cf-pill--fail{background:#fef3f2;color:#d92d20}.cf-error{display:flex;gap:6px;font-size:12px;font-weight:500;color:#d92d20;align-items:flex-start;line-height:18px;max-width:640px}.cf-error svg{flex-shrink:0;margin-top:3px}.cf-error--indent{margin-left:162px}.cf-check.is-blocked{color:#98a2b3;cursor:not-allowed}.cf-select{position:relative;display:inline-block;vertical-align:middle}.cf-select-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 10px 0 12px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#101828;cursor:pointer;white-space:nowrap}.cf-select-btn svg{color:#667085;transition:transform .15s ease}.is-open .cf-select-btn{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.is-open .cf-select-btn svg{transform:rotate(180deg)}.cf-select-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;min-width:100%;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-select-item{padding:8px 12px;border-radius:6px;font-size:13px;color:#344054;white-space:nowrap;cursor:pointer}.cf-select-item:hover{background:#f9fafb}.cf-select-item.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.cf-chipbox{position:relative}.cf-chipbox.is-open{box-shadow:0 0 0 2px #99dbff,inset 0 0 0 1px #d0d5dd}.cf-suggest{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:30;max-height:260px;overflow-y:auto;padding:4px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 8px 24px #1018281f}.cf-suggest-item{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:6px;cursor:pointer}.cf-suggest-item:hover{background:#f9fafb}.cf-suggest-name{font-size:13px;color:#101828}.cf-suggest-mail{font-size:12px;color:#667085;margin-left:auto}.cf-suggest-empty{padding:8px 10px;font-size:12px;color:#667085}.cf-error--page{margin:0 0 12px}.cf-autotask{margin-top:12px;padding:14px 16px;border-radius:10px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column;gap:8px}.cf-autotask-title{font-size:14px;font-weight:600;color:#1d2939}.cf-autotask-title:not(:first-child){margin-top:6px}.cf-autotask-choices{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}@media (max-width: 720px){.cf-autotask-choices{grid-template-columns:1fr}}.cf-choice{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;text-align:left;cursor:pointer}.cf-choice.is-on{background:#f5faff;box-shadow:inset 0 0 0 1px #66c8ff}.cf-radio{width:18px;height:18px;flex-shrink:0;margin-top:1px;border-radius:9999px;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center}.cf-radio span{width:8px;height:8px;border-radius:9999px;background:transparent}.cf-radio.is-on{box-shadow:inset 0 0 0 1px #1570ef}.cf-radio.is-on span{background:#1570ef}.cf-choice-text{display:flex;flex-direction:column;gap:2px;min-width:0}.cf-choice-title{font-size:14px;font-weight:600;color:#101828}.cf-choice-sub{font-size:12px;color:#667085}.cf-autotask-validity{display:flex;align-items:center;flex-wrap:wrap;gap:10px;font-size:13px;color:#344054}.cf-validity-select{width:96px}.cf-reminder{display:inline-flex;align-items:center;gap:6px}.cf-reminder-select{width:120px}.cf-icon-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;cursor:pointer}.cf-icon-btn:hover{background:#f9fafb}.cf-bulkbar{display:flex;justify-content:flex-end;margin-bottom:-4px}.cf-bulkbar .av2-btn{display:inline-flex;align-items:center;gap:6px}.cf-dlg-backdrop{position:fixed;inset:0;background:#34405499;z-index:1050}.cf-dlg{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:520px;max-width:calc(100vw - 32px);max-height:90vh;overflow-y:auto;padding:24px;border-radius:8px;background:#fff;box-shadow:0 20px 40px #10182833;z-index:1051;display:flex;flex-direction:column;gap:12px}.cf-dlg-icon{width:40px;height:40px;border-radius:9999px;background:#eaf8ff;color:#00a3ff;display:flex;align-items:center;justify-content:center}.cf-dlg-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.cf-dlg-steps{display:flex;flex-direction:column;gap:8px;font-size:14px;line-height:20px;color:#344054}.cf-dlg-steps a{color:#00a3ff;text-decoration:underline;cursor:pointer}.cf-dlg-note{font-size:13px;line-height:20px;font-weight:600;color:#344054}.cf-dlg-errors{display:flex;flex-direction:column;gap:2px;min-width:0;overflow-wrap:anywhere}.cf-dlg-foot{display:flex;justify-content:flex-end;gap:12px;margin-top:4px}\n"] }]
1046
1048
  }], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.GlobalStateService }, { type: i3.ActivatedRoute }, { type: i3.Router }, { type: i4.ToastService }, { type: i0.ChangeDetectorRef }], propDecorators: { onEscape: [{
1047
1049
  type: HostListener,
1048
1050
  args: ['document:keydown.escape']
1049
1051
  }] } });
1050
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItY29uZmlndXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvY29uZmlndXJlL2F1ZGl0LXYyLWNvbmZpZ3VyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2NvbmZpZ3VyZS9hdWRpdC12Mi1jb25maWd1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU5RixPQUFPLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztBQUNuQyxPQUFPLFFBQVEsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7QUFHOUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBc0J2QiwwR0FBMEc7QUFDMUcsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztB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RUFBNkU7UUFDN0UsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzt3R0ExN0JVLHlCQUF5Qjs0RkFBekIseUJBQXlCLGdJQzdEdEMsZ2l3Q0F5bEJBOzs0RkQ1aEJhLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx3QkFBd0I7OE5BMkpsQyxRQUFRO3NCQURQLFlBQVk7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZm9ya0pvaW4sIGZyb20sIG9mLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCB1dGMgZnJvbSAnZGF5anMvcGx1Z2luL3V0Yyc7XHJcbmltcG9ydCB0aW1lem9uZSBmcm9tICdkYXlqcy9wbHVnaW4vdGltZXpvbmUnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IEF1ZGl0QWNjZXNzLCBhdWRpdEFjY2VzcyB9IGZyb20gJy4uL2F1ZGl0LXYyLWFjY2Vzcyc7XHJcbmltcG9ydCB7IEF1ZGl0U2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vc2VsZWN0L2F1ZGl0LXYyLXNlbGVjdC5jb21wb25lbnQnO1xyXG5cclxuZGF5anMuZXh0ZW5kKHV0Yyk7XHJcbmRheWpzLmV4dGVuZCh0aW1lem9uZSk7XHJcblxyXG4vKiogQSB1c2VyIGNoaXA6IGluaXRpYWxzLCBkaXNwbGF5IG5hbWUsIGVtYWlsLiBTdG9yZWQgb24gdGhlIGNoZWNrbGlzdCBhcyB7IG5hbWUsIHZhbHVlIH0uICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hpcFVzZXIge1xyXG4gIGk6IHN0cmluZztcclxuICBuOiBzdHJpbmc7XHJcbiAgZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ1NlY3Rpb24ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgaXRlbXM6IHN0cmluZ1tdO1xyXG4gIG9wZW46IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0T3B0aW9uIHtcclxuICB2YWx1ZTogbnVtYmVyO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgQ2hpcExpc3QgPSAnb3duZXJzJyB8ICdhcHByb3ZlcnMnIHwgJ25vdGlmeVVzZXJzJyB8ICdyZWN1cnJpbmdVc2VycycgfCAnZGFpbHlVc2VycycgfCAncHJlU3VibWlzc2lvblVzZXJzJyB8ICdlZGl0VXNlcnMnO1xyXG5cclxuLyoqIFJlbWluZGVyIGludGVydmFscyBvZmZlcmVkLCBpbiBtaW51dGVzIGJlZm9yZSB0aGUgYXVkaXQgZW5kIHRpbWUgKGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UpLiAqL1xyXG5jb25zdCBSRU1JTkRFUl9NSU5VVEVTID0gWzMwLCA0NSwgNjAsIDc1LCA5MF07XHJcbi8qKiBUaGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIGFsbG93cyB1cCB0byB0aHJlZSByZW1pbmRlcnMuICovXHJcbmNvbnN0IE1BWF9SRU1JTkRFUlMgPSAzO1xyXG50eXBlIFNlbGVjdEtleSA9ICdyZWN1cnJpbmdUaHJlc2hvbGQnIHwgJ3JlZG9WYWxpZEZvcicgfCAncmVzcERlbGF5JyB8ICdkaXNwdXRlV2luZG93JyB8ICdyZWRvRXh0ZW5zaW9uJztcclxuLyoqIFwiU2VuZCBUbyA+IEFwcHJvdmVyXCIgdGlja3MgdGhhdCBuZWVkIGF0IGxlYXN0IG9uZSBhcHByb3ZlciB0byBzZW5kIHRvLiAqL1xyXG50eXBlIFNlbmRBcHByb3ZlcktleSA9ICdub3RpZnlTZW5kQXBwcm92ZXInIHwgJ3JlY3VycmluZ1NlbmRBcHByb3ZlcicgfCAnZGFpbHlTZW5kQXBwcm92ZXInO1xyXG5cclxuLyoqXHJcbiAqIE1hbmFnZSAtPiBDb25maWd1cmUgZm9yIG9uZSBhdWRpdCAoYD9jaGVja2xpc3RJZD1gKS5cclxuICpcclxuICogVGhlIGF1ZGl0IGlzIGEgY2hlY2tsaXN0LCBzbyB0aGlzIHBhZ2UgcmVhZHMgYW5kIHdyaXRlcyB0aGUgU0FNRSBmaWVsZHMgdGhlIENoZWNrbGlzdFxyXG4gKiBDb25maWd1cmUgcGFnZSB1c2VzIChHRVQgL3RyYXgvZ2V0Q29uZmlnRGV0YWlscywgUE9TVCAvdHJheC9jaGVja2xpc3RDb25maWd1cmV2MSk6XHJcbiAqIG93bmVyLCBhcHByb3ZlciwgcmVtYWluZGVyLCBub3RpZnlGbGFncywgcmVjdXJyaW5nRmxhZywgYXV0b0VtYWlsLCBleHBvcnQsIHJlZG9WYWxpZGl0eSxcclxuICogcmVkb0V4dGVuc2lvbiwgYXV0b0NyZWF0ZVRhc2ssIHVzZXJWZXJpZmljYXRpb24sIHNob3dBcHByb3ZlZFJlc3BvbnNlLCByZXNwb25zZVZpc2liaWxpdHkoK0hvdXJzKSxcclxuICogc2hhcmVSZXBvcnRQb3N0QXBwcm92YWwsIGNoZWNrTGlzdERlc2NyaXB0aW9uLiBBdWRpdC1vbmx5IHNldHRpbmdzIHRoYXQgdGhlIGNoZWNrbGlzdCBzY2hlbWFcclxuICogaGFzIG5vIGZpZWxkIGZvciAocGFzcyBtYXJrLCBkaXNwdXRlIHdpbmRvdywgcHJlLXN1Ym1pc3Npb24gYWNjZXNzLCBlZGl0LXN1Ym1pc3Npb24gdXNlcnMpXHJcbiAqIGFyZSBrZXB0IG9uIGF1ZGl0Y29uZmlnIHZpYSBQT1NUIC90cmF4L2F1ZGl0L2NvbmZpZy9zYXZlLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYXVkaXQtdjItY29uZmlndXJlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXVkaXQtdjItY29uZmlndXJlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXVkaXQtdjItY29uZmlndXJlLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaXRWMkNvbmZpZ3VyZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBjaGVja2xpc3RJZCA9ICcnO1xyXG4gIGF1ZGl0TmFtZSA9ICcnO1xyXG4gIGRlc2NyaXB0aW9uID0gJyc7XHJcbiAgcHVibGlzaGVkID0gZmFsc2U7XHJcbiAgc2NoZWR1bGUgPSAn4oCUJztcclxuICBzY2hlZHVsZVdpbmRvdyA9ICfigJQnO1xyXG4gIHNlY3Rpb25zOiBDb25maWdTZWN0aW9uW10gPSBbXTtcclxuXHJcbiAgLy8gLS0tLSBjaGVja2xpc3QgZmllbGRzIChzYXZlZCBvbiBjaGVja2xpc3Rjb25maWcpIC0tLS1cclxuICBvd25lcnM6IENoaXBVc2VyW10gPSBbXTtcclxuICBhcHByb3Zlck9uID0gZmFsc2U7XHJcbiAgYXBwcm92ZXJzOiBDaGlwVXNlcltdID0gW107XHJcbiAgLyoqIFRoZSBjbGllbnQncyBzdXBlcmFkbWluIChmcm9tIHRoZSB1c2VyIGxpc3QpLCB0aGUgdjEgZGVmYXVsdCBhcHByb3ZlciBmb3IgVGFuZ28gdXNlcnMgYW5kIHJvbGUgJ3VzZXInLiAqL1xyXG4gIHByaXZhdGUgc3VwZXJBZG1pbjogQ2hpcFVzZXIgfCBudWxsID0gbnVsbDtcclxuICByZW1pbmRlck9uID0gZmFsc2U7XHJcbiAgLyoqIGNoZWNrbGlzdC5yZW1haW5kZXI6IG1pbnV0ZXMgYmVmb3JlIHRoZSBlbmQgdGltZSBhdCB3aGljaCB0aGUgYXVkaXRvciBnZXRzIGEgcHVzaCByZW1pbmRlci4gKi9cclxuICByZW1pbmRlcnM6IG51bWJlcltdID0gW107XHJcbiAgLyoqIE9wdGlvbnMgcGVyIHJlbWluZGVyIHJvdzogZXZlcnkgaW50ZXJ2YWwgbm90IGFscmVhZHkgdXNlZCBieSBhbm90aGVyIHJvdy4gKi9cclxuICByZW1pbmRlck9wdHM6IEF1ZGl0U2VsZWN0T3B0aW9uW11bXSA9IFtdO1xyXG4gIHJlYWRvbmx5IG1heFJlbWluZGVycyA9IE1BWF9SRU1JTkRFUlM7XHJcbiAgLy8gTm90aWZ5IEZsYWdzIChjaGVja2xpc3Qubm90aWZ5RmxhZ3MpOiB3aG8gZ2V0cyB0aGUgZmxhZyBlbWFpbHMuXHJcbiAgbm90aWZ5RmxhZ3NPbiA9IGZhbHNlO1xyXG4gIG5vdGlmeVNlbmRBcHByb3ZlciA9IHRydWU7XHJcbiAgbm90aWZ5U2VuZEN1c3RvbSA9IGZhbHNlO1xyXG4gIG5vdGlmeVVzZXJzOiBDaGlwVXNlcltdID0gW107XHJcbiAgLy8gTm90aWZ5IG9uIFJlY3VycmluZyBGbGFncyAoY2hlY2tsaXN0LnJlY3VycmluZ0ZsYWcpOiB0aHJlc2hvbGQgKyBpdHMgb3duIHJlY2lwaWVudHMuXHJcbiAgcmVjdXJyaW5nRmxhZ3NPbiA9IGZhbHNlO1xyXG4gIHJlY3VycmluZ1RocmVzaG9sZCA9IDM7XHJcbiAgcmVjdXJyaW5nU2VuZEFwcHJvdmVyID0gdHJ1ZTtcclxuICByZWN1cnJpbmdTZW5kQ3VzdG9tID0gZmFsc2U7XHJcbiAgLyoqIFN0b3JlZCBhcyBub3RpZnlUeXBlICdzYW1lQXNOb3RpZnknOiB0aGUgc2VydmVyIG1haWxzIHdob2V2ZXIgTm90aWZ5IEZsYWdzIG1haWxzIGF0IHNlbmQgdGltZS4gKi9cclxuICByZWN1cnJpbmdTYW1lQXNOb3RpZnkgPSBmYWxzZTtcclxuICByZWN1cnJpbmdVc2VyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIGRhaWx5UmVwb3J0T24gPSBmYWxzZTtcclxuICBkYWlseVNlbmRBcHByb3ZlciA9IHRydWU7XHJcbiAgZGFpbHlTZW5kQ3VzdG9tID0gZmFsc2U7XHJcbiAgZGFpbHlVc2VyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIC8qKiBEYWlseSBSZXBvcnQgPiBDdXN0b20gYnVsayB1cGxvYWQgcG9wdXAgKGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UncykuICovXHJcbiAgZGFpbHlCdWxrT3BlbiA9IGZhbHNlO1xyXG4gIC8qKiBSb3cgZXJyb3JzIG9mIHRoZSBsYXN0IHVwbG9hZDsgYW55IGVycm9yIHJlamVjdHMgdGhlIHdob2xlIGZpbGUsIHNvIG5vdGhpbmcgcGFydGlhbCBpcyBhcHBsaWVkLiAqL1xyXG4gIGRhaWx5QnVsa0Vycm9yczogc3RyaW5nW10gPSBbXTtcclxuICBzaGFyZVBvc3RBcHByb3ZhbCA9IGZhbHNlO1xyXG4gIGV4cG9ydFN1Ym1pc3Npb25PbiA9IGZhbHNlO1xyXG4gIHJlZG9WYWxpZEZvciA9IDc7XHJcbiAgYXV0b0NyZWF0ZVRhc2tPbiA9IGZhbHNlO1xyXG4gIC8qKiBBdXRvLXRhc2sgc2V0dGluZ3MgKGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UpOiB3aG8gZ2V0cyB0aGUgdGFzayBhbmQgZm9yIGhvdyBtYW55IGRheXMuICovXHJcbiAgdGFza0Fzc2lnbmVlOiAnc3VibWl0dGVyJyB8ICdzdG9yZScgPSAnc3VibWl0dGVyJztcclxuICB0YXNrVmFsaWRpdHkgPSAxMDtcclxuICByZWFkb25seSB0YXNrVmFsaWRpdHlPcHRpb25zID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxNSwgMjAsIDI1LCAzMF0ubWFwKGQgPT4gKHsgdmFsdWU6IGQsIGxhYmVsOiBTdHJpbmcoZCkgfSkpO1xyXG4gIHNob3dSZXNwb25zZUluQXBwID0gdHJ1ZTtcclxuICByZXNwb25zZVZpc2liaWxpdHk6ICdwcmUnIHwgJ3Bvc3QnID0gJ3Bvc3QnO1xyXG4gIHJlc3BEZWxheSA9IDI7XHJcbiAgcmVxdWlyZVBob3RvID0gZmFsc2U7XHJcbiAgcmVxdWlyZUFja25vd2xlZGdtZW50ID0gZmFsc2U7XHJcbiAgcmVkb0V4dGVuc2lvbiA9IDE7XHJcblxyXG4gIC8vIC0tLS0gYXVkaXQtb25seSBmaWVsZHMgKHNhdmVkIG9uIGF1ZGl0Y29uZmlnKSAtLS0tXHJcbiAgcGFzc0ZhaWxPbiA9IHRydWU7XHJcbiAgcGFzc1RocmVzaG9sZCA9IDc1O1xyXG4gIGRpc3B1dGVPbiA9IHRydWU7XHJcbiAgZGlzcHV0ZVdpbmRvdyA9IDQ4O1xyXG4gIHByZVN1Ym1pc3Npb25BY2Nlc3NPbiA9IGZhbHNlO1xyXG4gIHByZVN1Ym1pc3Npb25Vc2VyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIGVkaXRTdWJtaXR0ZWRPbiA9IGZhbHNlO1xyXG4gIGVkaXRVc2VyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG5cclxuICBwYXNzTGFiZWwgPSAnUGFzcyc7XHJcbiAgZmFpbExhYmVsID0gJ0ZhaWwnO1xyXG5cclxuICAvKiogQ2xpZW50IHVzZXJzIG9mZmVyZWQgYnkgdGhlIGNoaXAgcGlja2Vycy4gKi9cclxuICB1c2VyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIGRyYWZ0czogUmVjb3JkPENoaXBMaXN0LCBzdHJpbmc+ID0geyBvd25lcnM6ICcnLCBhcHByb3ZlcnM6ICcnLCBub3RpZnlVc2VyczogJycsIHJlY3VycmluZ1VzZXJzOiAnJywgZGFpbHlVc2VyczogJycsIHByZVN1Ym1pc3Npb25Vc2VyczogJycsIGVkaXRVc2VyczogJycgfTtcclxuICAvKiogV2hpY2ggY2hpcCBib3ggaXMgc2hvd2luZyBzdWdnZXN0aW9ucywgYW5kIHdoaWNoIGRyb3Bkb3duIGlzIG9wZW4uICovXHJcbiAgb3BlbkNoaXBzOiBDaGlwTGlzdCB8IG51bGwgPSBudWxsO1xyXG4gIG9wZW5TZWxlY3Q6IFNlbGVjdEtleSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogU3RvcmVzIC8gdXNlcnMgYWxyZWFkeSBhc3NpZ25lZCB0byB0aGUgY2hlY2tsaXN0LiBBdWRpdHMgZ2V0IHRoZW0gZnJvbSBhIHNjaGVkdWxlXHJcbiAgICogIChNYW5hZ2Ug4oC6IFNjaGVkdWxlIEluZm8pLCBzbyB0aGlzIHBhZ2Ugb25seSByZWFkcyB0aGUgY291bnQuICovXHJcbiAgYXNzaWduZWRDb3VudCA9IDA7XHJcbiAgLyoqIFB1Ymxpc2ggd2l0aCBub3RoaW5nIGFzc2lnbmVkIHNhdmVzIGZpcnN0LCB0aGVuIG9wZW5zIENyZWF0ZSBzY2hlZHVsZSBmb3IgdGhpcyBhdWRpdC4gKi9cclxuICBwcml2YXRlIHNjaGVkdWxlQWZ0ZXJTYXZlID0gZmFsc2U7XHJcbiAgLyoqIFB1Ymxpc2ggc3RhdGUgYmVmb3JlIHRoZSBjdXJyZW50IHNhdmUsIHNvIHRoZSB0b2FzdCBjYW4gc2F5IFwicHVibGlzaGVkXCIgdnMgXCJzYXZlZCBhbmQgcHVibGlzaGVkXCIuICovXHJcbiAgcHJpdmF0ZSB3YXNQdWJsaXNoZWQgPSBmYWxzZTtcclxuXHJcbiAgcmVhZG9ubHkgdGhyZXNob2xkT3B0czogU2VsZWN0T3B0aW9uW10gPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdLm1hcChuID0+ICh7IHZhbHVlOiBuLCBsYWJlbDogU3RyaW5nKG4pIH0pKTtcclxuICByZWFkb25seSByZWRvRGF5T3B0czogU2VsZWN0T3B0aW9uW10gPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgMTAsIDE0LCAyMSwgMzBdLm1hcChuID0+ICh7IHZhbHVlOiBuLCBsYWJlbDogU3RyaW5nKG4pIH0pKTtcclxuICByZWFkb25seSByZXNwRGVsYXlPcHRzOiBTZWxlY3RPcHRpb25bXSA9IFswLCAyLCA2LCAxMiwgMjQsIDQ4XS5tYXAobiA9PiAoeyB2YWx1ZTogbiwgbGFiZWw6IG4gPT09IDAgPyAnSW1tZWRpYXRlbHknIDogbiArICcgaG91cnMnIH0pKTtcclxuICByZWFkb25seSBkaXNwV2luZG93T3B0czogU2VsZWN0T3B0aW9uW10gPSBbNiwgMTIsIDI0LCA0OCwgNzIsIDE2OF0ubWFwKG4gPT4gKHsgdmFsdWU6IG4sIGxhYmVsOiBuID09PSAxNjggPyAnNyBkYXlzJyA6IG4gKyAnIGhvdXJzJyB9KSk7XHJcbiAgcmVhZG9ubHkgcmVkb0V4dGVuc2lvbk9wdHM6IFNlbGVjdE9wdGlvbltdID0gWzEsIDIsIDMsIDQsIDUsIDYsIDddLm1hcChuID0+ICh7IHZhbHVlOiBuLCBsYWJlbDogU3RyaW5nKG4pIH0pKTtcclxuXHJcbiAgLyoqIFN0YXJ0cyB0cnVlIHNvIHRoZSBzZXR0aW5ncyBzaGltbWVyIGluc3RlYWQgb2Ygc2hvd2luZyBkZWZhdWx0cyB0aGF0IHRoZW4ganVtcC4gKi9cclxuICBsb2FkaW5nID0gdHJ1ZTtcclxuICBzYXZpbmcgPSBmYWxzZTtcclxuICBsb2FkRXJyb3IgPSAnJztcclxuICAvKiogL2F1ZGl0L2NvbmZpZy9nZXQgZmFpbGVkOiBzYXZpbmcgbm93IHdvdWxkIG92ZXJ3cml0ZSB0aGUgc3RvcmVkIHBhc3MgbWFyayAvIGFjY2VzcyBzZXR0aW5ncyB3aXRoIGRlZmF1bHRzLiAqL1xyXG4gIGF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgY2xpZW50SWQgPSAnJztcclxuICAvKiogVGhlIGdldENvbmZpZ0RldGFpbHMgcGF5bG9hZCwgc2VudCBiYWNrIHdob2xlIG9uIHNhdmUgKGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UgZG9lcykuICovXHJcbiAgcHJpdmF0ZSBjb25maWdEYXRhOiBhbnkgPSBudWxsO1xyXG4gIC8qKiBQdWJsaXNoIC8gU2F2ZSBuZWVkIHRoZSBDaGVja2xpc3QgZWRpdCBwZXJtaXNzaW9uICh0aGUgc2F2ZSBBUElzIGNoZWNrIGl0IHRvbykuICovXHJcbiAgYWNjZXNzOiBBdWRpdEFjY2VzcyA9IHsgY2FuQWRkOiBmYWxzZSwgY2FuRWRpdDogZmFsc2UgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRyYXhTZXJ2aWNlOiBUcmF4U2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBhdWRpdEFjY2Vzcyh0aGlzLmdzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGFjY2VzcyA9PiB7XHJcbiAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgdGhpcy5jaGVja2xpc3RJZCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ2NoZWNrbGlzdElkJykgfHwgJyc7XHJcbiAgICB0aGlzLmZyb21TY2hlZHVsZSA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ2Zyb20nKSA9PT0gJ3NjaGVkdWxlJztcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWUucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZGF0YT8uY2xpZW50IHx8IGRhdGEuY2xpZW50ID09PSB0aGlzLmNsaWVudElkKSB7IHJldHVybjsgfVxyXG4gICAgICB0aGlzLmNsaWVudElkID0gZGF0YS5jbGllbnQ7XHJcbiAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbmVkIGZyb20gU2NoZWR1bGUgSW5mbyAoP2Zyb209c2NoZWR1bGUpOiBCYWNrIHJldHVybnMgdG8gdGhhdCB0YWIsIGVsc2UgdG8gQXVkaXQgSW5mbyAoUUEgNiBPY3QpLiAqL1xyXG4gIGZyb21TY2hlZHVsZSA9IGZhbHNlO1xyXG5cclxuICBnZXQgYmFja0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5mcm9tU2NoZWR1bGUgPyAnQmFjayB0byBTY2hlZHVsZScgOiAnQmFjayB0byBNYW5hZ2UnO1xyXG4gIH1cclxuXHJcbiAgYmFjayhldmVudD86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS90cmF4L2F1ZGl0LXYyL21hbmFnZSddLCB0aGlzLmZyb21TY2hlZHVsZSA/IHsgcXVlcnlQYXJhbXM6IHsgdGFiOiAnc2NoZWR1bGUnIH0gfSA6IHt9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogRXNjYXBlIGNsb3NlcyB0aGUgb3BlbiBkcm9wZG93biAvIHN1Z2dlc3Rpb24gbGlzdCAvIGJ1bGsgdXBsb2FkIHBvcHVwLiAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcclxuICBvbkVzY2FwZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGFpbHlCdWxrT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5vcGVuU2VsZWN0ID0gbnVsbDtcclxuICAgIHRoaXMub3BlbkNoaXBzID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgcHJlc3Mgb3IgZm9jdXMgb3V0c2lkZSB0aGUgb3BlbiBkcm9wZG93biAvIHN1Z2dlc3Rpb24gbGlzdCBjbG9zZXMgaXQuIExpc3RlbmVkIHRvIGluIHRoZVxyXG4gICAqIGNhcHR1cmUgcGhhc2UsIHNvIG5vIGVsZW1lbnQgdGhhdCBzdG9wcyBjbGljayBwcm9wYWdhdGlvbiBjYW4ga2VlcCBpdCBvcGVuLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgb25PdXRzaWRlID0gKGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xyXG4gICAgaWYgKCF0aGlzLm9wZW5TZWxlY3QgJiYgIXRoaXMub3BlbkNoaXBzKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIGNvbnN0IGluc2lkZSA9IHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0LmNsb3Nlc3QgPT09ICdmdW5jdGlvbicgJiYgdGFyZ2V0LmNsb3Nlc3QoJy5jZi1zZWxlY3QuaXMtb3BlbiwgLmNmLWNoaXBib3guaXMtb3BlbicpO1xyXG4gICAgaWYgKGluc2lkZSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMub3BlblNlbGVjdCA9IG51bGw7XHJcbiAgICB0aGlzLm9wZW5DaGlwcyA9IG51bGw7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9O1xyXG5cclxuICAvLyAtLS0tIGxvYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHByaXZhdGUgbG9hZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jaGVja2xpc3RJZCkge1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5sb2FkRXJyb3IgPSAnTm8gYXVkaXQgc2VsZWN0ZWQuIE9wZW4gQ29uZmlndXJlIGZyb20gdGhlIE1hbmFnZSBwYWdlLic7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmxvYWRFcnJvciA9ICcnO1xyXG4gICAgdGhpcy5hdWRpdFNldHRpbmdzTG9hZEZhaWxlZCA9IGZhbHNlO1xyXG4gICAgLy8gQSBmYWlsZWQgY2FsbCByZXNvbHZlcyB0byB7IGZhaWxlZDogZXJyb3IgfSBzbyBlYWNoIHBhcnQgY2FuIHNheSB3aGF0IHdlbnQgd3JvbmcuXHJcbiAgICBjb25zdCBzYWZlID0gKG86IGFueSkgPT4gby5waXBlKGNhdGNoRXJyb3IoKGU6IGFueSkgPT4gb2YoeyBmYWlsZWQ6IGUgfSkpKTtcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgZGV0YWlsczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0R2V0Q29uZmlnKHsgY2hlY2tMaXN0SWQ6IHRoaXMuY2hlY2tsaXN0SWQsIGNsaWVudElkOiB0aGlzLmNsaWVudElkIH0pKSxcclxuICAgICAgYXVkaXQ6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdENvbmZpZ0dldCh7IGNsaWVudElkOiB0aGlzLmNsaWVudElkLCBjaGVja2xpc3RJZDogdGhpcy5jaGVja2xpc3RJZCB9KSksXHJcbiAgICAgIHVzZXJzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuZ2V0Q2xpZW50VXNlcih0aGlzLmNsaWVudElkKSksXHJcbiAgICAgIGxhYmVsczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U2V0dGluZ3NHZXQodGhpcy5jbGllbnRJZCkpXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh7IGRldGFpbHMsIGF1ZGl0LCB1c2VycywgbGFiZWxzIH06IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBjbGllbnRVc2VyczogYW55W10gPSB1c2Vycz8uY29kZSA9PT0gMjAwID8gdXNlcnMuZGF0YSB8fCBbXSA6IFtdO1xyXG4gICAgICAvLyBUaGUgY2xpZW50J3Mgc3VwZXJhZG1pbjogdGhlIGRlZmF1bHQgYXBwcm92ZXIgZm9yIFRhbmdvIHVzZXJzIGFuZCByb2xlICd1c2VyJyAodjEgQ29uZmlndXJlKS5cclxuICAgICAgY29uc3Qgc3VwZXJBZG1pbiA9IGNsaWVudFVzZXJzLmZpbmQoKHU6IGFueSkgPT4gdT8ucm9sZSA9PT0gJ3N1cGVyYWRtaW4nICYmIHU/LmVtYWlsKTtcclxuICAgICAgdGhpcy5zdXBlckFkbWluID0gc3VwZXJBZG1pbiA/IHRoaXMuY2hpcChzdXBlckFkbWluLnVzZXJOYW1lLCBzdXBlckFkbWluLmVtYWlsKSA6IG51bGw7XHJcbiAgICAgIHRoaXMudXNlcnMgPSBjbGllbnRVc2Vyc1xyXG4gICAgICAgIC5tYXAoKHU6IGFueSkgPT4gdGhpcy5jaGlwKHUudXNlck5hbWUsIHUuZW1haWwpKVxyXG4gICAgICAgIC5maWx0ZXIoKHU6IENoaXBVc2VyKSA9PiB1LmUpO1xyXG4gICAgICB0aGlzLnBhc3NMYWJlbCA9IGxhYmVscz8uZGF0YT8ucGFzc0xhYmVsIHx8ICdQYXNzJztcclxuICAgICAgdGhpcy5mYWlsTGFiZWwgPSBsYWJlbHM/LmRhdGE/LmZhaWxMYWJlbCB8fCAnRmFpbCc7XHJcblxyXG4gICAgICBjb25zdCBkID0gZGV0YWlscz8uY29kZSA9PT0gMjAwID8gZGV0YWlscy5kYXRhPy5jaGVja0xpc3REZXRhaWxzIDogbnVsbDtcclxuICAgICAgaWYgKCFkKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgLy8gVGhlIEFQSSBhbnN3ZXJzIDIwNCAobm8gYm9keSkgd2hlbiB0aGUgYXVkaXQgZG9lcyBub3QgZXhpc3Qgb3IgYmVsb25ncyB0byBhbm90aGVyIGNsaWVudC5cclxuICAgICAgICB0aGlzLmxvYWRFcnJvciA9IGRldGFpbHM/LmZhaWxlZFxyXG4gICAgICAgICAgPyB0aGlzLmFwaUVycm9yKGRldGFpbHMuZmFpbGVkLCAnQ291bGQgbm90IGxvYWQgdGhpcyBhdWRpdC4gUmVsb2FkIHRoZSBwYWdlIHRvIHRyeSBhZ2Fpbi4nLCBmYWxzZSlcclxuICAgICAgICAgIDogJ1RoaXMgYXVkaXQgd2FzIG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkLiBPcGVuIENvbmZpZ3VyZSBhZ2FpbiBmcm9tIHRoZSBNYW5hZ2UgcGFnZS4nO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNvbmZpZ0RhdGEgPSBkZXRhaWxzLmRhdGE7XHJcbiAgICAgIHRoaXMuYXBwbHlDaGVja2xpc3QoZCk7XHJcbiAgICAgIHRoaXMuYXBwbHlBc3NpZ25tZW50KGQpO1xyXG4gICAgICB0aGlzLmF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkID0gYXVkaXQ/LmNvZGUgIT09IDIwMDtcclxuICAgICAgdGhpcy5hcHBseUF1ZGl0KHRoaXMuYXVkaXRTZXR0aW5nc0xvYWRGYWlsZWQgPyBudWxsIDogYXVkaXQuZGF0YT8uY29uZmlnKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdDb3VsZCBub3QgbG9hZCB0aGUgc2NvcmluZywgZGlzcHV0ZSBhbmQgYWNjZXNzIHNldHRpbmdzIG9mIHRoaXMgYXVkaXQuIFJlbG9hZCB0aGUgcGFnZSBiZWZvcmUgc2F2aW5nLCBzbyB0aGV5IGFyZSBub3QgcmVzZXQuJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodXNlcnM/LmZhaWxlZCkge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0V2FybmluZ1RvYXN0KCdDb3VsZCBub3QgbG9hZCB0aGUgdXNlcnMgb2YgdGhpcyBjbGllbnQsIHNvIHRoZSB1c2VyIHBpY2tlcnMgaGF2ZSBubyBzdWdnZXN0aW9ucy4gWW91IGNhbiBzdGlsbCBhZGQgYSB1c2VyIGJ5IHR5cGluZyB0aGVpciBmdWxsIGVtYWlsLicpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogZ2V0Q29uZmlnRGV0YWlscyBsaXN0cyB0aGUgYXNzaWdubWVudCBhcyB7IGlkLCB0eXBlIH0gcGFpcnMgKHN0b3JlcyAvIGNsdXN0ZXJzIG9yIHVzZXJzIC8gdGVhbXMpLiAqL1xyXG4gIHByaXZhdGUgYXBwbHlBc3NpZ25tZW50KGQ6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgY291bnQgPSAobGlzdDogYW55KSA9PiAoQXJyYXkuaXNBcnJheShsaXN0KSA/IGxpc3QubGVuZ3RoIDogMCk7XHJcbiAgICB0aGlzLmFzc2lnbmVkQ291bnQgPSBjb3VudChkLnNpbmdsZUFzc2lnbikgKyBjb3VudChkLmdyb3VwQXNzaWduKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlDaGVja2xpc3QoZDogYW55KTogdm9pZCB7XHJcbiAgICAvLyBOZXZlciBjb25maWd1cmVkIHlldDogbm8gc2NoZWR1bGUgd2luZG93IGhhcyBiZWVuIHNhdmVkIChjaGVja2VkIGJlZm9yZSB0aGUgZGVmYXVsdHMgYmVsb3cgZmlsbCBpdCkuXHJcbiAgICBjb25zdCBmaXJzdENvbmZpZ3VyZSA9ICFkLnNjaGVkdWxlU3RhcnRUaW1lO1xyXG4gICAgLy8gQSBuZXcgYXVkaXQgaGFzIG5vIHNjaGVkdWxlIHdpbmRvdywgYW5kIGNoZWNrbGlzdENvbmZpZ3VyZXYxIGNhbm5vdCBzdG9yZSBhbiBlbXB0eSBvbmU7XHJcbiAgICAvLyBzYW1lIGRlZmF1bHRzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UgYXBwbGllcyBvbiBsb2FkLlxyXG4gICAgaWYgKCFkLnNjaGVkdWxlU3RhcnRUaW1lKSB7IGQuc2NoZWR1bGVTdGFydFRpbWUgPSAnMTA6MDAgQU0nOyB9XHJcbiAgICBpZiAoIWQuc2NoZWR1bGVFbmRUaW1lKSB7IGQuc2NoZWR1bGVFbmRUaW1lID0gJzEwOjAwIFBNJzsgfVxyXG4gICAgdGhpcy5hdWRpdE5hbWUgPSBkLmNoZWNrTGlzdE5hbWUgfHwgJ+KAlCc7XHJcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZC5jaGVja0xpc3REZXNjcmlwdGlvbiB8fCAnJztcclxuICAgIHRoaXMucHVibGlzaGVkID0gISFkLnB1Ymxpc2g7XHJcbiAgICB0aGlzLnNjaGVkdWxlID0gZC5zY2hlZHVsZVJlcGVhdGVkVHlwZSB8fCBkLnNjaGVkdWxlID8gdGhpcy50aXRsZUNhc2UoZC5zY2hlZHVsZVJlcGVhdGVkVHlwZSB8fCBkLnNjaGVkdWxlKSA6ICfigJQnO1xyXG4gICAgdGhpcy5zY2hlZHVsZVdpbmRvdyA9IGQuc2NoZWR1bGVTdGFydFRpbWUgJiYgZC5zY2hlZHVsZUVuZFRpbWUgPyBkLnNjaGVkdWxlU3RhcnRUaW1lICsgJyB0byAnICsgZC5zY2hlZHVsZUVuZFRpbWUgOiAn4oCUJztcclxuICAgIHRoaXMuc2VjdGlvbnMgPSAoZC5zZWN0aW9ucyB8fCBbXSkubWFwKChzZWM6IGFueSwgaTogbnVtYmVyKSA9PiAoe1xyXG4gICAgICBsYWJlbDogc2VjLm5hbWUgfHwgJ1NlY3Rpb24gJyArIChpICsgMSksXHJcbiAgICAgIGl0ZW1zOiAoc2VjLnF1ZXN0aW9ucyB8fCBbXSkubWFwKChxOiBhbnkpID0+IHE/LnFuYW1lIHx8IFN0cmluZyhxKSksXHJcbiAgICAgIG9wZW46IGkgPT09IDBcclxuICAgIH0pKTtcclxuXHJcbiAgICB0aGlzLm93bmVycyA9IHRoaXMuY2hpcHMoZC5vd25lcik7XHJcbiAgICAvLyBObyBvd25lciB5ZXQgKGF1ZGl0cyBjcmVhdGVkIGJlZm9yZSB0aGUgY3JlYXRvciB3YXMgc3RvcmVkIGFzIG9uZSk6IHRoZSBsb2dnZWQtaW4gdXNlciwgc2F2ZWQgd2l0aCB0aGUgcGFnZS5cclxuICAgIGlmICghdGhpcy5vd25lcnMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG1lID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XHJcbiAgICAgIGlmIChtZT8uZW1haWwpIHsgdGhpcy5vd25lcnMgPSBbdGhpcy5jaGlwKG1lLnVzZXJOYW1lLCBtZS5lbWFpbCldOyB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcHJvdmVycyA9IHRoaXMuY2hpcHMoZC5hcHByb3Zlcik7XHJcbiAgICAvLyB2MSBDb25maWd1cmUgZGVmYXVsdCBhcHByb3Zlciwgb24gdGhlIGZpcnN0IENvbmZpZ3VyZSBvbmx5IChsYXRlciBhbiBlbXB0eSBsaXN0IG1lYW5zIEFwcHJvdmVyIHdhcyB0dXJuZWRcclxuICAgIC8vIG9mZiBvbiBwdXJwb3NlKTogVGFuZ28gdXNlcnMgYW5kIGNsaWVudCB1c2VycyB3aXRoIHJvbGUgJ3VzZXInIGdldCB0aGUgY2xpZW50J3Mgc3VwZXJhZG1pbiwgb3RoZXJzIHRoZW1zZWx2ZXMuXHJcbiAgICBpZiAoZmlyc3RDb25maWd1cmUgJiYgIXRoaXMuYXBwcm92ZXJzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBtZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICd7fScpO1xyXG4gICAgICBjb25zdCB0b1N1cGVyQWRtaW4gPSBtZT8udXNlclR5cGUgPT09ICd0YW5nbycgfHwgKG1lPy51c2VyVHlwZSA9PT0gJ2NsaWVudCcgJiYgbWU/LnJvbGUgPT09ICd1c2VyJyk7XHJcbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gdG9TdXBlckFkbWluID8gdGhpcy5zdXBlckFkbWluIDogKG1lPy5lbWFpbCA/IHRoaXMuY2hpcChtZS51c2VyTmFtZSwgbWUuZW1haWwpIDogbnVsbCk7XHJcbiAgICAgIGlmIChmYWxsYmFjaykgeyB0aGlzLmFwcHJvdmVycyA9IFtmYWxsYmFja107IH1cclxuICAgIH1cclxuICAgIHRoaXMuYXBwcm92ZXJPbiA9IHRoaXMuYXBwcm92ZXJzLmxlbmd0aCA+IDA7XHJcbiAgICAvLyBTdG9yZWQgYXMgbWludXRlcyAobnVtYmVycyk7IGtlZXAgdGhlIGtub3duIGludGVydmFscywgdW5pcXVlLCBhdCBtb3N0IHRocmVlLlxyXG4gICAgY29uc3Qgc3RvcmVkOiBudW1iZXJbXSA9IChBcnJheS5pc0FycmF5KGQucmVtYWluZGVyKSA/IGQucmVtYWluZGVyIDogW10pLm1hcCgobTogYW55KSA9PiBOdW1iZXIobSkpO1xyXG4gICAgdGhpcy5yZW1pbmRlcnMgPSBzdG9yZWQuZmlsdGVyKChtLCBpKSA9PiBSRU1JTkRFUl9NSU5VVEVTLmluY2x1ZGVzKG0pICYmIHN0b3JlZC5pbmRleE9mKG0pID09PSBpKS5zbGljZSgwLCBNQVhfUkVNSU5ERVJTKTtcclxuICAgIHRoaXMucmVtaW5kZXJPbiA9IHRoaXMucmVtaW5kZXJzLmxlbmd0aCA+IDA7XHJcbiAgICB0aGlzLnJlZnJlc2hSZW1pbmRlck9wdHMoKTtcclxuXHJcbiAgICBjb25zdCBuZiA9IGQubm90aWZ5RmxhZ3MgfHwge307XHJcbiAgICBjb25zdCBuZlR5cGVzOiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkobmYubm90aWZ5VHlwZSkgPyBuZi5ub3RpZnlUeXBlIDogW107XHJcbiAgICB0aGlzLm5vdGlmeUZsYWdzT24gPSBuZlR5cGVzLmxlbmd0aCA+IDA7XHJcbiAgICB0aGlzLm5vdGlmeVNlbmRBcHByb3ZlciA9IG5mVHlwZXMuaW5jbHVkZXMoJ2FwcHJvdmVyJykgfHwgIXRoaXMubm90aWZ5RmxhZ3NPbjtcclxuICAgIHRoaXMubm90aWZ5U2VuZEN1c3RvbSA9IG5mVHlwZXMuaW5jbHVkZXMoJ2N1c3RvbScpO1xyXG4gICAgdGhpcy5ub3RpZnlVc2VycyA9IHRoaXMuY2hpcHMobmYudXNlcnMpO1xyXG5cclxuICAgIGNvbnN0IHJmID0gZC5yZWN1cnJpbmdGbGFnIHx8IHt9O1xyXG4gICAgY29uc3QgcmZUeXBlczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KHJmLm5vdGlmeVR5cGUpID8gcmYubm90aWZ5VHlwZSA6IFtdO1xyXG4gICAgdGhpcy5yZWN1cnJpbmdGbGFnc09uID0gcmZUeXBlcy5sZW5ndGggPiAwO1xyXG4gICAgdGhpcy5yZWN1cnJpbmdTZW5kQXBwcm92ZXIgPSByZlR5cGVzLmluY2x1ZGVzKCdhcHByb3ZlcicpIHx8ICF0aGlzLnJlY3VycmluZ0ZsYWdzT247XHJcbiAgICB0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gPSByZlR5cGVzLmluY2x1ZGVzKCdjdXN0b20nKTtcclxuICAgIHRoaXMucmVjdXJyaW5nU2FtZUFzTm90aWZ5ID0gcmZUeXBlcy5pbmNsdWRlcygnc2FtZUFzTm90aWZ5Jyk7XHJcbiAgICB0aGlzLnJlY3VycmluZ1VzZXJzID0gdGhpcy5jaGlwcyhyZi51c2Vycyk7XHJcbiAgICB0aGlzLnJlY3VycmluZ1RocmVzaG9sZCA9IE51bWJlcihyZi50aHJlc2hvbGQpIHx8IDM7XHJcblxyXG4gICAgY29uc3QgYWUgPSBkLmF1dG9FbWFpbCB8fCB7fTtcclxuICAgIGNvbnN0IGFlVHlwZXM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShhZS50eXBlKSA/IGFlLnR5cGUgOiBbXTtcclxuICAgIHRoaXMuZGFpbHlSZXBvcnRPbiA9IGFlVHlwZXMubGVuZ3RoID4gMDtcclxuICAgIHRoaXMuZGFpbHlTZW5kQXBwcm92ZXIgPSBhZVR5cGVzLmluY2x1ZGVzKCdhcHByb3ZlcicpIHx8ICF0aGlzLmRhaWx5UmVwb3J0T247XHJcbiAgICB0aGlzLmRhaWx5U2VuZEN1c3RvbSA9IGFlVHlwZXMuaW5jbHVkZXMoJ2N1c3RvbScpO1xyXG4gICAgdGhpcy5kYWlseVVzZXJzID0gdGhpcy5jaGlwcyhhZS51c2Vycyk7XHJcbiAgICB0aGlzLnNoYXJlUG9zdEFwcHJvdmFsID0gISFkLnNoYXJlUmVwb3J0UG9zdEFwcHJvdmFsO1xyXG5cclxuICAgIHRoaXMuZXhwb3J0U3VibWlzc2lvbk9uID0gISFkLmV4cG9ydDtcclxuICAgIHRoaXMucmVkb1ZhbGlkRm9yID0gTnVtYmVyKGQucmVkb1ZhbGlkaXR5KSB8fCA3O1xyXG4gICAgdGhpcy5hdXRvQ3JlYXRlVGFza09uID0gISFkLmF1dG9DcmVhdGVUYXNrO1xyXG4gICAgLy8gRGVmYXVsdHMgbGlrZSB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlOyB3aXRob3V0IGFuIGFzc2lnbmVlIHRoZSBhcHByb3ZhbCByYWlzZXMgbm8gdGFzay5cclxuICAgIHRoaXMudGFza0Fzc2lnbmVlID0gZC50YXNrQXNzaWduZWUgPT09ICdzdG9yZScgfHwgZC50YXNrQXNzaWduZWUgPT09ICdzdG9yZXVzZXInID8gJ3N0b3JlJyA6ICdzdWJtaXR0ZXInO1xyXG4gICAgdGhpcy50YXNrVmFsaWRpdHkgPSBOdW1iZXIoZC50YXNrVmFsaWRpdHkpIHx8IDEwO1xyXG4gICAgdGhpcy5zaG93UmVzcG9uc2VJbkFwcCA9IGQuc2hvd0FwcHJvdmVkUmVzcG9uc2UgIT09IGZhbHNlO1xyXG4gICAgdGhpcy5yZXNwb25zZVZpc2liaWxpdHkgPSBkLnJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3ByZUFwcHJvdmFsJyA/ICdwcmUnIDogJ3Bvc3QnO1xyXG4gICAgdGhpcy5yZXNwRGVsYXkgPSBkLnJlc3BvbnNlVmlzaWJpbGl0eUhvdXJzID8/IDI7XHJcbiAgICB0aGlzLnJlcXVpcmVQaG90byA9ICEhZC51c2VyVmVyaWZpY2F0aW9uPy5yZXF1aXJlUGhvdG9DYXB0dXJlO1xyXG4gICAgdGhpcy5yZXF1aXJlQWNrbm93bGVkZ21lbnQgPSAhIWQudXNlclZlcmlmaWNhdGlvbj8ucmVxdWlyZVVzZXJBY2tub3dsZWRnbWVudDtcclxuICAgIHRoaXMucmVkb0V4dGVuc2lvbiA9IE51bWJlcihkLnJlZG9FeHRlbnNpb24pIHx8IDE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5QXVkaXQoY2ZnOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHMgPSBjZmc/LnNldHRpbmdzIHx8IHt9O1xyXG4gICAgdGhpcy5wYXNzVGhyZXNob2xkID0gTnVtYmVyKGNmZz8ucGFzc01hcmspIHx8IDc1O1xyXG4gICAgdGhpcy5wYXNzRmFpbE9uID0gcy5wYXNzRmFpbE9uICE9PSBmYWxzZTtcclxuICAgIHRoaXMuZGlzcHV0ZU9uID0gcy5kaXNwdXRlT24gIT09IGZhbHNlO1xyXG4gICAgdGhpcy5kaXNwdXRlV2luZG93ID0gTnVtYmVyKHMuZGlzcHV0ZVdpbmRvdykgfHwgNDg7XHJcbiAgICB0aGlzLnByZVN1Ym1pc3Npb25BY2Nlc3NPbiA9ICEhcy5wcmVTdWJtaXNzaW9uQWNjZXNzT247XHJcbiAgICB0aGlzLnByZVN1Ym1pc3Npb25Vc2VycyA9IHRoaXMuY2hpcHMocy5wcmVTdWJtaXNzaW9uVXNlcnMpO1xyXG4gICAgdGhpcy5lZGl0U3VibWl0dGVkT24gPSAhIXMuZWRpdFN1Ym1pdHRlZE9uO1xyXG4gICAgdGhpcy5lZGl0VXNlcnMgPSB0aGlzLmNoaXBzKHMuZWRpdFVzZXJzKTtcclxuICB9XHJcblxyXG4gIC8qKiBBY2NlcHRzIGJvdGggdGhlIGNoZWNrbGlzdCBzaGFwZSB7IG5hbWUsIHZhbHVlIH0gYW5kIHRoZSBhdWRpdCBzaGFwZSB7IG4sIGUgfS4gKi9cclxuICBwcml2YXRlIGNoaXBzKGxpc3Q6IGFueSk6IENoaXBVc2VyW10ge1xyXG4gICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGxpc3QpID8gbGlzdCA6IFtdKVxyXG4gICAgICAubWFwKCh1OiBhbnkpID0+IHRoaXMuY2hpcCh1Py5uYW1lID8/IHU/Lm4sIHU/LnZhbHVlID8/IHU/LmUgPz8gdT8uZW1haWwpKVxyXG4gICAgICAuZmlsdGVyKCh1OiBDaGlwVXNlcikgPT4gdS5lIHx8IHUubik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNoaXAobmFtZTogc3RyaW5nLCBlbWFpbDogc3RyaW5nKTogQ2hpcFVzZXIge1xyXG4gICAgY29uc3QgbiA9IFN0cmluZyhuYW1lIHx8IGVtYWlsIHx8ICcnKS50cmltKCk7XHJcbiAgICBjb25zdCBwYXJ0cyA9IG4uc3BsaXQoL1xccysvKTtcclxuICAgIGNvbnN0IGkgPSAoKHBhcnRzWzBdPy5bMF0gfHwgJycpICsgKHBhcnRzWzFdPy5bMF0gfHwgcGFydHNbMF0/LlsxXSB8fCAnJykpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICByZXR1cm4geyBpLCBuLCBlOiBTdHJpbmcoZW1haWwgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRpdGxlQ2FzZSh2OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyB2LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdi5zbGljZSgxKSA6IHY7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWN0aW9uKHNlY3Rpb246IENvbmZpZ1NlY3Rpb24pOiB2b2lkIHtcclxuICAgIHNlY3Rpb24ub3BlbiA9ICFzZWN0aW9uLm9wZW47XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIHJlbWluZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogVHVybmluZyBSZW1pbmRlciBvbiBzdGFydHMgd2l0aCBvbmUgMzAtbWludXRlIHJlbWluZGVyLCBhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIGRvZXMuICovXHJcbiAgdG9nZ2xlUmVtaW5kZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbWluZGVyT24gPSAhdGhpcy5yZW1pbmRlck9uO1xyXG4gICAgaWYgKHRoaXMucmVtaW5kZXJPbiAmJiAhdGhpcy5yZW1pbmRlcnMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMucmVtaW5kZXJzID0gW1JFTUlOREVSX01JTlVURVNbMF1dO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoUmVtaW5kZXJPcHRzKCk7XHJcbiAgfVxyXG5cclxuICBzZXRSZW1pbmRlcihpbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBtaW51dGVzID0gTnVtYmVyKHZhbHVlKTtcclxuICAgIGlmICghUkVNSU5ERVJfTUlOVVRFUy5pbmNsdWRlcyhtaW51dGVzKSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucmVtaW5kZXJzID0gdGhpcy5yZW1pbmRlcnMubWFwKChtLCBpKSA9PiAoaSA9PT0gaW5kZXggPyBtaW51dGVzIDogbSkpO1xyXG4gICAgdGhpcy5yZWZyZXNoUmVtaW5kZXJPcHRzKCk7XHJcbiAgfVxyXG5cclxuICAvKiogQWRkcyB0aGUgZmlyc3QgaW50ZXJ2YWwgbm90IHVzZWQgeWV0LiAqL1xyXG4gIGFkZFJlbWluZGVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbmV4dCA9IFJFTUlOREVSX01JTlVURVMuZmluZChtID0+ICF0aGlzLnJlbWluZGVycy5pbmNsdWRlcyhtKSk7XHJcbiAgICBpZiAobmV4dCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMucmVtaW5kZXJzLmxlbmd0aCA+PSBNQVhfUkVNSU5ERVJTKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5yZW1pbmRlcnMgPSBbLi4udGhpcy5yZW1pbmRlcnMsIG5leHRdO1xyXG4gICAgdGhpcy5yZWZyZXNoUmVtaW5kZXJPcHRzKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVSZW1pbmRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5yZW1pbmRlcnMubGVuZ3RoIDw9IDEpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnJlbWluZGVycyA9IHRoaXMucmVtaW5kZXJzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xyXG4gICAgdGhpcy5yZWZyZXNoUmVtaW5kZXJPcHRzKCk7XHJcbiAgfVxyXG5cclxuICAvKiogXCIzMCwgNDUgYW5kIDYwIG1pbnNcIiBmb3IgdGhlIHN1bW1hcnkgbGluZS4gKi9cclxuICBnZXQgcmVtaW5kZXJTdW1tYXJ5KCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsaXN0ID0gWy4uLnRoaXMucmVtaW5kZXJzXS5zb3J0KChhLCBiKSA9PiBhIC0gYikubWFwKFN0cmluZyk7XHJcbiAgICByZXR1cm4gbGlzdC5sZW5ndGggPiAxID8gbGlzdC5zbGljZSgwLCAtMSkuam9pbignLCAnKSArICcgYW5kICcgKyBsaXN0W2xpc3QubGVuZ3RoIC0gMV0gOiAobGlzdFswXSB8fCAnJyk7XHJcbiAgfVxyXG5cclxuICAvKiogRWFjaCByb3cgb2ZmZXJzIGl0cyBvd24gdmFsdWUgcGx1cyBldmVyeSBpbnRlcnZhbCBubyBvdGhlciByb3cgdXNlcyAocmVidWlsdCBvbmx5IG9uIGNoYW5nZSkuICovXHJcbiAgcHJpdmF0ZSByZWZyZXNoUmVtaW5kZXJPcHRzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZW1pbmRlck9wdHMgPSB0aGlzLnJlbWluZGVycy5tYXAoKG93biwgaW5kZXgpID0+IFJFTUlOREVSX01JTlVURVNcclxuICAgICAgLmZpbHRlcihtID0+IG0gPT09IG93biB8fCAhdGhpcy5yZW1pbmRlcnMuc29tZSgob3RoZXIsIGkpID0+IGkgIT09IGluZGV4ICYmIG90aGVyID09PSBtKSlcclxuICAgICAgLm1hcChtID0+ICh7IHZhbHVlOiBtLCBsYWJlbDogbSArICcgbWlucycgfSkpKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gYXBwcm92ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBBcHByb3ZlciBpcyBvbiBhbmQgaGFzIGF0IGxlYXN0IG9uZSB1c2VyOiB0aGUgb25seSBzdGF0ZSBpbiB3aGljaCBhbnl0aGluZyBjYW4gZ28gXCJ0byB0aGUgYXBwcm92ZXJcIi4gKi9cclxuICBnZXQgaGFzQXBwcm92ZXJzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXBwcm92ZXJPbiAmJiB0aGlzLmFwcHJvdmVycy5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoeSBcImFwcHJvdmVyXCIgY2Fubm90IGJlIHVzZWQgcmlnaHQgbm93ICgnJyB3aGVuIGl0IGNhbikuICovXHJcbiAgcHJpdmF0ZSBnZXQgYXBwcm92ZXJNaXNzaW5nVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmFwcHJvdmVyT24pIHsgcmV0dXJuICdBcHByb3ZlciBpcyB0dXJuZWQgb2ZmLiBUdXJuIG9uIEFwcHJvdmVyIGFuZCBhZGQgYXQgbGVhc3Qgb25lIGFwcHJvdmVyIGZpcnN0Lic7IH1cclxuICAgIGlmICghdGhpcy5hcHByb3ZlcnMubGVuZ3RoKSB7IHJldHVybiAnTm8gYXBwcm92ZXIgaGFzIGJlZW4gYWRkZWQgeWV0LiBBZGQgYXQgbGVhc3Qgb25lIGFwcHJvdmVyIHVuZGVyIEFwcHJvdmVyIGZpcnN0Lic7IH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIC8qKiBTaG93biB1bmRlciB0aGUgYXBwcm92ZXIgcGlja2VyIHdoaWxlIGl0IGlzIG9uIGJ1dCBlbXB0eSAoU2F2ZSBhcyBEcmFmdCBzdGlsbCB3b3JrczsgUHVibGlzaCBkb2VzIG5vdCkuICovXHJcbiAgZ2V0IGFwcHJvdmVyRXJyb3IoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmFwcHJvdmVyT24gJiYgIXRoaXMuYXBwcm92ZXJzLmxlbmd0aCA/ICdBZGQgYXQgbGVhc3Qgb25lIGFwcHJvdmVyLCBvciB0dXJuIEFwcHJvdmVyIG9mZiB0byBwdWJsaXNoIHdpdGhvdXQgYXBwcm92YWwuJyA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBwYXJ0cyBvZiB0aGUgcGFnZSB0aGF0IHNlbmQgdG8gLyByZWx5IG9uIHRoZSBhcHByb3ZlcnMgYW5kIGFyZSBzd2l0Y2hlZCBvbiBub3cuICovXHJcbiAgcHJpdmF0ZSBnZXQgYXBwcm92ZXJEZXBlbmRlbnRzKCk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGxpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5ub3RpZnlGbGFnc09uICYmIHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyKSB7IGxpc3QucHVzaCgnTm90aWZ5IEZsYWdzJyk7IH1cclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgdGhpcy5yZWN1cnJpbmdTZW5kQXBwcm92ZXIpIHsgbGlzdC5wdXNoKCdOb3RpZnkgb24gUmVjdXJyaW5nIEZsYWdzJyk7IH1cclxuICAgIGlmICh0aGlzLmRhaWx5UmVwb3J0T24gJiYgdGhpcy5kYWlseVNlbmRBcHByb3ZlcikgeyBsaXN0LnB1c2goJ0RhaWx5IFJlcG9ydCcpOyB9XHJcbiAgICBpZiAodGhpcy5lZGl0U3VibWl0dGVkT24pIHsgbGlzdC5wdXNoKCdFZGl0IFN1Ym1pdHRlZCBBdWRpdCcpOyB9XHJcbiAgICByZXR1cm4gbGlzdDtcclxuICB9XHJcblxyXG4gIC8qKiBUdXJuaW5nIEFwcHJvdmVyIG9mZiB3YXJucyBhYm91dCBldmVyeSBzZXR0aW5nIHRoYXQgc3RpbGwgc2VuZHMgdG8gLyByZWxpZXMgb24gdGhlIGFwcHJvdmVycy4gKi9cclxuICB0b2dnbGVBcHByb3ZlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuYXBwcm92ZXJPbiA9ICF0aGlzLmFwcHJvdmVyT247XHJcbiAgICBjb25zdCBkZXBlbmRlbnRzID0gdGhpcy5hcHByb3ZlckRlcGVuZGVudHM7XHJcbiAgICBpZiAoIXRoaXMuYXBwcm92ZXJPbiAmJiBkZXBlbmRlbnRzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFdhcm5pbmdUb2FzdCgnQXBwcm92ZXIgaXMgdHVybmVkIG9mZiwgYnV0ICcgKyBkZXBlbmRlbnRzLmpvaW4oJywgJykgKyAnIHN0aWxsIHVzZSB0aGUgYXBwcm92ZXJzLiBUdXJuIEFwcHJvdmVyIGJhY2sgb24gb3IgY2hhbmdlIHRob3NlIHNldHRpbmdzIGJlZm9yZSBzYXZpbmcuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU2VuZCBUbyA+IEFwcHJvdmVyIGNhbiBvbmx5IGJlIHRpY2tlZCB3aGVuIHRoZXJlIGlzIGFuIGFwcHJvdmVyIHRvIHNlbmQgdG8uICovXHJcbiAgdG9nZ2xlU2VuZEFwcHJvdmVyKGtleTogU2VuZEFwcHJvdmVyS2V5KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXNba2V5XSAmJiAhdGhpcy5oYXNBcHByb3ZlcnMpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHRoaXMuYXBwcm92ZXJNaXNzaW5nVGV4dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXNba2V5XSA9ICF0aGlzW2tleV07XHJcbiAgfVxyXG5cclxuICAvKiogU3dpdGNoaW5nIGEgZmxhZyAvIHJlcG9ydCBlbWFpbCBvbiB0aWNrcyBBcHByb3ZlciBvbmx5IHdoZW4gdGhlcmUgaXMgYW4gYXBwcm92ZXIgdG8gc2VuZCB0by4gKi9cclxuICB0b2dnbGVOb3RpZnlGbGFncygpOiB2b2lkIHtcclxuICAgIHRoaXMubm90aWZ5RmxhZ3NPbiA9ICF0aGlzLm5vdGlmeUZsYWdzT247XHJcbiAgICBpZiAodGhpcy5ub3RpZnlGbGFnc09uICYmICF0aGlzLmhhc0FwcHJvdmVycykgeyB0aGlzLm5vdGlmeVNlbmRBcHByb3ZlciA9IGZhbHNlOyB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVSZWN1cnJpbmdGbGFncygpOiB2b2lkIHtcclxuICAgIHRoaXMucmVjdXJyaW5nRmxhZ3NPbiA9ICF0aGlzLnJlY3VycmluZ0ZsYWdzT247XHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdGbGFnc09uICYmICF0aGlzLmhhc0FwcHJvdmVycykgeyB0aGlzLnJlY3VycmluZ1NlbmRBcHByb3ZlciA9IGZhbHNlOyB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVEYWlseVJlcG9ydCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGFpbHlSZXBvcnRPbiA9ICF0aGlzLmRhaWx5UmVwb3J0T247XHJcbiAgICBpZiAodGhpcy5kYWlseVJlcG9ydE9uICYmICF0aGlzLmhhc0FwcHJvdmVycykgeyB0aGlzLmRhaWx5U2VuZEFwcHJvdmVyID0gZmFsc2U7IH1cclxuICB9XHJcblxyXG4gIC8qKiBFZGl0IFN1Ym1pdHRlZCBBdWRpdCBsZXRzIGFwcHJvdmVycyBjaGFuZ2Ugc3VibWlzc2lvbnMgYmVmb3JlIGFwcHJvdmluZywgc28gaXQgbmVlZHMgYXBwcm92ZXJzLiAqL1xyXG4gIHRvZ2dsZUVkaXRTdWJtaXR0ZWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWRpdFN1Ym1pdHRlZE9uICYmICF0aGlzLmhhc0FwcHJvdmVycykge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0VkaXQgU3VibWl0dGVkIEF1ZGl0IGlzIGZvciBhcHByb3ZlcnMuICcgKyB0aGlzLmFwcHJvdmVyTWlzc2luZ1RleHQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmVkaXRTdWJtaXR0ZWRPbiA9ICF0aGlzLmVkaXRTdWJtaXR0ZWRPbjtcclxuICB9XHJcblxyXG4gIGdldCBlZGl0U3VibWl0dGVkRXJyb3IoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5lZGl0U3VibWl0dGVkT24pIHsgcmV0dXJuICcnOyB9XHJcbiAgICBpZiAoIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHJldHVybiAnRWRpdCBTdWJtaXR0ZWQgQXVkaXQgaXMgZm9yIGFwcHJvdmVycy4gJyArIHRoaXMuYXBwcm92ZXJNaXNzaW5nVGV4dCArICcgT3IgdHVybiBFZGl0IFN1Ym1pdHRlZCBBdWRpdCBvZmYuJzsgfVxyXG4gICAgaWYgKCF0aGlzLmVkaXRVc2Vycy5sZW5ndGgpIHsgcmV0dXJuICdBZGQgYXQgbGVhc3Qgb25lIHVzZXIgd2hvIGNhbiBlZGl0IHN1Ym1pdHRlZCBhdWRpdHMnOyB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIG5vdGlmeSAvIHJlY3VycmluZyBmbGFnIHJlY2lwaWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIFRpY2tpbmcgQ3VzdG9tIHVuZGVyIFJlY3VycmluZyBGbGFncyBzdGFydHMgaXRzIHVzZXIgbGlzdCBmcm9tIHRoZSBOb3RpZnkgRmxhZ3MgY3VzdG9tIHVzZXJzLFxyXG4gICAqIHNvIHRoZSBzYW1lIHBlb3BsZSBhcmUgdXNlZCBieSBkZWZhdWx0OyB0aGUgbGlzdCBzdGF5cyBlZGl0YWJsZS5cclxuICAgKi9cclxuICB0b2dnbGVSZWN1cnJpbmdDdXN0b20oKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gPSAhdGhpcy5yZWN1cnJpbmdTZW5kQ3VzdG9tO1xyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSAmJiAhdGhpcy5yZWN1cnJpbmdVc2Vycy5sZW5ndGggJiYgdGhpcy5ub3RpZnlGbGFnc09uICYmIHRoaXMubm90aWZ5U2VuZEN1c3RvbSkge1xyXG4gICAgICB0aGlzLnJlY3VycmluZ1VzZXJzID0gWy4uLnRoaXMubm90aWZ5VXNlcnNdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFdobyBcIlVzZSBzYW1lIHVzZXJzIGZyb20gTm90aWZ5IEZsYWdzXCIgcmVzb2x2ZXMgdG8gKHNob3duIHJlYWQtb25seSB1bmRlciB0aGUgb3B0aW9uKS4gKi9cclxuICBnZXQgbm90aWZ5UmVjaXBpZW50c0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMubm90aWZ5RmxhZ3NPbikgeyByZXR1cm4gJ05vdGlmeSBGbGFncyBpcyBvZmYsIHNvIG5vIG9uZSBpcyBhZGRlZCBmcm9tIGl0JzsgfVxyXG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5ub3RpZnlTZW5kQXBwcm92ZXIpIHsgcGFydHMucHVzaCh0aGlzLmFwcHJvdmVycy5sZW5ndGggPyAndGhlIGFwcHJvdmVycycgOiAndGhlIGFwcHJvdmVycyAobm9uZSBzZXQpJyk7IH1cclxuICAgIGlmICh0aGlzLm5vdGlmeVNlbmRDdXN0b20gJiYgdGhpcy5ub3RpZnlVc2Vycy5sZW5ndGgpIHsgcGFydHMucHVzaCh0aGlzLm5vdGlmeVVzZXJzLm1hcCh1ID0+IHUubikuam9pbignLCAnKSk7IH1cclxuICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPyAnQWxzbyBzZW5kcyB0byAnICsgcGFydHMuam9pbignIGFuZCAnKSA6ICdOb3RpZnkgRmxhZ3MgaGFzIG5vIHJlY2lwaWVudHMgeWV0JztcclxuICB9XHJcblxyXG4gIGdldCBub3RpZnlGbGFnc0Vycm9yKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMubm90aWZ5RmxhZ3NPbikgeyByZXR1cm4gJyc7IH1cclxuICAgIGlmICghdGhpcy5ub3RpZnlTZW5kQXBwcm92ZXIgJiYgIXRoaXMubm90aWZ5U2VuZEN1c3RvbSkgeyByZXR1cm4gJ0Nob29zZSB3aG8gcmVjZWl2ZXMgdGhlIGZsYWcgZW1haWxzJzsgfVxyXG4gICAgaWYgKHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyICYmICF0aGlzLmhhc0FwcHJvdmVycykgeyByZXR1cm4gJ05vdGlmeSBGbGFncyBzZW5kcyB0byB0aGUgYXBwcm92ZXIuICcgKyB0aGlzLmFwcHJvdmVyTWlzc2luZ1RleHQgKyAnIE9yIHVudGljayBBcHByb3ZlciBoZXJlLic7IH1cclxuICAgIGlmICh0aGlzLm5vdGlmeVNlbmRDdXN0b20gJiYgIXRoaXMubm90aWZ5VXNlcnMubGVuZ3RoKSB7IHJldHVybiAnQWRkIGF0IGxlYXN0IG9uZSBjdXN0b20gdXNlciBmb3IgTm90aWZ5IEZsYWdzJzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlY3VycmluZ0ZsYWdzRXJyb3IoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5yZWN1cnJpbmdGbGFnc09uKSB7IHJldHVybiAnJzsgfVxyXG4gICAgaWYgKCF0aGlzLnJlY3VycmluZ1NlbmRBcHByb3ZlciAmJiAhdGhpcy5yZWN1cnJpbmdTZW5kQ3VzdG9tICYmICF0aGlzLnJlY3VycmluZ1NhbWVBc05vdGlmeSkgeyByZXR1cm4gJ0Nob29zZSB3aG8gcmVjZWl2ZXMgdGhlIHJlY3VycmluZyBmbGFnIGVtYWlscyc7IH1cclxuICAgIGlmICh0aGlzLnJlY3VycmluZ1NlbmRBcHByb3ZlciAmJiAhdGhpcy5oYXNBcHByb3ZlcnMpIHsgcmV0dXJuICdSZWN1cnJpbmcgRmxhZ3Mgc2VuZHMgdG8gdGhlIGFwcHJvdmVyLiAnICsgdGhpcy5hcHByb3Zlck1pc3NpbmdUZXh0ICsgJyBPciB1bnRpY2sgQXBwcm92ZXIgaGVyZS4nOyB9XHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdTZW5kQ3VzdG9tICYmICF0aGlzLnJlY3VycmluZ1VzZXJzLmxlbmd0aCkgeyByZXR1cm4gJ0FkZCBhdCBsZWFzdCBvbmUgY3VzdG9tIHVzZXIgZm9yIFJlY3VycmluZyBGbGFncyc7IH1cclxuICAgIC8vIEFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2U6IFwic2FtZSB1c2Vyc1wiIG5lZWRzIE5vdGlmeSBGbGFncyBvbiwgZWxzZSBpdCB3b3VsZCBtYWlsIG5vIG9uZS5cclxuICAgIGlmICh0aGlzLnJlY3VycmluZ1NhbWVBc05vdGlmeSAmJiAhdGhpcy5ub3RpZnlGbGFnc09uKSB7IHJldHVybiAnXCJVc2Ugc2FtZSB1c2VycyBmcm9tIE5vdGlmeSBGbGFnc1wiIG5lZWRzIE5vdGlmeSBGbGFncyBvbi4gVHVybiBOb3RpZnkgRmxhZ3Mgb24sIG9yIHVudGljayB0aGlzIG9wdGlvbi4nOyB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgZGFpbHlSZXBvcnRFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmRhaWx5UmVwb3J0T24pIHsgcmV0dXJuICcnOyB9XHJcbiAgICBpZiAoIXRoaXMuZGFpbHlTZW5kQXBwcm92ZXIgJiYgIXRoaXMuZGFpbHlTZW5kQ3VzdG9tKSB7IHJldHVybiAnQ2hvb3NlIHdobyByZWNlaXZlcyB0aGUgZGFpbHkgcmVwb3J0JzsgfVxyXG4gICAgaWYgKHRoaXMuZGFpbHlTZW5kQXBwcm92ZXIgJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHJldHVybiAnVGhlIGRhaWx5IHJlcG9ydCBpcyBzZW50IHRvIHRoZSBhcHByb3Zlci4gJyArIHRoaXMuYXBwcm92ZXJNaXNzaW5nVGV4dCArICcgT3IgdW50aWNrIEFwcHJvdmVyIGhlcmUuJzsgfVxyXG4gICAgaWYgKHRoaXMuZGFpbHlTZW5kQ3VzdG9tICYmICF0aGlzLmRhaWx5VXNlcnMubGVuZ3RoKSB7IHJldHVybiAnQWRkIGF0IGxlYXN0IG9uZSBjdXN0b20gdXNlciBmb3IgdGhlIGRhaWx5IHJlcG9ydCc7IH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gZHJvcGRvd25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHRvZ2dsZVNlbGVjdChrZXk6IFNlbGVjdEtleSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMub3BlblNlbGVjdCA9IHRoaXMub3BlblNlbGVjdCA9PT0ga2V5ID8gbnVsbCA6IGtleTtcclxuICAgIHRoaXMub3BlbkNoaXBzID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHBpY2soa2V5OiBTZWxlY3RLZXksIG9wdGlvbjogU2VsZWN0T3B0aW9uLCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpc1trZXldID0gb3B0aW9uLnZhbHVlO1xyXG4gICAgdGhpcy5vcGVuU2VsZWN0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHNlbGVjdExhYmVsKGtleTogU2VsZWN0S2V5LCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcclxuICAgIHJldHVybiBvcHRpb25zLmZpbmQobyA9PiBvLnZhbHVlID09PSB2YWx1ZSk/LmxhYmVsID8/IFN0cmluZyh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBpc1BpY2tlZChrZXk6IFNlbGVjdEtleSwgb3B0aW9uOiBTZWxlY3RPcHRpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzW2tleV0gPT09IG9wdGlvbi52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8vIFR5cGVkIGFjY2Vzc29ycyBmb3IgdGhlIHNoYXJlZCB0ZW1wbGF0ZXMgKHRoZWlyIGNvbnRleHQgdmFyaWFibGVzIGFyZSB1bnR5cGVkLCBhbmQgdGhlXHJcbiAgLy8gcm9vdCBhcHAncyBzdHJpY3QgdGVtcGxhdGUgY2hlY2sgcmVqZWN0cyBgdGhpc1tsaXN0XWAgLyBgZHJhZnRzW2xpc3RdYCkuXHJcbiAgY2hpcHNPZihsaXN0OiBDaGlwTGlzdCk6IENoaXBVc2VyW10ge1xyXG4gICAgcmV0dXJuIHRoaXNbbGlzdF07XHJcbiAgfVxyXG5cclxuICBkcmFmdE9mKGxpc3Q6IENoaXBMaXN0KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmRyYWZ0c1tsaXN0XTtcclxuICB9XHJcblxyXG4gIHNldERyYWZ0KGxpc3Q6IENoaXBMaXN0LCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0c1tsaXN0XSA9IHZhbHVlID8/ICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBjaGlwIHBpY2tlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogQ2xpZW50IHVzZXJzIG1hdGNoaW5nIHRoZSB0eXBlZCB0ZXh0LCBtaW51cyB0aGUgb25lcyBhbHJlYWR5IGluIHRoZSBsaXN0LiAqL1xyXG4gIHN1Z2dlc3Rpb25zKGxpc3Q6IENoaXBMaXN0KTogQ2hpcFVzZXJbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5kcmFmdHNbbGlzdF0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBjaG9zZW4gPSBuZXcgU2V0KHRoaXNbbGlzdF0ubWFwKHUgPT4gdS5lKSk7XHJcbiAgICByZXR1cm4gdGhpcy51c2Vyc1xyXG4gICAgICAuZmlsdGVyKHUgPT4gIWNob3Nlbi5oYXModS5lKSAmJiAoIXEgfHwgdS5uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwgdS5lLmluY2x1ZGVzKHEpKSlcclxuICAgICAgLnNsaWNlKDAsIDgpO1xyXG4gIH1cclxuXHJcbiAgZm9jdXNDaGlwcyhsaXN0OiBDaGlwTGlzdCwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMub3BlbkNoaXBzID0gbGlzdDtcclxuICAgIHRoaXMub3BlblNlbGVjdCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwcm92ZXJzIGNhbiBvbmx5IGJlIGFkZGVkIHdoaWxlIEFwcHJvdmVyIGlzIG9uICh0aGUgcGlja2VyIGlzIGhpZGRlbiBvdGhlcndpc2U7IHRoaXMgZ3VhcmRzIGl0KS4gKi9cclxuICBwcml2YXRlIGFwcHJvdmVyTGlzdExvY2tlZChsaXN0OiBDaGlwTGlzdCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGxpc3QgIT09ICdhcHByb3ZlcnMnIHx8IHRoaXMuYXBwcm92ZXJPbikgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQXBwcm92ZXIgaXMgdHVybmVkIG9mZi4gVHVybiBvbiBBcHByb3ZlciB0byBhZGQgYXBwcm92ZXJzLicpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBhZGRTdWdnZXN0aW9uKGxpc3Q6IENoaXBMaXN0LCB1c2VyOiBDaGlwVXNlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmFwcHJvdmVyTGlzdExvY2tlZChsaXN0KSkgeyByZXR1cm47IH1cclxuICAgIGlmICghdGhpc1tsaXN0XS5zb21lKHUgPT4gdS5lID09PSB1c2VyLmUpKSB7XHJcbiAgICAgIHRoaXNbbGlzdF0gPSBbLi4udGhpc1tsaXN0XSwgdXNlcl07XHJcbiAgICB9XHJcbiAgICB0aGlzLmRyYWZ0c1tsaXN0XSA9ICcnO1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVudGVyIHRha2VzIHRoZSBmaXJzdCBzdWdnZXN0aW9uOyBhbiBleGFjdCBlbWFpbCB3b3JrcyBldmVuIGZvciBhIHVzZXIgbm90IGluIHRoZSBsaXN0LiAqL1xyXG4gIGFkZENoaXAobGlzdDogQ2hpcExpc3QpOiB2b2lkIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLmRyYWZ0c1tsaXN0XS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGlmICghcSB8fCB0aGlzLmFwcHJvdmVyTGlzdExvY2tlZChsaXN0KSkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IHR5cGVkID0gdGhpcy5lc2ModGhpcy5kcmFmdHNbbGlzdF0udHJpbSgpKTtcclxuICAgIGNvbnN0IGlzRW1haWwgPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLy50ZXN0KHEpO1xyXG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLnN1Z2dlc3Rpb25zKGxpc3QpWzBdIHx8IChpc0VtYWlsID8gdGhpcy5jaGlwKHEsIHEpIDogbnVsbCk7XHJcbiAgICBpZiAoIW1hdGNoKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChxLmluY2x1ZGVzKCdAJylcclxuICAgICAgICA/ICdcIicgKyB0eXBlZCArICdcIiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLidcclxuICAgICAgICA6ICdObyB1c2VyIG1hdGNoZXMgXCInICsgdHlwZWQgKyAnXCIuIFBpY2sgYSB1c2VyIGZyb20gdGhlIGxpc3Qgb3IgdHlwZSB0aGVpciBmdWxsIGVtYWlsLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpc1tsaXN0XS5zb21lKHUgPT4gdS5lID09PSBtYXRjaC5lKSkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QodGhpcy5lc2MobWF0Y2gubiB8fCBtYXRjaC5lKSArICcgaXMgYWxyZWFkeSBhZGRlZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpc1tsaXN0XSA9IFsuLi50aGlzW2xpc3RdLCBtYXRjaF07XHJcbiAgICB0aGlzLmRyYWZ0c1tsaXN0XSA9ICcnO1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ2hpcChsaXN0OiBDaGlwTGlzdCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpc1tsaXN0XSA9IHRoaXNbbGlzdF0uZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIERhaWx5IFJlcG9ydCBjdXN0b20gdXNlcnM6IGJ1bGsgdXBsb2FkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgb3BlbkRhaWx5QnVsaygpOiB2b2lkIHtcclxuICAgIHRoaXMuZGFpbHlCdWxrRXJyb3JzID0gW107XHJcbiAgICB0aGlzLmRhaWx5QnVsa09wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBudWxsO1xyXG4gICAgdGhpcy5vcGVuU2VsZWN0ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIGNsb3NlRGFpbHlCdWxrKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kYWlseUJ1bGtPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmRhaWx5QnVsa0Vycm9ycyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVzZXJuYW1lICsgRW1haWwgdGVtcGxhdGUsIHByZS1maWxsZWQgd2l0aCB0aGUgY3VycmVudCBEYWlseSBSZXBvcnQgY3VzdG9tIHVzZXJzIChhcyB0aGUgQ2hlY2tsaXN0IG9uZSkuICovXHJcbiAgZG93bmxvYWREYWlseVRlbXBsYXRlKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZGFpbHlVc2Vycy5sZW5ndGggPyB0aGlzLmRhaWx5VXNlcnMubWFwKHUgPT4gW3UubiwgdS5lXSkgOiBbWycnLCAnJ11dO1xyXG4gICAgY29uc3Qgc2hlZXQgPSBYTFNYLnV0aWxzLmFvYV90b19zaGVldChbWydVc2VybmFtZScsICdFbWFpbCddLCAuLi5yb3dzXSk7XHJcbiAgICBzaGVldFsnIWNvbHMnXSA9IFt7IHdjaDogMjggfSwgeyB3Y2g6IDM2IH1dO1xyXG4gICAgY29uc3QgYm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcclxuICAgIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQoYm9vaywgc2hlZXQsICdVc2VycycpO1xyXG4gICAgWExTWC53cml0ZUZpbGUoYm9vaywgJ2RhaWx5UmVwb3J0VGVtcGxhdGUueGxzeCcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVwbGFjZXMgdGhlIERhaWx5IFJlcG9ydCBjdXN0b20gdXNlcnMgd2l0aCB0aGUgdXBsb2FkZWQgc2hlZXQsIGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UgZG9lczpcclxuICAgKiBvbmx5IHRoZSBFbWFpbCBjb2x1bW4gY291bnRzICh0aGUgbmFtZSBjb21lcyBmcm9tIHRoZSBjbGllbnQncyB1c2VyIGxpc3QpLCBhbmQgZXZlcnkgcm93IG11c3QgYmUgYW5cclxuICAgKiBleGlzdGluZyB1c2VyLiBBbnkgaW52YWxpZCByb3cgcmVqZWN0cyB0aGUgd2hvbGUgZmlsZS5cclxuICAgKi9cclxuICBvbkRhaWx5QnVsa0ZpbGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XHJcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xyXG4gICAgaWYgKCFmaWxlKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5kYWlseUJ1bGtFcnJvcnMgPSBbXTtcclxuICAgIGlmICghL1xcLnhsc3gkL2kudGVzdChmaWxlLm5hbWUpKSB7XHJcbiAgICAgIHRoaXMuZGFpbHlCdWxrRXJyb3JzID0gWydQbGVhc2UgdXBsb2FkIGEgdmFsaWQgLnhsc3ggZmlsZS4nXTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEV2ZXJ5IGFjdGl2ZSB1c2VyIG9mIHRoZSBjbGllbnQgY291bnRzIGhlcmUsIHJvbGUgJ3VzZXInIGluY2x1ZGVkIChRQSAxMyBPY3Q6IGFjdGl2ZSB1c2VycyB3ZXJlIHJlamVjdGVkIGFzXHJcbiAgICAvLyBcIm5vdCBhbiBleGlzdGluZyB1c2VyXCIgYmVjYXVzZSB0aGUgcGFnZSdzIHBpY2tlciBsaXN0IGhvbGRzIGFkbWlucyAvIHN1cGVyYWRtaW5zIG9ubHkpLiBUaGUgcGlja2VycyBrZWVwXHJcbiAgICAvLyB0aGF0IGxpc3Q7IG9ubHkgdGhlIHVwbG9hZCByZWFkcyB0aGUgZnVsbCBvbmUsIGZldGNoZWQgbm93IHNvIGl0IGlzIGN1cnJlbnQuXHJcbiAgICBjb25zdCBsb2FkZWQgPSB0aGlzLnRyYXhTZXJ2aWNlLmdldENsaWVudFVzZXIodGhpcy5jbGllbnRJZCwgdHJ1ZSkucGlwZShcclxuICAgICAgbWFwKChyZXM6IGFueSkgPT4gKHJlcz8uY29kZSA9PT0gMjAwID8gcmVzLmRhdGEgfHwgW10gOiBbXSlcclxuICAgICAgICAubWFwKCh1OiBhbnkpID0+IHRoaXMuY2hpcCh1LnVzZXJOYW1lLCB1LmVtYWlsKSlcclxuICAgICAgICAuZmlsdGVyKCh1OiBDaGlwVXNlcikgPT4gdS5lKSBhcyBDaGlwVXNlcltdKSxcclxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihbXSBhcyBDaGlwVXNlcltdKSlcclxuICAgICk7XHJcbiAgICBmb3JrSm9pbih7IHVzZXJzOiBsb2FkZWQsIGJ1ZmZlcjogZnJvbShmaWxlLmFycmF5QnVmZmVyKCkpIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoeyB1c2VycywgYnVmZmVyIH0pID0+IHtcclxuICAgICAgICBpZiAoIXVzZXJzLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5kYWlseUJ1bGtFcnJvcnMgPSBbJ1RoZSB1c2VycyBvZiB0aGlzIGNsaWVudCBjb3VsZCBub3QgYmUgbG9hZGVkLiBSZWxvYWQgdGhlIHBhZ2UgYW5kIHRyeSBhZ2Fpbi4nXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYWlseUJ1bGtFcnJvcnMgPSB0aGlzLmFwcGx5RGFpbHlCdWxrKGJ1ZmZlciwgdXNlcnMpO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmRhaWx5QnVsa0Vycm9ycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5kYWlseUJ1bGtPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdGaWxlIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseS4gJyArIHRoaXMuZGFpbHlVc2Vycy5sZW5ndGhcclxuICAgICAgICAgICAgICArICh0aGlzLmRhaWx5VXNlcnMubGVuZ3RoID09PSAxID8gJyB1c2VyJyA6ICcgdXNlcnMnKSArICcgYWRkZWQgdG8gdGhlIGRhaWx5IHJlcG9ydC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYWlseUJ1bGtFcnJvcnMgPSBbJ0NvdWxkIG5vdCByZWFkIHRoaXMgZmlsZS4gVXBsb2FkIHRoZSBkb3dubG9hZGVkIHRlbXBsYXRlIGFzIC54bHN4LiddO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGxpZXMgdGhlIHNoZWV0IHRvIGRhaWx5VXNlcnMgYW5kIHJldHVybnMgW10gb24gc3VjY2VzcywgZWxzZSB0aGUgcmVhc29ucyBpdCB3YXMgcmVqZWN0ZWQuXHJcbiAgICogdXNlcnM6IGV2ZXJ5IGFjdGl2ZSB1c2VyIG9mIHRoZSBjbGllbnQgKHRoZSB1cGxvYWQncyBvd24gbGlzdCwgcm9sZSAndXNlcicgaW5jbHVkZWQpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlEYWlseUJ1bGsoYnVmZmVyOiBBcnJheUJ1ZmZlciwgdXNlcnM6IENoaXBVc2VyW10pOiBzdHJpbmdbXSB7XHJcbiAgICBsZXQgcm93czogYW55W11bXTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGJvb2sgPSBYTFNYLnJlYWQoYnVmZmVyLCB7IHR5cGU6ICdhcnJheScgfSk7XHJcbiAgICAgIHJvd3MgPSBYTFNYLnV0aWxzLnNoZWV0X3RvX2pzb24oYm9vay5TaGVldHNbYm9vay5TaGVldE5hbWVzWzBdXSwgeyBoZWFkZXI6IDEsIGRlZnZhbDogJycsIGJsYW5rcm93czogdHJ1ZSB9KTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gWydDb3VsZCBub3QgcmVhZCB0aGlzIGZpbGUuIFVwbG9hZCB0aGUgZG93bmxvYWRlZCB0ZW1wbGF0ZSBhcyAueGxzeC4nXTtcclxuICAgIH1cclxuICAgIGNvbnN0IGVtYWlsQ29sID0gKHJvd3NbMF0gfHwgW10pLmZpbmRJbmRleChoID0+IFN0cmluZyhoID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gJ2VtYWlsJyk7XHJcbiAgICBpZiAoZW1haWxDb2wgPCAwKSB7IHJldHVybiBbXCJUaGUgdGVtcGxhdGUgbXVzdCBjb250YWluIGFuICdFbWFpbCcgY29sdW1uLlwiXTsgfVxyXG5cclxuICAgIGNvbnN0IGVtYWlsUmVnZXggPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskLztcclxuICAgIGNvbnN0IGJ5RW1haWwgPSBuZXcgTWFwKHVzZXJzLm1hcCh1ID0+IFt1LmUsIHVdKSk7XHJcbiAgICBjb25zdCBtYXRjaGVkOiBDaGlwVXNlcltdID0gW107XHJcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsZXQgZGF0YVJvd3MgPSAwO1xyXG4gICAgcm93cy5zbGljZSgxKS5mb3JFYWNoKChyb3csIGkpID0+IHtcclxuICAgICAgLy8gU2tpcCBmdWxseSBibGFuayByb3dzIChhbnkgY29sdW1uLCBub3QganVzdCBFbWFpbCkuXHJcbiAgICAgIGlmICghcm93LnNvbWUodiA9PiBTdHJpbmcodiA/PyAnJykudHJpbSgpICE9PSAnJykpIHsgcmV0dXJuOyB9XHJcbiAgICAgIGRhdGFSb3dzKys7XHJcbiAgICAgIGNvbnN0IHJvd05vID0gaSArIDI7IC8vICsxIGhlYWRlciwgKzEgdG8gMS1iYXNlZFxyXG4gICAgICBjb25zdCBlbWFpbCA9IFN0cmluZyhyb3dbZW1haWxDb2xdID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgaWYgKCFlbWFpbCkgeyBlcnJvcnMucHVzaCgnUm93ICcgKyByb3dObyArICc6IEVtYWlsIGlzIHJlcXVpcmVkJyk7IHJldHVybjsgfVxyXG4gICAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChlbWFpbCkpIHsgZXJyb3JzLnB1c2goJ1JvdyAnICsgcm93Tm8gKyAnOiBcIicgKyBlbWFpbCArICdcIiBpcyBub3QgYSB2YWxpZCBlbWFpbCcpOyByZXR1cm47IH1cclxuICAgICAgY29uc3QgdXNlciA9IGJ5RW1haWwuZ2V0KGVtYWlsKTtcclxuICAgICAgaWYgKCF1c2VyKSB7IGVycm9ycy5wdXNoKCdSb3cgJyArIHJvd05vICsgJzogXCInICsgZW1haWwgKyAnXCIgaXMgbm90IGFuIGV4aXN0aW5nIHVzZXInKTsgcmV0dXJuOyB9XHJcbiAgICAgIGlmICghbWF0Y2hlZC5zb21lKHUgPT4gdS5lID09PSB1c2VyLmUpKSB7IG1hdGNoZWQucHVzaCh1c2VyKTsgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAoIWRhdGFSb3dzKSB7IHJldHVybiBbJ1RoZSB1cGxvYWRlZCBmaWxlIGhhcyBubyBkYXRhIHJvd3MuJ107IH1cclxuICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7IHJldHVybiBlcnJvcnM7IH1cclxuXHJcbiAgICB0aGlzLmRhaWx5VXNlcnMgPSBtYXRjaGVkO1xyXG4gICAgdGhpcy5kYWlseVNlbmRDdXN0b20gPSB0cnVlO1xyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoYXQgdGhlIGNoZWNrbGlzdCBrZWVwcyBhcyBhc3NpZ25lZFVzZXJzLCBleGFjdGx5IGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2Ugc2VuZHMgaXQuICovXHJcbiAgcHJpdmF0ZSBhc3NpZ25lZFVzZXJzKCk6IHsgaWQ6IHN0cmluZzsgdHlwZTogc3RyaW5nIH1bXSB7XHJcbiAgICBjb25zdCBkID0gdGhpcy5jb25maWdEYXRhPy5jaGVja0xpc3REZXRhaWxzIHx8IHt9O1xyXG4gICAgcmV0dXJuIFsuLi4oZC5zaW5nbGVBc3NpZ24gfHwgW10pLCAuLi4oZC5ncm91cEFzc2lnbiB8fCBbXSldO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByZVN1Ym1pc3Npb25FbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnByZVN1Ym1pc3Npb25BY2Nlc3NPbiAmJiB0aGlzLnByZVN1Ym1pc3Npb25Vc2Vycy5sZW5ndGggPT09IDA7XHJcbiAgfVxyXG5cclxuICBnZXQgZGlzcHV0ZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3ByZScgJiYgdGhpcy5kaXNwdXRlT247XHJcbiAgfVxyXG5cclxuICAvKiogV2h5IFB1Ymxpc2ggLyBTYXZlIGFyZSBkaXNhYmxlZCAoYnV0dG9uIHRpdGxlKSwgJycgd2hlbiB0aGV5IGFyZSBub3QuICovXHJcbiAgZ2V0IHNhdmVCbG9ja2VkUmVhc29uKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuYWNjZXNzLmNhbkVkaXQpIHsgcmV0dXJuICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBjaGFuZ2UgYXVkaXRzJzsgfVxyXG4gICAgaWYgKHRoaXMuYXVkaXRTZXR0aW5nc0xvYWRGYWlsZWQpIHsgcmV0dXJuICdUaGUgc2NvcmluZyBhbmQgYWNjZXNzIHNldHRpbmdzIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFJlbG9hZCB0aGUgcGFnZSBiZWZvcmUgc2F2aW5nLic7IH1cclxuICAgIGlmICh0aGlzLnBhc3NGYWlsT24gJiYgKHRoaXMucGFzc1RocmVzaG9sZCA8IDEgfHwgdGhpcy5wYXNzVGhyZXNob2xkID4gMTAwKSkgeyByZXR1cm4gJ1Bhc3MgbWFyayBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAwJzsgfVxyXG4gICAgaWYgKHRoaXMucHJlU3VibWlzc2lvbkVtcHR5KSB7IHJldHVybiAnQWRkIGF0IGxlYXN0IG9uZSB1c2VyIGZvciBwcmUtc3VibWlzc2lvbiBhY2Nlc3MnOyB9XHJcbiAgICByZXR1cm4gdGhpcy5lZGl0U3VibWl0dGVkRXJyb3IgfHwgdGhpcy5ub3RpZnlGbGFnc0Vycm9yIHx8IHRoaXMucmVjdXJyaW5nRmxhZ3NFcnJvciB8fCB0aGlzLmRhaWx5UmVwb3J0RXJyb3I7XHJcbiAgfVxyXG5cclxuICAvKiogV2h5IFB1Ymxpc2ggd291bGQgYmUgcmVmdXNlZCAoJycgd2hlbiBpdCB3b3VsZCBub3QpOyBjaGVja2VkIG9uIGNsaWNrIHNvIHRoZSB0b2FzdCBjYW4gc2F5IHNvLiAqL1xyXG4gIGdldCBwdWJsaXNoQmxvY2tlZFJlYXNvbigpOiBzdHJpbmcge1xyXG4gICAgLy8gQXBwcm92ZXJzIGFyZSBuZWVkZWQgb25seSB3aGlsZSBBcHByb3ZlciBpcyBvbjsgd2l0aCBpdCBvZmYgdGhlIGF1ZGl0IHB1Ymxpc2hlcyB3aXRob3V0IGFwcHJvdmFsLlxyXG4gICAgaWYgKHRoaXMuYXBwcm92ZXJPbiAmJiAhdGhpcy5hcHByb3ZlcnMubGVuZ3RoKSB7IHJldHVybiAnQXBwcm92ZXIgaXMgdHVybmVkIG9uLiBBZGQgYXQgbGVhc3Qgb25lIGFwcHJvdmVyLCBvciB0dXJuIEFwcHJvdmVyIG9mZi4nOyB9XHJcbiAgICBpZiAoIXRoaXMuc2VjdGlvbnMuc29tZShzID0+IHMuaXRlbXMubGVuZ3RoKSkgeyByZXR1cm4gJ1RoaXMgYXVkaXQgaGFzIG5vIHF1ZXN0aW9ucy4gQWRkIGF0IGxlYXN0IG9uZSBxdWVzdGlvbiBiZWZvcmUgcHVibGlzaGluZy4nOyB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuU2F2ZSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLnNhdmluZyB8fCB0aGlzLmxvYWRpbmcgfHwgIXRoaXMuY2hlY2tsaXN0SWQgfHwgIXRoaXMuY29uZmlnRGF0YSkgeyByZXR1cm4gZmFsc2U7IH1cclxuICAgIHJldHVybiAhdGhpcy5zYXZlQmxvY2tlZFJlYXNvbjtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gc2F2ZSAvIHB1Ymxpc2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgc2F2ZURyYWZ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zYXZlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHB1Ymxpc2goKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU2F2ZSkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IGJsb2NrZWQgPSB0aGlzLnB1Ymxpc2hCbG9ja2VkUmVhc29uO1xyXG4gICAgaWYgKGJsb2NrZWQpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGJsb2NrZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuYXNzaWduZWRDb3VudCkge1xyXG4gICAgICAvLyBTdG9yZXMgYW5kIGF1ZGl0b3JzIGNvbWUgZnJvbSBzY2hlZHVsZSByb3dzOyBwdWJsaXNoaW5nIHRoZSBzY2hlZHVsZSBwdWJsaXNoZXMgdGhlIGF1ZGl0LlxyXG4gICAgICB0aGlzLnNjaGVkdWxlQWZ0ZXJTYXZlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5zYXZlKGZhbHNlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlKHB1Ymxpc2g6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jYW5TYXZlKSB7IHRoaXMuc2NoZWR1bGVBZnRlclNhdmUgPSBmYWxzZTsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLndhc1B1Ymxpc2hlZCA9IHRoaXMucHVibGlzaGVkO1xyXG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5zYXZlQ2hlY2tsaXN0KHB1Ymxpc2gpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFwicHVibGlzaCBTdG9yZSBBdWRpdFwiIC8gXCJzYXZlIFN0b3JlIEF1ZGl0XCIsIGZvciB0aGUgZXJyb3IgdG9hc3RzLiAqL1xyXG4gIHByaXZhdGUgYWN0aW9uVGV4dChwdWJsaXNoOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAocHVibGlzaCA/ICdwdWJsaXNoICcgOiAnc2F2ZSAnKSArIHRoaXMuZXNjKHRoaXMuYXVkaXROYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKiBBIHNhdmUgc3RlcCBmYWlsZWQ6IHN0b3AsIGFuZCBkbyBub3Qgb3BlbiBDcmVhdGUgc2NoZWR1bGUgb24gdGhlIG5leHQgcGxhaW4gc2F2ZS4gKi9cclxuICBwcml2YXRlIGZhaWxTYXZlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc2NoZWR1bGVBZnRlclNhdmUgPSBmYWxzZTtcclxuICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChtZXNzYWdlKTtcclxuICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGNoZWNrbGlzdCBwYXJ0IChjaGVja2xpc3RDb25maWd1cmV2MTogbm90aWZpY2F0aW9ucywgYXBwcm92ZXJzLCBwdWJsaXNoKSBhbmQgdGhlIGF1ZGl0LW9ubHkgc2V0dGluZ3NcclxuICAgKiAoY29uZmlnL3NhdmU6IHNjb3JpbmcsIGRpc3B1dGUsIGFjY2VzcykgZG8gbm90IGRlcGVuZCBvbiBlYWNoIG90aGVyLCBzbyBib3RoIGFyZSBzZW50IGF0IG9uY2UgaW5zdGVhZCBvZiBvbmVcclxuICAgKiBhZnRlciB0aGUgb3RoZXIgKFFBOiBzYXZlIC8gcHVibGlzaCB0b29rIGxvbmcpLiBPdXRjb21lcyBhcmUgcmVwb3J0ZWQgYXMgYmVmb3JlOiB0aGUgY2hlY2tsaXN0IHBhcnQgZmlyc3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzYXZlQ2hlY2tsaXN0KHB1Ymxpc2g6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGZhbGxiYWNrID0gJ0NvdWxkIG5vdCAnICsgdGhpcy5hY3Rpb25UZXh0KHB1Ymxpc2gpICsgJy4gUGxlYXNlIHRyeSBhZ2Fpbi4nO1xyXG4gICAgY29uc3Qgc2V0dGxlID0gKGNhbGw6IE9ic2VydmFibGU8YW55PikgPT4gY2FsbC5waXBlKG1hcCgocmVzOiBhbnkpID0+ICh7IHJlcywgZXJyOiBudWxsIH0pKSwgY2F0Y2hFcnJvcigoZXJyOiBhbnkpID0+IG9mKHsgcmVzOiBudWxsLCBlcnIgfSkpKTtcclxuICAgIGZvcmtKb2luKFtcclxuICAgICAgc2V0dGxlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRDb25maWdVcGRhdGUodGhpcy5jaGVja2xpc3RQYXlsb2FkKHB1Ymxpc2gpKSksXHJcbiAgICAgIHNldHRsZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0Q29uZmlnU2F2ZSh0aGlzLmV4dHJhc1BheWxvYWQoKSkpXHJcbiAgICBdKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChbbWFpbiwgZXh0cmFzXSkgPT4ge1xyXG4gICAgICBpZiAobWFpbi5lcnIpIHtcclxuICAgICAgICB0aGlzLmZhaWxTYXZlKHRoaXMuYXBpRXJyb3IobWFpbi5lcnIsIGZhbGxiYWNrLCB0cnVlLCAnQ291bGQgbm90ICcgKyB0aGlzLmFjdGlvblRleHQocHVibGlzaCkgKyAnOiAnKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChtYWluLnJlcz8uY29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgLy8gMjA0IChubyBib2R5KSA9IHRoZSBhdWRpdCBubyBsb25nZXIgZXhpc3RzIGZvciB0aGlzIGNsaWVudC5cclxuICAgICAgICB0aGlzLmZhaWxTYXZlKG1haW4ucmVzID8gZmFsbGJhY2sgOiAnQ291bGQgbm90ICcgKyB0aGlzLmFjdGlvblRleHQocHVibGlzaCkgKyAnOiB0aGUgYXVkaXQgd2FzIG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBkZWxldGVkLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHVibGlzaCkgeyB0aGlzLnB1Ymxpc2hlZCA9IHRydWU7IH1cclxuICAgICAgaWYgKGV4dHJhcy5lcnIgfHwgZXh0cmFzLnJlcz8uY29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgY29uc3QgcmVhc29uID0gZXh0cmFzLmVyciA/IHRoaXMuYXBpRXJyb3IoZXh0cmFzLmVyciwgJycsIHRydWUpIDogJyc7XHJcbiAgICAgICAgdGhpcy5mYWlsU2F2ZSgocHVibGlzaCA/IHRoaXMuZXNjKHRoaXMuYXVkaXROYW1lKSArICcgd2FzIHB1Ymxpc2hlZCcgOiAnVGhlIG5vdGlmaWNhdGlvbiBhbmQgYXBwcm92ZXIgc2V0dGluZ3Mgd2VyZSBzYXZlZCcpXHJcbiAgICAgICAgICArICcsIGJ1dCB0aGUgc2NvcmluZywgZGlzcHV0ZSBhbmQgYWNjZXNzIHNldHRpbmdzIHdlcmUgbm90JyArIChyZWFzb24gPyAnICgnICsgcmVhc29uICsgJyknIDogJycpICsgJy4gU2F2ZSBhZ2FpbiB0byBrZWVwIHRoZW0uJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmluaXNoU2F2ZShwdWJsaXNoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhdWRpdC1vbmx5IHNldHRpbmdzIHNhdmVkIGJ5IGNvbmZpZy9zYXZlLiAqL1xyXG4gIHByaXZhdGUgZXh0cmFzUGF5bG9hZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIGNvbnN0IHRvU3RvcmVkID0gKGxpc3Q6IENoaXBVc2VyW10pID0+IGxpc3QubWFwKHUgPT4gKHsgbjogdS5uLCBlOiB1LmUgfSkpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgIGNoZWNrbGlzdElkOiB0aGlzLmNoZWNrbGlzdElkLFxyXG4gICAgICBwYXNzTWFyazogdGhpcy5wYXNzRmFpbE9uID8gTnVtYmVyKHRoaXMucGFzc1RocmVzaG9sZCkgOiA3NSxcclxuICAgICAgc2V0dGluZ3M6IHtcclxuICAgICAgICBwYXNzRmFpbE9uOiB0aGlzLnBhc3NGYWlsT24sXHJcbiAgICAgICAgZGlzcHV0ZU9uOiB0aGlzLmRpc3B1dGVPbixcclxuICAgICAgICBkaXNwdXRlV2luZG93OiB0aGlzLmRpc3B1dGVXaW5kb3csXHJcbiAgICAgICAgcHJlU3VibWlzc2lvbkFjY2Vzc09uOiB0aGlzLnByZVN1Ym1pc3Npb25BY2Nlc3NPbixcclxuICAgICAgICBwcmVTdWJtaXNzaW9uVXNlcnM6IHRvU3RvcmVkKHRoaXMucHJlU3VibWlzc2lvblVzZXJzKSxcclxuICAgICAgICBlZGl0U3VibWl0dGVkT246IHRoaXMuZWRpdFN1Ym1pdHRlZE9uLFxyXG4gICAgICAgIGVkaXRVc2VyczogdG9TdG9yZWQodGhpcy5lZGl0VXNlcnMpXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbmlzaFNhdmUocHVibGlzaDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmVzYyh0aGlzLmF1ZGl0TmFtZSk7XHJcbiAgICBpZiAodGhpcy5zY2hlZHVsZUFmdGVyU2F2ZSkge1xyXG4gICAgICB0aGlzLnNjaGVkdWxlQWZ0ZXJTYXZlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KG5hbWUgKyAodGhpcy5wdWJsaXNoZWQgPyAnIHNhdmVkLicgOiAnIHNhdmVkIGFzIGRyYWZ0LicpICsgJyBJdCBoYXMgbm8gc3RvcmVzIHlldDogYWRkIHNjaGVkdWxlIHJvd3MsIHRoZW4gcHVibGlzaCB0aGUgc2NoZWR1bGUgdG8gcHVibGlzaCB0aGUgYXVkaXQuJyk7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL21hbmFnZS90cmF4L2F1ZGl0LXYyL21hbmFnZSddLCB7IHF1ZXJ5UGFyYW1zOiB7IHRhYjogJ3NjaGVkdWxlJywgc2NoZWR1bGU6ICdjcmVhdGUnLCBhdWRpdDogdGhpcy5jaGVja2xpc3RJZCB9IH0pO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHB1Ymxpc2gpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QodGhpcy53YXNQdWJsaXNoZWQgPyAnQ2hhbmdlcyB0byAnICsgbmFtZSArICcgc2F2ZWQgYW5kIHB1Ymxpc2hlZC4nIDogbmFtZSArICcgaGFzIGJlZW4gcHVibGlzaGVkLicpO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvdHJheC9hdWRpdC12Mi9tYW5hZ2UnXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBBIGRyYWZ0IHNhdmUgbmV2ZXIgdW5wdWJsaXNoZXMgKHRoZSBBUEkga2VlcHMgdGhlIHB1Ymxpc2ggc3RhdGUpLCBzbyBkbyBub3QgY2FsbCBhIGxpdmUgYXVkaXQgYSBkcmFmdC5cclxuICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QodGhpcy5wdWJsaXNoZWQgPyAnQ2hhbmdlcyB0byAnICsgbmFtZSArICcgc2F2ZWQuIFRoZSBhdWRpdCBzdGF5cyBwdWJsaXNoZWQuJyA6IG5hbWUgKyAnIHNhdmVkIGFzIGRyYWZ0LicpO1xyXG4gICAgICAvLyBSZWxvYWQgc28gdGhlIHBhZ2Ugc2hvd3MgZXhhY3RseSB3aGF0IHRoZSBzZXJ2ZXIga2VwdC5cclxuICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtZXNzYWdlIHRvIHNob3cgZm9yIGEgZmFpbGVkIGNhbGw6IHRoZSBBUEkncyBvd24gdGV4dCBmb3IgYSA0eHggKHByb2R1Y3Rpb24gc2VuZHMgaXQgYXNcclxuICAgKiBgZXJyb3JgICh0ZXh0IG9yIHsgbWVzc2FnZSB9KSwgdGhlIGxvY2FsIGRldiBoZWxwZXIgYXMgYGVycm9yYCB0ZXh0IHBsdXMgYGRldGFpbHNgKSwgZWxzZSBgZmFsbGJhY2tgLlxyXG4gICAqIDV4eCBib2RpZXMgY2FycnkgcmF3IGV4Y2VwdGlvbnMsIHNvIHRoZXkgZ2V0IHRoZSBmYWxsYmFjay4gYHByZWZpeGAgaXMgcHV0IGJlZm9yZSBhbiBBUEkgdGV4dC5cclxuICAgKi9cclxuICBwcml2YXRlIGFwaUVycm9yKGU6IGFueSwgZmFsbGJhY2s6IHN0cmluZywgZXNjYXBlID0gdHJ1ZSwgcHJlZml4ID0gJycpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RhdHVzID0gTnVtYmVyKGU/LnN0YXR1cykgfHwgMDtcclxuICAgIGlmIChzdGF0dXMgPT09IDQwMykgeyByZXR1cm4gJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcgb3IgY2hhbmdlIHRoaXMgYXVkaXQuJzsgfVxyXG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgeyByZXR1cm4gZmFsbGJhY2sgPyAnQ291bGQgbm90IHJlYWNoIHRoZSBzZXJ2ZXIuIENoZWNrIHlvdXIgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLicgOiAnJzsgfVxyXG4gICAgaWYgKHN0YXR1cyA+PSA1MDApIHsgcmV0dXJuIGZhbGxiYWNrOyB9XHJcbiAgICBjb25zdCBib2R5ID0gZT8uZXJyb3I7XHJcbiAgICBjb25zdCBlcnIgPSBib2R5Py5lcnJvcjtcclxuICAgIGNvbnN0IHJhdyA9ICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJyA/IGVyciA6IGVycj8ubWVzc2FnZSkgfHwgYm9keT8uZGV0YWlscz8ubWVzc2FnZSB8fCBib2R5Py5tZXNzYWdlIHx8ICcnO1xyXG4gICAgY29uc3QgdGV4dCA9IFN0cmluZyhyYXcpLnRyaW0oKTtcclxuICAgIGlmICghdGV4dCkgeyByZXR1cm4gZmFsbGJhY2s7IH1cclxuICAgIHJldHVybiBwcmVmaXggKyAoZXNjYXBlID8gdGhpcy5lc2ModGV4dCkgOiB0ZXh0KTtcclxuICB9XHJcblxyXG4gIC8qKiBUb2FzdHMgcmVuZGVyIHRoZWlyIG1lc3NhZ2UgYXMgSFRNTCwgc28gbmFtZXMsIHR5cGVkIHRleHQgYW5kIEFQSSBtZXNzYWdlcyBhcmUgZXNjYXBlZC4gKi9cclxuICBwcml2YXRlIGVzYyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnXCInOiAnJnF1b3Q7JywgJ1xcJyc6ICcmIzM5OycgfTtcclxuICAgIHJldHVybiBTdHJpbmcodmFsdWUgPz8gJycpLnJlcGxhY2UoL1smPD5cIiddL2csIGMgPT4gbWFwW2NdKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZ2V0Q29uZmlnRGV0YWlscyBwYXlsb2FkIHdpdGggdGhpcyBwYWdlJ3MgZmllbGRzIHdyaXR0ZW4gYmFjaywgaW4gdGhlIGNoZWNrbGlzdCdzIG93biBzaGFwZS4gKi9cclxuICBwcml2YXRlIGNoZWNrbGlzdFBheWxvYWQocHVibGlzaDogYm9vbGVhbik6IGFueSB7XHJcbiAgICBjb25zdCB0b1N0b3JlZCA9IChsaXN0OiBDaGlwVXNlcltdKSA9PiBsaXN0Lm1hcCh1ID0+ICh7IG5hbWU6IHUubiwgdmFsdWU6IHUuZSB9KSk7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5jb25maWdEYXRhO1xyXG4gICAgY29uc3QgZCA9IGRhdGEuY2hlY2tMaXN0RGV0YWlscztcclxuXHJcbiAgICBkLmNoZWNrTGlzdERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbi50cmltKCk7XHJcbiAgICBkLm93bmVyID0gdG9TdG9yZWQodGhpcy5vd25lcnMpO1xyXG4gICAgZC5hcHByb3ZlciA9IHRoaXMuYXBwcm92ZXJPbiA/IHRvU3RvcmVkKHRoaXMuYXBwcm92ZXJzKSA6IFtdO1xyXG4gICAgLy8gTWludXRlcyBiZWZvcmUgdGhlIGF1ZGl0IGVuZCB0aW1lLCBhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIHN0b3JlcyB0aGVtLlxyXG4gICAgZC5yZW1haW5kZXIgPSB0aGlzLnJlbWluZGVyT24gPyBbLi4udGhpcy5yZW1pbmRlcnNdIDogW107XHJcblxyXG4gICAgY29uc3QgbmZUeXBlczogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLm5vdGlmeUZsYWdzT24gJiYgdGhpcy5ub3RpZnlTZW5kQXBwcm92ZXIpIHsgbmZUeXBlcy5wdXNoKCdhcHByb3ZlcicpOyB9XHJcbiAgICBpZiAodGhpcy5ub3RpZnlGbGFnc09uICYmIHRoaXMubm90aWZ5U2VuZEN1c3RvbSkgeyBuZlR5cGVzLnB1c2goJ2N1c3RvbScpOyB9XHJcbiAgICBkLm5vdGlmeUZsYWdzID0geyBub3RpZnlUeXBlOiBuZlR5cGVzLCB1c2VyczogdGhpcy5ub3RpZnlGbGFnc09uICYmIHRoaXMubm90aWZ5U2VuZEN1c3RvbSA/IHRvU3RvcmVkKHRoaXMubm90aWZ5VXNlcnMpIDogW10gfTtcclxuXHJcbiAgICBjb25zdCByZlR5cGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nRmxhZ3NPbiAmJiB0aGlzLnJlY3VycmluZ1NlbmRBcHByb3ZlcikgeyByZlR5cGVzLnB1c2goJ2FwcHJvdmVyJyk7IH1cclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgdGhpcy5yZWN1cnJpbmdTZW5kQ3VzdG9tKSB7IHJmVHlwZXMucHVzaCgnY3VzdG9tJyk7IH1cclxuICAgIC8vIFRoZSBzZXJ2ZXIgcmVzb2x2ZXMgJ3NhbWVBc05vdGlmeScgdG8gdGhlIE5vdGlmeSBGbGFncyByZWNpcGllbnRzIHdoZW4gaXQgc2VuZHMgdGhlIGVtYWlsLlxyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nRmxhZ3NPbiAmJiB0aGlzLnJlY3VycmluZ1NhbWVBc05vdGlmeSkgeyByZlR5cGVzLnB1c2goJ3NhbWVBc05vdGlmeScpOyB9XHJcbiAgICBjb25zdCByZlVzZXJzID0gdGhpcy5yZWN1cnJpbmdGbGFnc09uICYmIHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSA/IHRvU3RvcmVkKHRoaXMucmVjdXJyaW5nVXNlcnMpIDogW107XHJcbiAgICBkLnJlY3VycmluZ0ZsYWcgPSB7IG5vdGlmeVR5cGU6IHJmVHlwZXMsIHVzZXJzOiByZlVzZXJzLCB0aHJlc2hvbGQ6IHRoaXMucmVjdXJyaW5nRmxhZ3NPbiA/IHRoaXMucmVjdXJyaW5nVGhyZXNob2xkIDogMCB9O1xyXG5cclxuICAgIGNvbnN0IGFlVHlwZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5kYWlseVJlcG9ydE9uICYmIHRoaXMuZGFpbHlTZW5kQXBwcm92ZXIpIHsgYWVUeXBlcy5wdXNoKCdhcHByb3ZlcicpOyB9XHJcbiAgICBpZiAodGhpcy5kYWlseVJlcG9ydE9uICYmIHRoaXMuZGFpbHlTZW5kQ3VzdG9tKSB7IGFlVHlwZXMucHVzaCgnY3VzdG9tJyk7IH1cclxuICAgIGQuYXV0b0VtYWlsID0geyB0eXBlOiBhZVR5cGVzLCB1c2VyczogdGhpcy5kYWlseVNlbmRDdXN0b20gPyB0b1N0b3JlZCh0aGlzLmRhaWx5VXNlcnMpIDogW10gfTtcclxuICAgIGQuc2hhcmVSZXBvcnRQb3N0QXBwcm92YWwgPSB0aGlzLmRhaWx5UmVwb3J0T24gJiYgdGhpcy5zaGFyZVBvc3RBcHByb3ZhbDtcclxuXHJcbiAgICBkLmV4cG9ydCA9IHRoaXMuZXhwb3J0U3VibWlzc2lvbk9uO1xyXG4gICAgZC5yZWRvVmFsaWRpdHkgPSB0aGlzLnJlZG9WYWxpZEZvcjtcclxuICAgIGQuYXV0b0NyZWF0ZVRhc2sgPSB0aGlzLmF1dG9DcmVhdGVUYXNrT247XHJcbiAgICBkLnRhc2tBc3NpZ25lZSA9IHRoaXMudGFza0Fzc2lnbmVlO1xyXG4gICAgZC50YXNrVmFsaWRpdHkgPSBOdW1iZXIodGhpcy50YXNrVmFsaWRpdHkpIHx8IDEwO1xyXG4gICAgZC5zaG93QXBwcm92ZWRSZXNwb25zZSA9IHRoaXMuc2hvd1Jlc3BvbnNlSW5BcHA7XHJcbiAgICBkLnJlc3BvbnNlVmlzaWJpbGl0eSA9IHRoaXMucmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncHJlJyA/ICdwcmVBcHByb3ZhbCcgOiAncG9zdEFwcHJvdmFsJztcclxuICAgIGQucmVzcG9uc2VWaXNpYmlsaXR5SG91cnMgPSB0aGlzLnJlc3BEZWxheTtcclxuICAgIGQudXNlclZlcmlmaWNhdGlvbiA9IHsgcmVxdWlyZVBob3RvQ2FwdHVyZTogdGhpcy5yZXF1aXJlUGhvdG8sIHJlcXVpcmVVc2VyQWNrbm93bGVkZ21lbnQ6IHRoaXMucmVxdWlyZUFja25vd2xlZGdtZW50IH07XHJcbiAgICBkLnJlZG9FeHRlbnNpb24gPSB0aGlzLnJlZG9FeHRlbnNpb247XHJcblxyXG4gICAgLy8gV2hhdCB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIHNlbmRzOiBldmVyeW9uZSBjdXJyZW50bHkgYXNzaWduZWQsIGFuZCB0aGUgcHVibGlzaCBzdGF0ZS5cclxuICAgIGQuYXNzaWduZWRVc2VycyA9IHRoaXMuYXNzaWduZWRVc2VycygpO1xyXG4gICAgZC5zdG9yZUNvdW50ID0gZC5hc3NpZ25lZFVzZXJzLmxlbmd0aDtcclxuICAgIGlmICghZC5jb3ZlcmFnZSkgeyBkLmNvdmVyYWdlID0gJ3N0b3JlJzsgfVxyXG4gICAgZC5wdWJsaXNoID0gcHVibGlzaCA/IHRydWUgOiAhIWQucHVibGlzaDtcclxuXHJcbiAgICBkYXRhLmNsaWVudElkID0gdGhpcy5jbGllbnRJZDtcclxuICAgIGRhdGEuc3VibWl0VHlwZSA9IHB1Ymxpc2ggPyAncHVibGlzaCcgOiAnc2F2ZSc7XHJcbiAgICBkYXRhLnNob3dFZGl0ID0gZmFsc2U7XHJcbiAgICBkYXRhLnVwZGF0ZUNvbmZpZ3VyZSA9IGZhbHNlO1xyXG4gICAgZGF0YS50aW1lWm9uZSA9IGRheWpzLnR6Lmd1ZXNzKCk7XHJcbiAgICAvLyBBc3NpZ25tZW50IGRpZmYgZm9yIHRoZSBhY3Rpdml0eSBsb2c7IHRoaXMgcGFnZSBuZXZlciBjaGFuZ2VzIGFzc2lnbm1lbnRzLlxyXG4gICAgZGF0YS5hZGRlZCA9IFtdO1xyXG4gICAgZGF0YS5yZW1vdmVkID0geyB1c2VyOiBbXSwgc3RvcmU6IFtdIH07XHJcbiAgICByZXR1cm4gZGF0YTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImF2Mi1wYWdlIGF1ZGl0LWNvbmZpZ3VyZVwiPlxyXG5cclxuICA8IS0tIEJhY2sgKyBicmVhZGNydW1iIChhcyB0aGUgc2NoZWR1bGUgZWRpdG9yJ3MgYmFjayBiYXIpIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJjZi1iYWNrYmFyXCI+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc20gY2YtYmFja1wiIChjbGljayk9XCJiYWNrKClcIj5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMTUgNiA5IDEyIDE1IDE4XCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAge3sgYmFja0xhYmVsIH19XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxkaXYgY2xhc3M9XCJjZi1jcnVtYlwiPlxyXG4gICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJiYWNrKCRldmVudClcIj5NYW5hZ2UgQXVkaXQ8L2E+IOKAuiBDb25maWd1cmVcclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFRpdGxlICsgYWN0aW9ucyAtLT5cclxuICA8ZGl2IGNsYXNzPVwiY2YtaGVhZGVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtaGVhZGVyLXRleHRcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgYXYyLXNrLS10aXRsZSBjZi1zay10aXRsZVwiICpuZ0lmPVwibG9hZGluZ1wiPjwvc3Bhbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLXRpdGxlXCIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGF1ZGl0TmFtZSB8fCAnQXVkaXQnIH19PC9kaXY+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiY2YtZGVzY1wiIHBsYWNlaG9sZGVyPVwiRW50ZXIgQXVkaXQgRGVzY3JpcHRpb25cIiBbKG5nTW9kZWwpXT1cImRlc2NyaXB0aW9uXCI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLXByaW1hcnkgY2YtcHVibGlzaFwiIFtkaXNhYmxlZF09XCIhY2FuU2F2ZVwiIFt0aXRsZV09XCJzYXZlQmxvY2tlZFJlYXNvbiB8fCBwdWJsaXNoQmxvY2tlZFJlYXNvblwiIChjbGljayk9XCJwdWJsaXNoKClcIj5cclxuICAgICAge3sgc2F2aW5nID8gJ1NhdmluZ+KApicgOiAocHVibGlzaGVkID8gJ1NhdmUgJiBQdWJsaXNoJyA6ICdQdWJsaXNoJykgfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGNmLWRyYWZ0XCIgW2Rpc2FibGVkXT1cIiFjYW5TYXZlXCIgW3RpdGxlXT1cInNhdmVCbG9ja2VkUmVhc29uXCIgKGNsaWNrKT1cInNhdmVEcmFmdCgpXCI+U2F2ZSBhcyBEcmFmdDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3IgY2YtZXJyb3ItLXBhZ2VcIiAqbmdJZj1cImxvYWRFcnJvclwiPlxyXG4gICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAge3sgbG9hZEVycm9yIH19XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gQ2hpcCBwaWNrZXI6IGNoaXBzICsgaW5wdXQgKyBzdWdnZXN0aW9uIGxpc3QgKG9uZSB0ZW1wbGF0ZSwgdXNlZCBmb3IgZXZlcnkgdXNlciBsaXN0KSAtLT5cclxuICA8bmctdGVtcGxhdGUgI2NoaXBQaWNrZXIgbGV0LWxpc3Q9XCJsaXN0XCIgbGV0LWxhcmdlPVwibGFyZ2VcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjZi1jaGlwYm94XCIgW2NsYXNzLmNmLWNoaXBib3gtLWxnXT1cImxhcmdlXCIgW2NsYXNzLmlzLW9wZW5dPVwib3BlbkNoaXBzID09PSBsaXN0XCIgKGNsaWNrKT1cImZvY3VzQ2hpcHMobGlzdCwgJGV2ZW50KVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImNmLWNoaXBcIiBbY2xhc3MuY2YtY2hpcC0tbGddPVwibGFyZ2VcIiAqbmdGb3I9XCJsZXQgdSBvZiBjaGlwc09mKGxpc3QpOyBsZXQgaSA9IGluZGV4XCIgW3RpdGxlXT1cInUuZVwiPlxyXG4gICAgICAgIDxzcGFuIFtjbGFzc109XCJsYXJnZSA/ICdjZi1jaGlwLXRhZycgOiAnY2YtY2hpcC1pbmknXCI+e3sgdS5pIH19PC9zcGFuPnt7IHUubiB9fVxyXG4gICAgICAgIDxhIGNsYXNzPVwiY2YtY2hpcC14XCIgKGNsaWNrKT1cInJlbW92ZUNoaXAobGlzdCwgaSk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjVcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiY2YtY2hpcC1pbnB1dFwiIFtjbGFzcy5jZi1jaGlwLWlucHV0LS1sZ109XCJsYXJnZVwiIHBsYWNlaG9sZGVyPVwiQWRkIHVzZXIuLi5cIlxyXG4gICAgICAgIFtuZ01vZGVsXT1cImRyYWZ0T2YobGlzdClcIiAobmdNb2RlbENoYW5nZSk9XCJzZXREcmFmdChsaXN0LCAkZXZlbnQpXCIgKGZvY3VzKT1cImZvY3VzQ2hpcHMobGlzdCwgJGV2ZW50KVwiIChrZXl1cC5lbnRlcik9XCJhZGRDaGlwKGxpc3QpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdWdnZXN0XCIgKm5nSWY9XCJvcGVuQ2hpcHMgPT09IGxpc3RcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3VnZ2VzdC1pdGVtXCIgKm5nRm9yPVwibGV0IHUgb2Ygc3VnZ2VzdGlvbnMobGlzdClcIiAoY2xpY2spPVwiYWRkU3VnZ2VzdGlvbihsaXN0LCB1LCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoaXAtaW5pXCI+e3sgdS5pIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1zdWdnZXN0LW5hbWVcIj57eyB1Lm4gfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXN1Z2dlc3QtbWFpbFwiPnt7IHUuZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3VnZ2VzdC1lbXB0eVwiICpuZ0lmPVwiIXN1Z2dlc3Rpb25zKGxpc3QpLmxlbmd0aFwiPlxyXG4gICAgICAgICAge3sgdXNlcnMubGVuZ3RoID8gJ05vIG1hdGNoaW5nIHVzZXInIDogJ05vIHVzZXJzIGZvciB0aGlzIGNsaWVudCcgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8IS0tIERyb3Bkb3duOiBzdHlsZWQgbGlrZSB0aGUgcHJvdG90eXBlIGluc3RlYWQgb2YgdGhlIGJyb3dzZXIncyBuYXRpdmUgc2VsZWN0IC0tPlxyXG4gIDxuZy10ZW1wbGF0ZSAjZHJvcGRvd24gbGV0LWtleT1cImtleVwiIGxldC1vcHRpb25zPVwib3B0aW9uc1wiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJjZi1zZWxlY3RcIiBbY2xhc3MuaXMtb3Blbl09XCJvcGVuU2VsZWN0ID09PSBrZXlcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zZWxlY3QtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZVNlbGVjdChrZXksICRldmVudClcIj5cclxuICAgICAgICB7eyBzZWxlY3RMYWJlbChrZXksIG9wdGlvbnMpIH19XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2Ytc2VsZWN0LW1lbnVcIiAqbmdJZj1cIm9wZW5TZWxlY3QgPT09IGtleVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zZWxlY3QtaXRlbVwiICpuZ0Zvcj1cImxldCBvIG9mIG9wdGlvbnNcIiBbY2xhc3MuaXMtb25dPVwiaXNQaWNrZWQoa2V5LCBvKVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicGljayhrZXksIG8sICRldmVudClcIj57eyBvLmxhYmVsIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9zcGFuPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjZi1ib2R5XCIgKm5nSWY9XCIhbG9hZEVycm9yXCI+XHJcbiAgICA8IS0tIFNlY3Rpb24gdHJlZSAtLT5cclxuICAgIDxhc2lkZSBjbGFzcz1cImNmLWxlZnRcIj5cclxuICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwibG9hZGluZ1wiIFtyb3dzXT1cIjNcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi1sZWZ0LXRpdGxlXCI+e3sgYXVkaXROYW1lIHx8ICdBdWRpdCcgfX08L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCIgKm5nSWY9XCIhc2VjdGlvbnMubGVuZ3RoXCI+Tm8gcXVlc3Rpb25zIHlldDwvZGl2PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzIG9mIHNlY3Rpb25zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXNlY3Rpb25cIiBbY2xhc3MuaXMtb3Blbl09XCJzLm9wZW5cIiAoY2xpY2spPVwidG9nZ2xlU2VjdGlvbihzKVwiPlxyXG4gICAgICAgICAge3sgcy5sYWJlbCB9fVxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1ydWxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGV2XCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgW2NsYXNzLnJvdGF0ZV09XCIhcy5vcGVuXCI+XHJcbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWl0ZW1zXCIgKm5nSWY9XCJzLm9wZW4gJiYgcy5pdGVtcy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0IG9mIHMuaXRlbXNcIj57eyBpdCB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDwhLS0gTm8gU2NoZWR1bGUgYmxvY2sgKFFBIDEwIE9jdCk6IGF1ZGl0cyBoYXZlIG5vIG9uZS10aW1lIC8gcmVwZWF0IHNjaGVkdWxlIGhlcmU7IHZpc2l0cyBjb21lIGZyb20gU2NoZWR1bGVzLiAtLT5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2FzaWRlPlxyXG5cclxuICAgIDwhLS0gQ29uZmlndXJhdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjZi1yaWdodFwiPlxyXG5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjZi1jYXJkXCIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyIFtyb3dzXT1cIjRcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuXHJcbiAgICAgIDwhLS0gPT09PT0gQWR2YW5jZSBDb25maWd1cmF0aW9uID09PT09IC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNmLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYmxvY2staGVhZFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1ibG9jay10aXRsZVwiPkFkdmFuY2UgQ29uZmlndXJhdGlvbjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcnVsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hldlwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gQXVkaXQgT3duZXIgLS0+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbFwiPkF1ZGl0IE93bmVyPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPk93bmVycyBnZXQgYWNjZXNzIHRvIG1hbmFnZSB0aGUgYXVkaXQ8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWZpZWxkXCI+Q2FuIGJlIG1hbmFnZWQgYnk8L3NwYW4+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hpcFBpY2tlcjsgY29udGV4dDogeyBsaXN0OiAnb3duZXJzJywgbGFyZ2U6IGZhbHNlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBcHByb3ZlciAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPkFwcHJvdmVyPC9zcGFuPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwiYXBwcm92ZXJPblwiIChjbGljayk9XCJ0b2dnbGVBcHByb3ZlcigpXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+QnkgZW5hYmxpbmcsIHRoZSB1c2VycyB3aWxsIGJlIGFibGUgdG8gYXBwcm92ZSB0aGUgYXVkaXQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytcm93XCIgKm5nSWY9XCJhcHByb3Zlck9uXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWZpZWxkXCI+VG8gYmUgYXBwcm92ZWQgYnk8L3NwYW4+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hpcFBpY2tlcjsgY29udGV4dDogeyBsaXN0OiAnYXBwcm92ZXJzJywgbGFyZ2U6IGZhbHNlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3JcIiAqbmdJZj1cImFwcHJvdmVyRXJyb3JcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgIHt7IGFwcHJvdmVyRXJyb3IgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mbyBjZi1pbmZvLS13cmFwXCIgKm5nSWY9XCIhYXBwcm92ZXJPbiAmJiBhcHByb3ZlcnMubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgIEFwcHJvdmVyIGlzIG9mZiwgc28gdGhlIHt7IGFwcHJvdmVycy5sZW5ndGggfX0gYXBwcm92ZXJ7eyBhcHByb3ZlcnMubGVuZ3RoID09PSAxID8gJycgOiAncycgfX0gYWRkZWQgd2lsbCBiZSByZW1vdmVkIHdoZW4geW91IHNhdmUuIFR1cm4gQXBwcm92ZXIgYmFjayBvbiB0byBrZWVwIHt7IGFwcHJvdmVycy5sZW5ndGggPT09IDEgPyAnaXQnIDogJ3RoZW0nIH19LlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmZvIGNmLWluZm8tLXdyYXBcIiAqbmdJZj1cIiFhcHByb3Zlck9uICYmICFhcHByb3ZlcnMubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgIEFwcHJvdmVyIGlzIG9mZiwgc28gc3VibWl0dGVkIGF1ZGl0cyBhcmUgbm90IHNlbnQgZm9yIGFwcHJvdmFsLiBUdXJuIGl0IG9uIHRvIGFkZCBhcHByb3ZlcnMgb3IgdG8gc2VuZCBmbGFncyBhbmQgcmVwb3J0cyB0byB0aGVtLlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFJlbWluZGVyIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+UmVtaW5kZXI8L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJyZW1pbmRlck9uXCIgKGNsaWNrKT1cInRvZ2dsZVJlbWluZGVyKClcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5CeSBlbmFibGluZywgdGhlIHVzZXJzIHdpbGwgYmUgcmVtaW5kZWQgaW4gdGhlIHNlbGVjdGVkIGludGVydmFsPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubmVyXCIgKm5nSWY9XCJyZW1pbmRlck9uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5saW5lXCI+XHJcbiAgICAgICAgICAgIE5vdGlmeSB1c2VyIGJlZm9yZVxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJlbWluZGVyXCIgKm5nRm9yPVwibGV0IG0gb2YgcmVtaW5kZXJzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJjZi1yZW1pbmRlci1zZWxlY3RcIiBbdmFsdWVdPVwibVwiIFtvcHRpb25zXT1cInJlbWluZGVyT3B0c1tpXSB8fCBbXVwiIFtzZWFyY2hhYmxlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ1JlbWluZGVyICcgKyAoaSArIDEpICsgJyBpbiBtaW51dGVzJ1wiIChjaGFuZ2VkKT1cInNldFJlbWluZGVyKGksICRldmVudC50YXJnZXQudmFsdWUpXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiY2YtY2hpcC14XCIgKm5nSWY9XCJyZW1pbmRlcnMubGVuZ3RoID4gMVwiIHRpdGxlPVwiUmVtb3ZlIHJlbWluZGVyXCIgKGNsaWNrKT1cInJlbW92ZVJlbWluZGVyKGkpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuNVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48bGluZSB4MT1cIjZcIiB5MT1cIjZcIiB4Mj1cIjE4XCIgeTI9XCIxOFwiPjwvbGluZT48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1pY29uLWJ0blwiICpuZ0lmPVwicmVtaW5kZXJzLmxlbmd0aCA8IG1heFJlbWluZGVyc1wiIHRpdGxlPVwiQWRkIHJlbWluZGVyXCIgKGNsaWNrKT1cImFkZFJlbWluZGVyKClcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGxpbmUgeDE9XCIxMlwiIHkxPVwiNVwiIHgyPVwiMTJcIiB5Mj1cIjE5XCI+PC9saW5lPjxsaW5lIHgxPVwiNVwiIHkxPVwiMTJcIiB4Mj1cIjE5XCIgeTI9XCIxMlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmZvXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIFNlbmQgYWxlcnRzIHt7IHJlbWluZGVyU3VtbWFyeSB9fSBtaW5zIGJlZm9yZSB0aGUgYXVkaXQgZW5kIHRpbWVcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIE5vdGlmeSBGbGFncyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPk5vdGlmeSBGbGFnczwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cIm5vdGlmeUZsYWdzT25cIiAoY2xpY2spPVwidG9nZ2xlTm90aWZ5RmxhZ3MoKVwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPkJ5IGVuYWJsaW5nLCBhbGwgZmxhZ3Mgd2lsbCBiZSBzZW50IGFzIGFuIGVtYWlsPC9kaXY+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdGlmeUZsYWdzT25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1jaGVja3NcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVja3MtbGFiZWxcIj5TZW5kIFRvPC9zcGFuPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIFtjbGFzcy5pcy1ibG9ja2VkXT1cIiFoYXNBcHByb3ZlcnMgJiYgIW5vdGlmeVNlbmRBcHByb3ZlclwiIChjbGljayk9XCJ0b2dnbGVTZW5kQXBwcm92ZXIoJ25vdGlmeVNlbmRBcHByb3ZlcicpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVjay1ib3hcIiBbY2xhc3MuaXMtb25dPVwibm90aWZ5U2VuZEFwcHJvdmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwibm90aWZ5U2VuZEFwcHJvdmVyXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPkFwcHJvdmVyXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLWNoZWNrXCIgKGNsaWNrKT1cIm5vdGlmeVNlbmRDdXN0b20gPSAhbm90aWZ5U2VuZEN1c3RvbVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cIm5vdGlmeVNlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJub3RpZnlTZW5kQ3VzdG9tXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPkN1c3RvbVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm90aWZ5U2VuZEN1c3RvbVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hpcFBpY2tlcjsgY29udGV4dDogeyBsaXN0OiAnbm90aWZ5VXNlcnMnLCBsYXJnZTogZmFsc2UgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3JcIiAqbmdJZj1cIm5vdGlmeUZsYWdzRXJyb3JcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IG5vdGlmeUZsYWdzRXJyb3IgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIE5vdGlmeSBvbiBSZWN1cnJpbmcgRmxhZ3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5Ob3RpZnkgb24gUmVjdXJyaW5nIEZsYWdzPC9zcGFuPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwicmVjdXJyaW5nRmxhZ3NPblwiIChjbGljayk9XCJ0b2dnbGVSZWN1cnJpbmdGbGFncygpXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+V2hlbiBlbmFibGVkLCBlbWFpbHMgYXJlIHNlbnQgZm9yIHJlY3VycmluZyBmbGFncyBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQ8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubmVyXCIgKm5nSWY9XCJyZWN1cnJpbmdGbGFnc09uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5saW5lXCI+XHJcbiAgICAgICAgICAgIFNlbmQgRW1haWwgaWYgdGhlIHNhbWUgcXVlc3Rpb24gaXMgZmxhZ2dlZFxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd247IGNvbnRleHQ6IHsga2V5OiAncmVjdXJyaW5nVGhyZXNob2xkJywgb3B0aW9uczogdGhyZXNob2xkT3B0cyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIHRpbWVzIGJ5IHRoZSBzYW1lIHN0b3JlXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmZvXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIE9uY2UgdGhlIHRocmVzaG9sZCBpcyByZWFjaGVkIGFuZCBhbiBlbWFpbCBpcyBzZW50LCB0aGUgZmxhZyBjb3VudCByZXNldHMgdG8gemVyb1xyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY3VycmluZ0ZsYWdzT25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1jaGVja3NcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVja3MtbGFiZWxcIj5TZW5kIFRvPC9zcGFuPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIFtjbGFzcy5pcy1ibG9ja2VkXT1cIiFoYXNBcHByb3ZlcnMgJiYgIXJlY3VycmluZ1NlbmRBcHByb3ZlclwiIChjbGljayk9XCJ0b2dnbGVTZW5kQXBwcm92ZXIoJ3JlY3VycmluZ1NlbmRBcHByb3ZlcicpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVjay1ib3hcIiBbY2xhc3MuaXMtb25dPVwicmVjdXJyaW5nU2VuZEFwcHJvdmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicmVjdXJyaW5nU2VuZEFwcHJvdmVyXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPkFwcHJvdmVyXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLWNoZWNrXCIgKGNsaWNrKT1cInRvZ2dsZVJlY3VycmluZ0N1c3RvbSgpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVjay1ib3hcIiBbY2xhc3MuaXMtb25dPVwicmVjdXJyaW5nU2VuZEN1c3RvbVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInJlY3VycmluZ1NlbmRDdXN0b21cIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+Q3VzdG9tXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLWNoZWNrXCIgKGNsaWNrKT1cInJlY3VycmluZ1NhbWVBc05vdGlmeSA9ICFyZWN1cnJpbmdTYW1lQXNOb3RpZnlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJyZWN1cnJpbmdTYW1lQXNOb3RpZnlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJyZWN1cnJpbmdTYW1lQXNOb3RpZnlcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+VXNlIHNhbWUgdXNlcnMgZnJvbSBOb3RpZnkgRmxhZ3NcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlY3VycmluZ1NlbmRDdXN0b21cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ3JlY3VycmluZ1VzZXJzJywgbGFyZ2U6IGZhbHNlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWluZm9cIiAqbmdJZj1cInJlY3VycmluZ1NhbWVBc05vdGlmeVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyBub3RpZnlSZWNpcGllbnRzTGFiZWwgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJyZWN1cnJpbmdGbGFnc0Vycm9yXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyByZWN1cnJpbmdGbGFnc0Vycm9yIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBEYWlseSByZXBvcnQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5FbmFibGUgLSBEYWlseSBSZXBvcnQ8L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJkYWlseVJlcG9ydE9uXCIgKGNsaWNrKT1cInRvZ2dsZURhaWx5UmVwb3J0KClcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5CeSBFbmFibGluZywgY29tcGxpYW5jZSBzY29yZSB3aWxsIGJlIHNlbnQgYXMgYW4gZW1haWwgdG8gdGhlIGFib3ZlIHVzZXJzPC9kaXY+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhaWx5UmVwb3J0T25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1jaGVja3NcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVja3MtbGFiZWxcIj5TZW5kIFRvPC9zcGFuPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIFtjbGFzcy5pcy1ibG9ja2VkXT1cIiFoYXNBcHByb3ZlcnMgJiYgIWRhaWx5U2VuZEFwcHJvdmVyXCIgKGNsaWNrKT1cInRvZ2dsZVNlbmRBcHByb3ZlcignZGFpbHlTZW5kQXBwcm92ZXInKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cImRhaWx5U2VuZEFwcHJvdmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZGFpbHlTZW5kQXBwcm92ZXJcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+QXBwcm92ZXJcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiAoY2xpY2spPVwiZGFpbHlTZW5kQ3VzdG9tID0gIWRhaWx5U2VuZEN1c3RvbVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cImRhaWx5U2VuZEN1c3RvbVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRhaWx5U2VuZEN1c3RvbVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5DdXN0b21cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhaWx5U2VuZEN1c3RvbVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYnVsa2JhclwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIChjbGljayk9XCJvcGVuRGFpbHlCdWxrKClcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICBCdWxrIFVwbG9hZFxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ2RhaWx5VXNlcnMnLCBsYXJnZTogZmFsc2UgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIChjbGljayk9XCJzaGFyZVBvc3RBcHByb3ZhbCA9ICFzaGFyZVBvc3RBcHByb3ZhbFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJzaGFyZVBvc3RBcHByb3ZhbFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJzaGFyZVBvc3RBcHByb3ZhbFwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlNoYXJlIFJlcG9ydCBQb3N0IEFwcHJvdmFsXHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJkYWlseVJlcG9ydEVycm9yXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyBkYWlseVJlcG9ydEVycm9yIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBFeHBvcnQgc3VibWlzc2lvbjogVGFuZ28gdXNlcnMgb25seSwgYXMgdGhlIHYxIENvbmZpZ3VyZSAoaXRzIHN0b3JlZCB2YWx1ZSBpcyBrZXB0IGZvciBldmVyeW9uZSBlbHNlKS4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWdyaWQyXCIgKm5nSWY9XCJhY2Nlc3MuaXNUYW5nb1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS10aWdodFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5FeHBvcnQgU3VibWlzc2lvbjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJleHBvcnRTdWJtaXNzaW9uT25cIiAoY2xpY2spPVwiZXhwb3J0U3VibWlzc2lvbk9uID0gIWV4cG9ydFN1Ym1pc3Npb25PblwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+RW5hYmxlIHRoaXMgdG8gYWxsb3cgYXVkaXQgc3VibWl0dGVycyB0byBkb3dubG9hZCB0aGVpciBzdWJtaXNzaW9uIGFzIGEgUERGIGZpbGU8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFJlZG8gdmFsaWRpdHkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWdyaWQyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2tcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsXCI+UmVkbyBWYWxpZGl0eTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5saW5lXCI+XHJcbiAgICAgICAgICAgICAgUmVkbyB2YWxpZCBmb3JcclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd247IGNvbnRleHQ6IHsga2V5OiAncmVkb1ZhbGlkRm9yJywgb3B0aW9uczogcmVkb0RheU9wdHMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIERheSBmcm9tIFJlZG8gY3JlYXRpb25cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBdXRvIGNyZWF0ZSB0YXNrIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+QXV0byBDcmVhdGUgVGFzayBmb3IgRmxhZ3M8L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJhdXRvQ3JlYXRlVGFza09uXCIgKGNsaWNrKT1cImF1dG9DcmVhdGVUYXNrT24gPSAhYXV0b0NyZWF0ZVRhc2tPblwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPkJ5IGVuYWJsaW5nLCBhIHRhc2sgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciBldmVyeSBmbGFnZ2VkIHF1ZXN0aW9uIGluIHRoZSBhdWRpdDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFdobyBnZXRzIHRoZSB0YXNrIGFuZCBob3cgbG9uZyBpdCBzdGF5cyBvcGVuIChhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlKSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYXV0b3Rhc2tcIiAqbmdJZj1cImF1dG9DcmVhdGVUYXNrT25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1hdXRvdGFzay10aXRsZVwiPlRhc2sgQXNzaWduZWU8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+Q2hvb3NlIHdobyB0aGUgZmxhZ2dlZCB0YXNrIGlzIGFzc2lnbmVkIHRvPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYXV0b3Rhc2stY2hvaWNlc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLWNob2ljZVwiIFtjbGFzcy5pcy1vbl09XCJ0YXNrQXNzaWduZWUgPT09ICdzdWJtaXR0ZXInXCIgKGNsaWNrKT1cInRhc2tBc3NpZ25lZSA9ICdzdWJtaXR0ZXInXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJ0YXNrQXNzaWduZWUgPT09ICdzdWJtaXR0ZXInXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNob2ljZS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNob2ljZS10aXRsZVwiPkF1ZGl0IFN1Ym1pdHRlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hvaWNlLXN1YlwiPlRhc2sgaXMgYXNzaWduZWQgdG8gdGhlIHVzZXIgd2hvIGZpbGxlZCB0aGUgYXVkaXQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1jaG9pY2VcIiBbY2xhc3MuaXMtb25dPVwidGFza0Fzc2lnbmVlID09PSAnc3RvcmUnXCIgKGNsaWNrKT1cInRhc2tBc3NpZ25lZSA9ICdzdG9yZSdcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cInRhc2tBc3NpZ25lZSA9PT0gJ3N0b3JlJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaG9pY2UtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaG9pY2UtdGl0bGVcIj5TdG9yZSBVc2VyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaG9pY2Utc3ViXCI+VGFzayBpcyBhc3NpZ25lZCB0byB0aGUgdXNlciBtYXBwZWQgdG8gdGhlIGZsYWdnZWQgc3RvcmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWF1dG90YXNrLXRpdGxlXCI+VGFzayBWYWxpZGl0eTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWF1dG90YXNrLXZhbGlkaXR5XCI+XHJcbiAgICAgICAgICAgIDxzcGFuPlRhc2sgdmFsaWQgZm9yPC9zcGFuPlxyXG4gICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImNmLXZhbGlkaXR5LXNlbGVjdFwiIFsobmdNb2RlbCldPVwidGFza1ZhbGlkaXR5XCIgW29wdGlvbnNdPVwidGFza1ZhbGlkaXR5T3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgW3NlYXJjaGFibGVdPVwiZmFsc2VcIiBhcmlhTGFiZWw9XCJUYXNrIHZhbGlkaXR5IGluIGRheXNcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDxzcGFuPmRheXMgZnJvbSB0YXNrIGNyZWF0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDwhLS0gPT09PT0gQXVkaXQgQ29uZmlndXJhdGlvbiA9PT09PSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLWRpdmlkZXItaGVhZFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5BdWRpdCBDb25maWd1cmF0aW9uPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcnVsZVwiPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNmLWNhcmQgY2YtY2FyZC0tbGdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5TdWJtaXNzaW9uICZhbXA7IFZpc2liaWxpdHk8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBjZi1ib3gtLW9wZW46IHRoZSBkaXNwdXRlLXdpbmRvdyBhbmQgcmVzcG9uc2UtZGVsYXkgbWVudXMgbXVzdCBub3QgYmUgY2xpcHBlZCBieSB0aGUgYm94IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3ggY2YtYm94LS1vcGVuXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94LXJvd1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaCBjZi1zd2l0Y2gtLXRvcFwiIFtjbGFzcy5pcy1vbl09XCJzaG93UmVzcG9uc2VJbkFwcFwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dSZXNwb25zZUluQXBwID0gIXNob3dSZXNwb25zZUluQXBwXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXhzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsXCI+U2hvdyBSZXNwb25zZSBpbiBNb2JpbGUgQXBwPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5CeSBlbmFibGluZyB0aGlzIG9wdGlvbiwgc3RvcmUgdXNlcnMgY2FuIHZpZXcgdGhlIGF1ZGl0IHJlc3BvbnNlIGluIHRoZSBNb2JpbGUgQXBwLjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3gtc3ViXCIgKm5nSWY9XCJzaG93UmVzcG9uc2VJbkFwcFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXhzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsLXNtXCI+UmVzcG9uc2UgVmlzaWJpbGl0eTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+Q2hvb3NlIHdoZW4gdGhlIHJlc3BvbnNlIGJlY29tZXMgdmlzaWJsZSB0byBzdG9yZSB1c2VyczwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1vcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJyZXNwb25zZVZpc2liaWxpdHkgPT09ICdwcmUnXCIgKGNsaWNrKT1cInJlc3BvbnNlVmlzaWJpbGl0eSA9ICdwcmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cInJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3ByZSdcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS1zbVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWwtc21cIj5QcmUtYXBwcm92YWw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5UaGUgYXVkaXQgcmVzcG9uc2Ugd2lsbCBiZSB2aXNpYmxlIHRvIHN0b3JlIHVzZXJzIGJlZm9yZSBpdCBpcyBhcHByb3ZlZC48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubGluZSBjZi1pbmxpbmUtLXRvcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3cgcmVzcG9uc2VcclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJvcGRvd247IGNvbnRleHQ6IHsga2V5OiAncmVzcERlbGF5Jywgb3B0aW9uczogcmVzcERlbGF5T3B0cyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgc3VibWlzc2lvblxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwicmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncG9zdCdcIiAoY2xpY2spPVwicmVzcG9uc2VWaXNpYmlsaXR5ID0gJ3Bvc3QnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cInJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3Bvc3QnXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0tc21cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsLXNtXCIgW2NsYXNzLmNmLW11dGVkXT1cInJlc3BvbnNlVmlzaWJpbGl0eSAhPT0gJ3Bvc3QnXCI+UG9zdC1hcHByb3ZhbDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPk9uY2UgdGhlIHJlc3BvbnNlIGlzIGFwcHJvdmVkLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBNb2JpbGUgQXBwLiBTdG9yZSB1c2VycyBjYW5ub3QgcmFpc2UgYSBkaXNwdXRlLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveC1zZXBcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncHJlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveC1yb3cgY2YtYm94LXJvdy0tZmx1c2hcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2ggY2Ytc3dpdGNoLS10b3BcIiBbY2xhc3MuaXMtb25dPVwiZGlzcHV0ZU9uXCIgKGNsaWNrKT1cImRpc3B1dGVPbiA9ICFkaXNwdXRlT25cIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0teHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWwtc21cIj5EaXNwdXRlIENvbmZpZ3VyYXRpb248L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS13cmFwXCI+V2hlbiBlbmFibGVkLCB0aGUgc3RvcmUgdGVhbSBjYW4gcmFpc2UgYSBkaXNwdXRlIGFnYWluc3QgdGhlIGF1ZGl0b3IncyBzdWJtaXNzaW9uIG9uY2UgdGhlIHJlc3BvbnNlIGJlY29tZXMgdmlzaWJsZSB0byB0aGVtLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLW5lc3RlZFwiICpuZ0lmPVwiZGlzcHV0ZU9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICBEaXNwdXRlIHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bjsgY29udGV4dDogeyBrZXk6ICdkaXNwdXRlV2luZG93Jywgb3B0aW9uczogZGlzcFdpbmRvd09wdHMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIGZyb20gd2hlbiB0aGUgcmVzcG9uc2UgYmVjb21lcyB2aXNpYmxlXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mbyBjZi1pbmZvLS13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIERpc3B1dGVzIHJhaXNlZCBpbnNpZGUgdGhpcyB3aW5kb3cgZ28gdG8gdGhlIGFwcHJvdmVyLiBBcHByb3ZlZCBkaXNwdXRlcyByZXZpc2UgdGhlIGFuc3dlciBhbmQgdGhlIGNvbXBsaWFuY2Ugc2NvcmUuXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3JcIiAqbmdJZj1cIiFoYXNBcHByb3ZlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIE5vIGFwcHJvdmVyIGlzIHNldCwgc28gbm8gb25lIGNhbiByZXZpZXcgZGlzcHV0ZXMuIFR1cm4gb24gQXBwcm92ZXIgYW5kIGFkZCBhbiBhcHByb3Zlci5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncG9zdCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0tc21cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsLXNtIGNmLW11dGVkXCI+RGlzcHV0ZSBDb25maWd1cmF0aW9uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmZvIGNmLWluZm8tLXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgRGlzcHV0ZXMgYXJlIG5vdCBhdmFpbGFibGUgd2hlbiByZXNwb25zZXMgYXJlIHNob3duIHBvc3QtYXBwcm92YWwuXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUHJlLXN1Ym1pc3Npb24gYWNjZXNzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3ggY2YtYm94LS1wYWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5QcmUtU3VibWlzc2lvbiBBY2Nlc3M8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cInByZVN1Ym1pc3Npb25BY2Nlc3NPblwiIChjbGljayk9XCJwcmVTdWJtaXNzaW9uQWNjZXNzT24gPSAhcHJlU3VibWlzc2lvbkFjY2Vzc09uXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS13cmFwXCI+VXNlcnMgYWRkZWQgaGVyZSBjYW4gdmlldyBPcGVuIGFuZCBJbiBQcm9ncmVzcyBhdWRpdHMgdW50aWwgc3VibWlzc2lvbi4gVGhlIFNjaGVkdWxlIEluZm8gdGFiIGlzIGFsc28gdmlzaWJsZSBvbmx5IHRvIHRoZXNlIHVzZXJzLjwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByZVN1Ym1pc3Npb25BY2Nlc3NPblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytcm93IGNmLXJvdy0tdG9wXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1maWVsZFwiPlZpc2libGUgdG88L3NwYW4+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ3ByZVN1Ym1pc3Npb25Vc2VycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3IgY2YtZXJyb3ItLWluZGVudFwiICpuZ0lmPVwicHJlU3VibWlzc2lvbkVtcHR5XCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICBBZGQgYXQgbGVhc3Qgb25lIHVzZXJcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPCEtLSA9PT09PSBTY29yaW5nID09PT09IC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNmLWNhcmQgY2YtY2FyZC0tbGdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5TY29yaW5nPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLXBhZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPlBhc3MvRmFpbCBTY29yZSBTZXR1cDwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwicGFzc0ZhaWxPblwiIChjbGljayk9XCJwYXNzRmFpbE9uID0gIXBhc3NGYWlsT25cIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXdyYXBcIj5TZXQgdGhlIGNvbXBsaWFuY2Ugc2NvcmUgYW4gYXVkaXQgbXVzdCByZWFjaCB0byBiZSBtYXJrZWQge3sgcGFzc0xhYmVsIH19LiBBbnl0aGluZyBiZWxvdyBpdCBpcyBtYXJrZWQge3sgZmFpbExhYmVsIH19LjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXJvdyBjZi1yb3ctLXdyYXAgY2Ytcm93LS10b3BcIiAqbmdJZj1cInBhc3NGYWlsT25cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1maWVsZFwiPk1pbmltdW0gc2NvcmUgdG8ge3sgcGFzc0xhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1udW1cIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBtYXg9XCIxMDBcIiBbKG5nTW9kZWwpXT1cInBhc3NUaHJlc2hvbGRcIj5cclxuICAgICAgICAgICAgICA8c3Bhbj4lPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXBpbGwgY2YtcGlsbC0tcGFzc1wiPnt7IHBhc3NMYWJlbCB9fSDiiaUge3sgcGFzc1RocmVzaG9sZCB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcGlsbCBjZi1waWxsLS1mYWlsXCI+e3sgZmFpbExhYmVsIH19ICZsdDsge3sgcGFzc1RocmVzaG9sZCB9fSU8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPCEtLSA9PT09PSBBcHByb3ZlciBDb250cm9scyA9PT09PSAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjZi1jYXJkIGNmLWNhcmQtLWxnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJsb2NrLXRpdGxlXCI+QXBwcm92ZXIgQ29udHJvbHM8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2tcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5FZGl0IFN1Ym1pdHRlZCBBdWRpdDwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwiZWRpdFN1Ym1pdHRlZE9uXCIgKGNsaWNrKT1cInRvZ2dsZUVkaXRTdWJtaXR0ZWQoKVwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5BbGxvdyBBcHByb3ZlcnMgdG8gZWRpdCBzdWJtaXR0ZWQgQXVkaXQ8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0U3VibWl0dGVkT25cIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoaXBQaWNrZXI7IGNvbnRleHQ6IHsgbGlzdDogJ2VkaXRVc2VycycsIGxhcmdlOiB0cnVlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJlZGl0U3VibWl0dGVkRXJyb3JcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIHt7IGVkaXRTdWJtaXR0ZWRFcnJvciB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ncmlkMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbFwiPlJlZG8gRXh0ZW5zaW9uPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICBFeHRlbmQgcmVkbyB1cCB0b1xyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bjsgY29udGV4dDogeyBrZXk6ICdyZWRvRXh0ZW5zaW9uJywgb3B0aW9uczogcmVkb0V4dGVuc2lvbk9wdHMgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIERheXMgdGlsbCBhcHByb3ZhbFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8IS0tID09PT09IFVzZXIgVmVyaWZpY2F0aW9uID09PT09IC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNmLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5Vc2VyIFZlcmlmaWNhdGlvbiBDb25maWd1cmF0aW9uPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLXJvd1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2ggY2Ytc3dpdGNoLS10b3BcIiBbY2xhc3MuaXMtb25dPVwicmVxdWlyZVBob3RvXCIgKGNsaWNrKT1cInJlcXVpcmVQaG90byA9ICFyZXF1aXJlUGhvdG9cIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXhzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbFwiPlJlcXVpcmUgUGhvdG8gQ2FwdHVyZTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPkJ5IGVuYWJsaW5nLCB1c2VycyBtdXN0IGNhcHR1cmUgdGhlaXIgcGhvdG8gdG8gY29tcGxldGUgc3VibWlzc2lvbjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLXJvd1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2ggY2Ytc3dpdGNoLS10b3BcIiBbY2xhc3MuaXMtb25dPVwicmVxdWlyZUFja25vd2xlZGdtZW50XCIgKGNsaWNrKT1cInJlcXVpcmVBY2tub3dsZWRnbWVudCA9ICFyZXF1aXJlQWNrbm93bGVkZ21lbnRcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXhzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbFwiPlJlcXVpcmUgVXNlciBBY2tub3dsZWRnbWVudDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPkJ5IGVuYWJsaW5nLCB1c2VycyBtdXN0IHR5cGUgdGhlaXIgbmFtZSBhcyBhY2tub3dsZWRnbWVudCB0byBjb21wbGV0ZSBzdWJtaXNzaW9uPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBEYWlseSBSZXBvcnQgPiBDdXN0b206IGJ1bGsgdXBsb2FkIHVzZXJzIChhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlJ3MgcG9wdXApIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYWlseUJ1bGtPcGVuXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtZGxnLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlRGFpbHlCdWxrKClcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjZi1kbGdcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIiBhcmlhLWxhYmVsbGVkYnk9XCJjZi1kbGctdGl0bGVcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJjZi1kbGctaWNvblwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi1kbGctdGl0bGVcIiBpZD1cImNmLWRsZy10aXRsZVwiPkJ1bGsgVXBsb2FkPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi1kbGctc3RlcHNcIj5cclxuICAgICAgICA8ZGl2PlN0ZXAgMSAtIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBkb3dubG9hZERhaWx5VGVtcGxhdGUoKVwiPkRvd25sb2FkIHRoZSB0ZW1wbGF0ZSBoZXJlPC9hPjwvZGl2PlxyXG4gICAgICAgIDxkaXY+U3RlcCAyIC0gQWRkIHRoZSBFbWFpbCBvZiBleGlzdGluZyB1c2VycyB0byB0aGUgdGVtcGxhdGU8L2Rpdj5cclxuICAgICAgICA8ZGl2PlN0ZXAgMyAtIFVwbG9hZCBpdCBiZWxvdyBmb3IgcHJvY2Vzc2luZzwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLWRsZy1ub3RlXCI+XHJcbiAgICAgICAgKipOb3RlIDogT25seSB0aGUgRW1haWwgY29sdW1uIGlzIGNvbnNpZGVyZWQgLSB0aGUgVXNlcm5hbWUgaXMgdGFrZW4gZnJvbSB0aGUgZXhpc3RpbmcgdXNlciBsaXN0LlxyXG4gICAgICAgIE9ubHkgZXhpc3RpbmcgdXNlcnMgb2YgdGhpcyBjbGllbnQgYXJlIGFjY2VwdGVkLiBPbiB1cGxvYWQsIGFsbCB0aGUgZXhpc3RpbmcgZGF0YSB3aWxsIGJlIHJlcGxhY2VkLlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLWVycm9yXCIgKm5nSWY9XCJkYWlseUJ1bGtFcnJvcnMubGVuZ3RoXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZGxnLWVycm9yc1wiPlxyXG4gICAgICAgICAgPGRpdj5UaGUgZmlsZSB3YXMgbm90IHVwbG9hZGVkLiBGaXgge3sgZGFpbHlCdWxrRXJyb3JzLmxlbmd0aCA9PT0gMSA/ICd0aGlzIHJvdycgOiAndGhlc2Ugcm93cycgfX0gYW5kIHVwbG9hZCBhZ2Fpbjo8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGUgb2YgZGFpbHlCdWxrRXJyb3JzLnNsaWNlKDAsIDUpXCI+e3sgZSB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImRhaWx5QnVsa0Vycm9ycy5sZW5ndGggPiA1XCI+K3t7IGRhaWx5QnVsa0Vycm9ycy5sZW5ndGggLSA1IH19IG1vcmU8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi1kbGctZm9vdFwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIChjbGljayk9XCJjbG9zZURhaWx5QnVsaygpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLXByaW1hcnkgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwiZGFpbHlCdWxrRmlsZS5jbGljaygpXCI+VXBsb2FkPC9idXR0b24+XHJcbiAgICAgICAgPGlucHV0ICNkYWlseUJ1bGtGaWxlIHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiLnhsc3hcIiBoaWRkZW4gKGNoYW5nZSk9XCJvbkRhaWx5QnVsa0ZpbGUoJGV2ZW50KVwiPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==
1052
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItY29uZmlndXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvY29uZmlndXJlL2F1ZGl0LXYyLWNvbmZpZ3VyZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2NvbmZpZ3VyZS9hdWRpdC12Mi1jb25maWd1cmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU5RixPQUFPLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztBQUNuQyxPQUFPLFFBQVEsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUU3QixPQUFPLEVBQWUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7QUFHOUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBc0J2QiwwR0FBMEc7QUFDMUcsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztB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LENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLDZFQUE2RTtRQUM3RSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO3dHQTU3QlUseUJBQXlCOzRGQUF6Qix5QkFBeUIsZ0lDN0R0QyxncXhDQWdtQkE7OzRGRG5pQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3Qjs4TkE2SmxDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmb3JrSm9pbiwgZnJvbSwgb2YsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcclxuaW1wb3J0IHRpbWV6b25lIGZyb20gJ2RheWpzL3BsdWdpbi90aW1lem9uZSc7XHJcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXVkaXRBY2Nlc3MsIGF1ZGl0QWNjZXNzIH0gZnJvbSAnLi4vYXVkaXQtdjItYWNjZXNzJztcclxuaW1wb3J0IHsgQXVkaXRTZWxlY3RPcHRpb24gfSBmcm9tICcuLi9zZWxlY3QvYXVkaXQtdjItc2VsZWN0LmNvbXBvbmVudCc7XHJcblxyXG5kYXlqcy5leHRlbmQodXRjKTtcclxuZGF5anMuZXh0ZW5kKHRpbWV6b25lKTtcclxuXHJcbi8qKiBBIHVzZXIgY2hpcDogaW5pdGlhbHMsIGRpc3BsYXkgbmFtZSwgZW1haWwuIFN0b3JlZCBvbiB0aGUgY2hlY2tsaXN0IGFzIHsgbmFtZSwgdmFsdWUgfS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDaGlwVXNlciB7XHJcbiAgaTogc3RyaW5nO1xyXG4gIG46IHN0cmluZztcclxuICBlOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnU2VjdGlvbiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBpdGVtczogc3RyaW5nW107XHJcbiAgb3BlbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RPcHRpb24ge1xyXG4gIHZhbHVlOiBudW1iZXI7XHJcbiAgbGFiZWw6IHN0cmluZztcclxufVxyXG5cclxudHlwZSBDaGlwTGlzdCA9ICdvd25lcnMnIHwgJ2FwcHJvdmVycycgfCAnbm90aWZ5VXNlcnMnIHwgJ3JlY3VycmluZ1VzZXJzJyB8ICdkYWlseVVzZXJzJyB8ICdwcmVTdWJtaXNzaW9uVXNlcnMnIHwgJ2VkaXRVc2Vycyc7XHJcblxyXG4vKiogUmVtaW5kZXIgaW50ZXJ2YWxzIG9mZmVyZWQsIGluIG1pbnV0ZXMgYmVmb3JlIHRoZSBhdWRpdCBlbmQgdGltZSAoYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSkuICovXHJcbmNvbnN0IFJFTUlOREVSX01JTlVURVMgPSBbMzAsIDQ1LCA2MCwgNzUsIDkwXTtcclxuLyoqIFRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UgYWxsb3dzIHVwIHRvIHRocmVlIHJlbWluZGVycy4gKi9cclxuY29uc3QgTUFYX1JFTUlOREVSUyA9IDM7XHJcbnR5cGUgU2VsZWN0S2V5ID0gJ3JlY3VycmluZ1RocmVzaG9sZCcgfCAncmVkb1ZhbGlkRm9yJyB8ICdyZXNwRGVsYXknIHwgJ2Rpc3B1dGVXaW5kb3cnIHwgJ3JlZG9FeHRlbnNpb24nO1xyXG4vKiogXCJTZW5kIFRvID4gQXBwcm92ZXJcIiB0aWNrcyB0aGF0IG5lZWQgYXQgbGVhc3Qgb25lIGFwcHJvdmVyIHRvIHNlbmQgdG8uICovXHJcbnR5cGUgU2VuZEFwcHJvdmVyS2V5ID0gJ25vdGlmeVNlbmRBcHByb3ZlcicgfCAncmVjdXJyaW5nU2VuZEFwcHJvdmVyJyB8ICdkYWlseVNlbmRBcHByb3Zlcic7XHJcblxyXG4vKipcclxuICogTWFuYWdlIC0+IENvbmZpZ3VyZSBmb3Igb25lIGF1ZGl0IChgP2NoZWNrbGlzdElkPWApLlxyXG4gKlxyXG4gKiBUaGUgYXVkaXQgaXMgYSBjaGVja2xpc3QsIHNvIHRoaXMgcGFnZSByZWFkcyBhbmQgd3JpdGVzIHRoZSBTQU1FIGZpZWxkcyB0aGUgQ2hlY2tsaXN0XHJcbiAqIENvbmZpZ3VyZSBwYWdlIHVzZXMgKEdFVCAvdHJheC9nZXRDb25maWdEZXRhaWxzLCBQT1NUIC90cmF4L2NoZWNrbGlzdENvbmZpZ3VyZXYxKTpcclxuICogb3duZXIsIGFwcHJvdmVyLCByZW1haW5kZXIsIG5vdGlmeUZsYWdzLCByZWN1cnJpbmdGbGFnLCBhdXRvRW1haWwsIGV4cG9ydCwgcmVkb1ZhbGlkaXR5LFxyXG4gKiByZWRvRXh0ZW5zaW9uLCBhdXRvQ3JlYXRlVGFzaywgdXNlclZlcmlmaWNhdGlvbiwgc2hvd0FwcHJvdmVkUmVzcG9uc2UsIHJlc3BvbnNlVmlzaWJpbGl0eSgrSG91cnMpLFxyXG4gKiBzaGFyZVJlcG9ydFBvc3RBcHByb3ZhbCwgY2hlY2tMaXN0RGVzY3JpcHRpb24uIEF1ZGl0LW9ubHkgc2V0dGluZ3MgdGhhdCB0aGUgY2hlY2tsaXN0IHNjaGVtYVxyXG4gKiBoYXMgbm8gZmllbGQgZm9yIChwYXNzIG1hcmssIGRpc3B1dGUgd2luZG93LCBwcmUtc3VibWlzc2lvbiBhY2Nlc3MsIGVkaXQtc3VibWlzc2lvbiB1c2VycylcclxuICogYXJlIGtlcHQgb24gYXVkaXRjb25maWcgdmlhIFBPU1QgL3RyYXgvYXVkaXQvY29uZmlnL3NhdmUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1jb25maWd1cmUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1jb25maWd1cmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1jb25maWd1cmUuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyQ29uZmlndXJlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNoZWNrbGlzdElkID0gJyc7XHJcbiAgYXVkaXROYW1lID0gJyc7XHJcbiAgZGVzY3JpcHRpb24gPSAnJztcclxuICBwdWJsaXNoZWQgPSBmYWxzZTtcclxuICBzY2hlZHVsZSA9ICfigJQnO1xyXG4gIHNjaGVkdWxlV2luZG93ID0gJ+KAlCc7XHJcbiAgc2VjdGlvbnM6IENvbmZpZ1NlY3Rpb25bXSA9IFtdO1xyXG5cclxuICAvLyAtLS0tIGNoZWNrbGlzdCBmaWVsZHMgKHNhdmVkIG9uIGNoZWNrbGlzdGNvbmZpZykgLS0tLVxyXG4gIG93bmVyczogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gIGFwcHJvdmVyT24gPSBmYWxzZTtcclxuICBhcHByb3ZlcnM6IENoaXBVc2VyW10gPSBbXTtcclxuICAvKiogVGhlIGNsaWVudCdzIHN1cGVyYWRtaW4gKGZyb20gdGhlIHVzZXIgbGlzdCksIHRoZSB2MSBkZWZhdWx0IGFwcHJvdmVyIGZvciBUYW5nbyB1c2VycyBhbmQgcm9sZSAndXNlcicuICovXHJcbiAgcHJpdmF0ZSBzdXBlckFkbWluOiBDaGlwVXNlciB8IG51bGwgPSBudWxsO1xyXG4gIHJlbWluZGVyT24gPSBmYWxzZTtcclxuICAvKiogY2hlY2tsaXN0LnJlbWFpbmRlcjogbWludXRlcyBiZWZvcmUgdGhlIGVuZCB0aW1lIGF0IHdoaWNoIHRoZSBhdWRpdG9yIGdldHMgYSBwdXNoIHJlbWluZGVyLiAqL1xyXG4gIHJlbWluZGVyczogbnVtYmVyW10gPSBbXTtcclxuICAvKiogT3B0aW9ucyBwZXIgcmVtaW5kZXIgcm93OiBldmVyeSBpbnRlcnZhbCBub3QgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgcm93LiAqL1xyXG4gIHJlbWluZGVyT3B0czogQXVkaXRTZWxlY3RPcHRpb25bXVtdID0gW107XHJcbiAgcmVhZG9ubHkgbWF4UmVtaW5kZXJzID0gTUFYX1JFTUlOREVSUztcclxuICAvLyBOb3RpZnkgRmxhZ3MgKGNoZWNrbGlzdC5ub3RpZnlGbGFncyk6IHdobyBnZXRzIHRoZSBmbGFnIGVtYWlscy5cclxuICBub3RpZnlGbGFnc09uID0gZmFsc2U7XHJcbiAgbm90aWZ5U2VuZEFwcHJvdmVyID0gdHJ1ZTtcclxuICBub3RpZnlTZW5kQ3VzdG9tID0gZmFsc2U7XHJcbiAgbm90aWZ5VXNlcnM6IENoaXBVc2VyW10gPSBbXTtcclxuICAvLyBOb3RpZnkgb24gUmVjdXJyaW5nIEZsYWdzIChjaGVja2xpc3QucmVjdXJyaW5nRmxhZyk6IHRocmVzaG9sZCArIGl0cyBvd24gcmVjaXBpZW50cy5cclxuICByZWN1cnJpbmdGbGFnc09uID0gZmFsc2U7XHJcbiAgcmVjdXJyaW5nVGhyZXNob2xkID0gMztcclxuICByZWN1cnJpbmdTZW5kQXBwcm92ZXIgPSB0cnVlO1xyXG4gIHJlY3VycmluZ1NlbmRDdXN0b20gPSBmYWxzZTtcclxuICAvKiogU3RvcmVkIGFzIG5vdGlmeVR5cGUgJ3NhbWVBc05vdGlmeSc6IHRoZSBzZXJ2ZXIgbWFpbHMgd2hvZXZlciBOb3RpZnkgRmxhZ3MgbWFpbHMgYXQgc2VuZCB0aW1lLiAqL1xyXG4gIHJlY3VycmluZ1NhbWVBc05vdGlmeSA9IGZhbHNlO1xyXG4gIHJlY3VycmluZ1VzZXJzOiBDaGlwVXNlcltdID0gW107XHJcbiAgZGFpbHlSZXBvcnRPbiA9IGZhbHNlO1xyXG4gIGRhaWx5U2VuZEFwcHJvdmVyID0gdHJ1ZTtcclxuICBkYWlseVNlbmRDdXN0b20gPSBmYWxzZTtcclxuICBkYWlseVVzZXJzOiBDaGlwVXNlcltdID0gW107XHJcbiAgLyoqIERhaWx5IFJlcG9ydCA+IEN1c3RvbSBidWxrIHVwbG9hZCBwb3B1cCAoYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSdzKS4gKi9cclxuICBkYWlseUJ1bGtPcGVuID0gZmFsc2U7XHJcbiAgLyoqIFJvdyBlcnJvcnMgb2YgdGhlIGxhc3QgdXBsb2FkOyBhbnkgZXJyb3IgcmVqZWN0cyB0aGUgd2hvbGUgZmlsZSwgc28gbm90aGluZyBwYXJ0aWFsIGlzIGFwcGxpZWQuICovXHJcbiAgZGFpbHlCdWxrRXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHNoYXJlUG9zdEFwcHJvdmFsID0gZmFsc2U7XHJcbiAgZXhwb3J0U3VibWlzc2lvbk9uID0gZmFsc2U7XHJcbiAgcmVkb1ZhbGlkRm9yID0gNztcclxuICBhdXRvQ3JlYXRlVGFza09uID0gZmFsc2U7XHJcbiAgLyoqIEF1dG8tdGFzayBzZXR0aW5ncyAoYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSk6IHdobyBnZXRzIHRoZSB0YXNrIGFuZCBmb3IgaG93IG1hbnkgZGF5cy4gKi9cclxuICB0YXNrQXNzaWduZWU6ICdzdWJtaXR0ZXInIHwgJ3N0b3JlJyA9ICdzdWJtaXR0ZXInO1xyXG4gIHRhc2tWYWxpZGl0eSA9IDEwO1xyXG4gIHJlYWRvbmx5IHRhc2tWYWxpZGl0eU9wdGlvbnMgPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDE1LCAyMCwgMjUsIDMwXS5tYXAoZCA9PiAoeyB2YWx1ZTogZCwgbGFiZWw6IFN0cmluZyhkKSB9KSk7XHJcbiAgc2hvd1Jlc3BvbnNlSW5BcHAgPSB0cnVlO1xyXG4gIHJlc3BvbnNlVmlzaWJpbGl0eTogJ3ByZScgfCAncG9zdCcgPSAncG9zdCc7XHJcbiAgcmVzcERlbGF5ID0gMjtcclxuICByZXF1aXJlUGhvdG8gPSBmYWxzZTtcclxuICByZXF1aXJlQWNrbm93bGVkZ21lbnQgPSBmYWxzZTtcclxuICByZWRvRXh0ZW5zaW9uID0gMTtcclxuICAvKiogQWR2YW5jZSBDb25maWd1cmF0aW9uIGFjY29yZGlvbjogb3BlbiBvbiBsb2FkOyBpdHMgaGVhZGVyIGZvbGRzIGl0LiAqL1xyXG4gIGFkdk9wZW4gPSB0cnVlO1xyXG5cclxuICAvLyAtLS0tIGF1ZGl0LW9ubHkgZmllbGRzIChzYXZlZCBvbiBhdWRpdGNvbmZpZykgLS0tLVxyXG4gIHBhc3NGYWlsT24gPSB0cnVlO1xyXG4gIHBhc3NUaHJlc2hvbGQgPSA3NTtcclxuICBkaXNwdXRlT24gPSB0cnVlO1xyXG4gIGRpc3B1dGVXaW5kb3cgPSA0ODtcclxuICBwcmVTdWJtaXNzaW9uQWNjZXNzT24gPSBmYWxzZTtcclxuICBwcmVTdWJtaXNzaW9uVXNlcnM6IENoaXBVc2VyW10gPSBbXTtcclxuICBlZGl0U3VibWl0dGVkT24gPSBmYWxzZTtcclxuICBlZGl0VXNlcnM6IENoaXBVc2VyW10gPSBbXTtcclxuXHJcbiAgcGFzc0xhYmVsID0gJ1Bhc3MnO1xyXG4gIGZhaWxMYWJlbCA9ICdGYWlsJztcclxuXHJcbiAgLyoqIENsaWVudCB1c2VycyBvZmZlcmVkIGJ5IHRoZSBjaGlwIHBpY2tlcnMuICovXHJcbiAgdXNlcnM6IENoaXBVc2VyW10gPSBbXTtcclxuICBkcmFmdHM6IFJlY29yZDxDaGlwTGlzdCwgc3RyaW5nPiA9IHsgb3duZXJzOiAnJywgYXBwcm92ZXJzOiAnJywgbm90aWZ5VXNlcnM6ICcnLCByZWN1cnJpbmdVc2VyczogJycsIGRhaWx5VXNlcnM6ICcnLCBwcmVTdWJtaXNzaW9uVXNlcnM6ICcnLCBlZGl0VXNlcnM6ICcnIH07XHJcbiAgLyoqIFdoaWNoIGNoaXAgYm94IGlzIHNob3dpbmcgc3VnZ2VzdGlvbnMsIGFuZCB3aGljaCBkcm9wZG93biBpcyBvcGVuLiAqL1xyXG4gIG9wZW5DaGlwczogQ2hpcExpc3QgfCBudWxsID0gbnVsbDtcclxuICBvcGVuU2VsZWN0OiBTZWxlY3RLZXkgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIFN0b3JlcyAvIHVzZXJzIGFscmVhZHkgYXNzaWduZWQgdG8gdGhlIGNoZWNrbGlzdC4gQXVkaXRzIGdldCB0aGVtIGZyb20gYSBzY2hlZHVsZVxyXG4gICAqICAoTWFuYWdlIOKAuiBTY2hlZHVsZSBJbmZvKSwgc28gdGhpcyBwYWdlIG9ubHkgcmVhZHMgdGhlIGNvdW50LiAqL1xyXG4gIGFzc2lnbmVkQ291bnQgPSAwO1xyXG4gIC8qKiBQdWJsaXNoIHdpdGggbm90aGluZyBhc3NpZ25lZCBzYXZlcyBmaXJzdCwgdGhlbiBvcGVucyBDcmVhdGUgc2NoZWR1bGUgZm9yIHRoaXMgYXVkaXQuICovXHJcbiAgcHJpdmF0ZSBzY2hlZHVsZUFmdGVyU2F2ZSA9IGZhbHNlO1xyXG4gIC8qKiBQdWJsaXNoIHN0YXRlIGJlZm9yZSB0aGUgY3VycmVudCBzYXZlLCBzbyB0aGUgdG9hc3QgY2FuIHNheSBcInB1Ymxpc2hlZFwiIHZzIFwic2F2ZWQgYW5kIHB1Ymxpc2hlZFwiLiAqL1xyXG4gIHByaXZhdGUgd2FzUHVibGlzaGVkID0gZmFsc2U7XHJcblxyXG4gIHJlYWRvbmx5IHRocmVzaG9sZE9wdHM6IFNlbGVjdE9wdGlvbltdID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXS5tYXAobiA9PiAoeyB2YWx1ZTogbiwgbGFiZWw6IFN0cmluZyhuKSB9KSk7XHJcbiAgcmVhZG9ubHkgcmVkb0RheU9wdHM6IFNlbGVjdE9wdGlvbltdID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDEwLCAxNCwgMjEsIDMwXS5tYXAobiA9PiAoeyB2YWx1ZTogbiwgbGFiZWw6IFN0cmluZyhuKSB9KSk7XHJcbiAgcmVhZG9ubHkgcmVzcERlbGF5T3B0czogU2VsZWN0T3B0aW9uW10gPSBbMCwgMiwgNiwgMTIsIDI0LCA0OF0ubWFwKG4gPT4gKHsgdmFsdWU6IG4sIGxhYmVsOiBuID09PSAwID8gJ0ltbWVkaWF0ZWx5JyA6IG4gKyAnIGhvdXJzJyB9KSk7XHJcbiAgcmVhZG9ubHkgZGlzcFdpbmRvd09wdHM6IFNlbGVjdE9wdGlvbltdID0gWzYsIDEyLCAyNCwgNDgsIDcyLCAxNjhdLm1hcChuID0+ICh7IHZhbHVlOiBuLCBsYWJlbDogbiA9PT0gMTY4ID8gJzcgZGF5cycgOiBuICsgJyBob3VycycgfSkpO1xyXG4gIHJlYWRvbmx5IHJlZG9FeHRlbnNpb25PcHRzOiBTZWxlY3RPcHRpb25bXSA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3XS5tYXAobiA9PiAoeyB2YWx1ZTogbiwgbGFiZWw6IFN0cmluZyhuKSB9KSk7XHJcblxyXG4gIC8qKiBTdGFydHMgdHJ1ZSBzbyB0aGUgc2V0dGluZ3Mgc2hpbW1lciBpbnN0ZWFkIG9mIHNob3dpbmcgZGVmYXVsdHMgdGhhdCB0aGVuIGp1bXAuICovXHJcbiAgbG9hZGluZyA9IHRydWU7XHJcbiAgc2F2aW5nID0gZmFsc2U7XHJcbiAgbG9hZEVycm9yID0gJyc7XHJcbiAgLyoqIC9hdWRpdC9jb25maWcvZ2V0IGZhaWxlZDogc2F2aW5nIG5vdyB3b3VsZCBvdmVyd3JpdGUgdGhlIHN0b3JlZCBwYXNzIG1hcmsgLyBhY2Nlc3Mgc2V0dGluZ3Mgd2l0aCBkZWZhdWx0cy4gKi9cclxuICBhdWRpdFNldHRpbmdzTG9hZEZhaWxlZCA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGNsaWVudElkID0gJyc7XHJcbiAgLyoqIFRoZSBnZXRDb25maWdEZXRhaWxzIHBheWxvYWQsIHNlbnQgYmFjayB3aG9sZSBvbiBzYXZlIChhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIGRvZXMpLiAqL1xyXG4gIHByaXZhdGUgY29uZmlnRGF0YTogYW55ID0gbnVsbDtcclxuICAvKiogUHVibGlzaCAvIFNhdmUgbmVlZCB0aGUgQ2hlY2tsaXN0IGVkaXQgcGVybWlzc2lvbiAodGhlIHNhdmUgQVBJcyBjaGVjayBpdCB0b28pLiAqL1xyXG4gIGFjY2VzczogQXVkaXRBY2Nlc3MgPSB7IGNhbkFkZDogZmFsc2UsIGNhbkVkaXQ6IGZhbHNlIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0cmF4U2VydmljZTogVHJheFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgYXVkaXRBY2Nlc3ModGhpcy5ncykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShhY2Nlc3MgPT4ge1xyXG4gICAgICB0aGlzLmFjY2VzcyA9IGFjY2VzcztcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMub25PdXRzaWRlLCB0cnVlKTtcclxuICAgIHRoaXMuY2hlY2tsaXN0SWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdjaGVja2xpc3RJZCcpIHx8ICcnO1xyXG4gICAgdGhpcy5mcm9tU2NoZWR1bGUgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdmcm9tJykgPT09ICdzY2hlZHVsZSc7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWRhdGE/LmNsaWVudCB8fCBkYXRhLmNsaWVudCA9PT0gdGhpcy5jbGllbnRJZCkgeyByZXR1cm47IH1cclxuICAgICAgdGhpcy5jbGllbnRJZCA9IGRhdGEuY2xpZW50O1xyXG4gICAgICB0aGlzLmxvYWQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW5lZCBmcm9tIFNjaGVkdWxlIEluZm8gKD9mcm9tPXNjaGVkdWxlKTogQmFjayByZXR1cm5zIHRvIHRoYXQgdGFiLCBlbHNlIHRvIEF1ZGl0IEluZm8gKFFBIDYgT2N0KS4gKi9cclxuICBmcm9tU2NoZWR1bGUgPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGJhY2tMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZnJvbVNjaGVkdWxlID8gJ0JhY2sgdG8gU2NoZWR1bGUnIDogJ0JhY2sgdG8gTWFuYWdlJztcclxuICB9XHJcblxyXG4gIGJhY2soZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvdHJheC9hdWRpdC12Mi9tYW5hZ2UnXSwgdGhpcy5mcm9tU2NoZWR1bGUgPyB7IHF1ZXJ5UGFyYW1zOiB7IHRhYjogJ3NjaGVkdWxlJyB9IH0gOiB7fSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMub25PdXRzaWRlLCB0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVzY2FwZSBjbG9zZXMgdGhlIG9wZW4gZHJvcGRvd24gLyBzdWdnZXN0aW9uIGxpc3QgLyBidWxrIHVwbG9hZCBwb3B1cC4gKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXHJcbiAgb25Fc2NhcGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhaWx5QnVsa09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMub3BlblNlbGVjdCA9IG51bGw7XHJcbiAgICB0aGlzLm9wZW5DaGlwcyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHByZXNzIG9yIGZvY3VzIG91dHNpZGUgdGhlIG9wZW4gZHJvcGRvd24gLyBzdWdnZXN0aW9uIGxpc3QgY2xvc2VzIGl0LiBMaXN0ZW5lZCB0byBpbiB0aGVcclxuICAgKiBjYXB0dXJlIHBoYXNlLCBzbyBubyBlbGVtZW50IHRoYXQgc3RvcHMgY2xpY2sgcHJvcGFnYXRpb24gY2FuIGtlZXAgaXQgb3Blbi5cclxuICAgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IG9uT3V0c2lkZSA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcclxuICAgIGlmICghdGhpcy5vcGVuU2VsZWN0ICYmICF0aGlzLm9wZW5DaGlwcykgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAgICBjb25zdCBpbnNpZGUgPSB0YXJnZXQgJiYgdHlwZW9mIHRhcmdldC5jbG9zZXN0ID09PSAnZnVuY3Rpb24nICYmIHRhcmdldC5jbG9zZXN0KCcuY2Ytc2VsZWN0LmlzLW9wZW4sIC5jZi1jaGlwYm94LmlzLW9wZW4nKTtcclxuICAgIGlmIChpbnNpZGUpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLm9wZW5TZWxlY3QgPSBudWxsO1xyXG4gICAgdGhpcy5vcGVuQ2hpcHMgPSBudWxsO1xyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfTtcclxuXHJcbiAgLy8gLS0tLSBsb2FkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2hlY2tsaXN0SWQpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubG9hZEVycm9yID0gJ05vIGF1ZGl0IHNlbGVjdGVkLiBPcGVuIENvbmZpZ3VyZSBmcm9tIHRoZSBNYW5hZ2UgcGFnZS4nO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5sb2FkRXJyb3IgPSAnJztcclxuICAgIHRoaXMuYXVkaXRTZXR0aW5nc0xvYWRGYWlsZWQgPSBmYWxzZTtcclxuICAgIC8vIEEgZmFpbGVkIGNhbGwgcmVzb2x2ZXMgdG8geyBmYWlsZWQ6IGVycm9yIH0gc28gZWFjaCBwYXJ0IGNhbiBzYXkgd2hhdCB3ZW50IHdyb25nLlxyXG4gICAgY29uc3Qgc2FmZSA9IChvOiBhbnkpID0+IG8ucGlwZShjYXRjaEVycm9yKChlOiBhbnkpID0+IG9mKHsgZmFpbGVkOiBlIH0pKSk7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIGRldGFpbHM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdEdldENvbmZpZyh7IGNoZWNrTGlzdElkOiB0aGlzLmNoZWNrbGlzdElkLCBjbGllbnRJZDogdGhpcy5jbGllbnRJZCB9KSksXHJcbiAgICAgIGF1ZGl0OiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRDb25maWdHZXQoeyBjbGllbnRJZDogdGhpcy5jbGllbnRJZCwgY2hlY2tsaXN0SWQ6IHRoaXMuY2hlY2tsaXN0SWQgfSkpLFxyXG4gICAgICB1c2Vyczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmdldENsaWVudFVzZXIodGhpcy5jbGllbnRJZCkpLFxyXG4gICAgICBsYWJlbHM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdFNldHRpbmdzR2V0KHRoaXMuY2xpZW50SWQpKVxyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoeyBkZXRhaWxzLCBhdWRpdCwgdXNlcnMsIGxhYmVscyB9OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgY2xpZW50VXNlcnM6IGFueVtdID0gdXNlcnM/LmNvZGUgPT09IDIwMCA/IHVzZXJzLmRhdGEgfHwgW10gOiBbXTtcclxuICAgICAgLy8gVGhlIGNsaWVudCdzIHN1cGVyYWRtaW46IHRoZSBkZWZhdWx0IGFwcHJvdmVyIGZvciBUYW5nbyB1c2VycyBhbmQgcm9sZSAndXNlcicgKHYxIENvbmZpZ3VyZSkuXHJcbiAgICAgIGNvbnN0IHN1cGVyQWRtaW4gPSBjbGllbnRVc2Vycy5maW5kKCh1OiBhbnkpID0+IHU/LnJvbGUgPT09ICdzdXBlcmFkbWluJyAmJiB1Py5lbWFpbCk7XHJcbiAgICAgIHRoaXMuc3VwZXJBZG1pbiA9IHN1cGVyQWRtaW4gPyB0aGlzLmNoaXAoc3VwZXJBZG1pbi51c2VyTmFtZSwgc3VwZXJBZG1pbi5lbWFpbCkgOiBudWxsO1xyXG4gICAgICB0aGlzLnVzZXJzID0gY2xpZW50VXNlcnNcclxuICAgICAgICAubWFwKCh1OiBhbnkpID0+IHRoaXMuY2hpcCh1LnVzZXJOYW1lLCB1LmVtYWlsKSlcclxuICAgICAgICAuZmlsdGVyKCh1OiBDaGlwVXNlcikgPT4gdS5lKTtcclxuICAgICAgdGhpcy5wYXNzTGFiZWwgPSBsYWJlbHM/LmRhdGE/LnBhc3NMYWJlbCB8fCAnUGFzcyc7XHJcbiAgICAgIHRoaXMuZmFpbExhYmVsID0gbGFiZWxzPy5kYXRhPy5mYWlsTGFiZWwgfHwgJ0ZhaWwnO1xyXG5cclxuICAgICAgY29uc3QgZCA9IGRldGFpbHM/LmNvZGUgPT09IDIwMCA/IGRldGFpbHMuZGF0YT8uY2hlY2tMaXN0RGV0YWlscyA6IG51bGw7XHJcbiAgICAgIGlmICghZCkge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIC8vIFRoZSBBUEkgYW5zd2VycyAyMDQgKG5vIGJvZHkpIHdoZW4gdGhlIGF1ZGl0IGRvZXMgbm90IGV4aXN0IG9yIGJlbG9uZ3MgdG8gYW5vdGhlciBjbGllbnQuXHJcbiAgICAgICAgdGhpcy5sb2FkRXJyb3IgPSBkZXRhaWxzPy5mYWlsZWRcclxuICAgICAgICAgID8gdGhpcy5hcGlFcnJvcihkZXRhaWxzLmZhaWxlZCwgJ0NvdWxkIG5vdCBsb2FkIHRoaXMgYXVkaXQuIFJlbG9hZCB0aGUgcGFnZSB0byB0cnkgYWdhaW4uJywgZmFsc2UpXHJcbiAgICAgICAgICA6ICdUaGlzIGF1ZGl0IHdhcyBub3QgZm91bmQuIEl0IG1heSBoYXZlIGJlZW4gZGVsZXRlZC4gT3BlbiBDb25maWd1cmUgYWdhaW4gZnJvbSB0aGUgTWFuYWdlIHBhZ2UuJztcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jb25maWdEYXRhID0gZGV0YWlscy5kYXRhO1xyXG4gICAgICB0aGlzLmFwcGx5Q2hlY2tsaXN0KGQpO1xyXG4gICAgICB0aGlzLmFwcGx5QXNzaWdubWVudChkKTtcclxuICAgICAgdGhpcy5hdWRpdFNldHRpbmdzTG9hZEZhaWxlZCA9IGF1ZGl0Py5jb2RlICE9PSAyMDA7XHJcbiAgICAgIHRoaXMuYXBwbHlBdWRpdCh0aGlzLmF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkID8gbnVsbCA6IGF1ZGl0LmRhdGE/LmNvbmZpZyk7XHJcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5hdWRpdFNldHRpbmdzTG9hZEZhaWxlZCkge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQ291bGQgbm90IGxvYWQgdGhlIHNjb3JpbmcsIGRpc3B1dGUgYW5kIGFjY2VzcyBzZXR0aW5ncyBvZiB0aGlzIGF1ZGl0LiBSZWxvYWQgdGhlIHBhZ2UgYmVmb3JlIHNhdmluZywgc28gdGhleSBhcmUgbm90IHJlc2V0LicpO1xyXG4gICAgICB9IGVsc2UgaWYgKHVzZXJzPy5mYWlsZWQpIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFdhcm5pbmdUb2FzdCgnQ291bGQgbm90IGxvYWQgdGhlIHVzZXJzIG9mIHRoaXMgY2xpZW50LCBzbyB0aGUgdXNlciBwaWNrZXJzIGhhdmUgbm8gc3VnZ2VzdGlvbnMuIFlvdSBjYW4gc3RpbGwgYWRkIGEgdXNlciBieSB0eXBpbmcgdGhlaXIgZnVsbCBlbWFpbC4nKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIGdldENvbmZpZ0RldGFpbHMgbGlzdHMgdGhlIGFzc2lnbm1lbnQgYXMgeyBpZCwgdHlwZSB9IHBhaXJzIChzdG9yZXMgLyBjbHVzdGVycyBvciB1c2VycyAvIHRlYW1zKS4gKi9cclxuICBwcml2YXRlIGFwcGx5QXNzaWdubWVudChkOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvdW50ID0gKGxpc3Q6IGFueSkgPT4gKEFycmF5LmlzQXJyYXkobGlzdCkgPyBsaXN0Lmxlbmd0aCA6IDApO1xyXG4gICAgdGhpcy5hc3NpZ25lZENvdW50ID0gY291bnQoZC5zaW5nbGVBc3NpZ24pICsgY291bnQoZC5ncm91cEFzc2lnbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5Q2hlY2tsaXN0KGQ6IGFueSk6IHZvaWQge1xyXG4gICAgLy8gTmV2ZXIgY29uZmlndXJlZCB5ZXQ6IG5vIHNjaGVkdWxlIHdpbmRvdyBoYXMgYmVlbiBzYXZlZCAoY2hlY2tlZCBiZWZvcmUgdGhlIGRlZmF1bHRzIGJlbG93IGZpbGwgaXQpLlxyXG4gICAgY29uc3QgZmlyc3RDb25maWd1cmUgPSAhZC5zY2hlZHVsZVN0YXJ0VGltZTtcclxuICAgIC8vIEEgbmV3IGF1ZGl0IGhhcyBubyBzY2hlZHVsZSB3aW5kb3csIGFuZCBjaGVja2xpc3RDb25maWd1cmV2MSBjYW5ub3Qgc3RvcmUgYW4gZW1wdHkgb25lO1xyXG4gICAgLy8gc2FtZSBkZWZhdWx0cyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIGFwcGxpZXMgb24gbG9hZC5cclxuICAgIGlmICghZC5zY2hlZHVsZVN0YXJ0VGltZSkgeyBkLnNjaGVkdWxlU3RhcnRUaW1lID0gJzEwOjAwIEFNJzsgfVxyXG4gICAgaWYgKCFkLnNjaGVkdWxlRW5kVGltZSkgeyBkLnNjaGVkdWxlRW5kVGltZSA9ICcxMDowMCBQTSc7IH1cclxuICAgIHRoaXMuYXVkaXROYW1lID0gZC5jaGVja0xpc3ROYW1lIHx8ICfigJQnO1xyXG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGQuY2hlY2tMaXN0RGVzY3JpcHRpb24gfHwgJyc7XHJcbiAgICB0aGlzLnB1Ymxpc2hlZCA9ICEhZC5wdWJsaXNoO1xyXG4gICAgdGhpcy5zY2hlZHVsZSA9IGQuc2NoZWR1bGVSZXBlYXRlZFR5cGUgfHwgZC5zY2hlZHVsZSA/IHRoaXMudGl0bGVDYXNlKGQuc2NoZWR1bGVSZXBlYXRlZFR5cGUgfHwgZC5zY2hlZHVsZSkgOiAn4oCUJztcclxuICAgIHRoaXMuc2NoZWR1bGVXaW5kb3cgPSBkLnNjaGVkdWxlU3RhcnRUaW1lICYmIGQuc2NoZWR1bGVFbmRUaW1lID8gZC5zY2hlZHVsZVN0YXJ0VGltZSArICcgdG8gJyArIGQuc2NoZWR1bGVFbmRUaW1lIDogJ+KAlCc7XHJcbiAgICB0aGlzLnNlY3Rpb25zID0gKGQuc2VjdGlvbnMgfHwgW10pLm1hcCgoc2VjOiBhbnksIGk6IG51bWJlcikgPT4gKHtcclxuICAgICAgbGFiZWw6IHNlYy5uYW1lIHx8ICdTZWN0aW9uICcgKyAoaSArIDEpLFxyXG4gICAgICBpdGVtczogKHNlYy5xdWVzdGlvbnMgfHwgW10pLm1hcCgocTogYW55KSA9PiBxPy5xbmFtZSB8fCBTdHJpbmcocSkpLFxyXG4gICAgICBvcGVuOiBpID09PSAwXHJcbiAgICB9KSk7XHJcblxyXG4gICAgdGhpcy5vd25lcnMgPSB0aGlzLmNoaXBzKGQub3duZXIpO1xyXG4gICAgLy8gTm8gb3duZXIgeWV0IChhdWRpdHMgY3JlYXRlZCBiZWZvcmUgdGhlIGNyZWF0b3Igd2FzIHN0b3JlZCBhcyBvbmUpOiB0aGUgbG9nZ2VkLWluIHVzZXIsIHNhdmVkIHdpdGggdGhlIHBhZ2UuXHJcbiAgICBpZiAoIXRoaXMub3duZXJzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBtZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICd7fScpO1xyXG4gICAgICBpZiAobWU/LmVtYWlsKSB7IHRoaXMub3duZXJzID0gW3RoaXMuY2hpcChtZS51c2VyTmFtZSwgbWUuZW1haWwpXTsgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5hcHByb3ZlcnMgPSB0aGlzLmNoaXBzKGQuYXBwcm92ZXIpO1xyXG4gICAgLy8gdjEgQ29uZmlndXJlIGRlZmF1bHQgYXBwcm92ZXIsIG9uIHRoZSBmaXJzdCBDb25maWd1cmUgb25seSAobGF0ZXIgYW4gZW1wdHkgbGlzdCBtZWFucyBBcHByb3ZlciB3YXMgdHVybmVkXHJcbiAgICAvLyBvZmYgb24gcHVycG9zZSk6IFRhbmdvIHVzZXJzIGFuZCBjbGllbnQgdXNlcnMgd2l0aCByb2xlICd1c2VyJyBnZXQgdGhlIGNsaWVudCdzIHN1cGVyYWRtaW4sIG90aGVycyB0aGVtc2VsdmVzLlxyXG4gICAgaWYgKGZpcnN0Q29uZmlndXJlICYmICF0aGlzLmFwcHJvdmVycy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgbWUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyLWluZm8nKSB8fCAne30nKTtcclxuICAgICAgY29uc3QgdG9TdXBlckFkbWluID0gbWU/LnVzZXJUeXBlID09PSAndGFuZ28nIHx8IChtZT8udXNlclR5cGUgPT09ICdjbGllbnQnICYmIG1lPy5yb2xlID09PSAndXNlcicpO1xyXG4gICAgICBjb25zdCBmYWxsYmFjayA9IHRvU3VwZXJBZG1pbiA/IHRoaXMuc3VwZXJBZG1pbiA6IChtZT8uZW1haWwgPyB0aGlzLmNoaXAobWUudXNlck5hbWUsIG1lLmVtYWlsKSA6IG51bGwpO1xyXG4gICAgICBpZiAoZmFsbGJhY2spIHsgdGhpcy5hcHByb3ZlcnMgPSBbZmFsbGJhY2tdOyB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcHJvdmVyT24gPSB0aGlzLmFwcHJvdmVycy5sZW5ndGggPiAwO1xyXG4gICAgLy8gU3RvcmVkIGFzIG1pbnV0ZXMgKG51bWJlcnMpOyBrZWVwIHRoZSBrbm93biBpbnRlcnZhbHMsIHVuaXF1ZSwgYXQgbW9zdCB0aHJlZS5cclxuICAgIGNvbnN0IHN0b3JlZDogbnVtYmVyW10gPSAoQXJyYXkuaXNBcnJheShkLnJlbWFpbmRlcikgPyBkLnJlbWFpbmRlciA6IFtdKS5tYXAoKG06IGFueSkgPT4gTnVtYmVyKG0pKTtcclxuICAgIHRoaXMucmVtaW5kZXJzID0gc3RvcmVkLmZpbHRlcigobSwgaSkgPT4gUkVNSU5ERVJfTUlOVVRFUy5pbmNsdWRlcyhtKSAmJiBzdG9yZWQuaW5kZXhPZihtKSA9PT0gaSkuc2xpY2UoMCwgTUFYX1JFTUlOREVSUyk7XHJcbiAgICB0aGlzLnJlbWluZGVyT24gPSB0aGlzLnJlbWluZGVycy5sZW5ndGggPiAwO1xyXG4gICAgdGhpcy5yZWZyZXNoUmVtaW5kZXJPcHRzKCk7XHJcblxyXG4gICAgY29uc3QgbmYgPSBkLm5vdGlmeUZsYWdzIHx8IHt9O1xyXG4gICAgY29uc3QgbmZUeXBlczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KG5mLm5vdGlmeVR5cGUpID8gbmYubm90aWZ5VHlwZSA6IFtdO1xyXG4gICAgdGhpcy5ub3RpZnlGbGFnc09uID0gbmZUeXBlcy5sZW5ndGggPiAwO1xyXG4gICAgdGhpcy5ub3RpZnlTZW5kQXBwcm92ZXIgPSBuZlR5cGVzLmluY2x1ZGVzKCdhcHByb3ZlcicpIHx8ICF0aGlzLm5vdGlmeUZsYWdzT247XHJcbiAgICB0aGlzLm5vdGlmeVNlbmRDdXN0b20gPSBuZlR5cGVzLmluY2x1ZGVzKCdjdXN0b20nKTtcclxuICAgIHRoaXMubm90aWZ5VXNlcnMgPSB0aGlzLmNoaXBzKG5mLnVzZXJzKTtcclxuXHJcbiAgICBjb25zdCByZiA9IGQucmVjdXJyaW5nRmxhZyB8fCB7fTtcclxuICAgIGNvbnN0IHJmVHlwZXM6IHN0cmluZ1tdID0gQXJyYXkuaXNBcnJheShyZi5ub3RpZnlUeXBlKSA/IHJmLm5vdGlmeVR5cGUgOiBbXTtcclxuICAgIHRoaXMucmVjdXJyaW5nRmxhZ3NPbiA9IHJmVHlwZXMubGVuZ3RoID4gMDtcclxuICAgIHRoaXMucmVjdXJyaW5nU2VuZEFwcHJvdmVyID0gcmZUeXBlcy5pbmNsdWRlcygnYXBwcm92ZXInKSB8fCAhdGhpcy5yZWN1cnJpbmdGbGFnc09uO1xyXG4gICAgdGhpcy5yZWN1cnJpbmdTZW5kQ3VzdG9tID0gcmZUeXBlcy5pbmNsdWRlcygnY3VzdG9tJyk7XHJcbiAgICB0aGlzLnJlY3VycmluZ1NhbWVBc05vdGlmeSA9IHJmVHlwZXMuaW5jbHVkZXMoJ3NhbWVBc05vdGlmeScpO1xyXG4gICAgdGhpcy5yZWN1cnJpbmdVc2VycyA9IHRoaXMuY2hpcHMocmYudXNlcnMpO1xyXG4gICAgdGhpcy5yZWN1cnJpbmdUaHJlc2hvbGQgPSBOdW1iZXIocmYudGhyZXNob2xkKSB8fCAzO1xyXG5cclxuICAgIGNvbnN0IGFlID0gZC5hdXRvRW1haWwgfHwge307XHJcbiAgICBjb25zdCBhZVR5cGVzOiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkoYWUudHlwZSkgPyBhZS50eXBlIDogW107XHJcbiAgICB0aGlzLmRhaWx5UmVwb3J0T24gPSBhZVR5cGVzLmxlbmd0aCA+IDA7XHJcbiAgICB0aGlzLmRhaWx5U2VuZEFwcHJvdmVyID0gYWVUeXBlcy5pbmNsdWRlcygnYXBwcm92ZXInKSB8fCAhdGhpcy5kYWlseVJlcG9ydE9uO1xyXG4gICAgdGhpcy5kYWlseVNlbmRDdXN0b20gPSBhZVR5cGVzLmluY2x1ZGVzKCdjdXN0b20nKTtcclxuICAgIHRoaXMuZGFpbHlVc2VycyA9IHRoaXMuY2hpcHMoYWUudXNlcnMpO1xyXG4gICAgdGhpcy5zaGFyZVBvc3RBcHByb3ZhbCA9ICEhZC5zaGFyZVJlcG9ydFBvc3RBcHByb3ZhbDtcclxuXHJcbiAgICB0aGlzLmV4cG9ydFN1Ym1pc3Npb25PbiA9ICEhZC5leHBvcnQ7XHJcbiAgICB0aGlzLnJlZG9WYWxpZEZvciA9IE51bWJlcihkLnJlZG9WYWxpZGl0eSkgfHwgNztcclxuICAgIHRoaXMuYXV0b0NyZWF0ZVRhc2tPbiA9ICEhZC5hdXRvQ3JlYXRlVGFzaztcclxuICAgIC8vIERlZmF1bHRzIGxpa2UgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZTsgd2l0aG91dCBhbiBhc3NpZ25lZSB0aGUgYXBwcm92YWwgcmFpc2VzIG5vIHRhc2suXHJcbiAgICB0aGlzLnRhc2tBc3NpZ25lZSA9IGQudGFza0Fzc2lnbmVlID09PSAnc3RvcmUnIHx8IGQudGFza0Fzc2lnbmVlID09PSAnc3RvcmV1c2VyJyA/ICdzdG9yZScgOiAnc3VibWl0dGVyJztcclxuICAgIHRoaXMudGFza1ZhbGlkaXR5ID0gTnVtYmVyKGQudGFza1ZhbGlkaXR5KSB8fCAxMDtcclxuICAgIHRoaXMuc2hvd1Jlc3BvbnNlSW5BcHAgPSBkLnNob3dBcHByb3ZlZFJlc3BvbnNlICE9PSBmYWxzZTtcclxuICAgIHRoaXMucmVzcG9uc2VWaXNpYmlsaXR5ID0gZC5yZXNwb25zZVZpc2liaWxpdHkgPT09ICdwcmVBcHByb3ZhbCcgPyAncHJlJyA6ICdwb3N0JztcclxuICAgIHRoaXMucmVzcERlbGF5ID0gZC5yZXNwb25zZVZpc2liaWxpdHlIb3VycyA/PyAyO1xyXG4gICAgdGhpcy5yZXF1aXJlUGhvdG8gPSAhIWQudXNlclZlcmlmaWNhdGlvbj8ucmVxdWlyZVBob3RvQ2FwdHVyZTtcclxuICAgIHRoaXMucmVxdWlyZUFja25vd2xlZGdtZW50ID0gISFkLnVzZXJWZXJpZmljYXRpb24/LnJlcXVpcmVVc2VyQWNrbm93bGVkZ21lbnQ7XHJcbiAgICB0aGlzLnJlZG9FeHRlbnNpb24gPSBOdW1iZXIoZC5yZWRvRXh0ZW5zaW9uKSB8fCAxO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUF1ZGl0KGNmZzogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCBzID0gY2ZnPy5zZXR0aW5ncyB8fCB7fTtcclxuICAgIHRoaXMucGFzc1RocmVzaG9sZCA9IE51bWJlcihjZmc/LnBhc3NNYXJrKSB8fCA3NTtcclxuICAgIHRoaXMucGFzc0ZhaWxPbiA9IHMucGFzc0ZhaWxPbiAhPT0gZmFsc2U7XHJcbiAgICB0aGlzLmRpc3B1dGVPbiA9IHMuZGlzcHV0ZU9uICE9PSBmYWxzZTtcclxuICAgIHRoaXMuZGlzcHV0ZVdpbmRvdyA9IE51bWJlcihzLmRpc3B1dGVXaW5kb3cpIHx8IDQ4O1xyXG4gICAgdGhpcy5wcmVTdWJtaXNzaW9uQWNjZXNzT24gPSAhIXMucHJlU3VibWlzc2lvbkFjY2Vzc09uO1xyXG4gICAgdGhpcy5wcmVTdWJtaXNzaW9uVXNlcnMgPSB0aGlzLmNoaXBzKHMucHJlU3VibWlzc2lvblVzZXJzKTtcclxuICAgIHRoaXMuZWRpdFN1Ym1pdHRlZE9uID0gISFzLmVkaXRTdWJtaXR0ZWRPbjtcclxuICAgIHRoaXMuZWRpdFVzZXJzID0gdGhpcy5jaGlwcyhzLmVkaXRVc2Vycyk7XHJcbiAgfVxyXG5cclxuICAvKiogQWNjZXB0cyBib3RoIHRoZSBjaGVja2xpc3Qgc2hhcGUgeyBuYW1lLCB2YWx1ZSB9IGFuZCB0aGUgYXVkaXQgc2hhcGUgeyBuLCBlIH0uICovXHJcbiAgcHJpdmF0ZSBjaGlwcyhsaXN0OiBhbnkpOiBDaGlwVXNlcltdIHtcclxuICAgIHJldHVybiAoQXJyYXkuaXNBcnJheShsaXN0KSA/IGxpc3QgOiBbXSlcclxuICAgICAgLm1hcCgodTogYW55KSA9PiB0aGlzLmNoaXAodT8ubmFtZSA/PyB1Py5uLCB1Py52YWx1ZSA/PyB1Py5lID8/IHU/LmVtYWlsKSlcclxuICAgICAgLmZpbHRlcigodTogQ2hpcFVzZXIpID0+IHUuZSB8fCB1Lm4pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGlwKG5hbWU6IHN0cmluZywgZW1haWw6IHN0cmluZyk6IENoaXBVc2VyIHtcclxuICAgIGNvbnN0IG4gPSBTdHJpbmcobmFtZSB8fCBlbWFpbCB8fCAnJykudHJpbSgpO1xyXG4gICAgY29uc3QgcGFydHMgPSBuLnNwbGl0KC9cXHMrLyk7XHJcbiAgICBjb25zdCBpID0gKChwYXJ0c1swXT8uWzBdIHx8ICcnKSArIChwYXJ0c1sxXT8uWzBdIHx8IHBhcnRzWzBdPy5bMV0gfHwgJycpKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHsgaSwgbiwgZTogU3RyaW5nKGVtYWlsIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKSB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0aXRsZUNhc2Uodjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2ID8gdi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHYuc2xpY2UoMSkgOiB2O1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VjdGlvbihzZWN0aW9uOiBDb25maWdTZWN0aW9uKTogdm9pZCB7XHJcbiAgICBzZWN0aW9uLm9wZW4gPSAhc2VjdGlvbi5vcGVuO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSByZW1pbmRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIFR1cm5pbmcgUmVtaW5kZXIgb24gc3RhcnRzIHdpdGggb25lIDMwLW1pbnV0ZSByZW1pbmRlciwgYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBkb2VzLiAqL1xyXG4gIHRvZ2dsZVJlbWluZGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZW1pbmRlck9uID0gIXRoaXMucmVtaW5kZXJPbjtcclxuICAgIGlmICh0aGlzLnJlbWluZGVyT24gJiYgIXRoaXMucmVtaW5kZXJzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLnJlbWluZGVycyA9IFtSRU1JTkRFUl9NSU5VVEVTWzBdXTtcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaFJlbWluZGVyT3B0cygpO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVtaW5kZXIoaW5kZXg6IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgbWludXRlcyA9IE51bWJlcih2YWx1ZSk7XHJcbiAgICBpZiAoIVJFTUlOREVSX01JTlVURVMuaW5jbHVkZXMobWludXRlcykpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnJlbWluZGVycyA9IHRoaXMucmVtaW5kZXJzLm1hcCgobSwgaSkgPT4gKGkgPT09IGluZGV4ID8gbWludXRlcyA6IG0pKTtcclxuICAgIHRoaXMucmVmcmVzaFJlbWluZGVyT3B0cygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFkZHMgdGhlIGZpcnN0IGludGVydmFsIG5vdCB1c2VkIHlldC4gKi9cclxuICBhZGRSZW1pbmRlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5leHQgPSBSRU1JTkRFUl9NSU5VVEVTLmZpbmQobSA9PiAhdGhpcy5yZW1pbmRlcnMuaW5jbHVkZXMobSkpO1xyXG4gICAgaWYgKG5leHQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnJlbWluZGVycy5sZW5ndGggPj0gTUFYX1JFTUlOREVSUykgeyByZXR1cm47IH1cclxuICAgIHRoaXMucmVtaW5kZXJzID0gWy4uLnRoaXMucmVtaW5kZXJzLCBuZXh0XTtcclxuICAgIHRoaXMucmVmcmVzaFJlbWluZGVyT3B0cygpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUmVtaW5kZXIoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucmVtaW5kZXJzLmxlbmd0aCA8PSAxKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5yZW1pbmRlcnMgPSB0aGlzLnJlbWluZGVycy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICAgIHRoaXMucmVmcmVzaFJlbWluZGVyT3B0cygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFwiMzAsIDQ1IGFuZCA2MCBtaW5zXCIgZm9yIHRoZSBzdW1tYXJ5IGxpbmUuICovXHJcbiAgZ2V0IHJlbWluZGVyU3VtbWFyeSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbGlzdCA9IFsuLi50aGlzLnJlbWluZGVyc10uc29ydCgoYSwgYikgPT4gYSAtIGIpLm1hcChTdHJpbmcpO1xyXG4gICAgcmV0dXJuIGxpc3QubGVuZ3RoID4gMSA/IGxpc3Quc2xpY2UoMCwgLTEpLmpvaW4oJywgJykgKyAnIGFuZCAnICsgbGlzdFtsaXN0Lmxlbmd0aCAtIDFdIDogKGxpc3RbMF0gfHwgJycpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEVhY2ggcm93IG9mZmVycyBpdHMgb3duIHZhbHVlIHBsdXMgZXZlcnkgaW50ZXJ2YWwgbm8gb3RoZXIgcm93IHVzZXMgKHJlYnVpbHQgb25seSBvbiBjaGFuZ2UpLiAqL1xyXG4gIHByaXZhdGUgcmVmcmVzaFJlbWluZGVyT3B0cygpOiB2b2lkIHtcclxuICAgIHRoaXMucmVtaW5kZXJPcHRzID0gdGhpcy5yZW1pbmRlcnMubWFwKChvd24sIGluZGV4KSA9PiBSRU1JTkRFUl9NSU5VVEVTXHJcbiAgICAgIC5maWx0ZXIobSA9PiBtID09PSBvd24gfHwgIXRoaXMucmVtaW5kZXJzLnNvbWUoKG90aGVyLCBpKSA9PiBpICE9PSBpbmRleCAmJiBvdGhlciA9PT0gbSkpXHJcbiAgICAgIC5tYXAobSA9PiAoeyB2YWx1ZTogbSwgbGFiZWw6IG0gKyAnIG1pbnMnIH0pKSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIGFwcHJvdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogQXBwcm92ZXIgaXMgb24gYW5kIGhhcyBhdCBsZWFzdCBvbmUgdXNlcjogdGhlIG9ubHkgc3RhdGUgaW4gd2hpY2ggYW55dGhpbmcgY2FuIGdvIFwidG8gdGhlIGFwcHJvdmVyXCIuICovXHJcbiAgZ2V0IGhhc0FwcHJvdmVycygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFwcHJvdmVyT24gJiYgdGhpcy5hcHByb3ZlcnMubGVuZ3RoID4gMDtcclxuICB9XHJcblxyXG4gIC8qKiBXaHkgXCJhcHByb3ZlclwiIGNhbm5vdCBiZSB1c2VkIHJpZ2h0IG5vdyAoJycgd2hlbiBpdCBjYW4pLiAqL1xyXG4gIHByaXZhdGUgZ2V0IGFwcHJvdmVyTWlzc2luZ1RleHQoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5hcHByb3Zlck9uKSB7IHJldHVybiAnQXBwcm92ZXIgaXMgdHVybmVkIG9mZi4gVHVybiBvbiBBcHByb3ZlciBhbmQgYWRkIGF0IGxlYXN0IG9uZSBhcHByb3ZlciBmaXJzdC4nOyB9XHJcbiAgICBpZiAoIXRoaXMuYXBwcm92ZXJzLmxlbmd0aCkgeyByZXR1cm4gJ05vIGFwcHJvdmVyIGhhcyBiZWVuIGFkZGVkIHlldC4gQWRkIGF0IGxlYXN0IG9uZSBhcHByb3ZlciB1bmRlciBBcHByb3ZlciBmaXJzdC4nOyB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICAvKiogU2hvd24gdW5kZXIgdGhlIGFwcHJvdmVyIHBpY2tlciB3aGlsZSBpdCBpcyBvbiBidXQgZW1wdHkgKFNhdmUgYXMgRHJhZnQgc3RpbGwgd29ya3M7IFB1Ymxpc2ggZG9lcyBub3QpLiAqL1xyXG4gIGdldCBhcHByb3ZlckVycm9yKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHByb3Zlck9uICYmICF0aGlzLmFwcHJvdmVycy5sZW5ndGggPyAnQWRkIGF0IGxlYXN0IG9uZSBhcHByb3Zlciwgb3IgdHVybiBBcHByb3ZlciBvZmYgdG8gcHVibGlzaCB3aXRob3V0IGFwcHJvdmFsLicgOiAnJztcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgcGFydHMgb2YgdGhlIHBhZ2UgdGhhdCBzZW5kIHRvIC8gcmVseSBvbiB0aGUgYXBwcm92ZXJzIGFuZCBhcmUgc3dpdGNoZWQgb24gbm93LiAqL1xyXG4gIHByaXZhdGUgZ2V0IGFwcHJvdmVyRGVwZW5kZW50cygpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBsaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMubm90aWZ5RmxhZ3NPbiAmJiB0aGlzLm5vdGlmeVNlbmRBcHByb3ZlcikgeyBsaXN0LnB1c2goJ05vdGlmeSBGbGFncycpOyB9XHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdGbGFnc09uICYmIHRoaXMucmVjdXJyaW5nU2VuZEFwcHJvdmVyKSB7IGxpc3QucHVzaCgnTm90aWZ5IG9uIFJlY3VycmluZyBGbGFncycpOyB9XHJcbiAgICBpZiAodGhpcy5kYWlseVJlcG9ydE9uICYmIHRoaXMuZGFpbHlTZW5kQXBwcm92ZXIpIHsgbGlzdC5wdXNoKCdEYWlseSBSZXBvcnQnKTsgfVxyXG4gICAgaWYgKHRoaXMuZWRpdFN1Ym1pdHRlZE9uKSB7IGxpc3QucHVzaCgnRWRpdCBTdWJtaXR0ZWQgQXVkaXQnKTsgfVxyXG4gICAgcmV0dXJuIGxpc3Q7XHJcbiAgfVxyXG5cclxuICAvKiogVHVybmluZyBBcHByb3ZlciBvZmYgd2FybnMgYWJvdXQgZXZlcnkgc2V0dGluZyB0aGF0IHN0aWxsIHNlbmRzIHRvIC8gcmVsaWVzIG9uIHRoZSBhcHByb3ZlcnMuICovXHJcbiAgdG9nZ2xlQXBwcm92ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwcHJvdmVyT24gPSAhdGhpcy5hcHByb3Zlck9uO1xyXG4gICAgY29uc3QgZGVwZW5kZW50cyA9IHRoaXMuYXBwcm92ZXJEZXBlbmRlbnRzO1xyXG4gICAgaWYgKCF0aGlzLmFwcHJvdmVyT24gJiYgZGVwZW5kZW50cy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRXYXJuaW5nVG9hc3QoJ0FwcHJvdmVyIGlzIHR1cm5lZCBvZmYsIGJ1dCAnICsgZGVwZW5kZW50cy5qb2luKCcsICcpICsgJyBzdGlsbCB1c2UgdGhlIGFwcHJvdmVycy4gVHVybiBBcHByb3ZlciBiYWNrIG9uIG9yIGNoYW5nZSB0aG9zZSBzZXR0aW5ncyBiZWZvcmUgc2F2aW5nLicpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFNlbmQgVG8gPiBBcHByb3ZlciBjYW4gb25seSBiZSB0aWNrZWQgd2hlbiB0aGVyZSBpcyBhbiBhcHByb3ZlciB0byBzZW5kIHRvLiAqL1xyXG4gIHRvZ2dsZVNlbmRBcHByb3ZlcihrZXk6IFNlbmRBcHByb3ZlcktleSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzW2tleV0gJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCh0aGlzLmFwcHJvdmVyTWlzc2luZ1RleHQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzW2tleV0gPSAhdGhpc1trZXldO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN3aXRjaGluZyBhIGZsYWcgLyByZXBvcnQgZW1haWwgb24gdGlja3MgQXBwcm92ZXIgb25seSB3aGVuIHRoZXJlIGlzIGFuIGFwcHJvdmVyIHRvIHNlbmQgdG8uICovXHJcbiAgdG9nZ2xlTm90aWZ5RmxhZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGlmeUZsYWdzT24gPSAhdGhpcy5ub3RpZnlGbGFnc09uO1xyXG4gICAgaWYgKHRoaXMubm90aWZ5RmxhZ3NPbiAmJiAhdGhpcy5oYXNBcHByb3ZlcnMpIHsgdGhpcy5ub3RpZnlTZW5kQXBwcm92ZXIgPSBmYWxzZTsgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUmVjdXJyaW5nRmxhZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlY3VycmluZ0ZsYWdzT24gPSAhdGhpcy5yZWN1cnJpbmdGbGFnc09uO1xyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nRmxhZ3NPbiAmJiAhdGhpcy5oYXNBcHByb3ZlcnMpIHsgdGhpcy5yZWN1cnJpbmdTZW5kQXBwcm92ZXIgPSBmYWxzZTsgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRGFpbHlSZXBvcnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhaWx5UmVwb3J0T24gPSAhdGhpcy5kYWlseVJlcG9ydE9uO1xyXG4gICAgaWYgKHRoaXMuZGFpbHlSZXBvcnRPbiAmJiAhdGhpcy5oYXNBcHByb3ZlcnMpIHsgdGhpcy5kYWlseVNlbmRBcHByb3ZlciA9IGZhbHNlOyB9XHJcbiAgfVxyXG5cclxuICAvKiogRWRpdCBTdWJtaXR0ZWQgQXVkaXQgbGV0cyBhcHByb3ZlcnMgY2hhbmdlIHN1Ym1pc3Npb25zIGJlZm9yZSBhcHByb3ZpbmcsIHNvIGl0IG5lZWRzIGFwcHJvdmVycy4gKi9cclxuICB0b2dnbGVFZGl0U3VibWl0dGVkKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmVkaXRTdWJtaXR0ZWRPbiAmJiAhdGhpcy5oYXNBcHByb3ZlcnMpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdFZGl0IFN1Ym1pdHRlZCBBdWRpdCBpcyBmb3IgYXBwcm92ZXJzLiAnICsgdGhpcy5hcHByb3Zlck1pc3NpbmdUZXh0KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lZGl0U3VibWl0dGVkT24gPSAhdGhpcy5lZGl0U3VibWl0dGVkT247XHJcbiAgfVxyXG5cclxuICBnZXQgZWRpdFN1Ym1pdHRlZEVycm9yKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuZWRpdFN1Ym1pdHRlZE9uKSB7IHJldHVybiAnJzsgfVxyXG4gICAgaWYgKCF0aGlzLmhhc0FwcHJvdmVycykgeyByZXR1cm4gJ0VkaXQgU3VibWl0dGVkIEF1ZGl0IGlzIGZvciBhcHByb3ZlcnMuICcgKyB0aGlzLmFwcHJvdmVyTWlzc2luZ1RleHQgKyAnIE9yIHR1cm4gRWRpdCBTdWJtaXR0ZWQgQXVkaXQgb2ZmLic7IH1cclxuICAgIGlmICghdGhpcy5lZGl0VXNlcnMubGVuZ3RoKSB7IHJldHVybiAnQWRkIGF0IGxlYXN0IG9uZSB1c2VyIHdobyBjYW4gZWRpdCBzdWJtaXR0ZWQgYXVkaXRzJzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBub3RpZnkgLyByZWN1cnJpbmcgZmxhZyByZWNpcGllbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKipcclxuICAgKiBUaWNraW5nIEN1c3RvbSB1bmRlciBSZWN1cnJpbmcgRmxhZ3Mgc3RhcnRzIGl0cyB1c2VyIGxpc3QgZnJvbSB0aGUgTm90aWZ5IEZsYWdzIGN1c3RvbSB1c2VycyxcclxuICAgKiBzbyB0aGUgc2FtZSBwZW9wbGUgYXJlIHVzZWQgYnkgZGVmYXVsdDsgdGhlIGxpc3Qgc3RheXMgZWRpdGFibGUuXHJcbiAgICovXHJcbiAgdG9nZ2xlUmVjdXJyaW5nQ3VzdG9tKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWN1cnJpbmdTZW5kQ3VzdG9tID0gIXRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbTtcclxuICAgIGlmICh0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gJiYgIXRoaXMucmVjdXJyaW5nVXNlcnMubGVuZ3RoICYmIHRoaXMubm90aWZ5RmxhZ3NPbiAmJiB0aGlzLm5vdGlmeVNlbmRDdXN0b20pIHtcclxuICAgICAgdGhpcy5yZWN1cnJpbmdVc2VycyA9IFsuLi50aGlzLm5vdGlmeVVzZXJzXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBXaG8gXCJVc2Ugc2FtZSB1c2VycyBmcm9tIE5vdGlmeSBGbGFnc1wiIHJlc29sdmVzIHRvIChzaG93biByZWFkLW9ubHkgdW5kZXIgdGhlIG9wdGlvbikuICovXHJcbiAgZ2V0IG5vdGlmeVJlY2lwaWVudHNMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLm5vdGlmeUZsYWdzT24pIHsgcmV0dXJuICdOb3RpZnkgRmxhZ3MgaXMgb2ZmLCBzbyBubyBvbmUgaXMgYWRkZWQgZnJvbSBpdCc7IH1cclxuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyKSB7IHBhcnRzLnB1c2godGhpcy5hcHByb3ZlcnMubGVuZ3RoID8gJ3RoZSBhcHByb3ZlcnMnIDogJ3RoZSBhcHByb3ZlcnMgKG5vbmUgc2V0KScpOyB9XHJcbiAgICBpZiAodGhpcy5ub3RpZnlTZW5kQ3VzdG9tICYmIHRoaXMubm90aWZ5VXNlcnMubGVuZ3RoKSB7IHBhcnRzLnB1c2godGhpcy5ub3RpZnlVc2Vycy5tYXAodSA9PiB1Lm4pLmpvaW4oJywgJykpOyB9XHJcbiAgICByZXR1cm4gcGFydHMubGVuZ3RoID8gJ0Fsc28gc2VuZHMgdG8gJyArIHBhcnRzLmpvaW4oJyBhbmQgJykgOiAnTm90aWZ5IEZsYWdzIGhhcyBubyByZWNpcGllbnRzIHlldCc7XHJcbiAgfVxyXG5cclxuICBnZXQgbm90aWZ5RmxhZ3NFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLm5vdGlmeUZsYWdzT24pIHsgcmV0dXJuICcnOyB9XHJcbiAgICBpZiAoIXRoaXMubm90aWZ5U2VuZEFwcHJvdmVyICYmICF0aGlzLm5vdGlmeVNlbmRDdXN0b20pIHsgcmV0dXJuICdDaG9vc2Ugd2hvIHJlY2VpdmVzIHRoZSBmbGFnIGVtYWlscyc7IH1cclxuICAgIGlmICh0aGlzLm5vdGlmeVNlbmRBcHByb3ZlciAmJiAhdGhpcy5oYXNBcHByb3ZlcnMpIHsgcmV0dXJuICdOb3RpZnkgRmxhZ3Mgc2VuZHMgdG8gdGhlIGFwcHJvdmVyLiAnICsgdGhpcy5hcHByb3Zlck1pc3NpbmdUZXh0ICsgJyBPciB1bnRpY2sgQXBwcm92ZXIgaGVyZS4nOyB9XHJcbiAgICBpZiAodGhpcy5ub3RpZnlTZW5kQ3VzdG9tICYmICF0aGlzLm5vdGlmeVVzZXJzLmxlbmd0aCkgeyByZXR1cm4gJ0FkZCBhdCBsZWFzdCBvbmUgY3VzdG9tIHVzZXIgZm9yIE5vdGlmeSBGbGFncyc7IH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGdldCByZWN1cnJpbmdGbGFnc0Vycm9yKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMucmVjdXJyaW5nRmxhZ3NPbikgeyByZXR1cm4gJyc7IH1cclxuICAgIGlmICghdGhpcy5yZWN1cnJpbmdTZW5kQXBwcm92ZXIgJiYgIXRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSAmJiAhdGhpcy5yZWN1cnJpbmdTYW1lQXNOb3RpZnkpIHsgcmV0dXJuICdDaG9vc2Ugd2hvIHJlY2VpdmVzIHRoZSByZWN1cnJpbmcgZmxhZyBlbWFpbHMnOyB9XHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdTZW5kQXBwcm92ZXIgJiYgIXRoaXMuaGFzQXBwcm92ZXJzKSB7IHJldHVybiAnUmVjdXJyaW5nIEZsYWdzIHNlbmRzIHRvIHRoZSBhcHByb3Zlci4gJyArIHRoaXMuYXBwcm92ZXJNaXNzaW5nVGV4dCArICcgT3IgdW50aWNrIEFwcHJvdmVyIGhlcmUuJzsgfVxyXG4gICAgaWYgKHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSAmJiAhdGhpcy5yZWN1cnJpbmdVc2Vycy5sZW5ndGgpIHsgcmV0dXJuICdBZGQgYXQgbGVhc3Qgb25lIGN1c3RvbSB1c2VyIGZvciBSZWN1cnJpbmcgRmxhZ3MnOyB9XHJcbiAgICAvLyBBcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlOiBcInNhbWUgdXNlcnNcIiBuZWVkcyBOb3RpZnkgRmxhZ3Mgb24sIGVsc2UgaXQgd291bGQgbWFpbCBubyBvbmUuXHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdTYW1lQXNOb3RpZnkgJiYgIXRoaXMubm90aWZ5RmxhZ3NPbikgeyByZXR1cm4gJ1wiVXNlIHNhbWUgdXNlcnMgZnJvbSBOb3RpZnkgRmxhZ3NcIiBuZWVkcyBOb3RpZnkgRmxhZ3Mgb24uIFR1cm4gTm90aWZ5IEZsYWdzIG9uLCBvciB1bnRpY2sgdGhpcyBvcHRpb24uJzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhaWx5UmVwb3J0RXJyb3IoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5kYWlseVJlcG9ydE9uKSB7IHJldHVybiAnJzsgfVxyXG4gICAgaWYgKCF0aGlzLmRhaWx5U2VuZEFwcHJvdmVyICYmICF0aGlzLmRhaWx5U2VuZEN1c3RvbSkgeyByZXR1cm4gJ0Nob29zZSB3aG8gcmVjZWl2ZXMgdGhlIGRhaWx5IHJlcG9ydCc7IH1cclxuICAgIGlmICh0aGlzLmRhaWx5U2VuZEFwcHJvdmVyICYmICF0aGlzLmhhc0FwcHJvdmVycykgeyByZXR1cm4gJ1RoZSBkYWlseSByZXBvcnQgaXMgc2VudCB0byB0aGUgYXBwcm92ZXIuICcgKyB0aGlzLmFwcHJvdmVyTWlzc2luZ1RleHQgKyAnIE9yIHVudGljayBBcHByb3ZlciBoZXJlLic7IH1cclxuICAgIGlmICh0aGlzLmRhaWx5U2VuZEN1c3RvbSAmJiAhdGhpcy5kYWlseVVzZXJzLmxlbmd0aCkgeyByZXR1cm4gJ0FkZCBhdCBsZWFzdCBvbmUgY3VzdG9tIHVzZXIgZm9yIHRoZSBkYWlseSByZXBvcnQnOyB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIGRyb3Bkb3ducyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICB0b2dnbGVTZWxlY3Qoa2V5OiBTZWxlY3RLZXksIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLm9wZW5TZWxlY3QgPSB0aGlzLm9wZW5TZWxlY3QgPT09IGtleSA/IG51bGwgOiBrZXk7XHJcbiAgICB0aGlzLm9wZW5DaGlwcyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwaWNrKGtleTogU2VsZWN0S2V5LCBvcHRpb246IFNlbGVjdE9wdGlvbiwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXNba2V5XSA9IG9wdGlvbi52YWx1ZTtcclxuICAgIHRoaXMub3BlblNlbGVjdCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RMYWJlbChrZXk6IFNlbGVjdEtleSwgb3B0aW9uczogU2VsZWN0T3B0aW9uW10pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzW2tleV07XHJcbiAgICByZXR1cm4gb3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PT0gdmFsdWUpPy5sYWJlbCA/PyBTdHJpbmcodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgaXNQaWNrZWQoa2V5OiBTZWxlY3RLZXksIG9wdGlvbjogU2VsZWN0T3B0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpc1trZXldID09PSBvcHRpb24udmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLyBUeXBlZCBhY2Nlc3NvcnMgZm9yIHRoZSBzaGFyZWQgdGVtcGxhdGVzICh0aGVpciBjb250ZXh0IHZhcmlhYmxlcyBhcmUgdW50eXBlZCwgYW5kIHRoZVxyXG4gIC8vIHJvb3QgYXBwJ3Mgc3RyaWN0IHRlbXBsYXRlIGNoZWNrIHJlamVjdHMgYHRoaXNbbGlzdF1gIC8gYGRyYWZ0c1tsaXN0XWApLlxyXG4gIGNoaXBzT2YobGlzdDogQ2hpcExpc3QpOiBDaGlwVXNlcltdIHtcclxuICAgIHJldHVybiB0aGlzW2xpc3RdO1xyXG4gIH1cclxuXHJcbiAgZHJhZnRPZihsaXN0OiBDaGlwTGlzdCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5kcmFmdHNbbGlzdF07XHJcbiAgfVxyXG5cclxuICBzZXREcmFmdChsaXN0OiBDaGlwTGlzdCwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5kcmFmdHNbbGlzdF0gPSB2YWx1ZSA/PyAnJztcclxuICB9XHJcblxyXG4gIC8vIC0tLS0gY2hpcCBwaWNrZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqIENsaWVudCB1c2VycyBtYXRjaGluZyB0aGUgdHlwZWQgdGV4dCwgbWludXMgdGhlIG9uZXMgYWxyZWFkeSBpbiB0aGUgbGlzdC4gKi9cclxuICBzdWdnZXN0aW9ucyhsaXN0OiBDaGlwTGlzdCk6IENoaXBVc2VyW10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuZHJhZnRzW2xpc3RdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3QgY2hvc2VuID0gbmV3IFNldCh0aGlzW2xpc3RdLm1hcCh1ID0+IHUuZSkpO1xyXG4gICAgcmV0dXJuIHRoaXMudXNlcnNcclxuICAgICAgLmZpbHRlcih1ID0+ICFjaG9zZW4uaGFzKHUuZSkgJiYgKCFxIHx8IHUubi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8IHUuZS5pbmNsdWRlcyhxKSkpXHJcbiAgICAgIC5zbGljZSgwLCA4KTtcclxuICB9XHJcblxyXG4gIGZvY3VzQ2hpcHMobGlzdDogQ2hpcExpc3QsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLm9wZW5DaGlwcyA9IGxpc3Q7XHJcbiAgICB0aGlzLm9wZW5TZWxlY3QgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFwcHJvdmVycyBjYW4gb25seSBiZSBhZGRlZCB3aGlsZSBBcHByb3ZlciBpcyBvbiAodGhlIHBpY2tlciBpcyBoaWRkZW4gb3RoZXJ3aXNlOyB0aGlzIGd1YXJkcyBpdCkuICovXHJcbiAgcHJpdmF0ZSBhcHByb3Zlckxpc3RMb2NrZWQobGlzdDogQ2hpcExpc3QpOiBib29sZWFuIHtcclxuICAgIGlmIChsaXN0ICE9PSAnYXBwcm92ZXJzJyB8fCB0aGlzLmFwcHJvdmVyT24pIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0FwcHJvdmVyIGlzIHR1cm5lZCBvZmYuIFR1cm4gb24gQXBwcm92ZXIgdG8gYWRkIGFwcHJvdmVycy4nKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgYWRkU3VnZ2VzdGlvbihsaXN0OiBDaGlwTGlzdCwgdXNlcjogQ2hpcFVzZXIsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5hcHByb3Zlckxpc3RMb2NrZWQobGlzdCkpIHsgcmV0dXJuOyB9XHJcbiAgICBpZiAoIXRoaXNbbGlzdF0uc29tZSh1ID0+IHUuZSA9PT0gdXNlci5lKSkge1xyXG4gICAgICB0aGlzW2xpc3RdID0gWy4uLnRoaXNbbGlzdF0sIHVzZXJdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kcmFmdHNbbGlzdF0gPSAnJztcclxuICAgIHRoaXMub3BlbkNoaXBzID0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBFbnRlciB0YWtlcyB0aGUgZmlyc3Qgc3VnZ2VzdGlvbjsgYW4gZXhhY3QgZW1haWwgd29ya3MgZXZlbiBmb3IgYSB1c2VyIG5vdCBpbiB0aGUgbGlzdC4gKi9cclxuICBhZGRDaGlwKGxpc3Q6IENoaXBMaXN0KTogdm9pZCB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5kcmFmdHNbbGlzdF0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAoIXEgfHwgdGhpcy5hcHByb3Zlckxpc3RMb2NrZWQobGlzdCkpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCB0eXBlZCA9IHRoaXMuZXNjKHRoaXMuZHJhZnRzW2xpc3RdLnRyaW0oKSk7XHJcbiAgICBjb25zdCBpc0VtYWlsID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC8udGVzdChxKTtcclxuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5zdWdnZXN0aW9ucyhsaXN0KVswXSB8fCAoaXNFbWFpbCA/IHRoaXMuY2hpcChxLCBxKSA6IG51bGwpO1xyXG4gICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QocS5pbmNsdWRlcygnQCcpXHJcbiAgICAgICAgPyAnXCInICsgdHlwZWQgKyAnXCIgaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcy4nXHJcbiAgICAgICAgOiAnTm8gdXNlciBtYXRjaGVzIFwiJyArIHR5cGVkICsgJ1wiLiBQaWNrIGEgdXNlciBmcm9tIHRoZSBsaXN0IG9yIHR5cGUgdGhlaXIgZnVsbCBlbWFpbC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXNbbGlzdF0uc29tZSh1ID0+IHUuZSA9PT0gbWF0Y2guZSkpIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHRoaXMuZXNjKG1hdGNoLm4gfHwgbWF0Y2guZSkgKyAnIGlzIGFscmVhZHkgYWRkZWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXNbbGlzdF0gPSBbLi4udGhpc1tsaXN0XSwgbWF0Y2hdO1xyXG4gICAgdGhpcy5kcmFmdHNbbGlzdF0gPSAnJztcclxuICAgIHRoaXMub3BlbkNoaXBzID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHJlbW92ZUNoaXAobGlzdDogQ2hpcExpc3QsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXNbbGlzdF0gPSB0aGlzW2xpc3RdLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLSBEYWlseSBSZXBvcnQgY3VzdG9tIHVzZXJzOiBidWxrIHVwbG9hZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIG9wZW5EYWlseUJ1bGsoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRhaWx5QnVsa0Vycm9ycyA9IFtdO1xyXG4gICAgdGhpcy5kYWlseUJ1bGtPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMub3BlbkNoaXBzID0gbnVsbDtcclxuICAgIHRoaXMub3BlblNlbGVjdCA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBjbG9zZURhaWx5QnVsaygpOiB2b2lkIHtcclxuICAgIHRoaXMuZGFpbHlCdWxrT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5kYWlseUJ1bGtFcnJvcnMgPSBbXTtcclxuICB9XHJcblxyXG4gIC8qKiBVc2VybmFtZSArIEVtYWlsIHRlbXBsYXRlLCBwcmUtZmlsbGVkIHdpdGggdGhlIGN1cnJlbnQgRGFpbHkgUmVwb3J0IGN1c3RvbSB1c2VycyAoYXMgdGhlIENoZWNrbGlzdCBvbmUpLiAqL1xyXG4gIGRvd25sb2FkRGFpbHlUZW1wbGF0ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmRhaWx5VXNlcnMubGVuZ3RoID8gdGhpcy5kYWlseVVzZXJzLm1hcCh1ID0+IFt1Lm4sIHUuZV0pIDogW1snJywgJyddXTtcclxuICAgIGNvbnN0IHNoZWV0ID0gWExTWC51dGlscy5hb2FfdG9fc2hlZXQoW1snVXNlcm5hbWUnLCAnRW1haWwnXSwgLi4ucm93c10pO1xyXG4gICAgc2hlZXRbJyFjb2xzJ10gPSBbeyB3Y2g6IDI4IH0sIHsgd2NoOiAzNiB9XTtcclxuICAgIGNvbnN0IGJvb2sgPSBYTFNYLnV0aWxzLmJvb2tfbmV3KCk7XHJcbiAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KGJvb2ssIHNoZWV0LCAnVXNlcnMnKTtcclxuICAgIFhMU1gud3JpdGVGaWxlKGJvb2ssICdkYWlseVJlcG9ydFRlbXBsYXRlLnhsc3gnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlcGxhY2VzIHRoZSBEYWlseSBSZXBvcnQgY3VzdG9tIHVzZXJzIHdpdGggdGhlIHVwbG9hZGVkIHNoZWV0LCBhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIGRvZXM6XHJcbiAgICogb25seSB0aGUgRW1haWwgY29sdW1uIGNvdW50cyAodGhlIG5hbWUgY29tZXMgZnJvbSB0aGUgY2xpZW50J3MgdXNlciBsaXN0KSwgYW5kIGV2ZXJ5IHJvdyBtdXN0IGJlIGFuXHJcbiAgICogZXhpc3RpbmcgdXNlci4gQW55IGludmFsaWQgcm93IHJlamVjdHMgdGhlIHdob2xlIGZpbGUuXHJcbiAgICovXHJcbiAgb25EYWlseUJ1bGtGaWxlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlcz8uWzBdO1xyXG4gICAgaW5wdXQudmFsdWUgPSAnJztcclxuICAgIGlmICghZmlsZSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuZGFpbHlCdWxrRXJyb3JzID0gW107XHJcbiAgICBpZiAoIS9cXC54bHN4JC9pLnRlc3QoZmlsZS5uYW1lKSkge1xyXG4gICAgICB0aGlzLmRhaWx5QnVsa0Vycm9ycyA9IFsnUGxlYXNlIHVwbG9hZCBhIHZhbGlkIC54bHN4IGZpbGUuJ107XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyBFdmVyeSBhY3RpdmUgdXNlciBvZiB0aGUgY2xpZW50IGNvdW50cyBoZXJlLCByb2xlICd1c2VyJyBpbmNsdWRlZCAoUUEgMTMgT2N0OiBhY3RpdmUgdXNlcnMgd2VyZSByZWplY3RlZCBhc1xyXG4gICAgLy8gXCJub3QgYW4gZXhpc3RpbmcgdXNlclwiIGJlY2F1c2UgdGhlIHBhZ2UncyBwaWNrZXIgbGlzdCBob2xkcyBhZG1pbnMgLyBzdXBlcmFkbWlucyBvbmx5KS4gVGhlIHBpY2tlcnMga2VlcFxyXG4gICAgLy8gdGhhdCBsaXN0OyBvbmx5IHRoZSB1cGxvYWQgcmVhZHMgdGhlIGZ1bGwgb25lLCBmZXRjaGVkIG5vdyBzbyBpdCBpcyBjdXJyZW50LlxyXG4gICAgY29uc3QgbG9hZGVkID0gdGhpcy50cmF4U2VydmljZS5nZXRDbGllbnRVc2VyKHRoaXMuY2xpZW50SWQsIHRydWUpLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IChyZXM/LmNvZGUgPT09IDIwMCA/IHJlcy5kYXRhIHx8IFtdIDogW10pXHJcbiAgICAgICAgLm1hcCgodTogYW55KSA9PiB0aGlzLmNoaXAodS51c2VyTmFtZSwgdS5lbWFpbCkpXHJcbiAgICAgICAgLmZpbHRlcigodTogQ2hpcFVzZXIpID0+IHUuZSkgYXMgQ2hpcFVzZXJbXSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgQ2hpcFVzZXJbXSkpXHJcbiAgICApO1xyXG4gICAgZm9ya0pvaW4oeyB1c2VyczogbG9hZGVkLCBidWZmZXI6IGZyb20oZmlsZS5hcnJheUJ1ZmZlcigpKSB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHsgdXNlcnMsIGJ1ZmZlciB9KSA9PiB7XHJcbiAgICAgICAgaWYgKCF1c2Vycy5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuZGFpbHlCdWxrRXJyb3JzID0gWydUaGUgdXNlcnMgb2YgdGhpcyBjbGllbnQgY291bGQgbm90IGJlIGxvYWRlZC4gUmVsb2FkIHRoZSBwYWdlIGFuZCB0cnkgYWdhaW4uJ107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGFpbHlCdWxrRXJyb3JzID0gdGhpcy5hcHBseURhaWx5QnVsayhidWZmZXIsIHVzZXJzKTtcclxuICAgICAgICAgIGlmICghdGhpcy5kYWlseUJ1bGtFcnJvcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGFpbHlCdWxrT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnRmlsZSB1cGxvYWRlZCBzdWNjZXNzZnVsbHkuICcgKyB0aGlzLmRhaWx5VXNlcnMubGVuZ3RoXHJcbiAgICAgICAgICAgICAgKyAodGhpcy5kYWlseVVzZXJzLmxlbmd0aCA9PT0gMSA/ICcgdXNlcicgOiAnIHVzZXJzJykgKyAnIGFkZGVkIHRvIHRoZSBkYWlseSByZXBvcnQuJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGFpbHlCdWxrRXJyb3JzID0gWydDb3VsZCBub3QgcmVhZCB0aGlzIGZpbGUuIFVwbG9hZCB0aGUgZG93bmxvYWRlZCB0ZW1wbGF0ZSBhcyAueGxzeC4nXTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBsaWVzIHRoZSBzaGVldCB0byBkYWlseVVzZXJzIGFuZCByZXR1cm5zIFtdIG9uIHN1Y2Nlc3MsIGVsc2UgdGhlIHJlYXNvbnMgaXQgd2FzIHJlamVjdGVkLlxyXG4gICAqIHVzZXJzOiBldmVyeSBhY3RpdmUgdXNlciBvZiB0aGUgY2xpZW50ICh0aGUgdXBsb2FkJ3Mgb3duIGxpc3QsIHJvbGUgJ3VzZXInIGluY2x1ZGVkKS5cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5RGFpbHlCdWxrKGJ1ZmZlcjogQXJyYXlCdWZmZXIsIHVzZXJzOiBDaGlwVXNlcltdKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IHJvd3M6IGFueVtdW107XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBib29rID0gWExTWC5yZWFkKGJ1ZmZlciwgeyB0eXBlOiAnYXJyYXknIH0pO1xyXG4gICAgICByb3dzID0gWExTWC51dGlscy5zaGVldF90b19qc29uKGJvb2suU2hlZXRzW2Jvb2suU2hlZXROYW1lc1swXV0sIHsgaGVhZGVyOiAxLCBkZWZ2YWw6ICcnLCBibGFua3Jvd3M6IHRydWUgfSk7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIFsnQ291bGQgbm90IHJlYWQgdGhpcyBmaWxlLiBVcGxvYWQgdGhlIGRvd25sb2FkZWQgdGVtcGxhdGUgYXMgLnhsc3guJ107XHJcbiAgICB9XHJcbiAgICBjb25zdCBlbWFpbENvbCA9IChyb3dzWzBdIHx8IFtdKS5maW5kSW5kZXgoaCA9PiBTdHJpbmcoaCA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICdlbWFpbCcpO1xyXG4gICAgaWYgKGVtYWlsQ29sIDwgMCkgeyByZXR1cm4gW1wiVGhlIHRlbXBsYXRlIG11c3QgY29udGFpbiBhbiAnRW1haWwnIGNvbHVtbi5cIl07IH1cclxuXHJcbiAgICBjb25zdCBlbWFpbFJlZ2V4ID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC87XHJcbiAgICBjb25zdCBieUVtYWlsID0gbmV3IE1hcCh1c2Vycy5tYXAodSA9PiBbdS5lLCB1XSkpO1xyXG4gICAgY29uc3QgbWF0Y2hlZDogQ2hpcFVzZXJbXSA9IFtdO1xyXG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgbGV0IGRhdGFSb3dzID0gMDtcclxuICAgIHJvd3Muc2xpY2UoMSkuZm9yRWFjaCgocm93LCBpKSA9PiB7XHJcbiAgICAgIC8vIFNraXAgZnVsbHkgYmxhbmsgcm93cyAoYW55IGNvbHVtbiwgbm90IGp1c3QgRW1haWwpLlxyXG4gICAgICBpZiAoIXJvdy5zb21lKHYgPT4gU3RyaW5nKHYgPz8gJycpLnRyaW0oKSAhPT0gJycpKSB7IHJldHVybjsgfVxyXG4gICAgICBkYXRhUm93cysrO1xyXG4gICAgICBjb25zdCByb3dObyA9IGkgKyAyOyAvLyArMSBoZWFkZXIsICsxIHRvIDEtYmFzZWRcclxuICAgICAgY29uc3QgZW1haWwgPSBTdHJpbmcocm93W2VtYWlsQ29sXSA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGlmICghZW1haWwpIHsgZXJyb3JzLnB1c2goJ1JvdyAnICsgcm93Tm8gKyAnOiBFbWFpbCBpcyByZXF1aXJlZCcpOyByZXR1cm47IH1cclxuICAgICAgaWYgKCFlbWFpbFJlZ2V4LnRlc3QoZW1haWwpKSB7IGVycm9ycy5wdXNoKCdSb3cgJyArIHJvd05vICsgJzogXCInICsgZW1haWwgKyAnXCIgaXMgbm90IGEgdmFsaWQgZW1haWwnKTsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IHVzZXIgPSBieUVtYWlsLmdldChlbWFpbCk7XHJcbiAgICAgIGlmICghdXNlcikgeyBlcnJvcnMucHVzaCgnUm93ICcgKyByb3dObyArICc6IFwiJyArIGVtYWlsICsgJ1wiIGlzIG5vdCBhbiBleGlzdGluZyB1c2VyJyk7IHJldHVybjsgfVxyXG4gICAgICBpZiAoIW1hdGNoZWQuc29tZSh1ID0+IHUuZSA9PT0gdXNlci5lKSkgeyBtYXRjaGVkLnB1c2godXNlcik7IH1cclxuICAgIH0pO1xyXG4gICAgaWYgKCFkYXRhUm93cykgeyByZXR1cm4gWydUaGUgdXBsb2FkZWQgZmlsZSBoYXMgbm8gZGF0YSByb3dzLiddOyB9XHJcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCkgeyByZXR1cm4gZXJyb3JzOyB9XHJcblxyXG4gICAgdGhpcy5kYWlseVVzZXJzID0gbWF0Y2hlZDtcclxuICAgIHRoaXMuZGFpbHlTZW5kQ3VzdG9tID0gdHJ1ZTtcclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGF0IHRoZSBjaGVja2xpc3Qga2VlcHMgYXMgYXNzaWduZWRVc2VycywgZXhhY3RseSBhcyB0aGUgQ2hlY2tsaXN0IENvbmZpZ3VyZSBwYWdlIHNlbmRzIGl0LiAqL1xyXG4gIHByaXZhdGUgYXNzaWduZWRVc2VycygpOiB7IGlkOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9W10ge1xyXG4gICAgY29uc3QgZCA9IHRoaXMuY29uZmlnRGF0YT8uY2hlY2tMaXN0RGV0YWlscyB8fCB7fTtcclxuICAgIHJldHVybiBbLi4uKGQuc2luZ2xlQXNzaWduIHx8IFtdKSwgLi4uKGQuZ3JvdXBBc3NpZ24gfHwgW10pXTtcclxuICB9XHJcblxyXG4gIGdldCBwcmVTdWJtaXNzaW9uRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmVTdWJtaXNzaW9uQWNjZXNzT24gJiYgdGhpcy5wcmVTdWJtaXNzaW9uVXNlcnMubGVuZ3RoID09PSAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc3B1dGVBdmFpbGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVZpc2liaWxpdHkgPT09ICdwcmUnICYmIHRoaXMuZGlzcHV0ZU9uO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoeSBQdWJsaXNoIC8gU2F2ZSBhcmUgZGlzYWJsZWQgKGJ1dHRvbiB0aXRsZSksICcnIHdoZW4gdGhleSBhcmUgbm90LiAqL1xyXG4gIGdldCBzYXZlQmxvY2tlZFJlYXNvbigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmFjY2Vzcy5jYW5FZGl0KSB7IHJldHVybiAnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY2hhbmdlIGF1ZGl0cyc7IH1cclxuICAgIGlmICh0aGlzLmF1ZGl0U2V0dGluZ3NMb2FkRmFpbGVkKSB7IHJldHVybiAnVGhlIHNjb3JpbmcgYW5kIGFjY2VzcyBzZXR0aW5ncyBjb3VsZCBub3QgYmUgbG9hZGVkLiBSZWxvYWQgdGhlIHBhZ2UgYmVmb3JlIHNhdmluZy4nOyB9XHJcbiAgICBpZiAodGhpcy5wYXNzRmFpbE9uICYmICh0aGlzLnBhc3NUaHJlc2hvbGQgPCAxIHx8IHRoaXMucGFzc1RocmVzaG9sZCA+IDEwMCkpIHsgcmV0dXJuICdQYXNzIG1hcmsgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMCc7IH1cclxuICAgIGlmICh0aGlzLnByZVN1Ym1pc3Npb25FbXB0eSkgeyByZXR1cm4gJ0FkZCBhdCBsZWFzdCBvbmUgdXNlciBmb3IgcHJlLXN1Ym1pc3Npb24gYWNjZXNzJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZWRpdFN1Ym1pdHRlZEVycm9yIHx8IHRoaXMubm90aWZ5RmxhZ3NFcnJvciB8fCB0aGlzLnJlY3VycmluZ0ZsYWdzRXJyb3IgfHwgdGhpcy5kYWlseVJlcG9ydEVycm9yO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoeSBQdWJsaXNoIHdvdWxkIGJlIHJlZnVzZWQgKCcnIHdoZW4gaXQgd291bGQgbm90KTsgY2hlY2tlZCBvbiBjbGljayBzbyB0aGUgdG9hc3QgY2FuIHNheSBzby4gKi9cclxuICBnZXQgcHVibGlzaEJsb2NrZWRSZWFzb24oKTogc3RyaW5nIHtcclxuICAgIC8vIEFwcHJvdmVycyBhcmUgbmVlZGVkIG9ubHkgd2hpbGUgQXBwcm92ZXIgaXMgb247IHdpdGggaXQgb2ZmIHRoZSBhdWRpdCBwdWJsaXNoZXMgd2l0aG91dCBhcHByb3ZhbC5cclxuICAgIGlmICh0aGlzLmFwcHJvdmVyT24gJiYgIXRoaXMuYXBwcm92ZXJzLmxlbmd0aCkgeyByZXR1cm4gJ0FwcHJvdmVyIGlzIHR1cm5lZCBvbi4gQWRkIGF0IGxlYXN0IG9uZSBhcHByb3Zlciwgb3IgdHVybiBBcHByb3ZlciBvZmYuJzsgfVxyXG4gICAgaWYgKCF0aGlzLnNlY3Rpb25zLnNvbWUocyA9PiBzLml0ZW1zLmxlbmd0aCkpIHsgcmV0dXJuICdUaGlzIGF1ZGl0IGhhcyBubyBxdWVzdGlvbnMuIEFkZCBhdCBsZWFzdCBvbmUgcXVlc3Rpb24gYmVmb3JlIHB1Ymxpc2hpbmcuJzsgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhblNhdmUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zYXZpbmcgfHwgdGhpcy5sb2FkaW5nIHx8ICF0aGlzLmNoZWNrbGlzdElkIHx8ICF0aGlzLmNvbmZpZ0RhdGEpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICByZXR1cm4gIXRoaXMuc2F2ZUJsb2NrZWRSZWFzb247XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIHNhdmUgLyBwdWJsaXNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHNhdmVEcmFmdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2ZShmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaXNoKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhblNhdmUpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBibG9ja2VkID0gdGhpcy5wdWJsaXNoQmxvY2tlZFJlYXNvbjtcclxuICAgIGlmIChibG9ja2VkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChibG9ja2VkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmFzc2lnbmVkQ291bnQpIHtcclxuICAgICAgLy8gU3RvcmVzIGFuZCBhdWRpdG9ycyBjb21lIGZyb20gc2NoZWR1bGUgcm93czsgcHVibGlzaGluZyB0aGUgc2NoZWR1bGUgcHVibGlzaGVzIHRoZSBhdWRpdC5cclxuICAgICAgdGhpcy5zY2hlZHVsZUFmdGVyU2F2ZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2F2ZShmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZShwdWJsaXNoOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuY2FuU2F2ZSkgeyB0aGlzLnNjaGVkdWxlQWZ0ZXJTYXZlID0gZmFsc2U7IHJldHVybjsgfVxyXG4gICAgdGhpcy53YXNQdWJsaXNoZWQgPSB0aGlzLnB1Ymxpc2hlZDtcclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZUNoZWNrbGlzdChwdWJsaXNoKTtcclxuICB9XHJcblxyXG4gIC8qKiBcInB1Ymxpc2ggU3RvcmUgQXVkaXRcIiAvIFwic2F2ZSBTdG9yZSBBdWRpdFwiLCBmb3IgdGhlIGVycm9yIHRvYXN0cy4gKi9cclxuICBwcml2YXRlIGFjdGlvblRleHQocHVibGlzaDogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHB1Ymxpc2ggPyAncHVibGlzaCAnIDogJ3NhdmUgJykgKyB0aGlzLmVzYyh0aGlzLmF1ZGl0TmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQSBzYXZlIHN0ZXAgZmFpbGVkOiBzdG9wLCBhbmQgZG8gbm90IG9wZW4gQ3JlYXRlIHNjaGVkdWxlIG9uIHRoZSBuZXh0IHBsYWluIHNhdmUuICovXHJcbiAgcHJpdmF0ZSBmYWlsU2F2ZShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnNjaGVkdWxlQWZ0ZXJTYXZlID0gZmFsc2U7XHJcbiAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QobWVzc2FnZSk7XHJcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjaGVja2xpc3QgcGFydCAoY2hlY2tsaXN0Q29uZmlndXJldjE6IG5vdGlmaWNhdGlvbnMsIGFwcHJvdmVycywgcHVibGlzaCkgYW5kIHRoZSBhdWRpdC1vbmx5IHNldHRpbmdzXHJcbiAgICogKGNvbmZpZy9zYXZlOiBzY29yaW5nLCBkaXNwdXRlLCBhY2Nlc3MpIGRvIG5vdCBkZXBlbmQgb24gZWFjaCBvdGhlciwgc28gYm90aCBhcmUgc2VudCBhdCBvbmNlIGluc3RlYWQgb2Ygb25lXHJcbiAgICogYWZ0ZXIgdGhlIG90aGVyIChRQTogc2F2ZSAvIHB1Ymxpc2ggdG9vayBsb25nKS4gT3V0Y29tZXMgYXJlIHJlcG9ydGVkIGFzIGJlZm9yZTogdGhlIGNoZWNrbGlzdCBwYXJ0IGZpcnN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2F2ZUNoZWNrbGlzdChwdWJsaXNoOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBmYWxsYmFjayA9ICdDb3VsZCBub3QgJyArIHRoaXMuYWN0aW9uVGV4dChwdWJsaXNoKSArICcuIFBsZWFzZSB0cnkgYWdhaW4uJztcclxuICAgIGNvbnN0IHNldHRsZSA9IChjYWxsOiBPYnNlcnZhYmxlPGFueT4pID0+IGNhbGwucGlwZShtYXAoKHJlczogYW55KSA9PiAoeyByZXMsIGVycjogbnVsbCB9KSksIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiBvZih7IHJlczogbnVsbCwgZXJyIH0pKSk7XHJcbiAgICBmb3JrSm9pbihbXHJcbiAgICAgIHNldHRsZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0Q29uZmlnVXBkYXRlKHRoaXMuY2hlY2tsaXN0UGF5bG9hZChwdWJsaXNoKSkpLFxyXG4gICAgICBzZXR0bGUodGhpcy50cmF4U2VydmljZS5hdWRpdENvbmZpZ1NhdmUodGhpcy5leHRyYXNQYXlsb2FkKCkpKVxyXG4gICAgXSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoW21haW4sIGV4dHJhc10pID0+IHtcclxuICAgICAgaWYgKG1haW4uZXJyKSB7XHJcbiAgICAgICAgdGhpcy5mYWlsU2F2ZSh0aGlzLmFwaUVycm9yKG1haW4uZXJyLCBmYWxsYmFjaywgdHJ1ZSwgJ0NvdWxkIG5vdCAnICsgdGhpcy5hY3Rpb25UZXh0KHB1Ymxpc2gpICsgJzogJykpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWFpbi5yZXM/LmNvZGUgIT09IDIwMCkge1xyXG4gICAgICAgIC8vIDIwNCAobm8gYm9keSkgPSB0aGUgYXVkaXQgbm8gbG9uZ2VyIGV4aXN0cyBmb3IgdGhpcyBjbGllbnQuXHJcbiAgICAgICAgdGhpcy5mYWlsU2F2ZShtYWluLnJlcyA/IGZhbGxiYWNrIDogJ0NvdWxkIG5vdCAnICsgdGhpcy5hY3Rpb25UZXh0KHB1Ymxpc2gpICsgJzogdGhlIGF1ZGl0IHdhcyBub3QgZm91bmQuIEl0IG1heSBoYXZlIGJlZW4gZGVsZXRlZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHB1Ymxpc2gpIHsgdGhpcy5wdWJsaXNoZWQgPSB0cnVlOyB9XHJcbiAgICAgIGlmIChleHRyYXMuZXJyIHx8IGV4dHJhcy5yZXM/LmNvZGUgIT09IDIwMCkge1xyXG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IGV4dHJhcy5lcnIgPyB0aGlzLmFwaUVycm9yKGV4dHJhcy5lcnIsICcnLCB0cnVlKSA6ICcnO1xyXG4gICAgICAgIHRoaXMuZmFpbFNhdmUoKHB1Ymxpc2ggPyB0aGlzLmVzYyh0aGlzLmF1ZGl0TmFtZSkgKyAnIHdhcyBwdWJsaXNoZWQnIDogJ1RoZSBub3RpZmljYXRpb24gYW5kIGFwcHJvdmVyIHNldHRpbmdzIHdlcmUgc2F2ZWQnKVxyXG4gICAgICAgICAgKyAnLCBidXQgdGhlIHNjb3JpbmcsIGRpc3B1dGUgYW5kIGFjY2VzcyBzZXR0aW5ncyB3ZXJlIG5vdCcgKyAocmVhc29uID8gJyAoJyArIHJlYXNvbiArICcpJyA6ICcnKSArICcuIFNhdmUgYWdhaW4gdG8ga2VlcCB0aGVtLicpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpbmlzaFNhdmUocHVibGlzaCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYXVkaXQtb25seSBzZXR0aW5ncyBzYXZlZCBieSBjb25maWcvc2F2ZS4gKi9cclxuICBwcml2YXRlIGV4dHJhc1BheWxvYWQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBjb25zdCB0b1N0b3JlZCA9IChsaXN0OiBDaGlwVXNlcltdKSA9PiBsaXN0Lm1hcCh1ID0+ICh7IG46IHUubiwgZTogdS5lIH0pKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBjaGVja2xpc3RJZDogdGhpcy5jaGVja2xpc3RJZCxcclxuICAgICAgcGFzc01hcms6IHRoaXMucGFzc0ZhaWxPbiA/IE51bWJlcih0aGlzLnBhc3NUaHJlc2hvbGQpIDogNzUsXHJcbiAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgcGFzc0ZhaWxPbjogdGhpcy5wYXNzRmFpbE9uLFxyXG4gICAgICAgIGRpc3B1dGVPbjogdGhpcy5kaXNwdXRlT24sXHJcbiAgICAgICAgZGlzcHV0ZVdpbmRvdzogdGhpcy5kaXNwdXRlV2luZG93LFxyXG4gICAgICAgIHByZVN1Ym1pc3Npb25BY2Nlc3NPbjogdGhpcy5wcmVTdWJtaXNzaW9uQWNjZXNzT24sXHJcbiAgICAgICAgcHJlU3VibWlzc2lvblVzZXJzOiB0b1N0b3JlZCh0aGlzLnByZVN1Ym1pc3Npb25Vc2VycyksXHJcbiAgICAgICAgZWRpdFN1Ym1pdHRlZE9uOiB0aGlzLmVkaXRTdWJtaXR0ZWRPbixcclxuICAgICAgICBlZGl0VXNlcnM6IHRvU3RvcmVkKHRoaXMuZWRpdFVzZXJzKVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5pc2hTYXZlKHB1Ymxpc2g6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5lc2ModGhpcy5hdWRpdE5hbWUpO1xyXG4gICAgaWYgKHRoaXMuc2NoZWR1bGVBZnRlclNhdmUpIHtcclxuICAgICAgdGhpcy5zY2hlZHVsZUFmdGVyU2F2ZSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChuYW1lICsgKHRoaXMucHVibGlzaGVkID8gJyBzYXZlZC4nIDogJyBzYXZlZCBhcyBkcmFmdC4nKSArICcgSXQgaGFzIG5vIHN0b3JlcyB5ZXQ6IGFkZCBzY2hlZHVsZSByb3dzLCB0aGVuIHB1Ymxpc2ggdGhlIHNjaGVkdWxlIHRvIHB1Ymxpc2ggdGhlIGF1ZGl0LicpO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvdHJheC9hdWRpdC12Mi9tYW5hZ2UnXSwgeyBxdWVyeVBhcmFtczogeyB0YWI6ICdzY2hlZHVsZScsIHNjaGVkdWxlOiAnY3JlYXRlJywgYXVkaXQ6IHRoaXMuY2hlY2tsaXN0SWQgfSB9KTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChwdWJsaXNoKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHRoaXMud2FzUHVibGlzaGVkID8gJ0NoYW5nZXMgdG8gJyArIG5hbWUgKyAnIHNhdmVkIGFuZCBwdWJsaXNoZWQuJyA6IG5hbWUgKyAnIGhhcyBiZWVuIHB1Ymxpc2hlZC4nKTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL3RyYXgvYXVkaXQtdjIvbWFuYWdlJ10pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gQSBkcmFmdCBzYXZlIG5ldmVyIHVucHVibGlzaGVzICh0aGUgQVBJIGtlZXBzIHRoZSBwdWJsaXNoIHN0YXRlKSwgc28gZG8gbm90IGNhbGwgYSBsaXZlIGF1ZGl0IGEgZHJhZnQuXHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KHRoaXMucHVibGlzaGVkID8gJ0NoYW5nZXMgdG8gJyArIG5hbWUgKyAnIHNhdmVkLiBUaGUgYXVkaXQgc3RheXMgcHVibGlzaGVkLicgOiBuYW1lICsgJyBzYXZlZCBhcyBkcmFmdC4nKTtcclxuICAgICAgLy8gUmVsb2FkIHNvIHRoZSBwYWdlIHNob3dzIGV4YWN0bHkgd2hhdCB0aGUgc2VydmVyIGtlcHQuXHJcbiAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbWVzc2FnZSB0byBzaG93IGZvciBhIGZhaWxlZCBjYWxsOiB0aGUgQVBJJ3Mgb3duIHRleHQgZm9yIGEgNHh4IChwcm9kdWN0aW9uIHNlbmRzIGl0IGFzXHJcbiAgICogYGVycm9yYCAodGV4dCBvciB7IG1lc3NhZ2UgfSksIHRoZSBsb2NhbCBkZXYgaGVscGVyIGFzIGBlcnJvcmAgdGV4dCBwbHVzIGBkZXRhaWxzYCksIGVsc2UgYGZhbGxiYWNrYC5cclxuICAgKiA1eHggYm9kaWVzIGNhcnJ5IHJhdyBleGNlcHRpb25zLCBzbyB0aGV5IGdldCB0aGUgZmFsbGJhY2suIGBwcmVmaXhgIGlzIHB1dCBiZWZvcmUgYW4gQVBJIHRleHQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcGlFcnJvcihlOiBhbnksIGZhbGxiYWNrOiBzdHJpbmcsIGVzY2FwZSA9IHRydWUsIHByZWZpeCA9ICcnKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHN0YXR1cyA9IE51bWJlcihlPy5zdGF0dXMpIHx8IDA7XHJcbiAgICBpZiAoc3RhdHVzID09PSA0MDMpIHsgcmV0dXJuICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IG9yIGNoYW5nZSB0aGlzIGF1ZGl0Lic7IH1cclxuICAgIGlmIChzdGF0dXMgPT09IDApIHsgcmV0dXJuIGZhbGxiYWNrID8gJ0NvdWxkIG5vdCByZWFjaCB0aGUgc2VydmVyLiBDaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nIDogJyc7IH1cclxuICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7IHJldHVybiBmYWxsYmFjazsgfVxyXG4gICAgY29uc3QgYm9keSA9IGU/LmVycm9yO1xyXG4gICAgY29uc3QgZXJyID0gYm9keT8uZXJyb3I7XHJcbiAgICBjb25zdCByYXcgPSAodHlwZW9mIGVyciA9PT0gJ3N0cmluZycgPyBlcnIgOiBlcnI/Lm1lc3NhZ2UpIHx8IGJvZHk/LmRldGFpbHM/Lm1lc3NhZ2UgfHwgYm9keT8ubWVzc2FnZSB8fCAnJztcclxuICAgIGNvbnN0IHRleHQgPSBTdHJpbmcocmF3KS50cmltKCk7XHJcbiAgICBpZiAoIXRleHQpIHsgcmV0dXJuIGZhbGxiYWNrOyB9XHJcbiAgICByZXR1cm4gcHJlZml4ICsgKGVzY2FwZSA/IHRoaXMuZXNjKHRleHQpIDogdGV4dCk7XHJcbiAgfVxyXG5cclxuICAvKiogVG9hc3RzIHJlbmRlciB0aGVpciBtZXNzYWdlIGFzIEhUTUwsIHNvIG5hbWVzLCB0eXBlZCB0ZXh0IGFuZCBBUEkgbWVzc2FnZXMgYXJlIGVzY2FwZWQuICovXHJcbiAgcHJpdmF0ZSBlc2ModmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgJ1wiJzogJyZxdW90OycsICdcXCcnOiAnJiMzOTsnIH07XHJcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlID8/ICcnKS5yZXBsYWNlKC9bJjw+XCInXS9nLCBjID0+IG1hcFtjXSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGdldENvbmZpZ0RldGFpbHMgcGF5bG9hZCB3aXRoIHRoaXMgcGFnZSdzIGZpZWxkcyB3cml0dGVuIGJhY2ssIGluIHRoZSBjaGVja2xpc3QncyBvd24gc2hhcGUuICovXHJcbiAgcHJpdmF0ZSBjaGVja2xpc3RQYXlsb2FkKHB1Ymxpc2g6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgY29uc3QgdG9TdG9yZWQgPSAobGlzdDogQ2hpcFVzZXJbXSkgPT4gbGlzdC5tYXAodSA9PiAoeyBuYW1lOiB1Lm4sIHZhbHVlOiB1LmUgfSkpO1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuY29uZmlnRGF0YTtcclxuICAgIGNvbnN0IGQgPSBkYXRhLmNoZWNrTGlzdERldGFpbHM7XHJcblxyXG4gICAgZC5jaGVja0xpc3REZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb24udHJpbSgpO1xyXG4gICAgZC5vd25lciA9IHRvU3RvcmVkKHRoaXMub3duZXJzKTtcclxuICAgIGQuYXBwcm92ZXIgPSB0aGlzLmFwcHJvdmVyT24gPyB0b1N0b3JlZCh0aGlzLmFwcHJvdmVycykgOiBbXTtcclxuICAgIC8vIE1pbnV0ZXMgYmVmb3JlIHRoZSBhdWRpdCBlbmQgdGltZSwgYXMgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBzdG9yZXMgdGhlbS5cclxuICAgIGQucmVtYWluZGVyID0gdGhpcy5yZW1pbmRlck9uID8gWy4uLnRoaXMucmVtaW5kZXJzXSA6IFtdO1xyXG5cclxuICAgIGNvbnN0IG5mVHlwZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAodGhpcy5ub3RpZnlGbGFnc09uICYmIHRoaXMubm90aWZ5U2VuZEFwcHJvdmVyKSB7IG5mVHlwZXMucHVzaCgnYXBwcm92ZXInKTsgfVxyXG4gICAgaWYgKHRoaXMubm90aWZ5RmxhZ3NPbiAmJiB0aGlzLm5vdGlmeVNlbmRDdXN0b20pIHsgbmZUeXBlcy5wdXNoKCdjdXN0b20nKTsgfVxyXG4gICAgZC5ub3RpZnlGbGFncyA9IHsgbm90aWZ5VHlwZTogbmZUeXBlcywgdXNlcnM6IHRoaXMubm90aWZ5RmxhZ3NPbiAmJiB0aGlzLm5vdGlmeVNlbmRDdXN0b20gPyB0b1N0b3JlZCh0aGlzLm5vdGlmeVVzZXJzKSA6IFtdIH07XHJcblxyXG4gICAgY29uc3QgcmZUeXBlczogc3RyaW5nW10gPSBbXTtcclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgdGhpcy5yZWN1cnJpbmdTZW5kQXBwcm92ZXIpIHsgcmZUeXBlcy5wdXNoKCdhcHByb3ZlcicpOyB9XHJcbiAgICBpZiAodGhpcy5yZWN1cnJpbmdGbGFnc09uICYmIHRoaXMucmVjdXJyaW5nU2VuZEN1c3RvbSkgeyByZlR5cGVzLnB1c2goJ2N1c3RvbScpOyB9XHJcbiAgICAvLyBUaGUgc2VydmVyIHJlc29sdmVzICdzYW1lQXNOb3RpZnknIHRvIHRoZSBOb3RpZnkgRmxhZ3MgcmVjaXBpZW50cyB3aGVuIGl0IHNlbmRzIHRoZSBlbWFpbC5cclxuICAgIGlmICh0aGlzLnJlY3VycmluZ0ZsYWdzT24gJiYgdGhpcy5yZWN1cnJpbmdTYW1lQXNOb3RpZnkpIHsgcmZUeXBlcy5wdXNoKCdzYW1lQXNOb3RpZnknKTsgfVxyXG4gICAgY29uc3QgcmZVc2VycyA9IHRoaXMucmVjdXJyaW5nRmxhZ3NPbiAmJiB0aGlzLnJlY3VycmluZ1NlbmRDdXN0b20gPyB0b1N0b3JlZCh0aGlzLnJlY3VycmluZ1VzZXJzKSA6IFtdO1xyXG4gICAgZC5yZWN1cnJpbmdGbGFnID0geyBub3RpZnlUeXBlOiByZlR5cGVzLCB1c2VyczogcmZVc2VycywgdGhyZXNob2xkOiB0aGlzLnJlY3VycmluZ0ZsYWdzT24gPyB0aGlzLnJlY3VycmluZ1RocmVzaG9sZCA6IDAgfTtcclxuXHJcbiAgICBjb25zdCBhZVR5cGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZGFpbHlSZXBvcnRPbiAmJiB0aGlzLmRhaWx5U2VuZEFwcHJvdmVyKSB7IGFlVHlwZXMucHVzaCgnYXBwcm92ZXInKTsgfVxyXG4gICAgaWYgKHRoaXMuZGFpbHlSZXBvcnRPbiAmJiB0aGlzLmRhaWx5U2VuZEN1c3RvbSkgeyBhZVR5cGVzLnB1c2goJ2N1c3RvbScpOyB9XHJcbiAgICBkLmF1dG9FbWFpbCA9IHsgdHlwZTogYWVUeXBlcywgdXNlcnM6IHRoaXMuZGFpbHlTZW5kQ3VzdG9tID8gdG9TdG9yZWQodGhpcy5kYWlseVVzZXJzKSA6IFtdIH07XHJcbiAgICBkLnNoYXJlUmVwb3J0UG9zdEFwcHJvdmFsID0gdGhpcy5kYWlseVJlcG9ydE9uICYmIHRoaXMuc2hhcmVQb3N0QXBwcm92YWw7XHJcblxyXG4gICAgZC5leHBvcnQgPSB0aGlzLmV4cG9ydFN1Ym1pc3Npb25PbjtcclxuICAgIGQucmVkb1ZhbGlkaXR5ID0gdGhpcy5yZWRvVmFsaWRGb3I7XHJcbiAgICBkLmF1dG9DcmVhdGVUYXNrID0gdGhpcy5hdXRvQ3JlYXRlVGFza09uO1xyXG4gICAgZC50YXNrQXNzaWduZWUgPSB0aGlzLnRhc2tBc3NpZ25lZTtcclxuICAgIGQudGFza1ZhbGlkaXR5ID0gTnVtYmVyKHRoaXMudGFza1ZhbGlkaXR5KSB8fCAxMDtcclxuICAgIGQuc2hvd0FwcHJvdmVkUmVzcG9uc2UgPSB0aGlzLnNob3dSZXNwb25zZUluQXBwO1xyXG4gICAgZC5yZXNwb25zZVZpc2liaWxpdHkgPSB0aGlzLnJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3ByZScgPyAncHJlQXBwcm92YWwnIDogJ3Bvc3RBcHByb3ZhbCc7XHJcbiAgICBkLnJlc3BvbnNlVmlzaWJpbGl0eUhvdXJzID0gdGhpcy5yZXNwRGVsYXk7XHJcbiAgICBkLnVzZXJWZXJpZmljYXRpb24gPSB7IHJlcXVpcmVQaG90b0NhcHR1cmU6IHRoaXMucmVxdWlyZVBob3RvLCByZXF1aXJlVXNlckFja25vd2xlZGdtZW50OiB0aGlzLnJlcXVpcmVBY2tub3dsZWRnbWVudCB9O1xyXG4gICAgZC5yZWRvRXh0ZW5zaW9uID0gdGhpcy5yZWRvRXh0ZW5zaW9uO1xyXG5cclxuICAgIC8vIFdoYXQgdGhlIENoZWNrbGlzdCBDb25maWd1cmUgcGFnZSBzZW5kczogZXZlcnlvbmUgY3VycmVudGx5IGFzc2lnbmVkLCBhbmQgdGhlIHB1Ymxpc2ggc3RhdGUuXHJcbiAgICBkLmFzc2lnbmVkVXNlcnMgPSB0aGlzLmFzc2lnbmVkVXNlcnMoKTtcclxuICAgIGQuc3RvcmVDb3VudCA9IGQuYXNzaWduZWRVc2Vycy5sZW5ndGg7XHJcbiAgICBpZiAoIWQuY292ZXJhZ2UpIHsgZC5jb3ZlcmFnZSA9ICdzdG9yZSc7IH1cclxuICAgIGQucHVibGlzaCA9IHB1Ymxpc2ggPyB0cnVlIDogISFkLnB1Ymxpc2g7XHJcblxyXG4gICAgZGF0YS5jbGllbnRJZCA9IHRoaXMuY2xpZW50SWQ7XHJcbiAgICBkYXRhLnN1Ym1pdFR5cGUgPSBwdWJsaXNoID8gJ3B1Ymxpc2gnIDogJ3NhdmUnO1xyXG4gICAgZGF0YS5zaG93RWRpdCA9IGZhbHNlO1xyXG4gICAgZGF0YS51cGRhdGVDb25maWd1cmUgPSBmYWxzZTtcclxuICAgIGRhdGEudGltZVpvbmUgPSBkYXlqcy50ei5ndWVzcygpO1xyXG4gICAgLy8gQXNzaWdubWVudCBkaWZmIGZvciB0aGUgYWN0aXZpdHkgbG9nOyB0aGlzIHBhZ2UgbmV2ZXIgY2hhbmdlcyBhc3NpZ25tZW50cy5cclxuICAgIGRhdGEuYWRkZWQgPSBbXTtcclxuICAgIGRhdGEucmVtb3ZlZCA9IHsgdXNlcjogW10sIHN0b3JlOiBbXSB9O1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhdjItcGFnZSBhdWRpdC1jb25maWd1cmVcIj5cclxuXHJcbiAgPCEtLSBCYWNrICsgYnJlYWRjcnVtYiAoYXMgdGhlIHNjaGVkdWxlIGVkaXRvcidzIGJhY2sgYmFyKSAtLT5cclxuICA8ZGl2IGNsYXNzPVwiY2YtYmFja2JhclwiPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtIGNmLWJhY2tcIiAoY2xpY2spPVwiYmFjaygpXCI+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDYgOSAxMiAxNSAxOFwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgIHt7IGJhY2tMYWJlbCB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtY3J1bWJcIj5cclxuICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwiYmFjaygkZXZlbnQpXCI+TWFuYWdlIEF1ZGl0PC9hPiDigLogQ29uZmlndXJlXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBUaXRsZSArIGFjdGlvbnMgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNmLWhlYWRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNmLWhlYWRlci10ZXh0XCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdGl0bGUgY2Ytc2stdGl0bGVcIiAqbmdJZj1cImxvYWRpbmdcIj48L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjZi10aXRsZVwiICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBhdWRpdE5hbWUgfHwgJ0F1ZGl0JyB9fTwvZGl2PlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImNmLWRlc2NcIiBwbGFjZWhvbGRlcj1cIkVudGVyIEF1ZGl0IERlc2NyaXB0aW9uXCIgWyhuZ01vZGVsKV09XCJkZXNjcmlwdGlvblwiPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGNmLXB1Ymxpc2hcIiBbZGlzYWJsZWRdPVwiIWNhblNhdmVcIiBbdGl0bGVdPVwic2F2ZUJsb2NrZWRSZWFzb24gfHwgcHVibGlzaEJsb2NrZWRSZWFzb25cIiAoY2xpY2spPVwicHVibGlzaCgpXCI+XHJcbiAgICAgIHt7IHNhdmluZyA/ICdTYXZpbmfigKYnIDogKHB1Ymxpc2hlZCA/ICdTYXZlICYgUHVibGlzaCcgOiAnUHVibGlzaCcpIH19XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBjZi1kcmFmdFwiIFtkaXNhYmxlZF09XCIhY2FuU2F2ZVwiIFt0aXRsZV09XCJzYXZlQmxvY2tlZFJlYXNvblwiIChjbGljayk9XCJzYXZlRHJhZnQoKVwiPlNhdmUgYXMgRHJhZnQ8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImNmLWVycm9yIGNmLWVycm9yLS1wYWdlXCIgKm5nSWY9XCJsb2FkRXJyb3JcIj5cclxuICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgIHt7IGxvYWRFcnJvciB9fVxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIENoaXAgcGlja2VyOiBjaGlwcyArIGlucHV0ICsgc3VnZ2VzdGlvbiBsaXN0IChvbmUgdGVtcGxhdGUsIHVzZWQgZm9yIGV2ZXJ5IHVzZXIgbGlzdCkgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNjaGlwUGlja2VyIGxldC1saXN0PVwibGlzdFwiIGxldC1sYXJnZT1cImxhcmdlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2YtY2hpcGJveFwiIFtjbGFzcy5jZi1jaGlwYm94LS1sZ109XCJsYXJnZVwiIFtjbGFzcy5pcy1vcGVuXT1cIm9wZW5DaGlwcyA9PT0gbGlzdFwiIChjbGljayk9XCJmb2N1c0NoaXBzKGxpc3QsICRldmVudClcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGlwXCIgW2NsYXNzLmNmLWNoaXAtLWxnXT1cImxhcmdlXCIgKm5nRm9yPVwibGV0IHUgb2YgY2hpcHNPZihsaXN0KTsgbGV0IGkgPSBpbmRleFwiIFt0aXRsZV09XCJ1LmVcIj5cclxuICAgICAgICA8c3BhbiBbY2xhc3NdPVwibGFyZ2UgPyAnY2YtY2hpcC10YWcnIDogJ2NmLWNoaXAtaW5pJ1wiPnt7IHUuaSB9fTwvc3Bhbj57eyB1Lm4gfX1cclxuICAgICAgICA8YSBjbGFzcz1cImNmLWNoaXAteFwiIChjbGljayk9XCJyZW1vdmVDaGlwKGxpc3QsIGkpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImNmLWNoaXAtaW5wdXRcIiBbY2xhc3MuY2YtY2hpcC1pbnB1dC0tbGddPVwibGFyZ2VcIiBwbGFjZWhvbGRlcj1cIkFkZCB1c2VyLi4uXCJcclxuICAgICAgICBbbmdNb2RlbF09XCJkcmFmdE9mKGxpc3QpXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0RHJhZnQobGlzdCwgJGV2ZW50KVwiIChmb2N1cyk9XCJmb2N1c0NoaXBzKGxpc3QsICRldmVudClcIiAoa2V5dXAuZW50ZXIpPVwiYWRkQ2hpcChsaXN0KVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3VnZ2VzdFwiICpuZ0lmPVwib3BlbkNoaXBzID09PSBsaXN0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN1Z2dlc3QtaXRlbVwiICpuZ0Zvcj1cImxldCB1IG9mIHN1Z2dlc3Rpb25zKGxpc3QpXCIgKGNsaWNrKT1cImFkZFN1Z2dlc3Rpb24obGlzdCwgdSwgJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGlwLWluaVwiPnt7IHUuaSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2Ytc3VnZ2VzdC1uYW1lXCI+e3sgdS5uIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1zdWdnZXN0LW1haWxcIj57eyB1LmUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN1Z2dlc3QtZW1wdHlcIiAqbmdJZj1cIiFzdWdnZXN0aW9ucyhsaXN0KS5sZW5ndGhcIj5cclxuICAgICAgICAgIHt7IHVzZXJzLmxlbmd0aCA/ICdObyBtYXRjaGluZyB1c2VyJyA6ICdObyB1c2VycyBmb3IgdGhpcyBjbGllbnQnIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPCEtLSBEcm9wZG93bjogc3R5bGVkIGxpa2UgdGhlIHByb3RvdHlwZSBpbnN0ZWFkIG9mIHRoZSBicm93c2VyJ3MgbmF0aXZlIHNlbGVjdCAtLT5cclxuICA8bmctdGVtcGxhdGUgI2Ryb3Bkb3duIGxldC1rZXk9XCJrZXlcIiBsZXQtb3B0aW9ucz1cIm9wdGlvbnNcIj5cclxuICAgIDxzcGFuIGNsYXNzPVwiY2Ytc2VsZWN0XCIgW2NsYXNzLmlzLW9wZW5dPVwib3BlblNlbGVjdCA9PT0ga2V5XCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc2VsZWN0LWJ0blwiIChjbGljayk9XCJ0b2dnbGVTZWxlY3Qoa2V5LCAkZXZlbnQpXCI+XHJcbiAgICAgICAge3sgc2VsZWN0TGFiZWwoa2V5LCBvcHRpb25zKSB9fVxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNiA5IDEyIDE1IDE4IDlcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLXNlbGVjdC1tZW51XCIgKm5nSWY9XCJvcGVuU2VsZWN0ID09PSBrZXlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc2VsZWN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgbyBvZiBvcHRpb25zXCIgW2NsYXNzLmlzLW9uXT1cImlzUGlja2VkKGtleSwgbylcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInBpY2soa2V5LCBvLCAkZXZlbnQpXCI+e3sgby5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvc3Bhbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY2YtYm9keVwiICpuZ0lmPVwiIWxvYWRFcnJvclwiPlxyXG4gICAgPCEtLSBTZWN0aW9uIHRyZWUgLS0+XHJcbiAgICA8IS0tIFRoZSB3aGl0ZSBjYXJkIHJ1bnMgdGhlIGZ1bGwgaGVpZ2h0IGJlc2lkZSB0aGUgY29uZmlndXJhdGlvbjsgdGhlIHRyZWUgaW5zaWRlIHN0YXlzIGluIHZpZXcgKHN0aWNreSkuIC0tPlxyXG4gICAgPGFzaWRlIGNsYXNzPVwiY2YtbGVmdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtbGVmdC1pbm5lclwiPlxyXG4gICAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJsb2FkaW5nXCIgW3Jvd3NdPVwiM1wiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLWxlZnQtdGl0bGVcIj57eyBhdWRpdE5hbWUgfHwgJ0F1ZGl0JyB9fTwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIiAqbmdJZj1cIiFzZWN0aW9ucy5sZW5ndGhcIj5ObyBxdWVzdGlvbnMgeWV0PC9kaXY+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHMgb2Ygc2VjdGlvbnNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc2VjdGlvblwiIFtjbGFzcy5pcy1vcGVuXT1cInMub3BlblwiIChjbGljayk9XCJ0b2dnbGVTZWN0aW9uKHMpXCI+XHJcbiAgICAgICAgICB7eyBzLmxhYmVsIH19XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJ1bGVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZXZcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBbY2xhc3Mucm90YXRlXT1cIiFzLm9wZW5cIj5cclxuICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNiA5IDEyIDE1IDE4IDlcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaXRlbXNcIiAqbmdJZj1cInMub3BlbiAmJiBzLml0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXQgb2Ygcy5pdGVtc1wiPnt7IGl0IH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLSBObyBTY2hlZHVsZSBibG9jayAoUUEgMTAgT2N0KTogYXVkaXRzIGhhdmUgbm8gb25lLXRpbWUgLyByZXBlYXQgc2NoZWR1bGUgaGVyZTsgdmlzaXRzIGNvbWUgZnJvbSBTY2hlZHVsZXMuIC0tPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2FzaWRlPlxyXG5cclxuICAgIDwhLS0gQ29uZmlndXJhdGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjZi1yaWdodFwiPlxyXG5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjZi1jYXJkXCIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyIFtyb3dzXT1cIjRcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuXHJcbiAgICAgIDwhLS0gPT09PT0gQWR2YW5jZSBDb25maWd1cmF0aW9uID09PT09IC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNmLWNhcmRcIj5cclxuICAgICAgICA8IS0tIEFjY29yZGlvbjogdGhlIGhlYWRlciAodGl0bGUsIHJ1bGUgb3IgYXJyb3cpIGZvbGRzIHRoZSBzZXR0aW5ncyBiZWxvdzsgdGhleSBzdGF5IG9uIHRoZSBwYWdlIHdoaWxlIGZvbGRlZC4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJsb2NrLWhlYWQgY2YtYmxvY2staGVhZC0tdG9nZ2xlXCIgcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PVwiMFwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiYWR2T3BlblwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYWR2T3BlbiA9ICFhZHZPcGVuXCIgKGtleWRvd24uZW50ZXIpPVwiYWR2T3BlbiA9ICFhZHZPcGVuXCIgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGFkdk9wZW4gPSAhYWR2T3BlblwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1ibG9jay10aXRsZVwiPkFkdmFuY2UgQ29uZmlndXJhdGlvbjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcnVsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hldlwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIFtjbGFzcy5yb3RhdGVdPVwiIWFkdk9wZW5cIj48cG9seWxpbmUgcG9pbnRzPVwiNiA5IDEyIDE1IDE4IDlcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYWR2LWJvZHlcIiBbaGlkZGVuXT1cIiFhZHZPcGVuXCI+XHJcbiAgICAgICAgPCEtLSBBdWRpdCBPd25lciAtLT5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsXCI+QXVkaXQgT3duZXI8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+T3duZXJzIGdldCBhY2Nlc3MgdG8gbWFuYWdlIHRoZSBhdWRpdDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1yb3dcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtZmllbGRcIj5DYW4gYmUgbWFuYWdlZCBieTwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwUGlja2VyOyBjb250ZXh0OiB7IGxpc3Q6ICdvd25lcnMnLCBsYXJnZTogZmFsc2UgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEFwcHJvdmVyIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+QXBwcm92ZXI8L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJhcHByb3Zlck9uXCIgKGNsaWNrKT1cInRvZ2dsZUFwcHJvdmVyKClcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5CeSBlbmFibGluZywgdGhlIHVzZXJzIHdpbGwgYmUgYWJsZSB0byBhcHByb3ZlIHRoZSBhdWRpdDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1yb3dcIiAqbmdJZj1cImFwcHJvdmVyT25cIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtZmllbGRcIj5UbyBiZSBhcHByb3ZlZCBieTwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwUGlja2VyOyBjb250ZXh0OiB7IGxpc3Q6ICdhcHByb3ZlcnMnLCBsYXJnZTogZmFsc2UgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1lcnJvclwiICpuZ0lmPVwiYXBwcm92ZXJFcnJvclwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAge3sgYXBwcm92ZXJFcnJvciB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmZvIGNmLWluZm8tLXdyYXBcIiAqbmdJZj1cIiFhcHByb3Zlck9uICYmIGFwcHJvdmVycy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgQXBwcm92ZXIgaXMgb2ZmLCBzbyB0aGUge3sgYXBwcm92ZXJzLmxlbmd0aCB9fSBhcHByb3Zlcnt7IGFwcHJvdmVycy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJyB9fSBhZGRlZCB3aWxsIGJlIHJlbW92ZWQgd2hlbiB5b3Ugc2F2ZS4gVHVybiBBcHByb3ZlciBiYWNrIG9uIHRvIGtlZXAge3sgYXBwcm92ZXJzLmxlbmd0aCA9PT0gMSA/ICdpdCcgOiAndGhlbScgfX0uXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWluZm8gY2YtaW5mby0td3JhcFwiICpuZ0lmPVwiIWFwcHJvdmVyT24gJiYgIWFwcHJvdmVycy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyLjAxXCIgeTI9XCI4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgQXBwcm92ZXIgaXMgb2ZmLCBzbyBzdWJtaXR0ZWQgYXVkaXRzIGFyZSBub3Qgc2VudCBmb3IgYXBwcm92YWwuIFR1cm4gaXQgb24gdG8gYWRkIGFwcHJvdmVycyBvciB0byBzZW5kIGZsYWdzIGFuZCByZXBvcnRzIHRvIHRoZW0uXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUmVtaW5kZXIgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5SZW1pbmRlcjwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cInJlbWluZGVyT25cIiAoY2xpY2spPVwidG9nZ2xlUmVtaW5kZXIoKVwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPkJ5IGVuYWJsaW5nLCB0aGUgdXNlcnMgd2lsbCBiZSByZW1pbmRlZCBpbiB0aGUgc2VsZWN0ZWQgaW50ZXJ2YWw8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5uZXJcIiAqbmdJZj1cInJlbWluZGVyT25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmxpbmVcIj5cclxuICAgICAgICAgICAgTm90aWZ5IHVzZXIgYmVmb3JlXHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcmVtaW5kZXJcIiAqbmdGb3I9XCJsZXQgbSBvZiByZW1pbmRlcnM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImNmLXJlbWluZGVyLXNlbGVjdFwiIFt2YWx1ZV09XCJtXCIgW29wdGlvbnNdPVwicmVtaW5kZXJPcHRzW2ldIHx8IFtdXCIgW3NlYXJjaGFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW2FyaWFMYWJlbF09XCInUmVtaW5kZXIgJyArIChpICsgMSkgKyAnIGluIG1pbnV0ZXMnXCIgKGNoYW5nZWQpPVwic2V0UmVtaW5kZXIoaSwgJGV2ZW50LnRhcmdldC52YWx1ZSlcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjZi1jaGlwLXhcIiAqbmdJZj1cInJlbWluZGVycy5sZW5ndGggPiAxXCIgdGl0bGU9XCJSZW1vdmUgcmVtaW5kZXJcIiAoY2xpY2spPVwicmVtb3ZlUmVtaW5kZXIoaSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLWljb24tYnRuXCIgKm5nSWY9XCJyZW1pbmRlcnMubGVuZ3RoIDwgbWF4UmVtaW5kZXJzXCIgdGl0bGU9XCJBZGQgcmVtaW5kZXJcIiAoY2xpY2spPVwiYWRkUmVtaW5kZXIoKVwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48bGluZSB4MT1cIjEyXCIgeTE9XCI1XCIgeDI9XCIxMlwiIHkyPVwiMTlcIj48L2xpbmU+PGxpbmUgeDE9XCI1XCIgeTE9XCIxMlwiIHgyPVwiMTlcIiB5Mj1cIjEyXCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWluZm9cIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgU2VuZCBhbGVydHMge3sgcmVtaW5kZXJTdW1tYXJ5IH19IG1pbnMgYmVmb3JlIHRoZSBhdWRpdCBlbmQgdGltZVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gTm90aWZ5IEZsYWdzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+Tm90aWZ5IEZsYWdzPC9zcGFuPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwibm90aWZ5RmxhZ3NPblwiIChjbGljayk9XCJ0b2dnbGVOb3RpZnlGbGFncygpXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+QnkgZW5hYmxpbmcsIGFsbCBmbGFncyB3aWxsIGJlIHNlbnQgYXMgYW4gZW1haWw8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm90aWZ5RmxhZ3NPblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWNoZWNrc1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrcy1sYWJlbFwiPlNlbmQgVG88L3NwYW4+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLWNoZWNrXCIgW2NsYXNzLmlzLWJsb2NrZWRdPVwiIWhhc0FwcHJvdmVycyAmJiAhbm90aWZ5U2VuZEFwcHJvdmVyXCIgKGNsaWNrKT1cInRvZ2dsZVNlbmRBcHByb3Zlcignbm90aWZ5U2VuZEFwcHJvdmVyJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJub3RpZnlTZW5kQXBwcm92ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJub3RpZnlTZW5kQXBwcm92ZXJcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+QXBwcm92ZXJcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiAoY2xpY2spPVwibm90aWZ5U2VuZEN1c3RvbSA9ICFub3RpZnlTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVjay1ib3hcIiBbY2xhc3MuaXMtb25dPVwibm90aWZ5U2VuZEN1c3RvbVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIm5vdGlmeVNlbmRDdXN0b21cIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+Q3VzdG9tXHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub3RpZnlTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjaGlwUGlja2VyOyBjb250ZXh0OiB7IGxpc3Q6ICdub3RpZnlVc2VycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1lcnJvclwiICpuZ0lmPVwibm90aWZ5RmxhZ3NFcnJvclwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxNlwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgbm90aWZ5RmxhZ3NFcnJvciB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gTm90aWZ5IG9uIFJlY3VycmluZyBGbGFncyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPk5vdGlmeSBvbiBSZWN1cnJpbmcgRmxhZ3M8L3NwYW4+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJyZWN1cnJpbmdGbGFnc09uXCIgKGNsaWNrKT1cInRvZ2dsZVJlY3VycmluZ0ZsYWdzKClcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5XaGVuIGVuYWJsZWQsIGVtYWlscyBhcmUgc2VudCBmb3IgcmVjdXJyaW5nIGZsYWdzIGJhc2VkIG9uIHRoZSBjb25maWd1cmVkIHRocmVzaG9sZDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5uZXJcIiAqbmdJZj1cInJlY3VycmluZ0ZsYWdzT25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmxpbmVcIj5cclxuICAgICAgICAgICAgU2VuZCBFbWFpbCBpZiB0aGUgc2FtZSBxdWVzdGlvbiBpcyBmbGFnZ2VkXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bjsgY29udGV4dDogeyBrZXk6ICdyZWN1cnJpbmdUaHJlc2hvbGQnLCBvcHRpb25zOiB0aHJlc2hvbGRPcHRzIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgdGltZXMgYnkgdGhlIHNhbWUgc3RvcmVcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWluZm9cIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgT25jZSB0aGUgdGhyZXNob2xkIGlzIHJlYWNoZWQgYW5kIGFuIGVtYWlsIGlzIHNlbnQsIHRoZSBmbGFnIGNvdW50IHJlc2V0cyB0byB6ZXJvXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjdXJyaW5nRmxhZ3NPblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWNoZWNrc1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrcy1sYWJlbFwiPlNlbmQgVG88L3NwYW4+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLWNoZWNrXCIgW2NsYXNzLmlzLWJsb2NrZWRdPVwiIWhhc0FwcHJvdmVycyAmJiAhcmVjdXJyaW5nU2VuZEFwcHJvdmVyXCIgKGNsaWNrKT1cInRvZ2dsZVNlbmRBcHByb3ZlcigncmVjdXJyaW5nU2VuZEFwcHJvdmVyJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJyZWN1cnJpbmdTZW5kQXBwcm92ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJyZWN1cnJpbmdTZW5kQXBwcm92ZXJcIiB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+QXBwcm92ZXJcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiAoY2xpY2spPVwidG9nZ2xlUmVjdXJyaW5nQ3VzdG9tKClcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrLWJveFwiIFtjbGFzcy5pcy1vbl09XCJyZWN1cnJpbmdTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicmVjdXJyaW5nU2VuZEN1c3RvbVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5DdXN0b21cclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2YtY2hlY2tcIiAoY2xpY2spPVwicmVjdXJyaW5nU2FtZUFzTm90aWZ5ID0gIXJlY3VycmluZ1NhbWVBc05vdGlmeVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cInJlY3VycmluZ1NhbWVBc05vdGlmeVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInJlY3VycmluZ1NhbWVBc05vdGlmeVwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5Vc2Ugc2FtZSB1c2VycyBmcm9tIE5vdGlmeSBGbGFnc1xyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjdXJyaW5nU2VuZEN1c3RvbVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hpcFBpY2tlcjsgY29udGV4dDogeyBsaXN0OiAncmVjdXJyaW5nVXNlcnMnLCBsYXJnZTogZmFsc2UgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5mb1wiICpuZ0lmPVwicmVjdXJyaW5nU2FtZUFzTm90aWZ5XCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IG5vdGlmeVJlY2lwaWVudHNMYWJlbCB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3JcIiAqbmdJZj1cInJlY3VycmluZ0ZsYWdzRXJyb3JcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IHJlY3VycmluZ0ZsYWdzRXJyb3IgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIERhaWx5IHJlcG9ydCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPkVuYWJsZSAtIERhaWx5IFJlcG9ydDwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cImRhaWx5UmVwb3J0T25cIiAoY2xpY2spPVwidG9nZ2xlRGFpbHlSZXBvcnQoKVwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPkJ5IEVuYWJsaW5nLCBjb21wbGlhbmNlIHNjb3JlIHdpbGwgYmUgc2VudCBhcyBhbiBlbWFpbCB0byB0aGUgYWJvdmUgdXNlcnM8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGFpbHlSZXBvcnRPblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWNoZWNrc1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNoZWNrcy1sYWJlbFwiPlNlbmQgVG88L3NwYW4+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLWNoZWNrXCIgW2NsYXNzLmlzLWJsb2NrZWRdPVwiIWhhc0FwcHJvdmVycyAmJiAhZGFpbHlTZW5kQXBwcm92ZXJcIiAoY2xpY2spPVwidG9nZ2xlU2VuZEFwcHJvdmVyKCdkYWlseVNlbmRBcHByb3ZlcicpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVjay1ib3hcIiBbY2xhc3MuaXMtb25dPVwiZGFpbHlTZW5kQXBwcm92ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkYWlseVNlbmRBcHByb3ZlclwiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5BcHByb3ZlclxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjZi1jaGVja1wiIChjbGljayk9XCJkYWlseVNlbmRDdXN0b20gPSAhZGFpbHlTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaGVjay1ib3hcIiBbY2xhc3MuaXMtb25dPVwiZGFpbHlTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZGFpbHlTZW5kQ3VzdG9tXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPkN1c3RvbVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGFpbHlTZW5kQ3VzdG9tXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1idWxrYmFyXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgKGNsaWNrKT1cIm9wZW5EYWlseUJ1bGsoKVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0xNy41IDEyLjVWMTUuODMzM0MxNy41IDE2LjI3NTQgMTcuMzI0NCAxNi42OTkzIDE3LjAxMTggMTcuMDExOEMxNi42OTkzIDE3LjMyNDQgMTYuMjc1NCAxNy41IDE1LjgzMzMgMTcuNUg0LjE2NjY3QzMuNzI0NjQgMTcuNSAzLjMwMDcyIDE3LjMyNDQgMi45ODgxNiAxNy4wMTE4QzIuNjc1NTkgMTYuNjk5MyAyLjUgMTYuMjc1NCAyLjUgMTUuODMzM1YxMi41TTE0LjE2NjcgNi42NjY2N0wxMCAyLjVNMTAgMi41TDUuODMzMzMgNi42NjY2N00xMCAyLjVWMTIuNVwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgICAgICAgIEJ1bGsgVXBsb2FkXHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hpcFBpY2tlcjsgY29udGV4dDogeyBsaXN0OiAnZGFpbHlVc2VycycsIGxhcmdlOiBmYWxzZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLWNoZWNrXCIgKGNsaWNrKT1cInNoYXJlUG9zdEFwcHJvdmFsID0gIXNoYXJlUG9zdEFwcHJvdmFsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hlY2stYm94XCIgW2NsYXNzLmlzLW9uXT1cInNoYXJlUG9zdEFwcHJvdmFsXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInNoYXJlUG9zdEFwcHJvdmFsXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+U2hhcmUgUmVwb3J0IFBvc3QgQXBwcm92YWxcclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3JcIiAqbmdJZj1cImRhaWx5UmVwb3J0RXJyb3JcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IGRhaWx5UmVwb3J0RXJyb3IgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEV4cG9ydCBzdWJtaXNzaW9uOiBUYW5nbyB1c2VycyBvbmx5LCBhcyB0aGUgdjEgQ29uZmlndXJlIChpdHMgc3RvcmVkIHZhbHVlIGlzIGtlcHQgZm9yIGV2ZXJ5b25lIGVsc2UpLiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZ3JpZDJcIiAqbmdJZj1cImFjY2Vzcy5pc1RhbmdvXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXRpZ2h0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi10b2dnbGUtcm93XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPkV4cG9ydCBTdWJtaXNzaW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cImV4cG9ydFN1Ym1pc3Npb25PblwiIChjbGljayk9XCJleHBvcnRTdWJtaXNzaW9uT24gPSAhZXhwb3J0U3VibWlzc2lvbk9uXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5FbmFibGUgdGhpcyB0byBhbGxvdyBhdWRpdCBzdWJtaXR0ZXJzIHRvIGRvd25sb2FkIHRoZWlyIHN1Ym1pc3Npb24gYXMgYSBQREYgZmlsZTwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUmVkbyB2YWxpZGl0eSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZ3JpZDJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFja1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWxcIj5SZWRvIFZhbGlkaXR5PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmxpbmVcIj5cclxuICAgICAgICAgICAgICBSZWRvIHZhbGlkIGZvclxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bjsgY29udGV4dDogeyBrZXk6ICdyZWRvVmFsaWRGb3InLCBvcHRpb25zOiByZWRvRGF5T3B0cyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgRGF5IGZyb20gUmVkbyBjcmVhdGlvblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEF1dG8gY3JlYXRlIHRhc2sgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtbGFiZWxcIj5BdXRvIENyZWF0ZSBUYXNrIGZvciBGbGFnczwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoXCIgW2NsYXNzLmlzLW9uXT1cImF1dG9DcmVhdGVUYXNrT25cIiAoY2xpY2spPVwiYXV0b0NyZWF0ZVRhc2tPbiA9ICFhdXRvQ3JlYXRlVGFza09uXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXRpZ2h0XCI+QnkgZW5hYmxpbmcsIGEgdGFzayBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZm9yIGV2ZXJ5IGZsYWdnZWQgcXVlc3Rpb24gaW4gdGhlIGF1ZGl0PC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gV2hvIGdldHMgdGhlIHRhc2sgYW5kIGhvdyBsb25nIGl0IHN0YXlzIG9wZW4gKGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UpIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1hdXRvdGFza1wiICpuZ0lmPVwiYXV0b0NyZWF0ZVRhc2tPblwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWF1dG90YXNrLXRpdGxlXCI+VGFzayBBc3NpZ25lZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0tdGlnaHRcIj5DaG9vc2Ugd2hvIHRoZSBmbGFnZ2VkIHRhc2sgaXMgYXNzaWduZWQgdG88L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1hdXRvdGFzay1jaG9pY2VzXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2YtY2hvaWNlXCIgW2NsYXNzLmlzLW9uXT1cInRhc2tBc3NpZ25lZSA9PT0gJ3N1Ym1pdHRlcidcIiAoY2xpY2spPVwidGFza0Fzc2lnbmVlID0gJ3N1Ym1pdHRlcidcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cInRhc2tBc3NpZ25lZSA9PT0gJ3N1Ym1pdHRlcidcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hvaWNlLXRleHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtY2hvaWNlLXRpdGxlXCI+QXVkaXQgU3VibWl0dGVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1jaG9pY2Utc3ViXCI+VGFzayBpcyBhc3NpZ25lZCB0byB0aGUgdXNlciB3aG8gZmlsbGVkIHRoZSBhdWRpdDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLWNob2ljZVwiIFtjbGFzcy5pcy1vbl09XCJ0YXNrQXNzaWduZWUgPT09ICdzdG9yZSdcIiAoY2xpY2spPVwidGFza0Fzc2lnbmVlID0gJ3N0b3JlJ1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwidGFza0Fzc2lnbmVlID09PSAnc3RvcmUnXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNob2ljZS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNob2ljZS10aXRsZVwiPlN0b3JlIFVzZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWNob2ljZS1zdWJcIj5UYXNrIGlzIGFzc2lnbmVkIHRvIHRoZSB1c2VyIG1hcHBlZCB0byB0aGUgZmxhZ2dlZCBzdG9yZTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYXV0b3Rhc2stdGl0bGVcIj5UYXNrIFZhbGlkaXR5PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYXV0b3Rhc2stdmFsaWRpdHlcIj5cclxuICAgICAgICAgICAgPHNwYW4+VGFzayB2YWxpZCBmb3I8L3NwYW4+XHJcbiAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiY2YtdmFsaWRpdHktc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJ0YXNrVmFsaWRpdHlcIiBbb3B0aW9uc109XCJ0YXNrVmFsaWRpdHlPcHRpb25zXCJcclxuICAgICAgICAgICAgICBbc2VhcmNoYWJsZV09XCJmYWxzZVwiIGFyaWFMYWJlbD1cIlRhc2sgdmFsaWRpdHkgaW4gZGF5c1wiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgPHNwYW4+ZGF5cyBmcm9tIHRhc2sgY3JlYXRpb248L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9zZWN0aW9uPlxyXG5cclxuICAgICAgPCEtLSA9PT09PSBBdWRpdCBDb25maWd1cmF0aW9uID09PT09IC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtZGl2aWRlci1oZWFkXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1ibG9jay10aXRsZVwiPkF1ZGl0IENvbmZpZ3VyYXRpb248L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1ydWxlXCI+PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2YtY2FyZCBjZi1jYXJkLS1sZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ibG9jay10aXRsZVwiPlN1Ym1pc3Npb24gJmFtcDsgVmlzaWJpbGl0eTwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIGNmLWJveC0tb3BlbjogdGhlIGRpc3B1dGUtd2luZG93IGFuZCByZXNwb25zZS1kZWxheSBtZW51cyBtdXN0IG5vdCBiZSBjbGlwcGVkIGJ5IHRoZSBib3ggLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLW9wZW5cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ib3gtcm93XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2Ytc3dpdGNoIGNmLXN3aXRjaC0tdG9wXCIgW2NsYXNzLmlzLW9uXT1cInNob3dSZXNwb25zZUluQXBwXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1Jlc3BvbnNlSW5BcHAgPSAhc2hvd1Jlc3BvbnNlSW5BcHBcIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0teHNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWxcIj5TaG93IFJlc3BvbnNlIGluIE1vYmlsZSBBcHA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPkJ5IGVuYWJsaW5nIHRoaXMgb3B0aW9uLCBzdG9yZSB1c2VycyBjYW4gdmlldyB0aGUgYXVkaXQgcmVzcG9uc2UgaW4gdGhlIE1vYmlsZSBBcHAuPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveC1zdWJcIiAqbmdJZj1cInNob3dSZXNwb25zZUluQXBwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0teHNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWwtc21cIj5SZXNwb25zZSBWaXNpYmlsaXR5PC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnRcIj5DaG9vc2Ugd2hlbiB0aGUgcmVzcG9uc2UgYmVjb21lcyB2aXNpYmxlIHRvIHN0b3JlIHVzZXJzPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLW9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cInJlc3BvbnNlVmlzaWJpbGl0eSA9PT0gJ3ByZSdcIiAoY2xpY2spPVwicmVzcG9uc2VWaXNpYmlsaXR5ID0gJ3ByZSdcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwicmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncHJlJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2sgY2Ytc3RhY2stLXNtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbC1zbVwiPlByZS1hcHByb3ZhbDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludFwiPlRoZSBhdWRpdCByZXNwb25zZSB3aWxsIGJlIHZpc2libGUgdG8gc3RvcmUgdXNlcnMgYmVmb3JlIGl0IGlzIGFwcHJvdmVkLjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaW5saW5lIGNmLWlubGluZS0tdG9wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgU2hvdyByZXNwb25zZVxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bjsgY29udGV4dDogeyBrZXk6ICdyZXNwRGVsYXknLCBvcHRpb25zOiByZXNwRGVsYXlPcHRzIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICBhZnRlciBzdWJtaXNzaW9uXHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJyZXNwb25zZVZpc2liaWxpdHkgPT09ICdwb3N0J1wiIChjbGljayk9XCJyZXNwb25zZVZpc2liaWxpdHkgPSAncG9zdCdcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwicmVzcG9uc2VWaXNpYmlsaXR5ID09PSAncG9zdCdcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS1zbVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWwtc21cIiBbY2xhc3MuY2YtbXV0ZWRdPVwicmVzcG9uc2VWaXNpYmlsaXR5ICE9PSAncG9zdCdcIj5Qb3N0LWFwcHJvdmFsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+T25jZSB0aGUgcmVzcG9uc2UgaXMgYXBwcm92ZWQsIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNwbGF5ZWQgaW4gdGhlIE1vYmlsZSBBcHAuIFN0b3JlIHVzZXJzIGNhbm5vdCByYWlzZSBhIGRpc3B1dGUuPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94LXNlcFwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZXNwb25zZVZpc2liaWxpdHkgPT09ICdwcmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94LXJvdyBjZi1ib3gtcm93LS1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaCBjZi1zd2l0Y2gtLXRvcFwiIFtjbGFzcy5pcy1vbl09XCJkaXNwdXRlT25cIiAoY2xpY2spPVwiZGlzcHV0ZU9uID0gIWRpc3B1dGVPblwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS14c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1sYWJlbC1zbVwiPkRpc3B1dGUgQ29uZmlndXJhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXdyYXBcIj5XaGVuIGVuYWJsZWQsIHRoZSBzdG9yZSB0ZWFtIGNhbiByYWlzZSBhIGRpc3B1dGUgYWdhaW5zdCB0aGUgYXVkaXRvcidzIHN1Ym1pc3Npb24gb25jZSB0aGUgcmVzcG9uc2UgYmVjb21lcyB2aXNpYmxlIHRvIHRoZW0uPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94IGNmLWJveC0tbmVzdGVkXCIgKm5nSWY9XCJkaXNwdXRlT25cIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIERpc3B1dGUgd2luZG93XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3duOyBjb250ZXh0OiB7IGtleTogJ2Rpc3B1dGVXaW5kb3cnLCBvcHRpb25zOiBkaXNwV2luZG93T3B0cyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSB3aGVuIHRoZSByZXNwb25zZSBiZWNvbWVzIHZpc2libGVcclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1pbmZvIGNmLWluZm8tLXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgRGlzcHV0ZXMgcmFpc2VkIGluc2lkZSB0aGlzIHdpbmRvdyBnbyB0byB0aGUgYXBwcm92ZXIuIEFwcHJvdmVkIGRpc3B1dGVzIHJldmlzZSB0aGUgYW5zd2VyIGFuZCB0aGUgY29tcGxpYW5jZSBzY29yZS5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1lcnJvclwiICpuZ0lmPVwiIWhhc0FwcHJvdmVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgTm8gYXBwcm92ZXIgaXMgc2V0LCBzbyBubyBvbmUgY2FuIHJldmlldyBkaXNwdXRlcy4gVHVybiBvbiBBcHByb3ZlciBhbmQgYWRkIGFuIGFwcHJvdmVyLlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZXNwb25zZVZpc2liaWxpdHkgPT09ICdwb3N0J1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXN0YWNrIGNmLXN0YWNrLS1zbVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtbGFiZWwtc20gY2YtbXV0ZWRcIj5EaXNwdXRlIENvbmZpZ3VyYXRpb248L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWluZm8gY2YtaW5mby0td3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBEaXNwdXRlcyBhcmUgbm90IGF2YWlsYWJsZSB3aGVuIHJlc3BvbnNlcyBhcmUgc2hvd24gcG9zdC1hcHByb3ZhbC5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBQcmUtc3VibWlzc2lvbiBhY2Nlc3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWJveCBjZi1ib3gtLXBhZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPlByZS1TdWJtaXNzaW9uIEFjY2Vzczwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjZi1zd2l0Y2hcIiBbY2xhc3MuaXMtb25dPVwicHJlU3VibWlzc2lvbkFjY2Vzc09uXCIgKGNsaWNrKT1cInByZVN1Ym1pc3Npb25BY2Nlc3NPbiA9ICFwcmVTdWJtaXNzaW9uQWNjZXNzT25cIj48c3Bhbj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50IGNmLWhpbnQtLXdyYXBcIj5Vc2VycyBhZGRlZCBoZXJlIGNhbiB2aWV3IE9wZW4gYW5kIEluIFByb2dyZXNzIGF1ZGl0cyB1bnRpbCBzdWJtaXNzaW9uLiBUaGUgU2NoZWR1bGUgSW5mbyB0YWIgaXMgYWxzbyB2aXNpYmxlIG9ubHkgdG8gdGhlc2UgdXNlcnMuPC9kaXY+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJlU3VibWlzc2lvbkFjY2Vzc09uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1yb3cgY2Ytcm93LS10b3BcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWZpZWxkXCI+VmlzaWJsZSB0bzwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hpcFBpY2tlcjsgY29udGV4dDogeyBsaXN0OiAncHJlU3VibWlzc2lvblVzZXJzJywgbGFyZ2U6IGZhbHNlIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1lcnJvciBjZi1lcnJvci0taW5kZW50XCIgKm5nSWY9XCJwcmVTdWJtaXNzaW9uRW1wdHlcIj5cclxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIEFkZCBhdCBsZWFzdCBvbmUgdXNlclxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8IS0tID09PT09IFNjb3JpbmcgPT09PT0gLS0+XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2YtY2FyZCBjZi1jYXJkLS1sZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ibG9jay10aXRsZVwiPlNjb3Jpbmc8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94IGNmLWJveC0tcGFkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtdG9nZ2xlLXJvd1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWxhYmVsXCI+UGFzcy9GYWlsIFNjb3JlIFNldHVwPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJwYXNzRmFpbE9uXCIgKGNsaWNrKT1cInBhc3NGYWlsT24gPSAhcGFzc0ZhaWxPblwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWhpbnQgY2YtaGludC0td3JhcFwiPlNldCB0aGUgY29tcGxpYW5jZSBzY29yZSBhbiBhdWRpdCBtdXN0IHJlYWNoIHRvIGJlIG1hcmtlZCB7eyBwYXNzTGFiZWwgfX0uIEFueXRoaW5nIGJlbG93IGl0IGlzIG1hcmtlZCB7eyBmYWlsTGFiZWwgfX0uPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytcm93IGNmLXJvdy0td3JhcCBjZi1yb3ctLXRvcFwiICpuZ0lmPVwicGFzc0ZhaWxPblwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNmLWZpZWxkXCI+TWluaW11bSBzY29yZSB0byB7eyBwYXNzTGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNmLW51bVwiPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIG1heD1cIjEwMFwiIFsobmdNb2RlbCldPVwicGFzc1RocmVzaG9sZFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuPiU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2YtcGlsbCBjZi1waWxsLS1wYXNzXCI+e3sgcGFzc0xhYmVsIH19IOKJpSB7eyBwYXNzVGhyZXNob2xkIH19JTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1waWxsIGNmLXBpbGwtLWZhaWxcIj57eyBmYWlsTGFiZWwgfX0gJmx0OyB7eyBwYXNzVGhyZXNob2xkIH19JTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8IS0tID09PT09IEFwcHJvdmVyIENvbnRyb2xzID09PT09IC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImNmLWNhcmQgY2YtY2FyZC0tbGdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYmxvY2stdGl0bGVcIj5BcHByb3ZlciBDb250cm9sczwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFja1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNmLXRvZ2dsZS1yb3dcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZi1sYWJlbFwiPkVkaXQgU3VibWl0dGVkIEF1ZGl0PC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaFwiIFtjbGFzcy5pcy1vbl09XCJlZGl0U3VibWl0dGVkT25cIiAoY2xpY2spPVwidG9nZ2xlRWRpdFN1Ym1pdHRlZCgpXCI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtaGludCBjZi1oaW50LS10aWdodFwiPkFsbG93IEFwcHJvdmVycyB0byBlZGl0IHN1Ym1pdHRlZCBBdWRpdDwvZGl2PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRTdWJtaXR0ZWRPblwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hpcFBpY2tlcjsgY29udGV4dDogeyBsaXN0OiAnZWRpdFVzZXJzJywgbGFyZ2U6IHRydWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3JcIiAqbmdJZj1cImVkaXRTdWJtaXR0ZWRFcnJvclwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTJcIiB5Mj1cIjEyXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTZcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAge3sgZWRpdFN1Ym1pdHRlZEVycm9yIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNmLWdyaWQyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2Ytc3RhY2tcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsXCI+UmVkbyBFeHRlbnNpb248L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWlubGluZVwiPlxyXG4gICAgICAgICAgICAgIEV4dGVuZCByZWRvIHVwIHRvXHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3duOyBjb250ZXh0OiB7IGtleTogJ3JlZG9FeHRlbnNpb24nLCBvcHRpb25zOiByZWRvRXh0ZW5zaW9uT3B0cyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgRGF5cyB0aWxsIGFwcHJvdmFsXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDwhLS0gPT09PT0gVXNlciBWZXJpZmljYXRpb24gPT09PT0gLS0+XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2YtY2FyZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1ibG9jay10aXRsZVwiPlVzZXIgVmVyaWZpY2F0aW9uIENvbmZpZ3VyYXRpb248L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94IGNmLWJveC0tcm93XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaCBjZi1zd2l0Y2gtLXRvcFwiIFtjbGFzcy5pcy1vbl09XCJyZXF1aXJlUGhvdG9cIiAoY2xpY2spPVwicmVxdWlyZVBob3RvID0gIXJlcXVpcmVQaG90b1wiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0teHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsXCI+UmVxdWlyZSBQaG90byBDYXB0dXJlPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+QnkgZW5hYmxpbmcsIHVzZXJzIG11c3QgY2FwdHVyZSB0aGVpciBwaG90byB0byBjb21wbGV0ZSBzdWJtaXNzaW9uPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2YtYm94IGNmLWJveC0tcm93XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNmLXN3aXRjaCBjZi1zd2l0Y2gtLXRvcFwiIFtjbGFzcy5pcy1vbl09XCJyZXF1aXJlQWNrbm93bGVkZ21lbnRcIiAoY2xpY2spPVwicmVxdWlyZUFja25vd2xlZGdtZW50ID0gIXJlcXVpcmVBY2tub3dsZWRnbWVudFwiPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1zdGFjayBjZi1zdGFjay0teHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNmLWxhYmVsXCI+UmVxdWlyZSBVc2VyIEFja25vd2xlZGdtZW50PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZi1oaW50XCI+QnkgZW5hYmxpbmcsIHVzZXJzIG11c3QgdHlwZSB0aGVpciBuYW1lIGFzIGFja25vd2xlZGdtZW50IHRvIGNvbXBsZXRlIHN1Ym1pc3Npb248L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIERhaWx5IFJlcG9ydCA+IEN1c3RvbTogYnVsayB1cGxvYWQgdXNlcnMgKGFzIHRoZSBDaGVja2xpc3QgQ29uZmlndXJlIHBhZ2UncyBwb3B1cCkgLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhaWx5QnVsa09wZW5cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjZi1kbGctYmFja2Ryb3BcIiAoY2xpY2spPVwiY2xvc2VEYWlseUJ1bGsoKVwiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNmLWRsZ1wiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cImNmLWRsZy10aXRsZVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImNmLWRsZy1pY29uXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLWRsZy10aXRsZVwiIGlkPVwiY2YtZGxnLXRpdGxlXCI+QnVsayBVcGxvYWQ8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLWRsZy1zdGVwc1wiPlxyXG4gICAgICAgIDxkaXY+U3RlcCAxIC0gPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGRvd25sb2FkRGFpbHlUZW1wbGF0ZSgpXCI+RG93bmxvYWQgdGhlIHRlbXBsYXRlIGhlcmU8L2E+PC9kaXY+XHJcbiAgICAgICAgPGRpdj5TdGVwIDIgLSBBZGQgdGhlIEVtYWlsIG9mIGV4aXN0aW5nIHVzZXJzIHRvIHRoZSB0ZW1wbGF0ZTwvZGl2PlxyXG4gICAgICAgIDxkaXY+U3RlcCAzIC0gVXBsb2FkIGl0IGJlbG93IGZvciBwcm9jZXNzaW5nPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtZGxnLW5vdGVcIj5cclxuICAgICAgICAqKk5vdGUgOiBPbmx5IHRoZSBFbWFpbCBjb2x1bW4gaXMgY29uc2lkZXJlZCAtIHRoZSBVc2VybmFtZSBpcyB0YWtlbiBmcm9tIHRoZSBleGlzdGluZyB1c2VyIGxpc3QuXHJcbiAgICAgICAgT25seSBleGlzdGluZyB1c2VycyBvZiB0aGlzIGNsaWVudCBhcmUgYWNjZXB0ZWQuIE9uIHVwbG9hZCwgYWxsIHRoZSBleGlzdGluZyBkYXRhIHdpbGwgYmUgcmVwbGFjZWQuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2YtZXJyb3JcIiAqbmdJZj1cImRhaWx5QnVsa0Vycm9ycy5sZW5ndGhcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjhcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiPjwvbGluZT48bGluZSB4MT1cIjEyXCIgeTE9XCIxNlwiIHgyPVwiMTIuMDFcIiB5Mj1cIjE2XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZi1kbGctZXJyb3JzXCI+XHJcbiAgICAgICAgICA8ZGl2PlRoZSBmaWxlIHdhcyBub3QgdXBsb2FkZWQuIEZpeCB7eyBkYWlseUJ1bGtFcnJvcnMubGVuZ3RoID09PSAxID8gJ3RoaXMgcm93JyA6ICd0aGVzZSByb3dzJyB9fSBhbmQgdXBsb2FkIGFnYWluOjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZSBvZiBkYWlseUJ1bGtFcnJvcnMuc2xpY2UoMCwgNSlcIj57eyBlIH19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGFpbHlCdWxrRXJyb3JzLmxlbmd0aCA+IDVcIj4re3sgZGFpbHlCdWxrRXJyb3JzLmxlbmd0aCAtIDUgfX0gbW9yZTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNmLWRsZy1mb290XCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgKGNsaWNrKT1cImNsb3NlRGFpbHlCdWxrKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS1zbVwiIChjbGljayk9XCJkYWlseUJ1bGtGaWxlLmNsaWNrKClcIj5VcGxvYWQ8L2J1dHRvbj5cclxuICAgICAgICA8aW5wdXQgI2RhaWx5QnVsa0ZpbGUgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIueGxzeFwiIGhpZGRlbiAoY2hhbmdlKT1cIm9uRGFpbHlCdWxrRmlsZSgkZXZlbnQpXCI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG48L2Rpdj5cclxuIl19