tango-app-ui-analyse-trax 4.0.47 → 4.0.49

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.
@@ -17,6 +17,8 @@ import * as i10 from "../sort-icon/audit-v2-sort-icon.component";
17
17
  const PASS_MARK = 75;
18
18
  /** Rows without a circle head in the store hierarchy are grouped under this key. */
19
19
  const UNASSIGNED = '__unassigned';
20
+ /** Visits per /audit/dashboard/detail call when exporting (the API's max limit). */
21
+ const EXPORT_PAGE = 5000;
20
22
  /**
21
23
  * Reports ("Reports — Store audit report" prototype), read from POST /trax/audit/reports: one call returns every
22
24
  * store of the header scope with its score, result, last audit, cluster and hierarchy line, plus the circle head /
@@ -185,6 +187,9 @@ export class AuditV2ReportsComponent {
185
187
  return this.pageOf(this.storeRows);
186
188
  }
187
189
  get storeLabel() {
190
+ if (this.storeSel && !this.storeSel.size) {
191
+ return 'No stores selected';
192
+ }
188
193
  return this.storeSel
189
194
  ? this.storeSel.size + (this.storeSel.size === 1 ? ' store' : ' stores') + ' selected'
190
195
  : 'All stores (' + this.allStores.length + ')';
@@ -617,6 +622,11 @@ export class AuditV2ReportsComponent {
617
622
  /** Apply: the draft's filters become the page's; a new date range refetches. */
618
623
  applyFilters() {
619
624
  const d = this.draft;
625
+ if (d && d.mode === 'store' && d.storeSel && !d.storeSel.size) {
626
+ this.activeCat = 'scope';
627
+ this.toast.getErrorToast('Select at least one store');
628
+ return;
629
+ }
620
630
  if (d) {
621
631
  const datesChanged = d.from !== this.from || d.to !== this.to;
622
632
  this.from = d.from;
@@ -695,9 +705,10 @@ export class AuditV2ReportsComponent {
695
705
  const n = this.storeScope.length;
696
706
  return this.storeLabel + ' · ' + n + (n === 1 ? ' store' : ' stores') + ' in scope';
697
707
  }
708
+ /** null = every store; an empty set = none ticked (Select All unticked), which Apply does not accept. */
698
709
  applyPick(ids) {
699
710
  const uniq = [...new Set(ids)];
700
- this.storeSel = !uniq.length || uniq.length >= this.allStores.length ? null : new Set(uniq);
711
+ this.storeSel = uniq.length >= this.allStores.length ? null : new Set(uniq);
701
712
  this.page = 1;
702
713
  }
703
714
  get pickedIds() {
@@ -809,52 +820,35 @@ export class AuditV2ReportsComponent {
809
820
  }
810
821
  }
811
822
  // ---------------------------------------------------------------------------
812
- // Export (CSV, built in the browser from the loaded report)
823
+ // Export (QA 12 Oct): every export on this page is the Dashboard detail (Monthly Performance) "Audit Info"
824
+ // workbook - one row per audit visit of the chosen stores in the report period - read from
825
+ // POST /trax/audit/dashboard/detail with by 'scope' (no single audit / store / user), 5000 rows a call.
813
826
  // ---------------------------------------------------------------------------
814
- storeHeader = ['Store', 'Store ID', 'Cluster', 'Circle head', 'Zone manager', 'Area manager', 'Audited', 'Score', 'Result', 'Last audit'];
815
- storeLine(s) {
816
- return [s.name, s.key, s.cluster, s.circle, s.zone, s.aom, s.audited ? 'Yes' : 'No', this.scoreText(s), this.resultText(s), s.lastAudit || 'No audit'];
817
- }
818
- /** Top Export: the whole report as filtered (every page): stores in the Store view, the current level in the User view. */
827
+ /** True while an export is being fetched; a second click waits for it. */
828
+ exporting = false;
829
+ /** Top Export: the report as filtered (every page): its stores in the Store view, the stores under the current level in the User view. */
819
830
  exportAll() {
820
831
  if (this.loading) {
821
832
  return;
822
833
  }
823
834
  if (this.isStoreMode || this.level === 'store') {
824
835
  const list = this.isStoreMode ? this.storeRows : this.userStores;
825
- if (!list.length) {
826
- this.toast.getErrorToast('No stores to export');
827
- return;
828
- }
829
- this.downloadCsv([this.storeHeader, ...list.map(s => this.storeLine(s))], this.isStoreMode ? 'store-report' : 'store-report-' + this.hierarchyTitle);
830
- }
831
- else {
832
- const list = this.filteredRows;
833
- if (!list.length) {
834
- this.toast.getErrorToast('Nothing to export');
835
- return;
836
- }
837
- const t = this.totals;
838
- this.downloadCsv([
839
- [this.levelLabel, 'Email', 'Total stores', 'Audited', 'Not audited', 'Coverage', 'Avg audit score', 'Failed store %'],
840
- ...list.map(r => [r.name, r.email, r.total, r.audited, r.notAudited, r.coverage, r.avgScore, r.failedPct]),
841
- ['Total', '', t.total, t.audited, t.total - t.audited, this.totalCoverage, this.totalAverage, this.totalFailedPct]
842
- ], 'user-report-' + this.hierarchyTitle);
836
+ this.exportVisits(list.map(s => s.key), this.isStoreMode ? 'Store report' : 'User report - ' + this.hierarchyTitle);
837
+ return;
843
838
  }
844
- this.toast.getSuccessToast(this.isStoreMode ? 'Store report exported' : 'User report exported');
839
+ const stores = this.filteredRows.reduce((all, row) => all.concat(this.storesUnder(row)), []);
840
+ this.exportVisits(stores.map(s => s.key), 'User report - ' + this.hierarchyTitle);
845
841
  }
846
- /** Row Export in a store table: that store's line; a store with no audit in the period has nothing to export. */
842
+ /** Row Export in a store table: that store's visits. */
847
843
  exportStore(s) {
848
- if (!s.audited) {
849
- this.toast.getErrorToast('No audit to export for ' + s.name);
850
- return;
851
- }
852
- this.downloadCsv([this.storeHeader, this.storeLine(s)], 'audit-report-' + s.name);
853
- this.toast.getSuccessToast('Report exported for ' + s.name);
844
+ this.exportVisits([s.key], s.name);
854
845
  }
855
- /** Row Export in the roll-up table: every store under that row. */
846
+ /** Row Export in the roll-up table: the visits of every store under that row. */
856
847
  exportRow(row) {
857
- const stores = this.allStores.filter(s => {
848
+ this.exportVisits(this.storesUnder(row).map(s => s.key), row.name);
849
+ }
850
+ storesUnder(row) {
851
+ return this.allStores.filter(s => {
858
852
  if (row.key === UNASSIGNED) {
859
853
  return !s.circleKey;
860
854
  }
@@ -866,21 +860,80 @@ export class AuditV2ReportsComponent {
866
860
  }
867
861
  return s.aomKey === row.key;
868
862
  });
869
- if (!stores.length) {
870
- this.toast.getErrorToast('No stores to export for ' + row.name);
863
+ }
864
+ exportVisits(storeIds, title) {
865
+ const ids = [...new Set(storeIds.filter(Boolean))];
866
+ if (!ids.length) {
867
+ this.toast.getErrorToast('No stores to export');
871
868
  return;
872
869
  }
873
- this.downloadCsv([this.storeHeader, ...stores.map(s => this.storeLine(s))], 'audit-report-' + row.name);
874
- this.toast.getSuccessToast('Report exported for ' + row.name);
870
+ if (this.exporting) {
871
+ return;
872
+ }
873
+ this.exporting = true;
874
+ const visits = [];
875
+ const done = (error) => {
876
+ this.exporting = false;
877
+ if (error) {
878
+ this.toast.getErrorToast(error);
879
+ }
880
+ else if (!visits.length) {
881
+ this.toast.getErrorToast('No audit visits to export for ' + title);
882
+ }
883
+ else {
884
+ this.traxService.exportWorkbook([{ name: 'Audit Info', rows: visits.map(r => this.visitLine(r)) }], `${title} - audit info - ${this.from} to ${this.to}`);
885
+ this.toast.getSuccessToast('Report exported for ' + title);
886
+ }
887
+ this.cd.detectChanges();
888
+ };
889
+ const fetchPage = (offset) => {
890
+ this.traxService.auditDashboardDetail({
891
+ clientId: this.headerData?.client,
892
+ fromDate: this.from,
893
+ toDate: this.to,
894
+ storeId: ids,
895
+ by: 'scope',
896
+ status: 'all',
897
+ searchValue: '',
898
+ limit: EXPORT_PAGE,
899
+ offset
900
+ }).pipe(takeUntil(this.destroy$)).subscribe({
901
+ next: (res) => {
902
+ if (res?.code !== 200) {
903
+ done('Unable to export');
904
+ return;
905
+ }
906
+ const page = res.data?.rows || [];
907
+ visits.push(...page);
908
+ if (page.length === EXPORT_PAGE && visits.length < (res.data?.totalCount || 0)) {
909
+ fetchPage(offset + 1);
910
+ return;
911
+ }
912
+ done();
913
+ },
914
+ error: () => done('Unable to export')
915
+ });
916
+ };
917
+ fetchPage(1);
875
918
  }
876
- downloadCsv(lines, name) {
877
- const q = (v) => '"' + String(v ?? '').replace(/"/g, '""') + '"';
878
- const blob = new Blob(['' + lines.map(l => l.map(q).join(',')).join('\r\n')], { type: 'text/csv;charset=utf-8;' });
879
- const a = document.createElement('a');
880
- a.href = URL.createObjectURL(blob);
881
- a.download = name.replace(/[^\w-]+/g, '_') + '-' + this.from + '-to-' + this.to + '.csv';
882
- a.click();
883
- URL.revokeObjectURL(a.href);
919
+ /** The Dashboard detail export's columns (audit-v2-detail exportRows), one visit per row. */
920
+ visitLine(r) {
921
+ const status = r.status === 'submit' ? 'Submitted' : (r.status === 'inprogress' ? 'In Progress' : 'Open');
922
+ const time = (v) => (v ? dayjs(v).format('hh:mm A, DD MMM YYYY') : '--');
923
+ return {
924
+ 'Date': r.date ? dayjs(r.date).format('DD MMM YYYY') : '--',
925
+ 'Audit Name': r.checkListName,
926
+ 'Store ID': r.storeId,
927
+ 'Store Name': r.storeName,
928
+ 'User Name': r.userName,
929
+ 'Submitted By': r.userEmail,
930
+ 'Status': status + (r.redo ? ' (Redo)' : ''),
931
+ 'Submitted On': time(r.submittedOn),
932
+ 'Submission Count': r.submissionCount,
933
+ 'Flags': r.flags,
934
+ 'Approved By': r.approvedBy || '--',
935
+ 'Approved On': time(r.approvedOn)
936
+ };
884
937
  }
885
938
  trackByRow(_, row) {
886
939
  return row.key || row.name;
@@ -895,10 +948,10 @@ export class AuditV2ReportsComponent {
895
948
  return c.key;
896
949
  }
897
950
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2ReportsComponent, deps: [{ token: i1.TraxService }, { token: i2.GlobalStateService }, { token: i3.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
898
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2ReportsComponent, selector: "lib-audit-v2-reports", ngImport: i0, template: "<div class=\"av2-page audit-reports\">\r\n\r\n <!-- Breadcrumb + title -->\r\n <div class=\"rp-head\">\r\n <div class=\"rp-crumb\">Audits \u203A <span class=\"rp-crumb-current\">Reports</span></div>\r\n <div class=\"rp-title\">Store audit report</div>\r\n </div>\r\n\r\n <!-- Filter chips, Filter button at the right end (QA 9 Oct); Export moved to the table head beside its search. -->\r\n <div class=\"rp-controls\">\r\n <button type=\"button\" class=\"rp-chip\" *ngFor=\"let c of chips; trackBy: trackByChip\" (click)=\"openFilters(c.key)\"\r\n [title]=\"c.label + ': ' + c.value\">\r\n <span class=\"rp-chip-key\">{{ c.label }}</span><span class=\"rp-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost rp-filterbtn\" (click)=\"openFilters()\">\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\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon></svg>\r\n Filter\r\n <span class=\"rp-countpill\">{{ filterCount }}</span>\r\n </button>\r\n </div>\r\n\r\n <!-- User view: where in the hierarchy -->\r\n <div class=\"rp-drillbar\" *ngIf=\"!isStoreMode\">\r\n <ng-container *ngFor=\"let c of crumbs; let last = last; let first = first\">\r\n <div class=\"rp-drillcrumb\" [class.is-current]=\"last\" (click)=\"goToLevel(c.level)\">\r\n <span class=\"rp-drillsep\" *ngIf=\"!first\">\u203A</span>{{ c.label }}\r\n </div>\r\n </ng-container>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"rp-hint\">{{ hint }}</div>\r\n </div>\r\n\r\n <!-- Scope -->\r\n <div class=\"rp-scope\">\r\n <div class=\"rp-scope-title\">{{ scopeTitle }}</div>\r\n <div class=\"rp-scope-meta\">{{ scopeMeta }}</div>\r\n </div>\r\n\r\n <!-- KPIs -->\r\n <div class=\"rp-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count rp-kpi-value\" [class.is-good]=\"kpi.tone === 'good'\" [class.is-bad]=\"kpi.tone === 'bad'\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value rp-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Report table -->\r\n <section class=\"rp-card\">\r\n <div class=\"rp-card-head\">\r\n <div class=\"rp-card-text\">\r\n <ng-container *ngIf=\"isStoreMode\">\r\n <div class=\"rp-card-title\">Store report</div>\r\n <div class=\"rp-card-meta\">{{ storeRows.length }} {{ storeRows.length === 1 ? 'store' : 'stores' }} \u00B7 audits submitted in the period</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!isStoreMode\">\r\n <div class=\"rp-card-title\">{{ tableTitle }}</div>\r\n <div class=\"rp-card-meta\">{{ tableMeta }}</div>\r\n </ng-container>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search rp-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"isStoreMode ? 'Search store' : 'Search ' + levelLabel.toLowerCase()\"\r\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearchChange()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"loading\" (click)=\"exportAll()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 16V4\"></path><polyline points=\"7 9 12 4 17 9\"></polyline><path d=\"M4 16v4h16v-4\"></path></svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <!-- Store view: one row per store -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && isStoreMode && tableCount\">\r\n <table class=\"rp-table rp-table--stores\">\r\n <thead>\r\n <tr>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('cluster')\">Cluster <lib-audit-v2-sort-icon [active]=\"sortKey === 'cluster'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('status')\">Result <lib-audit-v2-sort-icon [active]=\"sortKey === 'status'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('lastAudit')\">Last audit <lib-audit-v2-sort-icon [active]=\"sortKey === 'lastAudit'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right\">Export</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let s of storePageRows; trackBy: trackByKey\">\r\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\r\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.cluster\">{{ s.cluster || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '\u2014' }}</td>\r\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\r\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\r\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\r\n <td class=\"t-right\">\r\n <span class=\"rp-result\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\">{{ resultText(s) }}</span>\r\n </td>\r\n <td class=\"t-right\" [class.is-muted]=\"!s.lastAudit\">{{ s.lastAudit || 'No audit' }}</td>\r\n <td class=\"t-right\">\r\n <button type=\"button\" class=\"rp-export\" (click)=\"exportStore(s)\">Export</button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <tfoot>\r\n <tr class=\"rp-total\">\r\n <td>Total</td>\r\n <td></td>\r\n <td></td>\r\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\r\n <td class=\"t-right\">{{ totalAverage }}</td>\r\n <td class=\"t-right\">{{ totals.failed }} fail</td>\r\n <td></td>\r\n <td></td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n </div>\r\n\r\n <!-- User view: circle head / zone manager / area manager roll-up -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level !== 'store' && tableCount\">\r\n <table class=\"rp-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">{{ levelLabel }} <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('total')\">Total stores <lib-audit-v2-sort-icon [active]=\"sortKey === 'total'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('notAudited')\">Not audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'notAudited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('coverage')\">Coverage <lib-audit-v2-sort-icon [active]=\"sortKey === 'coverage'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('avgScore')\">Avg audit score <lib-audit-v2-sort-icon [active]=\"sortKey === 'avgScore'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('failedPct')\">Failed store % <lib-audit-v2-sort-icon [active]=\"sortKey === 'failedPct'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right\">Report</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByRow\" class=\"rp-row\" (click)=\"openRow(row)\">\r\n <td>\r\n <div class=\"rp-name\">\r\n <span class=\"rp-name-main\">{{ row.name }}</span>\r\n <span class=\"rp-name-sub\" *ngIf=\"row.email\">{{ row.email }}</span>\r\n </div>\r\n </td>\r\n <td class=\"t-right\">{{ row.total }}</td>\r\n <td class=\"t-right\">{{ row.audited }}</td>\r\n <td class=\"t-right\" [class.is-muted]=\"!row.notAudited\">{{ row.notAudited }}</td>\r\n <td class=\"t-right\">{{ row.coverage }}</td>\r\n <td class=\"t-right is-strong\">{{ row.avgScore }}</td>\r\n <td class=\"t-right is-strong\" [class.is-fail]=\"isHighFail(row)\">{{ row.failedPct }}</td>\r\n <td class=\"t-right\">\r\n <button type=\"button\" class=\"rp-export\" (click)=\"exportRow(row); $event.stopPropagation()\">Export</button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <tfoot>\r\n <tr class=\"rp-total\">\r\n <td>Total</td>\r\n <td class=\"t-right\">{{ totals.total }}</td>\r\n <td class=\"t-right\">{{ totals.audited }}</td>\r\n <td class=\"t-right\">{{ totals.total - totals.audited }}</td>\r\n <td class=\"t-right\">{{ totalCoverage }}</td>\r\n <td class=\"t-right\">{{ totalAverage }}</td>\r\n <td class=\"t-right\">{{ totalFailedPct }}</td>\r\n <td></td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n </div>\r\n\r\n <!-- User view, deepest level: the area manager's stores -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level === 'store' && tableCount\">\r\n <table class=\"rp-table rp-table--userstores\">\r\n <thead>\r\n <tr>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('zone')\">Zone manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'zone'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right\">Export</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let s of userStorePageRows; trackBy: trackByKey\">\r\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\r\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.zone\">{{ s.zone || '\u2014' }}</td>\r\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\r\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\r\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\r\n <td class=\"t-right\">\r\n <button type=\"button\" class=\"rp-export\" (click)=\"exportStore(s)\">Export</button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <tfoot>\r\n <tr class=\"rp-total\">\r\n <td>Total</td>\r\n <td></td>\r\n <td></td>\r\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\r\n <td class=\"t-right\">{{ totalAverage }}</td>\r\n <td></td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!loading && !tableCount\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ search ? 'No rows match \"' + search + '\"' : 'No stores match the current filters' }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"rp-pager\" *ngIf=\"!loading && tableCount\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\" [currentPage]=\"page\"\r\n [totalItems]=\"tableCount\" (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"closeFilters()\"></div>\r\n\r\n <!-- Every control edits the drawer's draft (dr); the page behind changes only on Apply or Reset all. -->\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"rp-countpill\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"closeFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\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 </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <!-- trackBy: filterCats is rebuilt on every check, and lib-audit-v2-select's document:mousedown runs one\r\n between press and release; without it the button was replaced mid-click and the click never landed. -->\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByChip\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.paneTitle }}</div>\r\n <div class=\"panehint\">{{ dr.paneSub }}</div>\r\n\r\n <!-- Date -->\r\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input rp-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n <div class=\"rp-presets\">\r\n <button type=\"button\" class=\"rp-preset\" *ngFor=\"let p of presets\" [class.is-on]=\"dr.preset === p\"\r\n (click)=\"dr.setPreset(p)\">{{ p }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- View by -->\r\n <div class=\"pane-options\" *ngIf=\"activeCat === 'mode'\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.isStoreMode\" (click)=\"dr.setMode('store')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.isStoreMode\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Store</span>\r\n <span class=\"pane-option-help\">One row per store with score, result and last audit date.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"!dr.isStoreMode\" (click)=\"dr.setMode('user')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"!dr.isStoreMode\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">User</span>\r\n <span class=\"pane-option-help\">Rolled up by circle head, zone manager and AOM, drillable down to stores.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Stores (Store view) -->\r\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && dr.isStoreMode\">\r\n <label class=\"av2-search rp-pick-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\r\n <input type=\"text\" placeholder=\"Search store\" [(ngModel)]=\"dr.storeQuery\">\r\n </label>\r\n <div class=\"rp-picklist\">\r\n <ng-container *ngIf=\"dr.storePickItems.length\">\r\n <label class=\"rp-pick is-all\">\r\n <input type=\"checkbox\" [checked]=\"dr.storePickAllChecked\" (change)=\"dr.toggleStorePickAll()\">\r\n <span>Select All</span>\r\n </label>\r\n <label class=\"rp-pick\" *ngFor=\"let it of dr.storePickItems; trackBy: trackByPick\">\r\n <input type=\"checkbox\" [checked]=\"it.checked\" (change)=\"dr.toggleStorePick(it.store)\">\r\n <span class=\"rp-pick-label\">{{ it.store.name }}</span>\r\n <span class=\"rp-pick-sub\">{{ it.store.cluster || it.store.aom }}</span>\r\n </label>\r\n </ng-container>\r\n <div class=\"rp-pick-empty\" *ngIf=\"!dr.storePickItems.length\">\r\n {{ dr.storeQuery ? 'No stores match \"' + dr.storeQuery + '\"' : 'No stores in scope' }}\r\n </div>\r\n </div>\r\n <div class=\"rp-reading\">\r\n <span>Reading</span>\r\n <strong>{{ dr.storePickReading }}</strong>\r\n <span class=\"av2-grow\"></span>\r\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.resetStorePick()\">Reset to all stores</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Store hierarchy (User view) -->\r\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && !dr.isStoreMode\">\r\n <div class=\"rp-field\">\r\n <div class=\"rp-field-label\">Circle Head <span>{{ dr.circleOptions.length - 1 }} users</span></div>\r\n <lib-audit-v2-select [value]=\"dr.circleKey\" [options]=\"dr.circleOptions\" placeholder=\"All circles\"\r\n ariaLabel=\"Circle Head\" (changed)=\"dr.pickCircle($event.target.value)\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"rp-field\" *ngIf=\"dr.showZonePick\">\r\n <div class=\"rp-field-label\">Zone Manager <span>{{ dr.zoneOptions.length - 1 }} {{ dr.zoneOptions.length === 2 ? 'user' : 'users' }}</span></div>\r\n <lib-audit-v2-select [value]=\"dr.zoneKey\" [options]=\"dr.zoneOptions\" placeholder=\"All zones\"\r\n ariaLabel=\"Zone Manager\" (changed)=\"dr.pickZone($event.target.value)\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"rp-field\" *ngIf=\"dr.zoneKey\">\r\n <div class=\"rp-field-label\">AOM <span>{{ dr.aomOptions.length - 1 }} {{ dr.aomOptions.length === 2 ? 'user' : 'users' }}</span></div>\r\n <lib-audit-v2-select [value]=\"dr.aomKey\" [options]=\"dr.aomOptions\" placeholder=\"All AOMs\"\r\n ariaLabel=\"AOM\" (changed)=\"dr.pickAom($event.target.value)\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"rp-field\" *ngIf=\"dr.aomKey\">\r\n <div class=\"rp-field-label\">Store <span>{{ dr.storeOptions.length - 1 }} stores</span></div>\r\n <lib-audit-v2-select [value]=\"dr.storeKey\" [options]=\"dr.storeOptions\" placeholder=\"All stores\"\r\n ariaLabel=\"Store\" (changed)=\"dr.pickStore($event.target.value)\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"rp-reading\">\r\n <span>Reading</span>\r\n <strong>{{ dr.hierarchyReading }}</strong>\r\n <span class=\"av2-grow\"></span>\r\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.goToLevel('circle')\">Reset to all circles</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Result (Store view) -->\r\n <div class=\"pane-options\" *ngIf=\"activeCat === 'result' && dr.isStoreMode\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'all'\" (click)=\"dr.setResult('all')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'all'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">All</span>\r\n <span class=\"pane-option-help\">Every store in scope, audited or not.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'pass'\" (click)=\"dr.setResult('pass')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'pass'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Pass</span>\r\n <span class=\"pane-option-help\">Only stores scoring at or above the {{ passMark }}% pass mark.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'fail'\" (click)=\"dr.setResult('fail')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'fail'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Fail</span>\r\n <span class=\"pane-option-help\">Only stores scoring below the {{ passMark }}% pass mark.</span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"resetFilters()\">Reset all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply</button>\r\n </div>\r\n </div>\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}}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #fff;--bs-tooltip-color: #344054;--bs-tooltip-max-width: 320px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#fff!important;color:#344054!important;padding:8px 12px;border-radius:8px;font-size:13px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,0 0 0 1px #eaecf0}::ng-deep .tooltip.av2-tip .tooltip-arrow:before{border-top-color:#fff;border-bottom-color:#fff}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg 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'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.rp-pager{padding-top:20px}.rp-head{display:flex;flex-direction:column;gap:2px}.rp-crumb{font-size:13px;line-height:20px;color:#667085}.rp-crumb-current{color:#00a3ff}.rp-title{font-size:22px;line-height:30px;font-weight:600;color:#101828}.rp-controls{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.rp-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:600}.rp-chip{height:32px;max-width:360px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;display:inline-flex;align-items:center;gap:6px;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.rp-chip:hover{background:#f9fafb}.rp-chip-key{font-weight:500;color:#667085}.rp-chip-value{overflow:hidden;text-overflow:ellipsis;font-weight:600;color:#101828}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.rp-daterange{width:260px;height:44px;font-size:14px}.rp-presets{display:flex;flex-wrap:wrap;gap:8px}.rp-preset{height:36px;padding:0 14px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:14px;font-weight:500;color:#667085;cursor:pointer}.rp-preset.is-on{background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;color:#101828;font-weight:600}.rp-drillbar{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:14px 18px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rp-drillcrumb{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:#00a3ff;cursor:pointer}.rp-drillcrumb.is-current{color:#101828;cursor:default}.rp-drillsep{color:#98a2b3;font-weight:400}.rp-hint{font-size:14px;color:#667085}.rp-scope{display:flex;flex-direction:column;gap:2px}.rp-scope-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.rp-scope-meta{font-size:14px;line-height:20px;color:#667085}.rp-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:16px}.rp-kpi-value.is-good{color:#027a48}.rp-kpi-value.is-bad{color:#d92d20}.rp-sk-value{height:32px;margin:3px 0}.rp-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px 12px;display:flex;flex-direction:column;gap:14px}.rp-card-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.rp-card-text{display:flex;flex-direction:column;gap:2px;flex:1;min-width:200px}.rp-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.rp-card-meta{font-size:14px;line-height:20px;color:#667085}.rp-search{width:260px}.rp-table{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.rp-table th:nth-child(1){width:29%}.rp-table th:nth-child(2){width:9.5%}.rp-table th:nth-child(3){width:8.5%}.rp-table th:nth-child(4){width:9.5%}.rp-table th:nth-child(5){width:9.5%}.rp-table th:nth-child(6){width:12%}.rp-table th:nth-child(7){width:11%}.rp-table th:nth-child(8){width:11%}.rp-table--stores th:nth-child(1){width:14%}.rp-table--stores th:nth-child(2){width:20%}.rp-table--stores th:nth-child(3){width:16%}.rp-table--stores th:nth-child(4){width:9%}.rp-table--stores th:nth-child(5){width:9%}.rp-table--stores th:nth-child(6){width:11%}.rp-table--stores th:nth-child(7){width:12%}.rp-table--stores th:nth-child(8){width:9%}.rp-table--userstores th:nth-child(1){width:18%}.rp-table--userstores th:nth-child(2){width:25%}.rp-table--userstores th:nth-child(3){width:25%}.rp-table--userstores th:nth-child(4){width:11%}.rp-table--userstores th:nth-child(5){width:10%}.rp-table--userstores th:nth-child(6){width:11%}.rp-table thead th{padding:8px 4px;border:0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.rp-table tbody td{padding:12px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.rp-table tfoot td{padding:12px 4px;border:0;font-size:14px;line-height:20px;font-weight:700;color:#101828}.rp-table thead th.t-right,.rp-table tbody td.t-right,.rp-table tfoot td.t-right{text-align:right}.rp-table .is-strong{font-weight:600}.rp-table tbody td.is-muted{color:#98a2b3}.rp-table tbody td.is-pass{color:#027a48}.rp-table tbody td.is-fail{color:#d92d20}.rp-table tbody td.rp-cell-name{color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-result{display:inline-flex;padding:2px 10px;border-radius:9999px;background:#f2f4f7;font-size:12px;line-height:18px;font-weight:500;color:#475467;white-space:nowrap}.rp-result.is-pass{background:#ecfdf3;color:#027a48}.rp-result.is-fail{background:#fef3f2;color:#b42318}.rp-row{cursor:pointer}.rp-row:hover td{background:#fcfcfd}.rp-name{display:flex;flex-direction:column;gap:2px;min-width:0}.rp-name-main{font-weight:600;color:#00a3ff}.rp-name-sub{font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-export{height:32px;padding:0 12px;border:none;border-radius:6px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#344054;cursor:pointer}.rp-export:hover{background:#f9fafb}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:14px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:14px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:18px;line-height:28px;font-weight:600;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-stack{display:flex;flex-direction:column;gap:14px;margin-top:14px;max-width:560px}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px;max-width:560px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:14px;line-height:20px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.rp-reset{border:none;background:transparent;padding:0;font-family:inherit;font-weight:600;text-decoration:none;white-space:nowrap}.rp-pick-search{width:100%}.rp-picklist{max-height:320px;overflow-y:auto;padding:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column}.rp-pick{display:flex;align-items:center;gap:12px;min-height:40px;margin:0;padding:0 10px;border-radius:6px;font-size:14px;color:#344054;cursor:pointer}.rp-pick:hover{background:#f9fafb}.rp-pick.is-all{font-weight:600}.rp-pick input{appearance:none;-webkit-appearance:none;flex-shrink:0;width:16px;height:16px;margin:0;border:1px solid #D0D5DD;border-radius:4px;background:#fff no-repeat center/12px 12px;cursor:pointer;vertical-align:middle;transition:border-color .12s ease,background-color .12s ease}.rp-pick input:hover:not(:disabled){border-color:#00a3ff}.rp-pick input:checked{border-color:#00a3ff;background-color:#eaf8ff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300A3FF' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")}.rp-pick input:focus-visible{outline:none;box-shadow:0 0 0 3px #eaf8ff}.rp-pick input:disabled{cursor:not-allowed;opacity:.45}.rp-pick-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-pick-sub{max-width:45%;font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-pick-empty{padding:20px 10px;font-size:14px;color:#667085}.rp-reading{display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:8px;background:#f9fafb;font-size:14px;color:#475467}.rp-reading strong{font-weight:600;color:#101828}.rp-field{display:flex;flex-direction:column;gap:6px;min-width:0}.rp-field-label{display:flex;align-items:baseline;gap:8px;font-size:14px;line-height:20px;font-weight:600;color:#1d2939}.rp-field-label span{font-weight:400;color:#667085}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "directive", type: i7.AuditV2TipDirective, selector: "[av2Tip]", inputs: ["av2Tip"] }, { kind: "component", type: i8.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i9.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i10.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
951
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2ReportsComponent, selector: "lib-audit-v2-reports", ngImport: i0, template: "<div class=\"av2-page audit-reports\">\n\n <!-- Breadcrumb + title -->\n <div class=\"rp-head\">\n <div class=\"rp-crumb\">Audits \u203A <span class=\"rp-crumb-current\">Reports</span></div>\n <div class=\"rp-title\">Store audit report</div>\n </div>\n\n <!-- Filter chips, Filter button at the right end (QA 9 Oct); Export moved to the table head beside its search. -->\n <div class=\"rp-controls\">\n <button type=\"button\" class=\"rp-chip\" *ngFor=\"let c of chips; trackBy: trackByChip\" (click)=\"openFilters(c.key)\"\n [title]=\"c.label + ': ' + c.value\">\n <span class=\"rp-chip-key\">{{ c.label }}</span><span class=\"rp-chip-value\">{{ c.value }}</span>\n </button>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost rp-filterbtn\" (click)=\"openFilters()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon></svg>\n Filter\n <span class=\"rp-countpill\">{{ filterCount }}</span>\n </button>\n </div>\n\n <!-- User view: where in the hierarchy -->\n <div class=\"rp-drillbar\" *ngIf=\"!isStoreMode\">\n <ng-container *ngFor=\"let c of crumbs; let last = last; let first = first\">\n <div class=\"rp-drillcrumb\" [class.is-current]=\"last\" (click)=\"goToLevel(c.level)\">\n <span class=\"rp-drillsep\" *ngIf=\"!first\">\u203A</span>{{ c.label }}\n </div>\n </ng-container>\n <div class=\"av2-grow\"></div>\n <div class=\"rp-hint\">{{ hint }}</div>\n </div>\n\n <!-- Scope -->\n <div class=\"rp-scope\">\n <div class=\"rp-scope-title\">{{ scopeTitle }}</div>\n <div class=\"rp-scope-meta\">{{ scopeMeta }}</div>\n </div>\n\n <!-- KPIs -->\n <div class=\"rp-kpis\">\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count rp-kpi-value\" [class.is-good]=\"kpi.tone === 'good'\" [class.is-bad]=\"kpi.tone === 'bad'\">\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value rp-sk-value\"></span>\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\n </div>\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\n </div>\n <div class=\"av2-ocard-body\">\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\">{{ kpi.note }}</div>\n </div>\n </div>\n </div>\n\n <!-- Report table -->\n <section class=\"rp-card\">\n <div class=\"rp-card-head\">\n <div class=\"rp-card-text\">\n <ng-container *ngIf=\"isStoreMode\">\n <div class=\"rp-card-title\">Store report</div>\n <div class=\"rp-card-meta\">{{ storeRows.length }} {{ storeRows.length === 1 ? 'store' : 'stores' }} \u00B7 audits submitted in the period</div>\n </ng-container>\n <ng-container *ngIf=\"!isStoreMode\">\n <div class=\"rp-card-title\">{{ tableTitle }}</div>\n <div class=\"rp-card-meta\">{{ tableMeta }}</div>\n </ng-container>\n </div>\n <div class=\"av2-grow\"></div>\n <label class=\"av2-search rp-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\n </svg>\n <input type=\"text\" [placeholder]=\"isStoreMode ? 'Search store' : 'Search ' + levelLabel.toLowerCase()\"\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearchChange()\">\n </label>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"loading || exporting\" (click)=\"exportAll()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 16V4\"></path><polyline points=\"7 9 12 4 17 9\"></polyline><path d=\"M4 16v4h16v-4\"></path></svg>\n Export\n </button>\n </div>\n\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\n\n <!-- Store view: one row per store -->\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && isStoreMode && tableCount\">\n <table class=\"rp-table rp-table--stores\">\n <thead>\n <tr>\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('cluster')\">Cluster <lib-audit-v2-sort-icon [active]=\"sortKey === 'cluster'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('status')\">Result <lib-audit-v2-sort-icon [active]=\"sortKey === 'status'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('lastAudit')\">Last audit <lib-audit-v2-sort-icon [active]=\"sortKey === 'lastAudit'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Export</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let s of storePageRows; trackBy: trackByKey\">\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.cluster\">{{ s.cluster || '\u2014' }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '\u2014' }}</td>\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\n <td class=\"t-right\">\n <span class=\"rp-result\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\">{{ resultText(s) }}</span>\n </td>\n <td class=\"t-right\" [class.is-muted]=\"!s.lastAudit\">{{ s.lastAudit || 'No audit' }}</td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"rp-export\" [disabled]=\"exporting\" (click)=\"exportStore(s)\">Export</button>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"rp-total\">\n <td>Total</td>\n <td></td>\n <td></td>\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\n <td class=\"t-right\">{{ totalAverage }}</td>\n <td class=\"t-right\">{{ totals.failed }} fail</td>\n <td></td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <!-- User view: circle head / zone manager / area manager roll-up -->\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level !== 'store' && tableCount\">\n <table class=\"rp-table\">\n <thead>\n <tr>\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">{{ levelLabel }} <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('total')\">Total stores <lib-audit-v2-sort-icon [active]=\"sortKey === 'total'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('notAudited')\">Not audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'notAudited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('coverage')\">Coverage <lib-audit-v2-sort-icon [active]=\"sortKey === 'coverage'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('avgScore')\">Avg audit score <lib-audit-v2-sort-icon [active]=\"sortKey === 'avgScore'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('failedPct')\">Failed store % <lib-audit-v2-sort-icon [active]=\"sortKey === 'failedPct'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Report</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of pageRows; trackBy: trackByRow\" class=\"rp-row\" (click)=\"openRow(row)\">\n <td>\n <div class=\"rp-name\">\n <span class=\"rp-name-main\">{{ row.name }}</span>\n <span class=\"rp-name-sub\" *ngIf=\"row.email\">{{ row.email }}</span>\n </div>\n </td>\n <td class=\"t-right\">{{ row.total }}</td>\n <td class=\"t-right\">{{ row.audited }}</td>\n <td class=\"t-right\" [class.is-muted]=\"!row.notAudited\">{{ row.notAudited }}</td>\n <td class=\"t-right\">{{ row.coverage }}</td>\n <td class=\"t-right is-strong\">{{ row.avgScore }}</td>\n <td class=\"t-right is-strong\" [class.is-fail]=\"isHighFail(row)\">{{ row.failedPct }}</td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"rp-export\" [disabled]=\"exporting\" (click)=\"exportRow(row); $event.stopPropagation()\">Export</button>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"rp-total\">\n <td>Total</td>\n <td class=\"t-right\">{{ totals.total }}</td>\n <td class=\"t-right\">{{ totals.audited }}</td>\n <td class=\"t-right\">{{ totals.total - totals.audited }}</td>\n <td class=\"t-right\">{{ totalCoverage }}</td>\n <td class=\"t-right\">{{ totalAverage }}</td>\n <td class=\"t-right\">{{ totalFailedPct }}</td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <!-- User view, deepest level: the area manager's stores -->\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level === 'store' && tableCount\">\n <table class=\"rp-table rp-table--userstores\">\n <thead>\n <tr>\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('zone')\">Zone manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'zone'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Export</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let s of userStorePageRows; trackBy: trackByKey\">\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '\u2014' }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.zone\">{{ s.zone || '\u2014' }}</td>\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"rp-export\" [disabled]=\"exporting\" (click)=\"exportStore(s)\">Export</button>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"rp-total\">\n <td>Total</td>\n <td></td>\n <td></td>\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\n <td class=\"t-right\">{{ totalAverage }}</td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <div *ngIf=\"!loading && !tableCount\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ search ? 'No rows match \"' + search + '\"' : 'No stores match the current filters' }}</div>\n </div>\n </div>\n\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\n <div class=\"rp-pager\" *ngIf=\"!loading && tableCount\">\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\" [currentPage]=\"page\"\n [totalItems]=\"tableCount\" (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </section>\n\n <!-- ============ FILTER DRAWER ============ -->\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"closeFilters()\"></div>\n\n <!-- Every control edits the drawer's draft (dr); the page behind changes only on Apply or Reset all. -->\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\n <div class=\"drawer-head\">\n <span class=\"drawer-title\">Filters</span>\n <span class=\"rp-countpill\">{{ dr.filterCount }}</span>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"closebtn\" (click)=\"closeFilters()\" title=\"Close\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\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>\n </button>\n </div>\n\n <div class=\"drawer-body\">\n <div class=\"drawer-nav\">\n <!-- trackBy: filterCats is rebuilt on every check, and lib-audit-v2-select's document:mousedown runs one\n between press and release; without it the button was replaced mid-click and the click never landed. -->\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByChip\" [class.navitem-active]=\"activeCat === c.key\"\n (click)=\"selectCat(c.key)\">\n <span class=\"navtext\">\n <span class=\"navtitle\">{{ c.label }}</span>\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\n </span>\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\n </button>\n </div>\n\n <div class=\"drawer-pane\">\n <div class=\"panetitle\">{{ dr.paneTitle }}</div>\n <div class=\"panehint\">{{ dr.paneSub }}</div>\n\n <!-- Date -->\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'date'\">\n <div class=\"av2-datepick\">\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\n <input type=\"text\" class=\"av2-datepick-input rp-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\n placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\n [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\"\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\n </div>\n <div class=\"rp-presets\">\n <button type=\"button\" class=\"rp-preset\" *ngFor=\"let p of presets\" [class.is-on]=\"dr.preset === p\"\n (click)=\"dr.setPreset(p)\">{{ p }}</button>\n </div>\n </div>\n\n <!-- View by -->\n <div class=\"pane-options\" *ngIf=\"activeCat === 'mode'\">\n <div class=\"pane-option\" [class.is-on]=\"dr.isStoreMode\" (click)=\"dr.setMode('store')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.isStoreMode\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">Store</span>\n <span class=\"pane-option-help\">One row per store with score, result and last audit date.</span>\n </span>\n </div>\n <div class=\"pane-option\" [class.is-on]=\"!dr.isStoreMode\" (click)=\"dr.setMode('user')\">\n <span class=\"pane-radio\" [class.is-on]=\"!dr.isStoreMode\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">User</span>\n <span class=\"pane-option-help\">Rolled up by circle head, zone manager and AOM, drillable down to stores.</span>\n </span>\n </div>\n </div>\n\n <!-- Stores (Store view) -->\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && dr.isStoreMode\">\n <label class=\"av2-search rp-pick-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" placeholder=\"Search store\" [(ngModel)]=\"dr.storeQuery\">\n </label>\n <div class=\"rp-picklist\">\n <ng-container *ngIf=\"dr.storePickItems.length\">\n <label class=\"rp-pick is-all\">\n <input type=\"checkbox\" [checked]=\"dr.storePickAllChecked\" (change)=\"dr.toggleStorePickAll()\">\n <span>Select All</span>\n </label>\n <label class=\"rp-pick\" *ngFor=\"let it of dr.storePickItems; trackBy: trackByPick\">\n <input type=\"checkbox\" [checked]=\"it.checked\" (change)=\"dr.toggleStorePick(it.store)\">\n <span class=\"rp-pick-label\">{{ it.store.name }}</span>\n <span class=\"rp-pick-sub\">{{ it.store.cluster || it.store.aom }}</span>\n </label>\n </ng-container>\n <div class=\"rp-pick-empty\" *ngIf=\"!dr.storePickItems.length\">\n {{ dr.storeQuery ? 'No stores match \"' + dr.storeQuery + '\"' : 'No stores in scope' }}\n </div>\n </div>\n <div class=\"rp-reading\">\n <span>Reading</span>\n <strong>{{ dr.storePickReading }}</strong>\n <span class=\"av2-grow\"></span>\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.resetStorePick()\">Reset to all stores</button>\n </div>\n </div>\n\n <!-- Store hierarchy (User view) -->\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && !dr.isStoreMode\">\n <div class=\"rp-field\">\n <div class=\"rp-field-label\">Circle Head <span>{{ dr.circleOptions.length - 1 }} users</span></div>\n <lib-audit-v2-select [value]=\"dr.circleKey\" [options]=\"dr.circleOptions\" placeholder=\"All circles\"\n ariaLabel=\"Circle Head\" (changed)=\"dr.pickCircle($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-field\" *ngIf=\"dr.showZonePick\">\n <div class=\"rp-field-label\">Zone Manager <span>{{ dr.zoneOptions.length - 1 }} {{ dr.zoneOptions.length === 2 ? 'user' : 'users' }}</span></div>\n <lib-audit-v2-select [value]=\"dr.zoneKey\" [options]=\"dr.zoneOptions\" placeholder=\"All zones\"\n ariaLabel=\"Zone Manager\" (changed)=\"dr.pickZone($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-field\" *ngIf=\"dr.zoneKey\">\n <div class=\"rp-field-label\">AOM <span>{{ dr.aomOptions.length - 1 }} {{ dr.aomOptions.length === 2 ? 'user' : 'users' }}</span></div>\n <lib-audit-v2-select [value]=\"dr.aomKey\" [options]=\"dr.aomOptions\" placeholder=\"All AOMs\"\n ariaLabel=\"AOM\" (changed)=\"dr.pickAom($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-field\" *ngIf=\"dr.aomKey\">\n <div class=\"rp-field-label\">Store <span>{{ dr.storeOptions.length - 1 }} stores</span></div>\n <lib-audit-v2-select [value]=\"dr.storeKey\" [options]=\"dr.storeOptions\" placeholder=\"All stores\"\n ariaLabel=\"Store\" (changed)=\"dr.pickStore($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-reading\">\n <span>Reading</span>\n <strong>{{ dr.hierarchyReading }}</strong>\n <span class=\"av2-grow\"></span>\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.goToLevel('circle')\">Reset to all circles</button>\n </div>\n </div>\n\n <!-- Result (Store view) -->\n <div class=\"pane-options\" *ngIf=\"activeCat === 'result' && dr.isStoreMode\">\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'all'\" (click)=\"dr.setResult('all')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'all'\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">All</span>\n <span class=\"pane-option-help\">Every store in scope, audited or not.</span>\n </span>\n </div>\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'pass'\" (click)=\"dr.setResult('pass')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'pass'\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">Pass</span>\n <span class=\"pane-option-help\">Only stores scoring at or above the {{ passMark }}% pass mark.</span>\n </span>\n </div>\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'fail'\" (click)=\"dr.setResult('fail')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'fail'\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">Fail</span>\n <span class=\"pane-option-help\">Only stores scoring below the {{ passMark }}% pass mark.</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"drawer-foot\">\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"resetFilters()\">Reset all</button>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply</button>\n </div>\n </div>\n\n</div>\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}}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #fff;--bs-tooltip-color: #344054;--bs-tooltip-max-width: 320px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#fff!important;color:#344054!important;padding:8px 12px;border-radius:8px;font-size:13px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,0 0 0 1px #eaecf0}::ng-deep .tooltip.av2-tip .tooltip-arrow:before{border-top-color:#fff;border-bottom-color:#fff}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg 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'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.rp-pager{padding-top:20px}.rp-head{display:flex;flex-direction:column;gap:2px}.rp-crumb{font-size:13px;line-height:20px;color:#667085}.rp-crumb-current{color:#00a3ff}.rp-title{font-size:22px;line-height:30px;font-weight:600;color:#101828}.rp-controls{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.rp-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:600}.rp-chip{height:32px;max-width:360px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;display:inline-flex;align-items:center;gap:6px;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.rp-chip:hover{background:#f9fafb}.rp-chip-key{font-weight:500;color:#667085}.rp-chip-value{overflow:hidden;text-overflow:ellipsis;font-weight:600;color:#101828}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.rp-daterange{width:260px;height:44px;font-size:14px}.rp-presets{display:flex;flex-wrap:wrap;gap:8px}.rp-preset{height:36px;padding:0 14px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:14px;font-weight:500;color:#667085;cursor:pointer}.rp-preset.is-on{background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;color:#101828;font-weight:600}.rp-drillbar{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:14px 18px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rp-drillcrumb{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:#00a3ff;cursor:pointer}.rp-drillcrumb.is-current{color:#101828;cursor:default}.rp-drillsep{color:#98a2b3;font-weight:400}.rp-hint{font-size:14px;color:#667085}.rp-scope{display:flex;flex-direction:column;gap:2px}.rp-scope-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.rp-scope-meta{font-size:14px;line-height:20px;color:#667085}.rp-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:16px}.rp-kpi-value.is-good{color:#027a48}.rp-kpi-value.is-bad{color:#d92d20}.rp-sk-value{height:32px;margin:3px 0}.rp-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px 12px;display:flex;flex-direction:column;gap:14px}.rp-card-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.rp-card-text{display:flex;flex-direction:column;gap:2px;flex:1;min-width:200px}.rp-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.rp-card-meta{font-size:14px;line-height:20px;color:#667085}.rp-search{width:260px}.rp-table{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.rp-table th:nth-child(1){width:29%}.rp-table th:nth-child(2){width:9.5%}.rp-table th:nth-child(3){width:8.5%}.rp-table th:nth-child(4){width:9.5%}.rp-table th:nth-child(5){width:9.5%}.rp-table th:nth-child(6){width:12%}.rp-table th:nth-child(7){width:11%}.rp-table th:nth-child(8){width:11%}.rp-table--stores th:nth-child(1){width:14%}.rp-table--stores th:nth-child(2){width:20%}.rp-table--stores th:nth-child(3){width:16%}.rp-table--stores th:nth-child(4){width:9%}.rp-table--stores th:nth-child(5){width:9%}.rp-table--stores th:nth-child(6){width:11%}.rp-table--stores th:nth-child(7){width:12%}.rp-table--stores th:nth-child(8){width:9%}.rp-table--userstores th:nth-child(1){width:18%}.rp-table--userstores th:nth-child(2){width:25%}.rp-table--userstores th:nth-child(3){width:25%}.rp-table--userstores th:nth-child(4){width:11%}.rp-table--userstores th:nth-child(5){width:10%}.rp-table--userstores th:nth-child(6){width:11%}.rp-table thead th{padding:8px 4px;border:0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.rp-table tbody td{padding:12px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.rp-table tfoot td{padding:12px 4px;border:0;font-size:14px;line-height:20px;font-weight:700;color:#101828}.rp-table thead th.t-right,.rp-table tbody td.t-right,.rp-table tfoot td.t-right{text-align:right}.rp-table .is-strong{font-weight:600}.rp-table tbody td.is-muted{color:#98a2b3}.rp-table tbody td.is-pass{color:#027a48}.rp-table tbody td.is-fail{color:#d92d20}.rp-table tbody td.rp-cell-name{color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-result{display:inline-flex;padding:2px 10px;border-radius:9999px;background:#f2f4f7;font-size:12px;line-height:18px;font-weight:500;color:#475467;white-space:nowrap}.rp-result.is-pass{background:#ecfdf3;color:#027a48}.rp-result.is-fail{background:#fef3f2;color:#b42318}.rp-row{cursor:pointer}.rp-row:hover td{background:#fcfcfd}.rp-name{display:flex;flex-direction:column;gap:2px;min-width:0}.rp-name-main{font-weight:600;color:#00a3ff}.rp-name-sub{font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-export{height:32px;padding:0 12px;border:none;border-radius:6px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#344054;cursor:pointer}.rp-export:hover{background:#f9fafb}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:14px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:14px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:18px;line-height:28px;font-weight:600;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-stack{display:flex;flex-direction:column;gap:14px;margin-top:14px;max-width:560px}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px;max-width:560px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:14px;line-height:20px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.rp-reset{border:none;background:transparent;padding:0;font-family:inherit;font-weight:600;text-decoration:none;white-space:nowrap}.rp-pick-search{width:100%}.rp-picklist{max-height:320px;overflow-y:auto;padding:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column}.rp-pick{display:flex;align-items:center;gap:12px;min-height:40px;margin:0;padding:0 10px;border-radius:6px;font-size:14px;color:#344054;cursor:pointer}.rp-pick:hover{background:#f9fafb}.rp-pick.is-all{font-weight:600}.rp-pick input{appearance:none;-webkit-appearance:none;flex-shrink:0;width:16px;height:16px;margin:0;border:1px solid #D0D5DD;border-radius:4px;background:#fff no-repeat center/12px 12px;cursor:pointer;vertical-align:middle;transition:border-color .12s ease,background-color .12s ease}.rp-pick input:hover:not(:disabled){border-color:#00a3ff}.rp-pick input:checked{border-color:#00a3ff;background-color:#eaf8ff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300A3FF' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")}.rp-pick input:focus-visible{outline:none;box-shadow:0 0 0 3px #eaf8ff}.rp-pick input:disabled{cursor:not-allowed;opacity:.45}.rp-pick-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-pick-sub{max-width:45%;font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-pick-empty{padding:20px 10px;font-size:14px;color:#667085}.rp-reading{display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:8px;background:#f9fafb;font-size:14px;color:#475467}.rp-reading strong{font-weight:600;color:#101828}.rp-field{display:flex;flex-direction:column;gap:6px;min-width:0}.rp-field-label{display:flex;align-items:baseline;gap:8px;font-size:14px;line-height:20px;font-weight:600;color:#1d2939}.rp-field-label span{font-weight:400;color:#667085}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "directive", type: i7.AuditV2TipDirective, selector: "[av2Tip]", inputs: ["av2Tip"] }, { kind: "component", type: i8.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i9.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i10.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
899
952
  }
900
953
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2ReportsComponent, decorators: [{
901
954
  type: Component,
902
- args: [{ selector: 'lib-audit-v2-reports', template: "<div class=\"av2-page audit-reports\">\r\n\r\n <!-- Breadcrumb + title -->\r\n <div class=\"rp-head\">\r\n <div class=\"rp-crumb\">Audits \u203A <span class=\"rp-crumb-current\">Reports</span></div>\r\n <div class=\"rp-title\">Store audit report</div>\r\n </div>\r\n\r\n <!-- Filter chips, Filter button at the right end (QA 9 Oct); Export moved to the table head beside its search. -->\r\n <div class=\"rp-controls\">\r\n <button type=\"button\" class=\"rp-chip\" *ngFor=\"let c of chips; trackBy: trackByChip\" (click)=\"openFilters(c.key)\"\r\n [title]=\"c.label + ': ' + c.value\">\r\n <span class=\"rp-chip-key\">{{ c.label }}</span><span class=\"rp-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost rp-filterbtn\" (click)=\"openFilters()\">\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\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon></svg>\r\n Filter\r\n <span class=\"rp-countpill\">{{ filterCount }}</span>\r\n </button>\r\n </div>\r\n\r\n <!-- User view: where in the hierarchy -->\r\n <div class=\"rp-drillbar\" *ngIf=\"!isStoreMode\">\r\n <ng-container *ngFor=\"let c of crumbs; let last = last; let first = first\">\r\n <div class=\"rp-drillcrumb\" [class.is-current]=\"last\" (click)=\"goToLevel(c.level)\">\r\n <span class=\"rp-drillsep\" *ngIf=\"!first\">\u203A</span>{{ c.label }}\r\n </div>\r\n </ng-container>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"rp-hint\">{{ hint }}</div>\r\n </div>\r\n\r\n <!-- Scope -->\r\n <div class=\"rp-scope\">\r\n <div class=\"rp-scope-title\">{{ scopeTitle }}</div>\r\n <div class=\"rp-scope-meta\">{{ scopeMeta }}</div>\r\n </div>\r\n\r\n <!-- KPIs -->\r\n <div class=\"rp-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count rp-kpi-value\" [class.is-good]=\"kpi.tone === 'good'\" [class.is-bad]=\"kpi.tone === 'bad'\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value rp-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Report table -->\r\n <section class=\"rp-card\">\r\n <div class=\"rp-card-head\">\r\n <div class=\"rp-card-text\">\r\n <ng-container *ngIf=\"isStoreMode\">\r\n <div class=\"rp-card-title\">Store report</div>\r\n <div class=\"rp-card-meta\">{{ storeRows.length }} {{ storeRows.length === 1 ? 'store' : 'stores' }} \u00B7 audits submitted in the period</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!isStoreMode\">\r\n <div class=\"rp-card-title\">{{ tableTitle }}</div>\r\n <div class=\"rp-card-meta\">{{ tableMeta }}</div>\r\n </ng-container>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search rp-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"isStoreMode ? 'Search store' : 'Search ' + levelLabel.toLowerCase()\"\r\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearchChange()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"loading\" (click)=\"exportAll()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 16V4\"></path><polyline points=\"7 9 12 4 17 9\"></polyline><path d=\"M4 16v4h16v-4\"></path></svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <!-- Store view: one row per store -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && isStoreMode && tableCount\">\r\n <table class=\"rp-table rp-table--stores\">\r\n <thead>\r\n <tr>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('cluster')\">Cluster <lib-audit-v2-sort-icon [active]=\"sortKey === 'cluster'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('status')\">Result <lib-audit-v2-sort-icon [active]=\"sortKey === 'status'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('lastAudit')\">Last audit <lib-audit-v2-sort-icon [active]=\"sortKey === 'lastAudit'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right\">Export</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let s of storePageRows; trackBy: trackByKey\">\r\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\r\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.cluster\">{{ s.cluster || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '\u2014' }}</td>\r\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\r\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\r\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\r\n <td class=\"t-right\">\r\n <span class=\"rp-result\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\">{{ resultText(s) }}</span>\r\n </td>\r\n <td class=\"t-right\" [class.is-muted]=\"!s.lastAudit\">{{ s.lastAudit || 'No audit' }}</td>\r\n <td class=\"t-right\">\r\n <button type=\"button\" class=\"rp-export\" (click)=\"exportStore(s)\">Export</button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <tfoot>\r\n <tr class=\"rp-total\">\r\n <td>Total</td>\r\n <td></td>\r\n <td></td>\r\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\r\n <td class=\"t-right\">{{ totalAverage }}</td>\r\n <td class=\"t-right\">{{ totals.failed }} fail</td>\r\n <td></td>\r\n <td></td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n </div>\r\n\r\n <!-- User view: circle head / zone manager / area manager roll-up -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level !== 'store' && tableCount\">\r\n <table class=\"rp-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">{{ levelLabel }} <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('total')\">Total stores <lib-audit-v2-sort-icon [active]=\"sortKey === 'total'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('notAudited')\">Not audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'notAudited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('coverage')\">Coverage <lib-audit-v2-sort-icon [active]=\"sortKey === 'coverage'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('avgScore')\">Avg audit score <lib-audit-v2-sort-icon [active]=\"sortKey === 'avgScore'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('failedPct')\">Failed store % <lib-audit-v2-sort-icon [active]=\"sortKey === 'failedPct'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right\">Report</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByRow\" class=\"rp-row\" (click)=\"openRow(row)\">\r\n <td>\r\n <div class=\"rp-name\">\r\n <span class=\"rp-name-main\">{{ row.name }}</span>\r\n <span class=\"rp-name-sub\" *ngIf=\"row.email\">{{ row.email }}</span>\r\n </div>\r\n </td>\r\n <td class=\"t-right\">{{ row.total }}</td>\r\n <td class=\"t-right\">{{ row.audited }}</td>\r\n <td class=\"t-right\" [class.is-muted]=\"!row.notAudited\">{{ row.notAudited }}</td>\r\n <td class=\"t-right\">{{ row.coverage }}</td>\r\n <td class=\"t-right is-strong\">{{ row.avgScore }}</td>\r\n <td class=\"t-right is-strong\" [class.is-fail]=\"isHighFail(row)\">{{ row.failedPct }}</td>\r\n <td class=\"t-right\">\r\n <button type=\"button\" class=\"rp-export\" (click)=\"exportRow(row); $event.stopPropagation()\">Export</button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <tfoot>\r\n <tr class=\"rp-total\">\r\n <td>Total</td>\r\n <td class=\"t-right\">{{ totals.total }}</td>\r\n <td class=\"t-right\">{{ totals.audited }}</td>\r\n <td class=\"t-right\">{{ totals.total - totals.audited }}</td>\r\n <td class=\"t-right\">{{ totalCoverage }}</td>\r\n <td class=\"t-right\">{{ totalAverage }}</td>\r\n <td class=\"t-right\">{{ totalFailedPct }}</td>\r\n <td></td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n </div>\r\n\r\n <!-- User view, deepest level: the area manager's stores -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level === 'store' && tableCount\">\r\n <table class=\"rp-table rp-table--userstores\">\r\n <thead>\r\n <tr>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortBy('zone')\">Zone manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'zone'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"t-right\">Export</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let s of userStorePageRows; trackBy: trackByKey\">\r\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\r\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.zone\">{{ s.zone || '\u2014' }}</td>\r\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\r\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\r\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\r\n <td class=\"t-right\">\r\n <button type=\"button\" class=\"rp-export\" (click)=\"exportStore(s)\">Export</button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <tfoot>\r\n <tr class=\"rp-total\">\r\n <td>Total</td>\r\n <td></td>\r\n <td></td>\r\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\r\n <td class=\"t-right\">{{ totalAverage }}</td>\r\n <td></td>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!loading && !tableCount\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ search ? 'No rows match \"' + search + '\"' : 'No stores match the current filters' }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"rp-pager\" *ngIf=\"!loading && tableCount\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\" [currentPage]=\"page\"\r\n [totalItems]=\"tableCount\" (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"closeFilters()\"></div>\r\n\r\n <!-- Every control edits the drawer's draft (dr); the page behind changes only on Apply or Reset all. -->\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"rp-countpill\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"closeFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\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 </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <!-- trackBy: filterCats is rebuilt on every check, and lib-audit-v2-select's document:mousedown runs one\r\n between press and release; without it the button was replaced mid-click and the click never landed. -->\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByChip\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.paneTitle }}</div>\r\n <div class=\"panehint\">{{ dr.paneSub }}</div>\r\n\r\n <!-- Date -->\r\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input rp-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n <div class=\"rp-presets\">\r\n <button type=\"button\" class=\"rp-preset\" *ngFor=\"let p of presets\" [class.is-on]=\"dr.preset === p\"\r\n (click)=\"dr.setPreset(p)\">{{ p }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- View by -->\r\n <div class=\"pane-options\" *ngIf=\"activeCat === 'mode'\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.isStoreMode\" (click)=\"dr.setMode('store')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.isStoreMode\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Store</span>\r\n <span class=\"pane-option-help\">One row per store with score, result and last audit date.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"!dr.isStoreMode\" (click)=\"dr.setMode('user')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"!dr.isStoreMode\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">User</span>\r\n <span class=\"pane-option-help\">Rolled up by circle head, zone manager and AOM, drillable down to stores.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Stores (Store view) -->\r\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && dr.isStoreMode\">\r\n <label class=\"av2-search rp-pick-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\r\n <input type=\"text\" placeholder=\"Search store\" [(ngModel)]=\"dr.storeQuery\">\r\n </label>\r\n <div class=\"rp-picklist\">\r\n <ng-container *ngIf=\"dr.storePickItems.length\">\r\n <label class=\"rp-pick is-all\">\r\n <input type=\"checkbox\" [checked]=\"dr.storePickAllChecked\" (change)=\"dr.toggleStorePickAll()\">\r\n <span>Select All</span>\r\n </label>\r\n <label class=\"rp-pick\" *ngFor=\"let it of dr.storePickItems; trackBy: trackByPick\">\r\n <input type=\"checkbox\" [checked]=\"it.checked\" (change)=\"dr.toggleStorePick(it.store)\">\r\n <span class=\"rp-pick-label\">{{ it.store.name }}</span>\r\n <span class=\"rp-pick-sub\">{{ it.store.cluster || it.store.aom }}</span>\r\n </label>\r\n </ng-container>\r\n <div class=\"rp-pick-empty\" *ngIf=\"!dr.storePickItems.length\">\r\n {{ dr.storeQuery ? 'No stores match \"' + dr.storeQuery + '\"' : 'No stores in scope' }}\r\n </div>\r\n </div>\r\n <div class=\"rp-reading\">\r\n <span>Reading</span>\r\n <strong>{{ dr.storePickReading }}</strong>\r\n <span class=\"av2-grow\"></span>\r\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.resetStorePick()\">Reset to all stores</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Store hierarchy (User view) -->\r\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && !dr.isStoreMode\">\r\n <div class=\"rp-field\">\r\n <div class=\"rp-field-label\">Circle Head <span>{{ dr.circleOptions.length - 1 }} users</span></div>\r\n <lib-audit-v2-select [value]=\"dr.circleKey\" [options]=\"dr.circleOptions\" placeholder=\"All circles\"\r\n ariaLabel=\"Circle Head\" (changed)=\"dr.pickCircle($event.target.value)\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"rp-field\" *ngIf=\"dr.showZonePick\">\r\n <div class=\"rp-field-label\">Zone Manager <span>{{ dr.zoneOptions.length - 1 }} {{ dr.zoneOptions.length === 2 ? 'user' : 'users' }}</span></div>\r\n <lib-audit-v2-select [value]=\"dr.zoneKey\" [options]=\"dr.zoneOptions\" placeholder=\"All zones\"\r\n ariaLabel=\"Zone Manager\" (changed)=\"dr.pickZone($event.target.value)\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"rp-field\" *ngIf=\"dr.zoneKey\">\r\n <div class=\"rp-field-label\">AOM <span>{{ dr.aomOptions.length - 1 }} {{ dr.aomOptions.length === 2 ? 'user' : 'users' }}</span></div>\r\n <lib-audit-v2-select [value]=\"dr.aomKey\" [options]=\"dr.aomOptions\" placeholder=\"All AOMs\"\r\n ariaLabel=\"AOM\" (changed)=\"dr.pickAom($event.target.value)\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"rp-field\" *ngIf=\"dr.aomKey\">\r\n <div class=\"rp-field-label\">Store <span>{{ dr.storeOptions.length - 1 }} stores</span></div>\r\n <lib-audit-v2-select [value]=\"dr.storeKey\" [options]=\"dr.storeOptions\" placeholder=\"All stores\"\r\n ariaLabel=\"Store\" (changed)=\"dr.pickStore($event.target.value)\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"rp-reading\">\r\n <span>Reading</span>\r\n <strong>{{ dr.hierarchyReading }}</strong>\r\n <span class=\"av2-grow\"></span>\r\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.goToLevel('circle')\">Reset to all circles</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Result (Store view) -->\r\n <div class=\"pane-options\" *ngIf=\"activeCat === 'result' && dr.isStoreMode\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'all'\" (click)=\"dr.setResult('all')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'all'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">All</span>\r\n <span class=\"pane-option-help\">Every store in scope, audited or not.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'pass'\" (click)=\"dr.setResult('pass')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'pass'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Pass</span>\r\n <span class=\"pane-option-help\">Only stores scoring at or above the {{ passMark }}% pass mark.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'fail'\" (click)=\"dr.setResult('fail')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'fail'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Fail</span>\r\n <span class=\"pane-option-help\">Only stores scoring below the {{ passMark }}% pass mark.</span>\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"resetFilters()\">Reset all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply</button>\r\n </div>\r\n </div>\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}}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #fff;--bs-tooltip-color: #344054;--bs-tooltip-max-width: 320px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#fff!important;color:#344054!important;padding:8px 12px;border-radius:8px;font-size:13px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,0 0 0 1px #eaecf0}::ng-deep .tooltip.av2-tip .tooltip-arrow:before{border-top-color:#fff;border-bottom-color:#fff}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg 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'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.rp-pager{padding-top:20px}.rp-head{display:flex;flex-direction:column;gap:2px}.rp-crumb{font-size:13px;line-height:20px;color:#667085}.rp-crumb-current{color:#00a3ff}.rp-title{font-size:22px;line-height:30px;font-weight:600;color:#101828}.rp-controls{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.rp-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:600}.rp-chip{height:32px;max-width:360px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;display:inline-flex;align-items:center;gap:6px;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.rp-chip:hover{background:#f9fafb}.rp-chip-key{font-weight:500;color:#667085}.rp-chip-value{overflow:hidden;text-overflow:ellipsis;font-weight:600;color:#101828}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.rp-daterange{width:260px;height:44px;font-size:14px}.rp-presets{display:flex;flex-wrap:wrap;gap:8px}.rp-preset{height:36px;padding:0 14px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:14px;font-weight:500;color:#667085;cursor:pointer}.rp-preset.is-on{background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;color:#101828;font-weight:600}.rp-drillbar{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:14px 18px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rp-drillcrumb{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:#00a3ff;cursor:pointer}.rp-drillcrumb.is-current{color:#101828;cursor:default}.rp-drillsep{color:#98a2b3;font-weight:400}.rp-hint{font-size:14px;color:#667085}.rp-scope{display:flex;flex-direction:column;gap:2px}.rp-scope-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.rp-scope-meta{font-size:14px;line-height:20px;color:#667085}.rp-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:16px}.rp-kpi-value.is-good{color:#027a48}.rp-kpi-value.is-bad{color:#d92d20}.rp-sk-value{height:32px;margin:3px 0}.rp-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px 12px;display:flex;flex-direction:column;gap:14px}.rp-card-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.rp-card-text{display:flex;flex-direction:column;gap:2px;flex:1;min-width:200px}.rp-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.rp-card-meta{font-size:14px;line-height:20px;color:#667085}.rp-search{width:260px}.rp-table{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.rp-table th:nth-child(1){width:29%}.rp-table th:nth-child(2){width:9.5%}.rp-table th:nth-child(3){width:8.5%}.rp-table th:nth-child(4){width:9.5%}.rp-table th:nth-child(5){width:9.5%}.rp-table th:nth-child(6){width:12%}.rp-table th:nth-child(7){width:11%}.rp-table th:nth-child(8){width:11%}.rp-table--stores th:nth-child(1){width:14%}.rp-table--stores th:nth-child(2){width:20%}.rp-table--stores th:nth-child(3){width:16%}.rp-table--stores th:nth-child(4){width:9%}.rp-table--stores th:nth-child(5){width:9%}.rp-table--stores th:nth-child(6){width:11%}.rp-table--stores th:nth-child(7){width:12%}.rp-table--stores th:nth-child(8){width:9%}.rp-table--userstores th:nth-child(1){width:18%}.rp-table--userstores th:nth-child(2){width:25%}.rp-table--userstores th:nth-child(3){width:25%}.rp-table--userstores th:nth-child(4){width:11%}.rp-table--userstores th:nth-child(5){width:10%}.rp-table--userstores th:nth-child(6){width:11%}.rp-table thead th{padding:8px 4px;border:0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.rp-table tbody td{padding:12px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.rp-table tfoot td{padding:12px 4px;border:0;font-size:14px;line-height:20px;font-weight:700;color:#101828}.rp-table thead th.t-right,.rp-table tbody td.t-right,.rp-table tfoot td.t-right{text-align:right}.rp-table .is-strong{font-weight:600}.rp-table tbody td.is-muted{color:#98a2b3}.rp-table tbody td.is-pass{color:#027a48}.rp-table tbody td.is-fail{color:#d92d20}.rp-table tbody td.rp-cell-name{color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-result{display:inline-flex;padding:2px 10px;border-radius:9999px;background:#f2f4f7;font-size:12px;line-height:18px;font-weight:500;color:#475467;white-space:nowrap}.rp-result.is-pass{background:#ecfdf3;color:#027a48}.rp-result.is-fail{background:#fef3f2;color:#b42318}.rp-row{cursor:pointer}.rp-row:hover td{background:#fcfcfd}.rp-name{display:flex;flex-direction:column;gap:2px;min-width:0}.rp-name-main{font-weight:600;color:#00a3ff}.rp-name-sub{font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-export{height:32px;padding:0 12px;border:none;border-radius:6px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#344054;cursor:pointer}.rp-export:hover{background:#f9fafb}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:14px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:14px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:18px;line-height:28px;font-weight:600;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-stack{display:flex;flex-direction:column;gap:14px;margin-top:14px;max-width:560px}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px;max-width:560px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:14px;line-height:20px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.rp-reset{border:none;background:transparent;padding:0;font-family:inherit;font-weight:600;text-decoration:none;white-space:nowrap}.rp-pick-search{width:100%}.rp-picklist{max-height:320px;overflow-y:auto;padding:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column}.rp-pick{display:flex;align-items:center;gap:12px;min-height:40px;margin:0;padding:0 10px;border-radius:6px;font-size:14px;color:#344054;cursor:pointer}.rp-pick:hover{background:#f9fafb}.rp-pick.is-all{font-weight:600}.rp-pick input{appearance:none;-webkit-appearance:none;flex-shrink:0;width:16px;height:16px;margin:0;border:1px solid #D0D5DD;border-radius:4px;background:#fff no-repeat center/12px 12px;cursor:pointer;vertical-align:middle;transition:border-color .12s ease,background-color .12s ease}.rp-pick input:hover:not(:disabled){border-color:#00a3ff}.rp-pick input:checked{border-color:#00a3ff;background-color:#eaf8ff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300A3FF' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")}.rp-pick input:focus-visible{outline:none;box-shadow:0 0 0 3px #eaf8ff}.rp-pick input:disabled{cursor:not-allowed;opacity:.45}.rp-pick-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-pick-sub{max-width:45%;font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-pick-empty{padding:20px 10px;font-size:14px;color:#667085}.rp-reading{display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:8px;background:#f9fafb;font-size:14px;color:#475467}.rp-reading strong{font-weight:600;color:#101828}.rp-field{display:flex;flex-direction:column;gap:6px;min-width:0}.rp-field-label{display:flex;align-items:baseline;gap:8px;font-size:14px;line-height:20px;font-weight:600;color:#1d2939}.rp-field-label span{font-weight:400;color:#667085}\n"] }]
955
+ args: [{ selector: 'lib-audit-v2-reports', template: "<div class=\"av2-page audit-reports\">\n\n <!-- Breadcrumb + title -->\n <div class=\"rp-head\">\n <div class=\"rp-crumb\">Audits \u203A <span class=\"rp-crumb-current\">Reports</span></div>\n <div class=\"rp-title\">Store audit report</div>\n </div>\n\n <!-- Filter chips, Filter button at the right end (QA 9 Oct); Export moved to the table head beside its search. -->\n <div class=\"rp-controls\">\n <button type=\"button\" class=\"rp-chip\" *ngFor=\"let c of chips; trackBy: trackByChip\" (click)=\"openFilters(c.key)\"\n [title]=\"c.label + ': ' + c.value\">\n <span class=\"rp-chip-key\">{{ c.label }}</span><span class=\"rp-chip-value\">{{ c.value }}</span>\n </button>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost rp-filterbtn\" (click)=\"openFilters()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon></svg>\n Filter\n <span class=\"rp-countpill\">{{ filterCount }}</span>\n </button>\n </div>\n\n <!-- User view: where in the hierarchy -->\n <div class=\"rp-drillbar\" *ngIf=\"!isStoreMode\">\n <ng-container *ngFor=\"let c of crumbs; let last = last; let first = first\">\n <div class=\"rp-drillcrumb\" [class.is-current]=\"last\" (click)=\"goToLevel(c.level)\">\n <span class=\"rp-drillsep\" *ngIf=\"!first\">\u203A</span>{{ c.label }}\n </div>\n </ng-container>\n <div class=\"av2-grow\"></div>\n <div class=\"rp-hint\">{{ hint }}</div>\n </div>\n\n <!-- Scope -->\n <div class=\"rp-scope\">\n <div class=\"rp-scope-title\">{{ scopeTitle }}</div>\n <div class=\"rp-scope-meta\">{{ scopeMeta }}</div>\n </div>\n\n <!-- KPIs -->\n <div class=\"rp-kpis\">\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count rp-kpi-value\" [class.is-good]=\"kpi.tone === 'good'\" [class.is-bad]=\"kpi.tone === 'bad'\">\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value rp-sk-value\"></span>\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\n </div>\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\n </div>\n <div class=\"av2-ocard-body\">\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\">{{ kpi.note }}</div>\n </div>\n </div>\n </div>\n\n <!-- Report table -->\n <section class=\"rp-card\">\n <div class=\"rp-card-head\">\n <div class=\"rp-card-text\">\n <ng-container *ngIf=\"isStoreMode\">\n <div class=\"rp-card-title\">Store report</div>\n <div class=\"rp-card-meta\">{{ storeRows.length }} {{ storeRows.length === 1 ? 'store' : 'stores' }} \u00B7 audits submitted in the period</div>\n </ng-container>\n <ng-container *ngIf=\"!isStoreMode\">\n <div class=\"rp-card-title\">{{ tableTitle }}</div>\n <div class=\"rp-card-meta\">{{ tableMeta }}</div>\n </ng-container>\n </div>\n <div class=\"av2-grow\"></div>\n <label class=\"av2-search rp-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\n </svg>\n <input type=\"text\" [placeholder]=\"isStoreMode ? 'Search store' : 'Search ' + levelLabel.toLowerCase()\"\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearchChange()\">\n </label>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"loading || exporting\" (click)=\"exportAll()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 16V4\"></path><polyline points=\"7 9 12 4 17 9\"></polyline><path d=\"M4 16v4h16v-4\"></path></svg>\n Export\n </button>\n </div>\n\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\n\n <!-- Store view: one row per store -->\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && isStoreMode && tableCount\">\n <table class=\"rp-table rp-table--stores\">\n <thead>\n <tr>\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('cluster')\">Cluster <lib-audit-v2-sort-icon [active]=\"sortKey === 'cluster'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('status')\">Result <lib-audit-v2-sort-icon [active]=\"sortKey === 'status'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('lastAudit')\">Last audit <lib-audit-v2-sort-icon [active]=\"sortKey === 'lastAudit'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Export</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let s of storePageRows; trackBy: trackByKey\">\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.cluster\">{{ s.cluster || '\u2014' }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '\u2014' }}</td>\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\n <td class=\"t-right\">\n <span class=\"rp-result\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\">{{ resultText(s) }}</span>\n </td>\n <td class=\"t-right\" [class.is-muted]=\"!s.lastAudit\">{{ s.lastAudit || 'No audit' }}</td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"rp-export\" [disabled]=\"exporting\" (click)=\"exportStore(s)\">Export</button>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"rp-total\">\n <td>Total</td>\n <td></td>\n <td></td>\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\n <td class=\"t-right\">{{ totalAverage }}</td>\n <td class=\"t-right\">{{ totals.failed }} fail</td>\n <td></td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <!-- User view: circle head / zone manager / area manager roll-up -->\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level !== 'store' && tableCount\">\n <table class=\"rp-table\">\n <thead>\n <tr>\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">{{ levelLabel }} <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('total')\">Total stores <lib-audit-v2-sort-icon [active]=\"sortKey === 'total'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('notAudited')\">Not audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'notAudited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('coverage')\">Coverage <lib-audit-v2-sort-icon [active]=\"sortKey === 'coverage'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('avgScore')\">Avg audit score <lib-audit-v2-sort-icon [active]=\"sortKey === 'avgScore'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('failedPct')\">Failed store % <lib-audit-v2-sort-icon [active]=\"sortKey === 'failedPct'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Report</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of pageRows; trackBy: trackByRow\" class=\"rp-row\" (click)=\"openRow(row)\">\n <td>\n <div class=\"rp-name\">\n <span class=\"rp-name-main\">{{ row.name }}</span>\n <span class=\"rp-name-sub\" *ngIf=\"row.email\">{{ row.email }}</span>\n </div>\n </td>\n <td class=\"t-right\">{{ row.total }}</td>\n <td class=\"t-right\">{{ row.audited }}</td>\n <td class=\"t-right\" [class.is-muted]=\"!row.notAudited\">{{ row.notAudited }}</td>\n <td class=\"t-right\">{{ row.coverage }}</td>\n <td class=\"t-right is-strong\">{{ row.avgScore }}</td>\n <td class=\"t-right is-strong\" [class.is-fail]=\"isHighFail(row)\">{{ row.failedPct }}</td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"rp-export\" [disabled]=\"exporting\" (click)=\"exportRow(row); $event.stopPropagation()\">Export</button>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"rp-total\">\n <td>Total</td>\n <td class=\"t-right\">{{ totals.total }}</td>\n <td class=\"t-right\">{{ totals.audited }}</td>\n <td class=\"t-right\">{{ totals.total - totals.audited }}</td>\n <td class=\"t-right\">{{ totalCoverage }}</td>\n <td class=\"t-right\">{{ totalAverage }}</td>\n <td class=\"t-right\">{{ totalFailedPct }}</td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <!-- User view, deepest level: the area manager's stores -->\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level === 'store' && tableCount\">\n <table class=\"rp-table rp-table--userstores\">\n <thead>\n <tr>\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('zone')\">Zone manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'zone'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Export</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let s of userStorePageRows; trackBy: trackByKey\">\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '\u2014' }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.zone\">{{ s.zone || '\u2014' }}</td>\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"rp-export\" [disabled]=\"exporting\" (click)=\"exportStore(s)\">Export</button>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"rp-total\">\n <td>Total</td>\n <td></td>\n <td></td>\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\n <td class=\"t-right\">{{ totalAverage }}</td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <div *ngIf=\"!loading && !tableCount\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ search ? 'No rows match \"' + search + '\"' : 'No stores match the current filters' }}</div>\n </div>\n </div>\n\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\n <div class=\"rp-pager\" *ngIf=\"!loading && tableCount\">\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\" [currentPage]=\"page\"\n [totalItems]=\"tableCount\" (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </section>\n\n <!-- ============ FILTER DRAWER ============ -->\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"closeFilters()\"></div>\n\n <!-- Every control edits the drawer's draft (dr); the page behind changes only on Apply or Reset all. -->\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\n <div class=\"drawer-head\">\n <span class=\"drawer-title\">Filters</span>\n <span class=\"rp-countpill\">{{ dr.filterCount }}</span>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"closebtn\" (click)=\"closeFilters()\" title=\"Close\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\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>\n </button>\n </div>\n\n <div class=\"drawer-body\">\n <div class=\"drawer-nav\">\n <!-- trackBy: filterCats is rebuilt on every check, and lib-audit-v2-select's document:mousedown runs one\n between press and release; without it the button was replaced mid-click and the click never landed. -->\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByChip\" [class.navitem-active]=\"activeCat === c.key\"\n (click)=\"selectCat(c.key)\">\n <span class=\"navtext\">\n <span class=\"navtitle\">{{ c.label }}</span>\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\n </span>\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\n </button>\n </div>\n\n <div class=\"drawer-pane\">\n <div class=\"panetitle\">{{ dr.paneTitle }}</div>\n <div class=\"panehint\">{{ dr.paneSub }}</div>\n\n <!-- Date -->\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'date'\">\n <div class=\"av2-datepick\">\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\n <input type=\"text\" class=\"av2-datepick-input rp-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\n placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\n [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\"\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\n </div>\n <div class=\"rp-presets\">\n <button type=\"button\" class=\"rp-preset\" *ngFor=\"let p of presets\" [class.is-on]=\"dr.preset === p\"\n (click)=\"dr.setPreset(p)\">{{ p }}</button>\n </div>\n </div>\n\n <!-- View by -->\n <div class=\"pane-options\" *ngIf=\"activeCat === 'mode'\">\n <div class=\"pane-option\" [class.is-on]=\"dr.isStoreMode\" (click)=\"dr.setMode('store')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.isStoreMode\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">Store</span>\n <span class=\"pane-option-help\">One row per store with score, result and last audit date.</span>\n </span>\n </div>\n <div class=\"pane-option\" [class.is-on]=\"!dr.isStoreMode\" (click)=\"dr.setMode('user')\">\n <span class=\"pane-radio\" [class.is-on]=\"!dr.isStoreMode\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">User</span>\n <span class=\"pane-option-help\">Rolled up by circle head, zone manager and AOM, drillable down to stores.</span>\n </span>\n </div>\n </div>\n\n <!-- Stores (Store view) -->\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && dr.isStoreMode\">\n <label class=\"av2-search rp-pick-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" placeholder=\"Search store\" [(ngModel)]=\"dr.storeQuery\">\n </label>\n <div class=\"rp-picklist\">\n <ng-container *ngIf=\"dr.storePickItems.length\">\n <label class=\"rp-pick is-all\">\n <input type=\"checkbox\" [checked]=\"dr.storePickAllChecked\" (change)=\"dr.toggleStorePickAll()\">\n <span>Select All</span>\n </label>\n <label class=\"rp-pick\" *ngFor=\"let it of dr.storePickItems; trackBy: trackByPick\">\n <input type=\"checkbox\" [checked]=\"it.checked\" (change)=\"dr.toggleStorePick(it.store)\">\n <span class=\"rp-pick-label\">{{ it.store.name }}</span>\n <span class=\"rp-pick-sub\">{{ it.store.cluster || it.store.aom }}</span>\n </label>\n </ng-container>\n <div class=\"rp-pick-empty\" *ngIf=\"!dr.storePickItems.length\">\n {{ dr.storeQuery ? 'No stores match \"' + dr.storeQuery + '\"' : 'No stores in scope' }}\n </div>\n </div>\n <div class=\"rp-reading\">\n <span>Reading</span>\n <strong>{{ dr.storePickReading }}</strong>\n <span class=\"av2-grow\"></span>\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.resetStorePick()\">Reset to all stores</button>\n </div>\n </div>\n\n <!-- Store hierarchy (User view) -->\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && !dr.isStoreMode\">\n <div class=\"rp-field\">\n <div class=\"rp-field-label\">Circle Head <span>{{ dr.circleOptions.length - 1 }} users</span></div>\n <lib-audit-v2-select [value]=\"dr.circleKey\" [options]=\"dr.circleOptions\" placeholder=\"All circles\"\n ariaLabel=\"Circle Head\" (changed)=\"dr.pickCircle($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-field\" *ngIf=\"dr.showZonePick\">\n <div class=\"rp-field-label\">Zone Manager <span>{{ dr.zoneOptions.length - 1 }} {{ dr.zoneOptions.length === 2 ? 'user' : 'users' }}</span></div>\n <lib-audit-v2-select [value]=\"dr.zoneKey\" [options]=\"dr.zoneOptions\" placeholder=\"All zones\"\n ariaLabel=\"Zone Manager\" (changed)=\"dr.pickZone($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-field\" *ngIf=\"dr.zoneKey\">\n <div class=\"rp-field-label\">AOM <span>{{ dr.aomOptions.length - 1 }} {{ dr.aomOptions.length === 2 ? 'user' : 'users' }}</span></div>\n <lib-audit-v2-select [value]=\"dr.aomKey\" [options]=\"dr.aomOptions\" placeholder=\"All AOMs\"\n ariaLabel=\"AOM\" (changed)=\"dr.pickAom($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-field\" *ngIf=\"dr.aomKey\">\n <div class=\"rp-field-label\">Store <span>{{ dr.storeOptions.length - 1 }} stores</span></div>\n <lib-audit-v2-select [value]=\"dr.storeKey\" [options]=\"dr.storeOptions\" placeholder=\"All stores\"\n ariaLabel=\"Store\" (changed)=\"dr.pickStore($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-reading\">\n <span>Reading</span>\n <strong>{{ dr.hierarchyReading }}</strong>\n <span class=\"av2-grow\"></span>\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.goToLevel('circle')\">Reset to all circles</button>\n </div>\n </div>\n\n <!-- Result (Store view) -->\n <div class=\"pane-options\" *ngIf=\"activeCat === 'result' && dr.isStoreMode\">\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'all'\" (click)=\"dr.setResult('all')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'all'\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">All</span>\n <span class=\"pane-option-help\">Every store in scope, audited or not.</span>\n </span>\n </div>\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'pass'\" (click)=\"dr.setResult('pass')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'pass'\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">Pass</span>\n <span class=\"pane-option-help\">Only stores scoring at or above the {{ passMark }}% pass mark.</span>\n </span>\n </div>\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'fail'\" (click)=\"dr.setResult('fail')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'fail'\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">Fail</span>\n <span class=\"pane-option-help\">Only stores scoring below the {{ passMark }}% pass mark.</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"drawer-foot\">\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"resetFilters()\">Reset all</button>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply</button>\n </div>\n </div>\n\n</div>\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}}::ng-deep .tooltip.av2-tip{--bs-tooltip-bg: #fff;--bs-tooltip-color: #344054;--bs-tooltip-max-width: 320px;--bs-tooltip-opacity: 1}::ng-deep .tooltip.av2-tip .tooltip-inner{background-color:#fff!important;color:#344054!important;padding:8px 12px;border-radius:8px;font-size:13px;line-height:18px;font-weight:500;text-align:left;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,0 0 0 1px #eaecf0}::ng-deep .tooltip.av2-tip .tooltip-arrow:before{border-top-color:#fff;border-bottom-color:#fff}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg 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'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.rp-pager{padding-top:20px}.rp-head{display:flex;flex-direction:column;gap:2px}.rp-crumb{font-size:13px;line-height:20px;color:#667085}.rp-crumb-current{color:#00a3ff}.rp-title{font-size:22px;line-height:30px;font-weight:600;color:#101828}.rp-controls{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.rp-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:600}.rp-chip{height:32px;max-width:360px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;display:inline-flex;align-items:center;gap:6px;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.rp-chip:hover{background:#f9fafb}.rp-chip-key{font-weight:500;color:#667085}.rp-chip-value{overflow:hidden;text-overflow:ellipsis;font-weight:600;color:#101828}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.rp-daterange{width:260px;height:44px;font-size:14px}.rp-presets{display:flex;flex-wrap:wrap;gap:8px}.rp-preset{height:36px;padding:0 14px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:14px;font-weight:500;color:#667085;cursor:pointer}.rp-preset.is-on{background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;color:#101828;font-weight:600}.rp-drillbar{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:14px 18px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.rp-drillcrumb{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:#00a3ff;cursor:pointer}.rp-drillcrumb.is-current{color:#101828;cursor:default}.rp-drillsep{color:#98a2b3;font-weight:400}.rp-hint{font-size:14px;color:#667085}.rp-scope{display:flex;flex-direction:column;gap:2px}.rp-scope-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.rp-scope-meta{font-size:14px;line-height:20px;color:#667085}.rp-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:16px}.rp-kpi-value.is-good{color:#027a48}.rp-kpi-value.is-bad{color:#d92d20}.rp-sk-value{height:32px;margin:3px 0}.rp-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px 12px;display:flex;flex-direction:column;gap:14px}.rp-card-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.rp-card-text{display:flex;flex-direction:column;gap:2px;flex:1;min-width:200px}.rp-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.rp-card-meta{font-size:14px;line-height:20px;color:#667085}.rp-search{width:260px}.rp-table{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.rp-table th:nth-child(1){width:29%}.rp-table th:nth-child(2){width:9.5%}.rp-table th:nth-child(3){width:8.5%}.rp-table th:nth-child(4){width:9.5%}.rp-table th:nth-child(5){width:9.5%}.rp-table th:nth-child(6){width:12%}.rp-table th:nth-child(7){width:11%}.rp-table th:nth-child(8){width:11%}.rp-table--stores th:nth-child(1){width:14%}.rp-table--stores th:nth-child(2){width:20%}.rp-table--stores th:nth-child(3){width:16%}.rp-table--stores th:nth-child(4){width:9%}.rp-table--stores th:nth-child(5){width:9%}.rp-table--stores th:nth-child(6){width:11%}.rp-table--stores th:nth-child(7){width:12%}.rp-table--stores th:nth-child(8){width:9%}.rp-table--userstores th:nth-child(1){width:18%}.rp-table--userstores th:nth-child(2){width:25%}.rp-table--userstores th:nth-child(3){width:25%}.rp-table--userstores th:nth-child(4){width:11%}.rp-table--userstores th:nth-child(5){width:10%}.rp-table--userstores th:nth-child(6){width:11%}.rp-table thead th{padding:8px 4px;border:0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.rp-table tbody td{padding:12px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.rp-table tfoot td{padding:12px 4px;border:0;font-size:14px;line-height:20px;font-weight:700;color:#101828}.rp-table thead th.t-right,.rp-table tbody td.t-right,.rp-table tfoot td.t-right{text-align:right}.rp-table .is-strong{font-weight:600}.rp-table tbody td.is-muted{color:#98a2b3}.rp-table tbody td.is-pass{color:#027a48}.rp-table tbody td.is-fail{color:#d92d20}.rp-table tbody td.rp-cell-name{color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-result{display:inline-flex;padding:2px 10px;border-radius:9999px;background:#f2f4f7;font-size:12px;line-height:18px;font-weight:500;color:#475467;white-space:nowrap}.rp-result.is-pass{background:#ecfdf3;color:#027a48}.rp-result.is-fail{background:#fef3f2;color:#b42318}.rp-row{cursor:pointer}.rp-row:hover td{background:#fcfcfd}.rp-name{display:flex;flex-direction:column;gap:2px;min-width:0}.rp-name-main{font-weight:600;color:#00a3ff}.rp-name-sub{font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-export{height:32px;padding:0 12px;border:none;border-radius:6px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-family:inherit;font-size:13px;font-weight:600;color:#344054;cursor:pointer}.rp-export:hover{background:#f9fafb}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:18px;line-height:28px;font-weight:600;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:14px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:14px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:18px;line-height:28px;font-weight:600;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-stack{display:flex;flex-direction:column;gap:14px;margin-top:14px;max-width:560px}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px;max-width:560px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:14px;line-height:20px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.rp-reset{border:none;background:transparent;padding:0;font-family:inherit;font-weight:600;text-decoration:none;white-space:nowrap}.rp-pick-search{width:100%}.rp-picklist{max-height:320px;overflow-y:auto;padding:6px;border-radius:8px;box-shadow:inset 0 0 0 1px #eaecf0;display:flex;flex-direction:column}.rp-pick{display:flex;align-items:center;gap:12px;min-height:40px;margin:0;padding:0 10px;border-radius:6px;font-size:14px;color:#344054;cursor:pointer}.rp-pick:hover{background:#f9fafb}.rp-pick.is-all{font-weight:600}.rp-pick input{appearance:none;-webkit-appearance:none;flex-shrink:0;width:16px;height:16px;margin:0;border:1px solid #D0D5DD;border-radius:4px;background:#fff no-repeat center/12px 12px;cursor:pointer;vertical-align:middle;transition:border-color .12s ease,background-color .12s ease}.rp-pick input:hover:not(:disabled){border-color:#00a3ff}.rp-pick input:checked{border-color:#00a3ff;background-color:#eaf8ff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300A3FF' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E\")}.rp-pick input:focus-visible{outline:none;box-shadow:0 0 0 3px #eaf8ff}.rp-pick input:disabled{cursor:not-allowed;opacity:.45}.rp-pick-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-pick-sub{max-width:45%;font-size:12px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rp-pick-empty{padding:20px 10px;font-size:14px;color:#667085}.rp-reading{display:flex;align-items:center;gap:12px;padding:12px 16px;border-radius:8px;background:#f9fafb;font-size:14px;color:#475467}.rp-reading strong{font-weight:600;color:#101828}.rp-field{display:flex;flex-direction:column;gap:6px;min-width:0}.rp-field-label{display:flex;align-items:baseline;gap:8px;font-size:14px;line-height:20px;font-weight:600;color:#1d2939}.rp-field-label span{font-weight:400;color:#667085}\n"] }]
903
956
  }], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.GlobalStateService }, { type: i3.ToastService }, { type: i0.ChangeDetectorRef }] });
904
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItcmVwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL3JlcG9ydHMvYXVkaXQtdjItcmVwb3J0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL3JlcG9ydHMvYXVkaXQtdjItcmVwb3J0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3hELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUUsYUFBYSxFQUE0QixlQUFlLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7QUFzRC9ILHlGQUF5RjtBQUN6RixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFckIsb0ZBQW9GO0FBQ3BGLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQztBQUVsQzs7Ozs7O0dBTUc7QUFNSCxNQUFNLE9BQU8sdUJBQXVCO0lBOER4QjtJQUNBO0lBQ0E7SUFDQTtJQWhFVixRQUFRLEdBQUcsU0FBUyxDQUFDO0lBRXJCLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JELEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEMsTUFBTSxHQUFHLFlBQVksQ0FBQztJQUNi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LE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUUsT0FBTztZQUNMLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM3RSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRO1lBQzNHLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNqRixRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3ZFLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzdFLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLENBQU07UUFDbEIsT0FBTztZQUNMLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDekIsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUs7WUFDN0IsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUks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QUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ25ELENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN0QixPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDaEUsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEIsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEIsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FB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QUksR0FBRyxDQUFDLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsVUFBVSxDQUFDLENBQVMsRUFBRSxDQUFXO1FBQy9CLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXLENBQUMsQ0FBUyxFQUFFLElBQXlCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7SUFDeEIsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFTLEVBQUUsQ0FBa0I7UUFDdkMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQzt3R0FuM0JVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDREQzlFcEMsMnV4QkFxWkE7OzRGRHZVYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0Usc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IFBJQ0tFUl9MT0NBTEUsIFBpY2tlZERhdGVzLCBQaWNrZXJSYW5nZSwgZnJvbVBpY2tlclJhbmdlLCBwaWNrZXJSYW5nZXMsIHRvUGlja2VyUmFuZ2UgfSBmcm9tICcuLi9hdWRpdC12Mi1kYXRlcGlja2VyJztcclxuaW1wb3J0IHsgQXVkaXRTZWxlY3RPcHRpb24gfSBmcm9tICcuLi9zZWxlY3QvYXVkaXQtdjItc2VsZWN0LmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEtwaSB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIG5vdGU6IHN0cmluZztcclxuICAvKiogRmlndXJlIGNvbG91cjogZ3JlZW4gLyByZWQgYWdhaW5zdCB0aGUgcGFzcyBtYXJrLCBvciBwbGFpbi4gKi9cclxuICB0b25lOiAnJyB8ICdnb29kJyB8ICdiYWQnO1xyXG59XHJcblxyXG4vKiogT25lIHJvdyBvZiB0aGUgcm9sbC11cCB0YWJsZSAoY2lyY2xlIGhlYWQgLyB6b25lIG1hbmFnZXIgLyBhcmVhIG1hbmFnZXIpLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFJvdyB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGV2ZWw6IFJlcG9ydExldmVsO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBlbWFpbDogc3RyaW5nO1xyXG4gIHRvdGFsOiBudW1iZXI7XHJcbiAgYXVkaXRlZDogbnVtYmVyO1xyXG4gIG5vdEF1ZGl0ZWQ6IG51bWJlcjtcclxuICBmYWlsZWQ6IG51bWJlcjtcclxuICBzY29yZVN1bTogbnVtYmVyO1xyXG4gIGNvdmVyYWdlOiBzdHJpbmc7XHJcbiAgYXZnU2NvcmU6IHN0cmluZztcclxuICBmYWlsZWRQY3Q6IHN0cmluZztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbi8qKiBPbmUgc3RvcmUgb2YgdGhlIFN0b3JlIHZpZXcgKGFuZCBvZiB0aGUgVXNlciB2aWV3J3MgZGVlcGVzdCBsZXZlbCkuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVSb3cge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBjbHVzdGVyOiBzdHJpbmc7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIGNpcmNsZUtleTogc3RyaW5nO1xyXG4gIHpvbmVLZXk6IHN0cmluZztcclxuICBhb21LZXk6IHN0cmluZztcclxuICBhdWRpdGVkOiBib29sZWFuO1xyXG4gIC8qKiAwLTEwMCwgbnVsbCB3aGVuIHRoZSBzdG9yZSBoYXMgbm8gc2NvcmVkIGF1ZGl0IGluIHRoZSBwZXJpb2QuICovXHJcbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XHJcbiAgc3RhdHVzOiAncGFzcycgfCAnZmFpbCcgfCAnbmEnO1xyXG4gIC8qKiBcIkREIE1NTSBZWVlZXCI7ICcnIHdoZW4gbm9uZS4gKi9cclxuICBsYXN0QXVkaXQ6IHN0cmluZztcclxuICAvKiogWVlZWS1NTS1ERCBvZiB0aGUgbGFzdCBhdWRpdCwgZm9yIHNvcnRpbmc7ICcnIHdoZW4gbm9uZS4gKi9cclxuICBsYXN0QXVkaXRJc286IHN0cmluZztcclxufVxyXG5cclxudHlwZSBSZXBvcnRMZXZlbCA9ICdjaXJjbGUnIHwgJ3pvbmUnIHwgJ2FvbScgfCAnc3RvcmUnO1xyXG50eXBlIFZpZXdNb2RlID0gJ3N0b3JlJyB8ICd1c2VyJztcclxudHlwZSBSZXN1bHRGaWx0ZXIgPSAnYWxsJyB8ICdwYXNzJyB8ICdmYWlsJztcclxudHlwZSBGaWx0ZXJDYXQgPSAnZGF0ZScgfCAnbW9kZScgfCAnc2NvcGUnIHwgJ3Jlc3VsdCc7XHJcblxyXG4vKiogUGFzcyBtYXJrIHNob3duIHVudGlsIHRoZSBBUEkgYW5zd2VycyAoaXQgc2VuZHMgdGhlIHJlYWwgb25lIGluIHN1bW1hcnkucGFzc01hcmspLiAqL1xyXG5jb25zdCBQQVNTX01BUksgPSA3NTtcclxuXHJcbi8qKiBSb3dzIHdpdGhvdXQgYSBjaXJjbGUgaGVhZCBpbiB0aGUgc3RvcmUgaGllcmFyY2h5IGFyZSBncm91cGVkIHVuZGVyIHRoaXMga2V5LiAqL1xyXG5jb25zdCBVTkFTU0lHTkVEID0gJ19fdW5hc3NpZ25lZCc7XHJcblxyXG4vKipcclxuICogUmVwb3J0cyAoXCJSZXBvcnRzIOKAlCBTdG9yZSBhdWRpdCByZXBvcnRcIiBwcm90b3R5cGUpLCByZWFkIGZyb20gUE9TVCAvdHJheC9hdWRpdC9yZXBvcnRzOiBvbmUgY2FsbCByZXR1cm5zIGV2ZXJ5XHJcbiAqIHN0b3JlIG9mIHRoZSBoZWFkZXIgc2NvcGUgd2l0aCBpdHMgc2NvcmUsIHJlc3VsdCwgbGFzdCBhdWRpdCwgY2x1c3RlciBhbmQgaGllcmFyY2h5IGxpbmUsIHBsdXMgdGhlIGNpcmNsZSBoZWFkIC9cclxuICogem9uZSBtYW5hZ2VyIC8gYXJlYSBtYW5hZ2VyIHJvbGwtdXBzLiBFdmVyeXRoaW5nIGJlbG93IHRoZSBkYXRlIHJhbmdlIGlzIGZpbHRlcmVkIGluIHRoZSBicm93c2VyOlxyXG4gKiAgIFZpZXcgYnkgU3RvcmUgLSBvbmUgcm93IHBlciBzdG9yZSwgbmFycm93ZWQgYnkgdGhlIFN0b3JlcyBwaWNrIGFuZCB0aGUgUmVzdWx0IGZpbHRlci5cclxuICogICBWaWV3IGJ5IFVzZXIgIC0gY2lyY2xlIGhlYWQgLT4gem9uZSBtYW5hZ2VyIC0+IGFyZWEgbWFuYWdlciAtPiBzdG9yZXMsIGJ5IGNsaWNraW5nIHJvd3Mgb3IgdGhlIEhpZXJhcmNoeSBwaWNrcy5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWF1ZGl0LXYyLXJlcG9ydHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1yZXBvcnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXVkaXQtdjItcmVwb3J0cy5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGl0VjJSZXBvcnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHBhc3NNYXJrID0gUEFTU19NQVJLO1xyXG5cclxuICBmcm9tID0gZGF5anMoKS5zdGFydE9mKCdtb250aCcpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gIHRvID0gZGF5anMoKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICBwcmVzZXQgPSAnVGhpcyBtb250aCc7XHJcbiAgcmVhZG9ubHkgcHJlc2V0cyA9IFsnVGhpcyBtb250aCcsICdMYXN0IG1vbnRoJywgJ0xhc3QgMzAgZGF5cyddO1xyXG4gIC8qKiBSYW5nZSBwaWNrZXIgbW9kZWwsIGtlcHQgaW4gc3RlcCB3aXRoIGZyb20gLyB0by4gKi9cclxuICByYW5nZTogUGlja2VyUmFuZ2UgfCBudWxsID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gIHJlYWRvbmx5IHBpY2tlckxvY2FsZSA9IFBJQ0tFUl9MT0NBTEU7XHJcbiAgcmVhZG9ubHkgcmFuZ2VzID0gcGlja2VyUmFuZ2VzKCk7XHJcbiAgcmVhZG9ubHkgdG9kYXkgPSBkYXlqcygpO1xyXG5cclxuICAvKiogVmlldyBieTogU3RvcmUgKHByb3RvdHlwZSBkZWZhdWx0KSBvciBVc2VyIChoaWVyYXJjaHkgcm9sbC11cCkuICovXHJcbiAgbW9kZTogVmlld01vZGUgPSAnc3RvcmUnO1xyXG4gIHJlc3VsdDogUmVzdWx0RmlsdGVyID0gJ2FsbCc7XHJcbiAgLyoqIFN0b3JlcyBwaWNrZWQgaW4gRmlsdGVycyAtPiBTdG9yZXM7IG51bGwgPSBldmVyeSBzdG9yZSBpbiBzY29wZS4gKi9cclxuICBzdG9yZVNlbDogU2V0PHN0cmluZz4gfCBudWxsID0gbnVsbDtcclxuICBzdG9yZVF1ZXJ5ID0gJyc7XHJcblxyXG4gIHNlYXJjaCA9ICcnO1xyXG5cclxuICAvLyBVc2VyIHZpZXcgcG9zaXRpb24uXHJcbiAgbGV2ZWw6IFJlcG9ydExldmVsID0gJ2NpcmNsZSc7XHJcbiAgY2lyY2xlS2V5ID0gJyc7XHJcbiAgem9uZUtleSA9ICcnO1xyXG4gIGFvbUtleSA9ICcnO1xyXG4gIC8qKiBPbmUgc3RvcmUgcGlja2VkIHVuZGVyIGFuIGFyZWEgbWFuYWdlciAoRmlsdGVycyAtPiBTdG9yZSBoaWVyYXJjaHkgLT4gU3RvcmUpLiAqL1xyXG4gIHN0b3JlS2V5ID0gJyc7XHJcbiAgY2lyY2xlSGVhZCA9ICcnO1xyXG4gIHpvbmVNYW5hZ2VyID0gJyc7XHJcbiAgYW9tID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbHRlciBkcmF3ZXIgKFFBIDkgT2N0KTogdGhlIGRyYXdlciBlZGl0cyBhIGRyYWZ0LCBhbmQgdGhlIHBhZ2UgYmVoaW5kIGNoYW5nZXMgb25seSBvbiBBcHBseSAob3IgUmVzZXQgYWxsKS5cclxuICAgKiBUaGUgZHJhZnQgaXMgT2JqZWN0LmNyZWF0ZSh0aGlzKTogaXQgcmVhZHMgdGhlIGxvYWRlZCByZXBvcnQgdGhyb3VnaCB0aGUgY29tcG9uZW50LCBzbyBldmVyeSBnZXR0ZXIgdGhlXHJcbiAgICogZHJhd2VyIHNob3dzIChzdG9yZSBwaWNrLCBoaWVyYXJjaHkgb3B0aW9ucywgcmVhZGluZ3MpIHdvcmtzIG9uIHRoZSBkcmFmdCdzIG93biBmaWx0ZXIgdmFsdWVzLlxyXG4gICAqL1xyXG4gIGZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgZHJhZnQ6IEF1ZGl0VjJSZXBvcnRzQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgLyoqIFNldCBvbiB0aGUgZHJhZnQgb25seTogZGF0ZSBwaWNrcyB3YWl0IGZvciBBcHBseSBpbnN0ZWFkIG9mIHJlZmV0Y2hpbmcuICovXHJcbiAgcHJpdmF0ZSBpc0RyYWZ0ID0gZmFsc2U7XHJcbiAgYWN0aXZlQ2F0OiBGaWx0ZXJDYXQgPSAnc2NvcGUnO1xyXG5cclxuICAvKiogU3RhcnRzIHRydWUgc28gdGhlIGZpcnN0IHBhaW50IHNoaW1tZXJzIGluc3RlYWQgb2Ygc2hvd2luZyB6ZXJvIEtQSXMgYW5kIGFuIGVtcHR5IHRhYmxlLiAqL1xyXG4gIGxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAvKiogQ29sdW1uIHNvcnQgKCcnID0gdGhlIEFQSSdzIG9yZGVyKTsgYSBoZWFkZXIgY2xpY2sgdG9nZ2xlcyBhc2NlbmRpbmcgLyBkZXNjZW5kaW5nLiAqL1xyXG4gIHNvcnRLZXkgPSAnJztcclxuICBzb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAvKiogVGFibGUgcGFnZXIgKHNoYXJlZCBsaWItcGFnaW5hdGlvbiwgMTAgLyAyMCAvIDMwIGxpa2UgZXZlcnkgYXVkaXQgbGlzdCk7IGJhY2sgdG8gcGFnZSAxIG9uIGFueSBmaWx0ZXIgY2hhbmdlLiAqL1xyXG4gIHBhZ2UgPSAxO1xyXG4gIHBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGFnZVNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG5cclxuICBwcml2YXRlIGRhdGE6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBhbGxTdG9yZXM6IFN0b3JlUm93W10gPSBbXTtcclxuICBwcml2YXRlIGhlYWRlckRhdGE6IGFueTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRyYXhTZXJ2aWNlOiBUcmF4U2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YT8uY2xpZW50KSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnN0IGNsaWVudENoYW5nZWQgPSB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCAhPT0gZGF0YS5jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJEYXRhID0gZGF0YTtcclxuICAgICAgICBpZiAoY2xpZW50Q2hhbmdlZCkge1xyXG4gICAgICAgICAgdGhpcy5nb1RvTGV2ZWwoJ2NpcmNsZScpO1xyXG4gICAgICAgICAgdGhpcy5zdG9yZVNlbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIEFQSSByZWplY3RzIHVua25vd24ga2V5cywgc28gb25seSB0aGUgc2NvcGUgaXMgc2VudC4gKi9cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGVhZGVyRGF0YT8uY2xpZW50KSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRSZXBvcnRzKHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YS5jbGllbnQsXHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZyb20sXHJcbiAgICAgIHRvRGF0ZTogdGhpcy50byxcclxuICAgICAgc3RvcmVJZDogKHRoaXMuaGVhZGVyRGF0YS5zdG9yZXMgfHwgW10pLmZpbHRlcigoczogYW55KSA9PiBzLmNoZWNrZWQpLm1hcCgoczogYW55KSA9PiBzLnN0b3JlSWQpXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gcmVzPy5jb2RlID09PSAyMDAgPyAocmVzLmRhdGEgfHwgbnVsbCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMucGFzc01hcmsgPSBOdW1iZXIodGhpcy5kYXRhPy5zdW1tYXJ5Py5wYXNzTWFyaykgfHwgUEFTU19NQVJLO1xyXG4gICAgICAgIHRoaXMuYWxsU3RvcmVzID0gKHRoaXMuZGF0YT8uc3RvcmVzIHx8IFtdKS5tYXAoKHM6IGFueSkgPT4gdGhpcy50b1N0b3JlKHMpKTtcclxuICAgICAgICAvLyBBIHBpY2sgb2Ygc3RvcmVzIHRoYXQgbGVmdCB0aGUgc2NvcGUgaXMgZHJvcHBlZC5cclxuICAgICAgICBpZiAodGhpcy5zdG9yZVNlbCkge1xyXG4gICAgICAgICAgY29uc3QgaWRzID0gbmV3IFNldCh0aGlzLmFsbFN0b3Jlcy5tYXAocyA9PiBzLmtleSkpO1xyXG4gICAgICAgICAgY29uc3Qga2VwdCA9IFsuLi50aGlzLnN0b3JlU2VsXS5maWx0ZXIoaWQgPT4gaWRzLmhhcyhpZCkpO1xyXG4gICAgICAgICAgdGhpcy5zdG9yZVNlbCA9IGtlcHQubGVuZ3RoICYmIGtlcHQubGVuZ3RoIDwgdGhpcy5hbGxTdG9yZXMubGVuZ3RoID8gbmV3IFNldChrZXB0KSA6IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hbGxTdG9yZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvU3RvcmUoczogYW55KTogU3RvcmVSb3cge1xyXG4gICAgY29uc3Qgc2NvcmUgPSBzPy5zY29yZSA9PT0gbnVsbCB8fCBzPy5zY29yZSA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKE51bWJlcihzLnNjb3JlKSkgPyBudWxsIDogTWF0aC5yb3VuZChOdW1iZXIocy5zY29yZSkpO1xyXG4gICAgY29uc3Qgc3RhdHVzID0gcz8uc3RhdHVzID09PSAncGFzcycgfHwgcz8uc3RhdHVzID09PSAnZmFpbCcgPyBzLnN0YXR1cyA6ICduYSc7XHJcbiAgICBjb25zdCBsYXN0ID0gcz8ubGFzdEF1ZGl0RGF0ZSAmJiBkYXlqcyhzLmxhc3RBdWRpdERhdGUpLmlzVmFsaWQoKSA/IGRheWpzKHMubGFzdEF1ZGl0RGF0ZSkgOiBudWxsO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAga2V5OiBTdHJpbmcocz8ua2V5ID8/ICcnKSxcclxuICAgICAgbmFtZTogcz8ubmFtZSB8fCAn4oCUJyxcclxuICAgICAgY2x1c3Rlcjogcz8uY2x1c3RlciB8fCAnJyxcclxuICAgICAgY2lyY2xlOiBzPy5jaXJjbGVOYW1lIHx8IHRoaXMubmFtZU9mKHRoaXMuZGF0YT8uY2lyY2xlcywgcz8uY2lyY2xlS2V5KSxcclxuICAgICAgem9uZTogcz8uem9uZU5hbWUgfHwgdGhpcy5uYW1lT2YodGhpcy5kYXRhPy56b25lcywgcz8uem9uZUtleSksXHJcbiAgICAgIGFvbTogcz8uYW9tTmFtZSB8fCB0aGlzLm5hbWVPZih0aGlzLmRhdGE/LmFvbXMsIHM/LmFvbUtleSksXHJcbiAgICAgIGNpcmNsZUtleTogcz8uY2lyY2xlS2V5IHx8ICcnLFxyXG4gICAgICB6b25lS2V5OiBzPy56b25lS2V5IHx8ICcnLFxyXG4gICAgICBhb21LZXk6IHM/LmFvbUtleSB8fCAnJyxcclxuICAgICAgYXVkaXRlZDogc2NvcmUgIT09IG51bGwsXHJcbiAgICAgIHNjb3JlLFxyXG4gICAgICBzdGF0dXM6IHNjb3JlID09PSBudWxsID8gJ25hJyA6IHN0YXR1cyxcclxuICAgICAgbGFzdEF1ZGl0OiBsYXN0ID8gbGFzdC5mb3JtYXQoJ0REIE1NTSBZWVlZJykgOiAnJyxcclxuICAgICAgbGFzdEF1ZGl0SXNvOiBsYXN0ID8gbGFzdC5mb3JtYXQoJ1lZWVktTU0tREQnKSA6ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYW1lT2YobGlzdDogYW55W10sIGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBrZXkgPyAoKGxpc3QgfHwgW10pLmZpbmQoKHI6IGFueSkgPT4gci5rZXkgPT09IGtleSk/Lm5hbWUgfHwgJycpIDogJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNTdG9yZU1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnc3RvcmUnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gU3RvcmUgdmlld1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogU3RvcmVzIG9mIHRoZSBTdG9yZXMgcGljaywgdGhlbiB0aGUgUmVzdWx0IGZpbHRlciAod2hhdCB0aGUgS1BJcyBhbmQgdGhlIHRhYmxlIHJlYWQpLiAqL1xyXG4gIGdldCBzdG9yZVNjb3BlKCk6IFN0b3JlUm93W10ge1xyXG4gICAgY29uc3QgcGlja2VkID0gdGhpcy5zdG9yZVNlbCA/IHRoaXMuYWxsU3RvcmVzLmZpbHRlcihzID0+IHRoaXMuc3RvcmVTZWwhLmhhcyhzLmtleSkpIDogdGhpcy5hbGxTdG9yZXM7XHJcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQgPT09ICdhbGwnID8gcGlja2VkIDogcGlja2VkLmZpbHRlcihzID0+IHMuc3RhdHVzID09PSB0aGlzLnJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmUgdGFibGUgcm93czogdGhlIHNjb3BlLCBuYXJyb3dlZCBieSB0aGUgc2VhcmNoIGJveCwgaW4gdGhlIGNvbHVtbiBzb3J0LiAqL1xyXG4gIGdldCBzdG9yZVJvd3MoKTogU3RvcmVSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5zZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBsaXN0ID0gcVxyXG4gICAgICA/IHRoaXMuc3RvcmVTY29wZS5maWx0ZXIocyA9PiAocy5uYW1lICsgJyAnICsgcy5rZXkgKyAnICcgKyBzLmNsdXN0ZXIgKyAnICcgKyBzLmFvbSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSlcclxuICAgICAgOiB0aGlzLnN0b3JlU2NvcGU7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0U3RvcmVzKGxpc3QpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0b3JlUGFnZVJvd3MoKTogU3RvcmVSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlT2YodGhpcy5zdG9yZVJvd3MpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0b3JlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlU2VsXHJcbiAgICAgID8gdGhpcy5zdG9yZVNlbC5zaXplICsgKHRoaXMuc3RvcmVTZWwuc2l6ZSA9PT0gMSA/ICcgc3RvcmUnIDogJyBzdG9yZXMnKSArICcgc2VsZWN0ZWQnXHJcbiAgICAgIDogJ0FsbCBzdG9yZXMgKCcgKyB0aGlzLmFsbFN0b3Jlcy5sZW5ndGggKyAnKSc7XHJcbiAgfVxyXG5cclxuICBzY29yZVRleHQoczogU3RvcmVSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHMuc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IHMuc2NvcmUgKyAnJSc7XHJcbiAgfVxyXG5cclxuICByZXN1bHRUZXh0KHM6IFN0b3JlUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzLnN0YXR1cyA9PT0gJ3Bhc3MnID8gJ1Bhc3MnIDogcy5zdGF0dXMgPT09ICdmYWlsJyA/ICdGYWlsJyA6ICdOb3QgYXVkaXRlZCc7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBVc2VyIHZpZXcgKHJvbGwtdXApXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBSb2xsLXVwIHJvd3Mgb2YgdGhlIGN1cnJlbnQgbGV2ZWwsIG5hcnJvd2VkIHRvIHRoZSBzZWxlY3RlZCBwYXJlbnQgKHN0b3JlcyBhdCB0aGUgZGVlcGVzdCBsZXZlbCkuICovXHJcbiAgZ2V0IHJvd3MoKTogUmVwb3J0Um93W10ge1xyXG4gICAgaWYgKCF0aGlzLmRhdGEpIHsgcmV0dXJuIFtdOyB9XHJcbiAgICBsZXQgbGlzdDogYW55W107XHJcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gJ2NpcmNsZScpIHtcclxuICAgICAgbGlzdCA9IFsuLi4odGhpcy5kYXRhLmNpcmNsZXMgfHwgW10pXTtcclxuICAgICAgY29uc3Qgb3JwaGFucyA9ICh0aGlzLmRhdGEuc3RvcmVzIHx8IFtdKS5maWx0ZXIoKHM6IGFueSkgPT4gIXMuY2lyY2xlS2V5KTtcclxuICAgICAgaWYgKG9ycGhhbnMubGVuZ3RoKSB7IGxpc3QucHVzaCh0aGlzLnJvbGx1cChVTkFTU0lHTkVELCAnTm90IGluIGhpZXJhcmNoeScsIG9ycGhhbnMpKTsgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmxldmVsID09PSAnem9uZScpIHtcclxuICAgICAgbGlzdCA9ICh0aGlzLmRhdGEuem9uZXMgfHwgW10pLmZpbHRlcigoejogYW55KSA9PiB6LmNpcmNsZUtleSA9PT0gdGhpcy5jaXJjbGVLZXkpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmxldmVsID09PSAnYW9tJykge1xyXG4gICAgICBsaXN0ID0gKHRoaXMuZGF0YS5hb21zIHx8IFtdKS5maWx0ZXIoKGE6IGFueSkgPT4gYS56b25lS2V5ID09PSB0aGlzLnpvbmVLZXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGlzdCA9ICh0aGlzLmRhdGEuc3RvcmVzIHx8IFtdKS5maWx0ZXIoKHM6IGFueSkgPT5cclxuICAgICAgICAodGhpcy5hb21LZXkgPyBzLmFvbUtleSA9PT0gdGhpcy5hb21LZXkgOiB0aGlzLmNpcmNsZUtleSA9PT0gVU5BU1NJR05FRCA/ICFzLmNpcmNsZUtleSA6IHRydWUpXHJcbiAgICAgICAgJiYgKCF0aGlzLnN0b3JlS2V5IHx8IHMua2V5ID09PSB0aGlzLnN0b3JlS2V5KSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbGlzdC5tYXAoKHI6IGFueSkgPT4gdGhpcy50b1JvdyhyKSk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIG9mIHRoZSBVc2VyIHZpZXcncyBkZWVwZXN0IGxldmVsIChTdG9yZSwgQXJlYSBtYW5hZ2VyLCBab25lIG1hbmFnZXIsIEF1ZGl0ZWQsIFNjb3JlKS4gKi9cclxuICBnZXQgdXNlclN0b3JlcygpOiBTdG9yZVJvd1tdIHtcclxuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KHRoaXMucm93cy5tYXAociA9PiByLmtleSkpO1xyXG4gICAgY29uc3QgcSA9IHRoaXMuc2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFN0b3Jlcyh0aGlzLmFsbFN0b3Jlcy5maWx0ZXIocyA9PiBrZXlzLmhhcyhzLmtleSkgJiYgKCFxIHx8IChzLm5hbWUgKyAnICcgKyBzLmtleSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkpKTtcclxuICB9XHJcblxyXG4gIGdldCB1c2VyU3RvcmVQYWdlUm93cygpOiBTdG9yZVJvd1tdIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2VPZih0aGlzLnVzZXJTdG9yZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsaWVudC1zaWRlIHJvbGwtdXAgKHNhbWUgbWF0aHMgYXMgdGhlIEFQSSkgZm9yIHN0b3JlcyB0aGUgaGllcmFyY2h5IGRvZXMgbm90IGxpc3QuICovXHJcbiAgcHJpdmF0ZSByb2xsdXAoa2V5OiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc3RvcmVzOiBhbnlbXSk6IGFueSB7XHJcbiAgICBjb25zdCBhdWRpdGVkID0gc3RvcmVzLmZpbHRlcihzID0+IHMuYXVkaXRlZCk7XHJcbiAgICBjb25zdCBmYWlsZWQgPSBzdG9yZXMuZmlsdGVyKHMgPT4gcy5mYWlsZWQpLmxlbmd0aDtcclxuICAgIGNvbnN0IHNjb3JlU3VtID0gYXVkaXRlZC5yZWR1Y2UoKGEsIHMpID0+IGEgKyAoTnVtYmVyKHMuYXZnU2NvcmUpIHx8IDApLCAwKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxldmVsOiAnY2lyY2xlJywga2V5LCBuYW1lLCBlbWFpbDogJycsIGNpcmNsZUtleTogJycsIHpvbmVLZXk6ICcnLCBhb21LZXk6ICcnLFxyXG4gICAgICB0b3RhbDogc3RvcmVzLmxlbmd0aCwgYXVkaXRlZDogYXVkaXRlZC5sZW5ndGgsIG5vdEF1ZGl0ZWQ6IHN0b3Jlcy5sZW5ndGggLSBhdWRpdGVkLmxlbmd0aCwgZmFpbGVkLCBzY29yZVN1bSxcclxuICAgICAgY292ZXJhZ2U6IHN0b3Jlcy5sZW5ndGggPyBNYXRoLnJvdW5kKGF1ZGl0ZWQubGVuZ3RoIC8gc3RvcmVzLmxlbmd0aCAqIDEwMCkgOiBudWxsLFxyXG4gICAgICBhdmdTY29yZTogYXVkaXRlZC5sZW5ndGggPyBNYXRoLnJvdW5kKHNjb3JlU3VtIC8gYXVkaXRlZC5sZW5ndGgpIDogbnVsbCxcclxuICAgICAgZmFpbGVkUGN0OiBhdWRpdGVkLmxlbmd0aCA/IE1hdGgucm91bmQoZmFpbGVkIC8gYXVkaXRlZC5sZW5ndGggKiAxMDApIDogbnVsbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9Sb3cocjogYW55KTogUmVwb3J0Um93IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGtleTogU3RyaW5nKHI/LmtleSA/PyAnJyksXHJcbiAgICAgIGxldmVsOiByPy5sZXZlbCB8fCB0aGlzLmxldmVsLFxyXG4gICAgICBuYW1lOiByPy5uYW1lIHx8ICfigJQnLFxyXG4gICAgICBlbWFpbDogcj8uZW1haWwgfHwgJycsXHJcbiAgICAgIHRvdGFsOiBOdW1iZXIocj8udG90YWwpIHx8IDAsXHJcbiAgICAgIGF1ZGl0ZWQ6IE51bWJlcihyPy5hdWRpdGVkKSB8fCAwLFxyXG4gICAgICBub3RBdWRpdGVkOiBOdW1iZXIocj8ubm90QXVkaXRlZCkgfHwgMCxcclxuICAgICAgZmFpbGVkOiBOdW1iZXIocj8uZmFpbGVkKSB8fCAwLFxyXG4gICAgICBzY29yZVN1bTogTnVtYmVyKHI/LnNjb3JlU3VtKSB8fCAwLFxyXG4gICAgICBjb3ZlcmFnZTogdGhpcy5wY3RUZXh0KHI/LmNvdmVyYWdlKSxcclxuICAgICAgYXZnU2NvcmU6IHRoaXMucGN0VGV4dChyPy5hdmdTY29yZSksXHJcbiAgICAgIGZhaWxlZFBjdDogdGhpcy5wY3RUZXh0KHI/LmZhaWxlZFBjdCksXHJcbiAgICAgIHJhdzogclxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGN0VGV4dCh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPT09IG51bGwgfHwgdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09ICcnIHx8IGlzTmFOKE51bWJlcih2KSkgPyAn4oCUJyA6IE1hdGgucm91bmQoTnVtYmVyKHYpKSArICclJztcclxuICB9XHJcblxyXG4gIGdldCBjcnVtYnMoKTogQXJyYXk8eyBsYWJlbDogc3RyaW5nOyBsZXZlbDogUmVwb3J0TGV2ZWwgfT4ge1xyXG4gICAgY29uc3QgdHJhaWw6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgbGV2ZWw6IFJlcG9ydExldmVsIH0+ID0gW3sgbGFiZWw6ICdBbGwgY2lyY2xlcycsIGxldmVsOiAnY2lyY2xlJyB9XTtcclxuICAgIGlmICh0aGlzLmNpcmNsZUhlYWQpIHsgdHJhaWwucHVzaCh7IGxhYmVsOiB0aGlzLmNpcmNsZUhlYWQsIGxldmVsOiAnem9uZScgfSk7IH1cclxuICAgIGlmICh0aGlzLnpvbmVNYW5hZ2VyKSB7IHRyYWlsLnB1c2goeyBsYWJlbDogdGhpcy56b25lTWFuYWdlciwgbGV2ZWw6ICdhb20nIH0pOyB9XHJcbiAgICBpZiAodGhpcy5hb20pIHsgdHJhaWwucHVzaCh7IGxhYmVsOiB0aGlzLmFvbSwgbGV2ZWw6ICdzdG9yZScgfSk7IH1cclxuICAgIHJldHVybiB0cmFpbDtcclxuICB9XHJcblxyXG4gIGdldCBoaW50KCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gJ2NpcmNsZScpIHsgcmV0dXJuICdDbGljayBhIGNpcmNsZSBoZWFkIHRvIG9wZW4gdGhlaXIgem9uZSBtYW5hZ2Vycyc7IH1cclxuICAgIGlmICh0aGlzLmxldmVsID09PSAnem9uZScpIHsgcmV0dXJuICdDbGljayBhIHpvbmUgbWFuYWdlciB0byBvcGVuIHRoZWlyIGFyZWEgbWFuYWdlcnMnOyB9XHJcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gJ2FvbScpIHsgcmV0dXJuICdDbGljayBhbiBhcmVhIG1hbmFnZXIgdG8gb3BlbiB0aGVpciBzdG9yZXMnOyB9XHJcbiAgICByZXR1cm4gJ1N0b3JlIGxldmVsIMK3IHRoZSBkZWVwZXN0IHZpZXcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbHVtbiBoZWFkaW5nIGZvciB0aGUgY3VycmVudCBsZXZlbC4gKi9cclxuICBnZXQgbGV2ZWxMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMubGV2ZWwgPT09ICdjaXJjbGUnKSB7IHJldHVybiAnQ2lyY2xlIGhlYWQnOyB9XHJcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gJ3pvbmUnKSB7IHJldHVybiAnWm9uZSBtYW5hZ2VyJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMubGV2ZWwgPT09ICdhb20nID8gJ0FyZWEgbWFuYWdlcicgOiAnU3RvcmUnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhYmxlVGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxldmVsID09PSAnc3RvcmUnID8gJ1N0b3JlIHJlcG9ydCcgOiB0aGlzLmxldmVsTGFiZWwgKyAnIHN1bW1hcnknO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhYmxlTWV0YSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMubGV2ZWwgPT09ICdzdG9yZScpIHtcclxuICAgICAgY29uc3QgbiA9IHRoaXMudXNlclN0b3Jlcy5sZW5ndGg7XHJcbiAgICAgIHJldHVybiBuICsgKG4gPT09IDEgPyAnIHN0b3JlJyA6ICcgc3RvcmVzJykgKyAnIMK3IHJvbGxlZCB1cCBmcm9tIHN0b3JlIGF1ZGl0cyBpbiB0aGUgcGVyaW9kJztcclxuICAgIH1cclxuICAgIGNvbnN0IG4gPSB0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGg7XHJcbiAgICByZXR1cm4gbiArIChuID09PSAxID8gJyByb3cnIDogJyByb3dzJykgKyAnIMK3IHJvbGxlZCB1cCBmcm9tIHN0b3JlIGF1ZGl0cyBpbiB0aGUgcGVyaW9kJztcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFJvd3MoKTogUmVwb3J0Um93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuc2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3Qgcm93cyA9IHEgPyB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gKHIubmFtZSArICcgJyArIHIuZW1haWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy5yb3dzO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFJvd3Mocm93cyk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFnZVJvd3MoKTogUmVwb3J0Um93W10ge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnZU9mKHRoaXMuZmlsdGVyZWRSb3dzKTtcclxuICB9XHJcblxyXG4gIC8qKiBEcmlsbCBvbmUgbGV2ZWwgZG93biBpbnRvIHRoZSBjbGlja2VkIHJvdy4gKi9cclxuICBvcGVuUm93KHJvdzogUmVwb3J0Um93KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gJ2NpcmNsZScpIHtcclxuICAgICAgdGhpcy5jaXJjbGVLZXkgPSByb3cua2V5O1xyXG4gICAgICB0aGlzLmNpcmNsZUhlYWQgPSByb3cubmFtZTtcclxuICAgICAgLy8gU3RvcmVzIG91dHNpZGUgdGhlIGhpZXJhcmNoeSBoYXZlIG5vIHpvbmUgLyBBT00gdG8gZHJpbGwgdGhyb3VnaC5cclxuICAgICAgdGhpcy5sZXZlbCA9IHJvdy5rZXkgPT09IFVOQVNTSUdORUQgPyAnc3RvcmUnIDogJ3pvbmUnO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmxldmVsID09PSAnem9uZScpIHtcclxuICAgICAgdGhpcy56b25lS2V5ID0gcm93LmtleTtcclxuICAgICAgdGhpcy56b25lTWFuYWdlciA9IHJvdy5uYW1lO1xyXG4gICAgICB0aGlzLmxldmVsID0gJ2FvbSc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubGV2ZWwgPT09ICdhb20nKSB7XHJcbiAgICAgIHRoaXMuYW9tS2V5ID0gcm93LmtleTtcclxuICAgICAgdGhpcy5hb20gPSByb3cubmFtZTtcclxuICAgICAgdGhpcy5sZXZlbCA9ICdzdG9yZSc7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlYXJjaCA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIGdvVG9MZXZlbChsZXZlbDogUmVwb3J0TGV2ZWwpOiB2b2lkIHtcclxuICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcclxuICAgIGlmIChsZXZlbCA9PT0gJ2NpcmNsZScpIHsgdGhpcy5jaXJjbGVLZXkgPSAnJzsgdGhpcy5jaXJjbGVIZWFkID0gJyc7IH1cclxuICAgIGlmIChsZXZlbCA9PT0gJ2NpcmNsZScgfHwgbGV2ZWwgPT09ICd6b25lJykgeyB0aGlzLnpvbmVLZXkgPSAnJzsgdGhpcy56b25lTWFuYWdlciA9ICcnOyB9XHJcbiAgICBpZiAobGV2ZWwgIT09ICdzdG9yZScpIHsgdGhpcy5hb21LZXkgPSAnJzsgdGhpcy5hb20gPSAnJzsgfVxyXG4gICAgdGhpcy5zdG9yZUtleSA9ICcnO1xyXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBTb3J0aW5nIChldmVyeSB0YWJsZSlcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgc29ydEJ5KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnNvcnREaXIgPSB0aGlzLnNvcnRLZXkgPT09IGtleSAmJiB0aGlzLnNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XHJcbiAgICB0aGlzLnNvcnRLZXkgPSBrZXk7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIE51bWJlcnMgYXMgbnVtYmVycywgdGV4dCBhcyB0ZXh0LCBlbXB0eSB2YWx1ZXMgKFwi4oCUXCIpIGFsd2F5cyBsYXN0LiAqL1xyXG4gIHByaXZhdGUgc29ydExpc3Q8VD4ocm93czogVFtdLCB2YWx1ZTogKHI6IFQpID0+IG51bWJlciB8IHN0cmluZyB8IG51bGwpOiBUW10ge1xyXG4gICAgaWYgKCF0aGlzLnNvcnRLZXkpIHsgcmV0dXJuIHJvd3M7IH1cclxuICAgIGNvbnN0IGRpciA9IHRoaXMuc29ydERpciA9PT0gJ2FzYycgPyAxIDogLTE7XHJcbiAgICByZXR1cm4gWy4uLnJvd3NdLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgeCA9IHZhbHVlKGEpO1xyXG4gICAgICBjb25zdCB5ID0gdmFsdWUoYik7XHJcbiAgICAgIGlmICh4ID09PSBudWxsIHx8IHggPT09ICcnIHx8IHkgPT09IG51bGwgfHwgeSA9PT0gJycpIHtcclxuICAgICAgICBjb25zdCB4ZSA9IHggPT09IG51bGwgfHwgeCA9PT0gJyc7XHJcbiAgICAgICAgY29uc3QgeWUgPSB5ID09PSBudWxsIHx8IHkgPT09ICcnO1xyXG4gICAgICAgIHJldHVybiB4ZSA9PT0geWUgPyAwIDogeGUgPyAxIDogLTE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgeSA9PT0gJ251bWJlcicpIHsgcmV0dXJuICh4IC0geSkgKiBkaXI7IH1cclxuICAgICAgcmV0dXJuIFN0cmluZyh4KS5sb2NhbGVDb21wYXJlKFN0cmluZyh5KSwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiAnYmFzZScgfSkgKiBkaXI7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBSb2xsLXVwIHJvd3M6IGNvdW50cyBhcyBudW1iZXJzLCB0aGUgJSBjb2x1bW5zIGJ5IHRoZWlyIG51bWJlciwgdGhlIG5hbWUgYXMgdGV4dC4gKi9cclxuICBwcml2YXRlIHNvcnRSb3dzKHJvd3M6IFJlcG9ydFJvd1tdKTogUmVwb3J0Um93W10ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5zb3J0S2V5IGFzIGtleW9mIFJlcG9ydFJvdztcclxuICAgIHJldHVybiB0aGlzLnNvcnRMaXN0KHJvd3MsIChyKSA9PiB7XHJcbiAgICAgIGNvbnN0IHYgPSByW2tleV07XHJcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicpIHsgcmV0dXJuIHY7IH1cclxuICAgICAgaWYgKGtleSA9PT0gJ25hbWUnKSB7IHJldHVybiBTdHJpbmcodiB8fCAnJyk7IH1cclxuICAgICAgY29uc3QgbiA9IHBhcnNlRmxvYXQoU3RyaW5nKHYpKTtcclxuICAgICAgcmV0dXJuIGlzTmFOKG4pID8gbnVsbCA6IG47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc29ydFN0b3Jlcyhyb3dzOiBTdG9yZVJvd1tdKTogU3RvcmVSb3dbXSB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLnNvcnRLZXk7XHJcbiAgICBjb25zdCByYW5rID0geyBwYXNzOiAyLCBmYWlsOiAxLCBuYTogbnVsbCB9IGFzIGNvbnN0O1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydExpc3Qocm93cywgKHMpID0+IHtcclxuICAgICAgc3dpdGNoIChrZXkpIHtcclxuICAgICAgICBjYXNlICduYW1lJzogcmV0dXJuIHMubmFtZTtcclxuICAgICAgICBjYXNlICdjbHVzdGVyJzogcmV0dXJuIHMuY2x1c3RlcjtcclxuICAgICAgICBjYXNlICdhb20nOiByZXR1cm4gcy5hb207XHJcbiAgICAgICAgY2FzZSAnem9uZSc6IHJldHVybiBzLnpvbmU7XHJcbiAgICAgICAgY2FzZSAnYXVkaXRlZCc6IHJldHVybiBzLmF1ZGl0ZWQgPyAxIDogMDtcclxuICAgICAgICBjYXNlICdzY29yZSc6IHJldHVybiBzLnNjb3JlO1xyXG4gICAgICAgIGNhc2UgJ3N0YXR1cyc6IHJldHVybiByYW5rW3Muc3RhdHVzXTtcclxuICAgICAgICBjYXNlICdsYXN0QXVkaXQnOiByZXR1cm4gcy5sYXN0QXVkaXRJc287XHJcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gU2NvcGUgaGVhZGVyICsgS1BJcyAoYm90aCB2aWV3cylcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgZ2V0IGRhdGVMaW5lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKHRoaXMuZnJvbSkgKyAnIHRvICcgKyB0aGlzLmZvcm1hdERhdGUodGhpcy50byk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdERhdGUoaXNvOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGlzbyA/IGRheWpzKGlzbykuZm9ybWF0KCdERCBNTU0gWVlZWScpIDogaXNvO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhpZXJhcmNoeVRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmVLZXkgPyB0aGlzLmFsbFN0b3Jlcy5maW5kKHMgPT4gcy5rZXkgPT09IHRoaXMuc3RvcmVLZXkpIDogbnVsbDtcclxuICAgIHJldHVybiBzdG9yZT8ubmFtZSB8fCB0aGlzLmFvbSB8fCB0aGlzLnpvbmVNYW5hZ2VyIHx8IHRoaXMuY2lyY2xlSGVhZCB8fCAnQWxsIGNpcmNsZXMnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3BlVGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmlzU3RvcmVNb2RlID8gdGhpcy5zdG9yZUxhYmVsIDogdGhpcy5oaWVyYXJjaHlUaXRsZTtcclxuICB9XHJcblxyXG4gIGdldCBzY29wZU1ldGEoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLnRvdGFscy50b3RhbDtcclxuICAgIHJldHVybiB0aGlzLmRhdGVMaW5lICsgJyDCtyAnICsgbiArIChuID09PSAxID8gJyBzdG9yZScgOiAnIHN0b3JlcycpICsgJyBpbiBzY29wZSc7XHJcbiAgfVxyXG5cclxuICAvKiogVG90YWxzIG9mIHdoYXQgaXMgb24gc2NyZWVuOiB0aGUgU3RvcmUgdmlldydzIHNjb3BlLCBvciB0aGUgVXNlciB2aWV3J3MgY3VycmVudCBsZXZlbC4gKi9cclxuICBnZXQgdG90YWxzKCk6IHsgdG90YWw6IG51bWJlcjsgYXVkaXRlZDogbnVtYmVyOyBmYWlsZWQ6IG51bWJlcjsgc2NvcmVTdW06IG51bWJlciB9IHtcclxuICAgIGlmICh0aGlzLmlzU3RvcmVNb2RlKSB7XHJcbiAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLnN0b3JlU2NvcGU7XHJcbiAgICAgIGNvbnN0IGF1ZGl0ZWQgPSBsaXN0LmZpbHRlcihzID0+IHMuYXVkaXRlZCk7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdG90YWw6IGxpc3QubGVuZ3RoLFxyXG4gICAgICAgIGF1ZGl0ZWQ6IGF1ZGl0ZWQubGVuZ3RoLFxyXG4gICAgICAgIGZhaWxlZDogYXVkaXRlZC5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2ZhaWwnKS5sZW5ndGgsXHJcbiAgICAgICAgc2NvcmVTdW06IGF1ZGl0ZWQucmVkdWNlKChhLCBzKSA9PiBhICsgKHMuc2NvcmUgfHwgMCksIDApXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBjb25zdCByb3dzID0gdGhpcy5yb3dzO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG90YWw6IHJvd3MucmVkdWNlKChhLCByKSA9PiBhICsgci50b3RhbCwgMCksXHJcbiAgICAgIGF1ZGl0ZWQ6IHJvd3MucmVkdWNlKChhLCByKSA9PiBhICsgci5hdWRpdGVkLCAwKSxcclxuICAgICAgZmFpbGVkOiByb3dzLnJlZHVjZSgoYSwgcikgPT4gYSArIHIuZmFpbGVkLCAwKSxcclxuICAgICAgc2NvcmVTdW06IHJvd3MucmVkdWNlKChhLCByKSA9PiBhICsgci5zY29yZVN1bSwgMClcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBnZXQgY292ZXJhZ2VOdW0oKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBjb25zdCB0ID0gdGhpcy50b3RhbHM7XHJcbiAgICByZXR1cm4gdC50b3RhbCA/IE1hdGgucm91bmQodC5hdWRpdGVkIC8gdC50b3RhbCAqIDEwMCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF2ZXJhZ2VOdW0oKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBjb25zdCB0ID0gdGhpcy50b3RhbHM7XHJcbiAgICByZXR1cm4gdC5hdWRpdGVkID8gTWF0aC5yb3VuZCh0LnNjb3JlU3VtIC8gdC5hdWRpdGVkKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgZmFpbGVkUGN0TnVtKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgdCA9IHRoaXMudG90YWxzO1xyXG4gICAgcmV0dXJuIHQuYXVkaXRlZCA/IE1hdGgucm91bmQodC5mYWlsZWQgLyB0LmF1ZGl0ZWQgKiAxMDApIDogbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGN0KHY6IG51bWJlciB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPT09IG51bGwgPyAn4oCUJyA6IHYgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBnZXQga3BpcygpOiBSZXBvcnRLcGlbXSB7XHJcbiAgICBjb25zdCB0ID0gdGhpcy50b3RhbHM7XHJcbiAgICBjb25zdCBhdmcgPSB0aGlzLmF2ZXJhZ2VOdW07XHJcbiAgICBjb25zdCBmYWlsZWQgPSB0aGlzLmZhaWxlZFBjdE51bTtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsgbGFiZWw6ICdUb3RhbCBzdG9yZXMnLCB2YWx1ZTogU3RyaW5nKHQudG90YWwpLCBub3RlOiAnSW4gdGhpcyBzY29wZScsIHRvbmU6ICcnIH0sXHJcbiAgICAgIHsgbGFiZWw6ICdBdWRpdGVkIHN0b3JlcycsIHZhbHVlOiBTdHJpbmcodC5hdWRpdGVkKSwgbm90ZTogKHQudG90YWwgLSB0LmF1ZGl0ZWQpICsgJyBub3QgYXVkaXRlZCcsIHRvbmU6ICcnIH0sXHJcbiAgICAgIHsgbGFiZWw6ICdBdWRpdCBjb3ZlcmFnZScsIHZhbHVlOiB0aGlzLnBjdCh0aGlzLmNvdmVyYWdlTnVtKSwgbm90ZTogJ1N0b3JlcyB3aXRoIGEgc3VibWl0dGVkIGF1ZGl0JywgdG9uZTogJycgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnQXZlcmFnZSBhdWRpdCBzY29yZScsIHZhbHVlOiB0aGlzLnBjdChhdmcpLCBub3RlOiAnQWNyb3NzIGF1ZGl0ZWQgc3RvcmVzJyxcclxuICAgICAgICB0b25lOiBhdmcgPT09IG51bGwgPyAnJyA6IGF2ZyA8IHRoaXMucGFzc01hcmsgPyAnYmFkJyA6ICdnb29kJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdGYWlsZWQgc3RvcmUgJScsIHZhbHVlOiB0aGlzLnBjdChmYWlsZWQpLCBub3RlOiB0LmZhaWxlZCArICcgYmVsb3cgdGhlICcgKyB0aGlzLnBhc3NNYXJrICsgJyUgcGFzcyBtYXJrJyxcclxuICAgICAgICB0b25lOiBmYWlsZWQgIT09IG51bGwgJiYgZmFpbGVkID4gNTAgPyAnYmFkJyA6ICcnXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICAvKiogVG90YWwgcm93IHRleHRzLiAqL1xyXG4gIGdldCB0b3RhbEF1ZGl0ZWRPZigpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdCA9IHRoaXMudG90YWxzO1xyXG4gICAgcmV0dXJuIHQuYXVkaXRlZCArICcgb2YgJyArIHQudG90YWw7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxBdmVyYWdlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5wY3QodGhpcy5hdmVyYWdlTnVtKTtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbENvdmVyYWdlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5wY3QodGhpcy5jb3ZlcmFnZU51bSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxGYWlsZWRQY3QoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnBjdCh0aGlzLmZhaWxlZFBjdE51bSk7XHJcbiAgfVxyXG5cclxuICAvKiogQSByb2xsLXVwIHJvdyB3aGVyZSBtb3JlIHRoYW4gaGFsZiBvZiB0aGUgYXVkaXRlZCBzdG9yZXMgZmFpbGVkIHJlYWRzIHJlZCAocHJvdG90eXBlKS4gKi9cclxuICBpc0hpZ2hGYWlsKHJvdzogUmVwb3J0Um93KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBuID0gcGFyc2VJbnQocm93LmZhaWxlZFBjdCwgMTApO1xyXG4gICAgcmV0dXJuICFpc05hTihuKSAmJiBuID4gNTA7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBQYWdpbmdcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgcHJpdmF0ZSBwYWdlT2Y8VD4obGlzdDogVFtdKTogVFtdIHtcclxuICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGxpc3QubGVuZ3RoIC8gdGhpcy5wYWdlU2l6ZSkpO1xyXG4gICAgY29uc3QgcGFnZSA9IE1hdGgubWluKHRoaXMucGFnZSwgcGFnZXMpO1xyXG4gICAgcmV0dXJuIGxpc3Quc2xpY2UoKHBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemUsIHBhZ2UgKiB0aGlzLnBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIG9mIHRoZSB0YWJsZSBvbiBzY3JlZW4gKGZvciB0aGUgcGFnZXIgYW5kIHRoZSBlbXB0eSBzdGF0ZSkuICovXHJcbiAgZ2V0IHRhYmxlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLmlzU3RvcmVNb2RlKSB7IHJldHVybiB0aGlzLnN0b3JlUm93cy5sZW5ndGg7IH1cclxuICAgIHJldHVybiB0aGlzLmxldmVsID09PSAnc3RvcmUnID8gdGhpcy51c2VyU3RvcmVzLmxlbmd0aCA6IHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIG9uUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZSA9IE51bWJlcihwYWdlKSB8fCAxO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBOdW1iZXIoc2l6ZSkgfHwgMTA7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2hDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gRmlsdGVycyAoZHJhd2VyICsgY2hpcHMpXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBEYXRlIGFuZCBWaWV3IGJ5IGFsd2F5cyBjb3VudDsgdGhlIHNjb3BlIHBpY2sgYW5kIHRoZSBSZXN1bHQgZmlsdGVyIHdoZW4gc2V0IChwcm90b3R5cGUpLiAqL1xyXG4gIGdldCBmaWx0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIDIgKyAodGhpcy5zY29wZURpcnR5ID8gMSA6IDApICsgKHRoaXMuaXNTdG9yZU1vZGUgJiYgdGhpcy5yZXN1bHQgIT09ICdhbGwnID8gMSA6IDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgc2NvcGVEaXJ0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzU3RvcmVNb2RlID8gISF0aGlzLnN0b3JlU2VsIDogISEodGhpcy5jaXJjbGVLZXkgfHwgdGhpcy5zdG9yZUtleSk7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVzdWx0TGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnJlc3VsdCA9PT0gJ3Bhc3MnID8gJ1Bhc3MnIDogdGhpcy5yZXN1bHQgPT09ICdmYWlsJyA/ICdGYWlsJyA6ICdBbGwgcmVzdWx0cyc7XHJcbiAgfVxyXG5cclxuICBnZXQgY2hpcHMoKTogQXJyYXk8eyBrZXk6IEZpbHRlckNhdDsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCBjaGlwczogQXJyYXk8eyBrZXk6IEZpbHRlckNhdDsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiA9IFtcclxuICAgICAgeyBrZXk6ICdkYXRlJywgbGFiZWw6ICdEYXRlJywgdmFsdWU6IHRoaXMuZGF0ZUxpbmUgfSxcclxuICAgICAgeyBrZXk6ICdtb2RlJywgbGFiZWw6ICdWaWV3IGJ5JywgdmFsdWU6IHRoaXMuaXNTdG9yZU1vZGUgPyAnU3RvcmUnIDogJ1VzZXInIH0sXHJcbiAgICAgIHsga2V5OiAnc2NvcGUnLCBsYWJlbDogdGhpcy5pc1N0b3JlTW9kZSA/ICdTdG9yZXMnIDogJ0hpZXJhcmNoeScsIHZhbHVlOiB0aGlzLmlzU3RvcmVNb2RlID8gdGhpcy5zdG9yZUxhYmVsIDogdGhpcy5oaWVyYXJjaHlUaXRsZSB9XHJcbiAgICBdO1xyXG4gICAgaWYgKHRoaXMuaXNTdG9yZU1vZGUpIHsgY2hpcHMucHVzaCh7IGtleTogJ3Jlc3VsdCcsIGxhYmVsOiAnUmVzdWx0JywgdmFsdWU6IHRoaXMucmVzdWx0TGFiZWwgfSk7IH1cclxuICAgIHJldHVybiBjaGlwcztcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJDYXRzKCk6IEFycmF5PHsga2V5OiBGaWx0ZXJDYXQ7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGRpcnR5OiBib29sZWFuIH0+IHtcclxuICAgIGNvbnN0IGNhdHM6IEFycmF5PHsga2V5OiBGaWx0ZXJDYXQ7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGRpcnR5OiBib29sZWFuIH0+ID0gW1xyXG4gICAgICB7IGtleTogJ2RhdGUnLCBsYWJlbDogJ0RhdGUnLCB2YWx1ZTogdGhpcy5kYXRlTGluZSwgZGlydHk6IHRoaXMucHJlc2V0ICE9PSAnVGhpcyBtb250aCcgfSxcclxuICAgICAgeyBrZXk6ICdtb2RlJywgbGFiZWw6ICdWaWV3IGJ5JywgdmFsdWU6IHRoaXMuaXNTdG9yZU1vZGUgPyAnU3RvcmUnIDogJ1VzZXInLCBkaXJ0eTogIXRoaXMuaXNTdG9yZU1vZGUgfSxcclxuICAgICAge1xyXG4gICAgICAgIGtleTogJ3Njb3BlJywgbGFiZWw6IHRoaXMuaXNTdG9yZU1vZGUgPyAnU3RvcmVzJyA6ICdTdG9yZSBoaWVyYXJjaHknLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmlzU3RvcmVNb2RlID8gdGhpcy5zdG9yZUxhYmVsIDogdGhpcy5oaWVyYXJjaHlUaXRsZSwgZGlydHk6IHRoaXMuc2NvcGVEaXJ0eVxyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gICAgaWYgKHRoaXMuaXNTdG9yZU1vZGUpIHsgY2F0cy5wdXNoKHsga2V5OiAncmVzdWx0JywgbGFiZWw6ICdSZXN1bHQnLCB2YWx1ZTogdGhpcy5yZXN1bHRMYWJlbCwgZGlydHk6IHRoaXMucmVzdWx0ICE9PSAnYWxsJyB9KTsgfVxyXG4gICAgcmV0dXJuIGNhdHM7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFuZVRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVDYXQgPT09ICdkYXRlJykgeyByZXR1cm4gJ0RhdGUnOyB9XHJcbiAgICBpZiAodGhpcy5hY3RpdmVDYXQgPT09ICdtb2RlJykgeyByZXR1cm4gJ1ZpZXcgYnknOyB9XHJcbiAgICBpZiAodGhpcy5hY3RpdmVDYXQgPT09ICdyZXN1bHQnKSB7IHJldHVybiAnUmVzdWx0JzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuaXNTdG9yZU1vZGUgPyAnU3RvcmVzJyA6ICdTdG9yZSBoaWVyYXJjaHknO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhbmVTdWIoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmFjdGl2ZUNhdCA9PT0gJ2RhdGUnKSB7IHJldHVybiAnUGljayB0aGUgd2luZG93IHRoZSB3aG9sZSByZXBvcnQgcmVhZHMuJzsgfVxyXG4gICAgaWYgKHRoaXMuYWN0aXZlQ2F0ID09PSAnbW9kZScpIHsgcmV0dXJuICdSZWFkIHRoZSByZXBvcnQgc3RvcmUgYnkgc3RvcmUsIG9yIHJvbGxlZCB1cCBieSB1c2VyLic7IH1cclxuICAgIGlmICh0aGlzLmFjdGl2ZUNhdCA9PT0gJ3Jlc3VsdCcpIHsgcmV0dXJuICdTaG93IGV2ZXJ5IHN0b3JlLCBvciBvbmx5IHRoZSBvbmVzIHRoYXQgcGFzc2VkIG9yIGZhaWxlZC4nOyB9XHJcbiAgICByZXR1cm4gdGhpcy5pc1N0b3JlTW9kZSA/ICdTZWFyY2ggYW5kIHNlbGVjdCB0aGUgc3RvcmVzIHRoZSByZXBvcnQgcmVhZHMuJyA6ICdQaWNrIHRoZSBjaXJjbGUsIHpvbmUsIEFPTSBvciBzdG9yZSB0aGUgd2hvbGUgcmVwb3J0IHJlYWRzLic7XHJcbiAgfVxyXG5cclxuICBvcGVuRmlsdGVycyhjYXQ/OiBGaWx0ZXJDYXQpOiB2b2lkIHtcclxuICAgIHRoaXMuYWN0aXZlQ2F0ID0gY2F0IHx8IHRoaXMuYWN0aXZlQ2F0O1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlQ2F0ID09PSAncmVzdWx0JyAmJiAhdGhpcy5pc1N0b3JlTW9kZSkgeyB0aGlzLmFjdGl2ZUNhdCA9ICdzY29wZSc7IH1cclxuICAgIGNvbnN0IGRyYWZ0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzKSBhcyBBdWRpdFYyUmVwb3J0c0NvbXBvbmVudDtcclxuICAgIGRyYWZ0LmlzRHJhZnQgPSB0cnVlO1xyXG4gICAgZHJhZnQuc3RvcmVRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5kcmFmdCA9IGRyYWZ0O1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKiogQ2xvc2UgKHgsIGJhY2tkcm9wKTogdGhlIGRyYWZ0IGlzIGRyb3BwZWQsIHRoZSBwYWdlIGlzIGFzIGl0IHdhcy4gKi9cclxuICBjbG9zZUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmRyYWZ0ID0gbnVsbDtcclxuICAgIHRoaXMuc3RvcmVRdWVyeSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFwcGx5OiB0aGUgZHJhZnQncyBmaWx0ZXJzIGJlY29tZSB0aGUgcGFnZSdzOyBhIG5ldyBkYXRlIHJhbmdlIHJlZmV0Y2hlcy4gKi9cclxuICBhcHBseUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkID0gdGhpcy5kcmFmdDtcclxuICAgIGlmIChkKSB7XHJcbiAgICAgIGNvbnN0IGRhdGVzQ2hhbmdlZCA9IGQuZnJvbSAhPT0gdGhpcy5mcm9tIHx8IGQudG8gIT09IHRoaXMudG87XHJcbiAgICAgIHRoaXMuZnJvbSA9IGQuZnJvbTtcclxuICAgICAgdGhpcy50byA9IGQudG87XHJcbiAgICAgIHRoaXMucHJlc2V0ID0gZC5wcmVzZXQ7XHJcbiAgICAgIHRoaXMucmFuZ2UgPSBkLnJhbmdlO1xyXG4gICAgICB0aGlzLm1vZGUgPSBkLm1vZGU7XHJcbiAgICAgIHRoaXMucmVzdWx0ID0gZC5yZXN1bHQ7XHJcbiAgICAgIHRoaXMuc3RvcmVTZWwgPSBkLnN0b3JlU2VsO1xyXG4gICAgICB0aGlzLmxldmVsID0gZC5sZXZlbDtcclxuICAgICAgdGhpcy5jaXJjbGVLZXkgPSBkLmNpcmNsZUtleTtcclxuICAgICAgdGhpcy56b25lS2V5ID0gZC56b25lS2V5O1xyXG4gICAgICB0aGlzLmFvbUtleSA9IGQuYW9tS2V5O1xyXG4gICAgICB0aGlzLnN0b3JlS2V5ID0gZC5zdG9yZUtleTtcclxuICAgICAgdGhpcy5jaXJjbGVIZWFkID0gZC5jaXJjbGVIZWFkO1xyXG4gICAgICB0aGlzLnpvbmVNYW5hZ2VyID0gZC56b25lTWFuYWdlcjtcclxuICAgICAgdGhpcy5hb20gPSBkLmFvbTtcclxuICAgICAgdGhpcy5zZWFyY2ggPSBkLnNlYXJjaDtcclxuICAgICAgdGhpcy5zb3J0S2V5ID0gZC5zb3J0S2V5O1xyXG4gICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgICBpZiAoZGF0ZXNDaGFuZ2VkKSB7IHRoaXMubG9hZCgpOyB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsb3NlRmlsdGVycygpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0KGNhdDogRmlsdGVyQ2F0KTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUNhdCA9IGNhdDtcclxuICB9XHJcblxyXG4gIHNldE1vZGUobW9kZTogVmlld01vZGUpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1vZGUgPT09IG1vZGUpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xyXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcclxuICAgIHRoaXMuc29ydEtleSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIGlmIChtb2RlID09PSAndXNlcicpIHsgdGhpcy5nb1RvTGV2ZWwoJ2NpcmNsZScpOyB9XHJcbiAgfVxyXG5cclxuICBzZXRSZXN1bHQocmVzdWx0OiBSZXN1bHRGaWx0ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNldCBhbGw6IHRoZSBwcm90b3R5cGUncyBkZWZhdWx0cyAodGhpcyBtb250aCwgU3RvcmUgdmlldywgZXZlcnkgc3RvcmUsIGFsbCByZXN1bHRzKS4gKi9cclxuICByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAvLyBGcm9tIHRoZSBkcmF3ZXI6IHJlc2V0IHRoZSBwYWdlIGl0c2VsZiAodGhlIGRyYXdlcidzIGRyYWZ0IGlzIGRyb3BwZWQpLlxyXG4gICAgaWYgKHRoaXMuaXNEcmFmdCkgeyBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykucmVzZXRGaWx0ZXJzKCk7IHJldHVybjsgfVxyXG4gICAgdGhpcy5tb2RlID0gJ3N0b3JlJztcclxuICAgIHRoaXMucmVzdWx0ID0gJ2FsbCc7XHJcbiAgICB0aGlzLnN0b3JlU2VsID0gbnVsbDtcclxuICAgIHRoaXMuc3RvcmVRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5zb3J0S2V5ID0gJyc7XHJcbiAgICB0aGlzLmdvVG9MZXZlbCgnY2lyY2xlJyk7XHJcbiAgICBpZiAodGhpcy5wcmVzZXQgIT09ICdUaGlzIG1vbnRoJykgeyB0aGlzLnNldFByZXNldCgnVGhpcyBtb250aCcpOyB9XHJcbiAgICB0aGlzLmNsb3NlRmlsdGVycygpO1xyXG4gIH1cclxuXHJcbiAgLy8gU3RvcmVzIHBpY2sgKFN0b3JlIHZpZXcpLlxyXG5cclxuICBnZXQgc3RvcmVQaWNrSXRlbXMoKTogQXJyYXk8eyBzdG9yZTogU3RvcmVSb3c7IGNoZWNrZWQ6IGJvb2xlYW4gfT4ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuc3RvcmVRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLmFsbFN0b3Jlc1xyXG4gICAgICAuZmlsdGVyKHMgPT4gIXEgfHwgKHMubmFtZSArICcgJyArIHMua2V5KS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKVxyXG4gICAgICAubWFwKHMgPT4gKHsgc3RvcmU6IHMsIGNoZWNrZWQ6ICF0aGlzLnN0b3JlU2VsIHx8IHRoaXMuc3RvcmVTZWwuaGFzKHMua2V5KSB9KSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RvcmVQaWNrQWxsQ2hlY2tlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5zdG9yZVBpY2tJdGVtcztcclxuICAgIHJldHVybiBpdGVtcy5sZW5ndGggPiAwICYmIGl0ZW1zLmV2ZXJ5KGkgPT4gaS5jaGVja2VkKTtcclxuICB9XHJcblxyXG4gIGdldCBzdG9yZVBpY2tSZWFkaW5nKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5zdG9yZVNjb3BlLmxlbmd0aDtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlTGFiZWwgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIHN0b3JlJyA6ICcgc3RvcmVzJykgKyAnIGluIHNjb3BlJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlQaWNrKGlkczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IHVuaXEgPSBbLi4ubmV3IFNldChpZHMpXTtcclxuICAgIHRoaXMuc3RvcmVTZWwgPSAhdW5pcS5sZW5ndGggfHwgdW5pcS5sZW5ndGggPj0gdGhpcy5hbGxTdG9yZXMubGVuZ3RoID8gbnVsbCA6IG5ldyBTZXQodW5pcSk7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgcGlja2VkSWRzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlU2VsID8gWy4uLnRoaXMuc3RvcmVTZWxdIDogdGhpcy5hbGxTdG9yZXMubWFwKHMgPT4gcy5rZXkpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU3RvcmVQaWNrKHM6IFN0b3JlUm93KTogdm9pZCB7XHJcbiAgICBjb25zdCBpZHMgPSB0aGlzLnBpY2tlZElkcztcclxuICAgIHRoaXMuYXBwbHlQaWNrKGlkcy5pbmNsdWRlcyhzLmtleSkgPyBpZHMuZmlsdGVyKGlkID0+IGlkICE9PSBzLmtleSkgOiBpZHMuY29uY2F0KHMua2V5KSk7XHJcbiAgfVxyXG5cclxuICAvKiogU2VsZWN0IEFsbCB3b3JrcyBvbiB0aGUgc3RvcmVzIHRoZSBzZWFyY2ggc2hvd3MsIGxpa2UgdGhlIHByb3RvdHlwZS4gKi9cclxuICB0b2dnbGVTdG9yZVBpY2tBbGwoKTogdm9pZCB7XHJcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5zdG9yZVBpY2tJdGVtcy5tYXAoaSA9PiBpLnN0b3JlLmtleSk7XHJcbiAgICBjb25zdCBpZHMgPSB0aGlzLnBpY2tlZElkcztcclxuICAgIHRoaXMuYXBwbHlQaWNrKHRoaXMuc3RvcmVQaWNrQWxsQ2hlY2tlZCA/IGlkcy5maWx0ZXIoaWQgPT4gIXZpc2libGUuaW5jbHVkZXMoaWQpKSA6IGlkcy5jb25jYXQodmlzaWJsZSkpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTdG9yZVBpY2soKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlU2VsID0gbnVsbDtcclxuICAgIHRoaXMuc3RvcmVRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8vIFN0b3JlIGhpZXJhcmNoeSBwaWNrIChVc2VyIHZpZXcpLlxyXG5cclxuICBnZXQgY2lyY2xlT3B0aW9ucygpOiBBdWRpdFNlbGVjdE9wdGlvbltdIHtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiAnQWxsIGNpcmNsZXMnIH1dLmNvbmNhdCgodGhpcy5kYXRhPy5jaXJjbGVzIHx8IFtdKS5tYXAoKGM6IGFueSkgPT4gKHsgdmFsdWU6IGMua2V5LCBsYWJlbDogYy5uYW1lIH0pKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgem9uZU9wdGlvbnMoKTogQXVkaXRTZWxlY3RPcHRpb25bXSB7XHJcbiAgICByZXR1cm4gW3sgdmFsdWU6ICcnLCBsYWJlbDogJ0FsbCB6b25lcycgfV0uY29uY2F0KCh0aGlzLmRhdGE/LnpvbmVzIHx8IFtdKVxyXG4gICAgICAuZmlsdGVyKCh6OiBhbnkpID0+IHouY2lyY2xlS2V5ID09PSB0aGlzLmNpcmNsZUtleSkubWFwKCh6OiBhbnkpID0+ICh7IHZhbHVlOiB6LmtleSwgbGFiZWw6IHoubmFtZSB9KSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFvbU9wdGlvbnMoKTogQXVkaXRTZWxlY3RPcHRpb25bXSB7XHJcbiAgICByZXR1cm4gW3sgdmFsdWU6ICcnLCBsYWJlbDogJ0FsbCBBT01zJyB9XS5jb25jYXQoKHRoaXMuZGF0YT8uYW9tcyB8fCBbXSlcclxuICAgICAgLmZpbHRlcigoYTogYW55KSA9PiBhLnpvbmVLZXkgPT09IHRoaXMuem9uZUtleSkubWFwKChhOiBhbnkpID0+ICh7IHZhbHVlOiBhLmtleSwgbGFiZWw6IGEubmFtZSB9KSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0b3JlT3B0aW9ucygpOiBBdWRpdFNlbGVjdE9wdGlvbltdIHtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiAnQWxsIHN0b3JlcycgfV0uY29uY2F0KHRoaXMuYWxsU3RvcmVzXHJcbiAgICAgIC5maWx0ZXIocyA9PiBzLmFvbUtleSA9PT0gdGhpcy5hb21LZXkpLm1hcChzID0+ICh7IHZhbHVlOiBzLmtleSwgbGFiZWw6IHMubmFtZSB9KSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFpvbmUgLyBBT00gcGlja3MgZm9sbG93IHRoZSBjaXJjbGUgcGljayAoXCJOb3QgaW4gaGllcmFyY2h5XCIgaGFzIG5vbmUpLiAqL1xyXG4gIGdldCBzaG93Wm9uZVBpY2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmNpcmNsZUtleSAmJiB0aGlzLmNpcmNsZUtleSAhPT0gVU5BU1NJR05FRDtcclxuICB9XHJcblxyXG4gIHBpY2tDaXJjbGUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHJvdyA9ICh0aGlzLmRhdGE/LmNpcmNsZXMgfHwgW10pLmZpbmQoKGM6IGFueSkgPT4gYy5rZXkgPT09IGtleSk7XHJcbiAgICB0aGlzLmdvVG9MZXZlbCgnY2lyY2xlJyk7XHJcbiAgICBpZiAocm93KSB7IHRoaXMub3BlblJvdyh0aGlzLnRvUm93KHJvdykpOyB9XHJcbiAgfVxyXG5cclxuICBwaWNrWm9uZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgcm93ID0gKHRoaXMuZGF0YT8uem9uZXMgfHwgW10pLmZpbmQoKHo6IGFueSkgPT4gei5rZXkgPT09IGtleSk7XHJcbiAgICB0aGlzLmdvVG9MZXZlbCgnem9uZScpO1xyXG4gICAgaWYgKHJvdykgeyB0aGlzLm9wZW5Sb3codGhpcy50b1Jvdyhyb3cpKTsgfVxyXG4gIH1cclxuXHJcbiAgcGlja0FvbShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgcm93ID0gKHRoaXMuZGF0YT8uYW9tcyB8fCBbXSkuZmluZCgoYTogYW55KSA9PiBhLmtleSA9PT0ga2V5KTtcclxuICAgIHRoaXMuZ29Ub0xldmVsKCdhb20nKTtcclxuICAgIGlmIChyb3cpIHsgdGhpcy5vcGVuUm93KHRoaXMudG9Sb3cocm93KSk7IH1cclxuICB9XHJcblxyXG4gIHBpY2tTdG9yZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9yZUtleSA9IGtleSB8fCAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICBnZXQgaGllcmFyY2h5UmVhZGluZygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHRoaXMudG90YWxzLnRvdGFsO1xyXG4gICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5VGl0bGUgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIHN0b3JlJyA6ICcgc3RvcmVzJyk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBEYXRlc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogUHJlc2V0cyBzZXQgdGhlIGRhdGUgcmFuZ2UgYW5kIHJlZmV0Y2guICovXHJcbiAgc2V0UHJlc2V0KHA6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5wcmVzZXQgPSBwO1xyXG4gICAgY29uc3QgdG9kYXkgPSBkYXlqcygpO1xyXG4gICAgaWYgKHAgPT09ICdUaGlzIG1vbnRoJykge1xyXG4gICAgICB0aGlzLmZyb20gPSB0b2RheS5zdGFydE9mKCdtb250aCcpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICB0aGlzLnRvID0gdG9kYXkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICB9IGVsc2UgaWYgKHAgPT09ICdMYXN0IG1vbnRoJykge1xyXG4gICAgICBjb25zdCBsbSA9IHRvZGF5LnN1YnRyYWN0KDEsICdtb250aCcpO1xyXG4gICAgICB0aGlzLmZyb20gPSBsbS5zdGFydE9mKCdtb250aCcpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICB0aGlzLnRvID0gbG0uZW5kT2YoJ21vbnRoJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZyb20gPSB0b2RheS5zdWJ0cmFjdCgzMCwgJ2RheScpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICB0aGlzLnRvID0gdG9kYXkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIC8vIEluIHRoZSBkcmF3ZXIgdGhlIHJhbmdlIHdhaXRzIGZvciBBcHBseS5cclxuICAgIGlmICghdGhpcy5pc0RyYWZ0KSB7IHRoaXMubG9hZCgpOyB9XHJcbiAgfVxyXG5cclxuICAvKiogQSByYW5nZSBwaWNrZWQgYnkgaGFuZCByZWZldGNoZXMgdG9vIGFuZCBpcyBubyBsb25nZXIgb25lIG9mIHRoZSBwcmVzZXRzLiAqL1xyXG4gIG9uUmFuZ2VQaWNrZWQoZTogUGlja2VkRGF0ZXMgfCBudWxsKTogdm9pZCB7XHJcbiAgICBjb25zdCBwaWNrZWQgPSBmcm9tUGlja2VyUmFuZ2UoZSk7XHJcbiAgICBpZiAoIXBpY2tlZCB8fCAocGlja2VkLmZyb20gPT09IHRoaXMuZnJvbSAmJiBwaWNrZWQudG8gPT09IHRoaXMudG8pKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5mcm9tID0gcGlja2VkLmZyb207XHJcbiAgICB0aGlzLnRvID0gcGlja2VkLnRvO1xyXG4gICAgdGhpcy5wcmVzZXQgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICBpZiAoIXRoaXMuaXNEcmFmdCkgeyB0aGlzLmxvYWQoKTsgfVxyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gRXhwb3J0IChDU1YsIGJ1aWx0IGluIHRoZSBicm93c2VyIGZyb20gdGhlIGxvYWRlZCByZXBvcnQpXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmVIZWFkZXIgPSBbJ1N0b3JlJywgJ1N0b3JlIElEJywgJ0NsdXN0ZXInLCAnQ2lyY2xlIGhlYWQnLCAnWm9uZSBtYW5hZ2VyJywgJ0FyZWEgbWFuYWdlcicsICdBdWRpdGVkJywgJ1Njb3JlJywgJ1Jlc3VsdCcsICdMYXN0IGF1ZGl0J107XHJcblxyXG4gIHByaXZhdGUgc3RvcmVMaW5lKHM6IFN0b3JlUm93KTogYW55W10ge1xyXG4gICAgcmV0dXJuIFtzLm5hbWUsIHMua2V5LCBzLmNsdXN0ZXIsIHMuY2lyY2xlLCBzLnpvbmUsIHMuYW9tLCBzLmF1ZGl0ZWQgPyAnWWVzJyA6ICdObycsIHRoaXMuc2NvcmVUZXh0KHMpLCB0aGlzLnJlc3VsdFRleHQocyksIHMubGFzdEF1ZGl0IHx8ICdObyBhdWRpdCddO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRvcCBFeHBvcnQ6IHRoZSB3aG9sZSByZXBvcnQgYXMgZmlsdGVyZWQgKGV2ZXJ5IHBhZ2UpOiBzdG9yZXMgaW4gdGhlIFN0b3JlIHZpZXcsIHRoZSBjdXJyZW50IGxldmVsIGluIHRoZSBVc2VyIHZpZXcuICovXHJcbiAgZXhwb3J0QWxsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubG9hZGluZykgeyByZXR1cm47IH1cclxuICAgIGlmICh0aGlzLmlzU3RvcmVNb2RlIHx8IHRoaXMubGV2ZWwgPT09ICdzdG9yZScpIHtcclxuICAgICAgY29uc3QgbGlzdCA9IHRoaXMuaXNTdG9yZU1vZGUgPyB0aGlzLnN0b3JlUm93cyA6IHRoaXMudXNlclN0b3JlcztcclxuICAgICAgaWYgKCFsaXN0Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gc3RvcmVzIHRvIGV4cG9ydCcpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRvd25sb2FkQ3N2KFt0aGlzLnN0b3JlSGVhZGVyLCAuLi5saXN0Lm1hcChzID0+IHRoaXMuc3RvcmVMaW5lKHMpKV0sXHJcbiAgICAgICAgdGhpcy5pc1N0b3JlTW9kZSA/ICdzdG9yZS1yZXBvcnQnIDogJ3N0b3JlLXJlcG9ydC0nICsgdGhpcy5oaWVyYXJjaHlUaXRsZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBsaXN0ID0gdGhpcy5maWx0ZXJlZFJvd3M7XHJcbiAgICAgIGlmICghbGlzdC5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vdGhpbmcgdG8gZXhwb3J0Jyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHQgPSB0aGlzLnRvdGFscztcclxuICAgICAgdGhpcy5kb3dubG9hZENzdihbXHJcbiAgICAgICAgW3RoaXMubGV2ZWxMYWJlbCwgJ0VtYWlsJywgJ1RvdGFsIHN0b3JlcycsICdBdWRpdGVkJywgJ05vdCBhdWRpdGVkJywgJ0NvdmVyYWdlJywgJ0F2ZyBhdWRpdCBzY29yZScsICdGYWlsZWQgc3RvcmUgJSddLFxyXG4gICAgICAgIC4uLmxpc3QubWFwKHIgPT4gW3IubmFtZSwgci5lbWFpbCwgci50b3RhbCwgci5hdWRpdGVkLCByLm5vdEF1ZGl0ZWQsIHIuY292ZXJhZ2UsIHIuYXZnU2NvcmUsIHIuZmFpbGVkUGN0XSksXHJcbiAgICAgICAgWydUb3RhbCcsICcnLCB0LnRvdGFsLCB0LmF1ZGl0ZWQsIHQudG90YWwgLSB0LmF1ZGl0ZWQsIHRoaXMudG90YWxDb3ZlcmFnZSwgdGhpcy50b3RhbEF2ZXJhZ2UsIHRoaXMudG90YWxGYWlsZWRQY3RdXHJcbiAgICAgIF0sICd1c2VyLXJlcG9ydC0nICsgdGhpcy5oaWVyYXJjaHlUaXRsZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCh0aGlzLmlzU3RvcmVNb2RlID8gJ1N0b3JlIHJlcG9ydCBleHBvcnRlZCcgOiAnVXNlciByZXBvcnQgZXhwb3J0ZWQnKTtcclxuICB9XHJcblxyXG4gIC8qKiBSb3cgRXhwb3J0IGluIGEgc3RvcmUgdGFibGU6IHRoYXQgc3RvcmUncyBsaW5lOyBhIHN0b3JlIHdpdGggbm8gYXVkaXQgaW4gdGhlIHBlcmlvZCBoYXMgbm90aGluZyB0byBleHBvcnQuICovXHJcbiAgZXhwb3J0U3RvcmUoczogU3RvcmVSb3cpOiB2b2lkIHtcclxuICAgIGlmICghcy5hdWRpdGVkKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gYXVkaXQgdG8gZXhwb3J0IGZvciAnICsgcy5uYW1lKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kb3dubG9hZENzdihbdGhpcy5zdG9yZUhlYWRlciwgdGhpcy5zdG9yZUxpbmUocyldLCAnYXVkaXQtcmVwb3J0LScgKyBzLm5hbWUpO1xyXG4gICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoJ1JlcG9ydCBleHBvcnRlZCBmb3IgJyArIHMubmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUm93IEV4cG9ydCBpbiB0aGUgcm9sbC11cCB0YWJsZTogZXZlcnkgc3RvcmUgdW5kZXIgdGhhdCByb3cuICovXHJcbiAgZXhwb3J0Um93KHJvdzogUmVwb3J0Um93KTogdm9pZCB7XHJcbiAgICBjb25zdCBzdG9yZXMgPSB0aGlzLmFsbFN0b3Jlcy5maWx0ZXIocyA9PiB7XHJcbiAgICAgIGlmIChyb3cua2V5ID09PSBVTkFTU0lHTkVEKSB7IHJldHVybiAhcy5jaXJjbGVLZXk7IH1cclxuICAgICAgaWYgKHJvdy5sZXZlbCA9PT0gJ2NpcmNsZScpIHsgcmV0dXJuIHMuY2lyY2xlS2V5ID09PSByb3cua2V5OyB9XHJcbiAgICAgIGlmIChyb3cubGV2ZWwgPT09ICd6b25lJykgeyByZXR1cm4gcy56b25lS2V5ID09PSByb3cua2V5OyB9XHJcbiAgICAgIHJldHVybiBzLmFvbUtleSA9PT0gcm93LmtleTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCFzdG9yZXMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gc3RvcmVzIHRvIGV4cG9ydCBmb3IgJyArIHJvdy5uYW1lKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kb3dubG9hZENzdihbdGhpcy5zdG9yZUhlYWRlciwgLi4uc3RvcmVzLm1hcChzID0+IHRoaXMuc3RvcmVMaW5lKHMpKV0sICdhdWRpdC1yZXBvcnQtJyArIHJvdy5uYW1lKTtcclxuICAgIHRoaXMudG9hc3QuZ2V0U3VjY2Vzc1RvYXN0KCdSZXBvcnQgZXhwb3J0ZWQgZm9yICcgKyByb3cubmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRvd25sb2FkQ3N2KGxpbmVzOiBhbnlbXVtdLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHEgPSAodjogYW55KSA9PiAnXCInICsgU3RyaW5nKHYgPz8gJycpLnJlcGxhY2UoL1wiL2csICdcIlwiJykgKyAnXCInO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFsn77u/JyArIGxpbmVzLm1hcChsID0+IGwubWFwKHEpLmpvaW4oJywnKSkuam9pbignXFxyXFxuJyldLCB7IHR5cGU6ICd0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04OycgfSk7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGEuZG93bmxvYWQgPSBuYW1lLnJlcGxhY2UoL1teXFx3LV0rL2csICdfJykgKyAnLScgKyB0aGlzLmZyb20gKyAnLXRvLScgKyB0aGlzLnRvICsgJy5jc3YnO1xyXG4gICAgYS5jbGljaygpO1xyXG4gICAgVVJMLnJldm9rZU9iamVjdFVSTChhLmhyZWYpO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVJvdyhfOiBudW1iZXIsIHJvdzogUmVwb3J0Um93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cua2V5IHx8IHJvdy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeUtleShfOiBudW1iZXIsIHM6IFN0b3JlUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzLmtleTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQaWNrKF86IG51bWJlciwgaXRlbTogeyBzdG9yZTogU3RvcmVSb3cgfSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gaXRlbS5zdG9yZS5rZXk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Q2hpcChfOiBudW1iZXIsIGM6IHsga2V5OiBzdHJpbmcgfSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYy5rZXk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhdjItcGFnZSBhdWRpdC1yZXBvcnRzXCI+XHJcblxyXG4gIDwhLS0gQnJlYWRjcnVtYiArIHRpdGxlIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJycC1oZWFkXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicnAtY3J1bWJcIj5BdWRpdHMg4oC6IDxzcGFuIGNsYXNzPVwicnAtY3J1bWItY3VycmVudFwiPlJlcG9ydHM8L3NwYW4+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicnAtdGl0bGVcIj5TdG9yZSBhdWRpdCByZXBvcnQ8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBGaWx0ZXIgY2hpcHMsIEZpbHRlciBidXR0b24gYXQgdGhlIHJpZ2h0IGVuZCAoUUEgOSBPY3QpOyBFeHBvcnQgbW92ZWQgdG8gdGhlIHRhYmxlIGhlYWQgYmVzaWRlIGl0cyBzZWFyY2guIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJycC1jb250cm9sc1wiPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycC1jaGlwXCIgKm5nRm9yPVwibGV0IGMgb2YgY2hpcHM7IHRyYWNrQnk6IHRyYWNrQnlDaGlwXCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKGMua2V5KVwiXHJcbiAgICAgIFt0aXRsZV09XCJjLmxhYmVsICsgJzogJyArIGMudmFsdWVcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJycC1jaGlwLWtleVwiPnt7IGMubGFiZWwgfX08L3NwYW4+PHNwYW4gY2xhc3M9XCJycC1jaGlwLXZhbHVlXCI+e3sgYy52YWx1ZSB9fTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgcnAtZmlsdGVyYnRuXCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKClcIj5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWdvbiBwb2ludHM9XCIyMiAzIDIgMyAxMCAxMi40NiAxMCAxOSAxNCAyMSAxNCAxMi40NiAyMiAzXCI+PC9wb2x5Z29uPjwvc3ZnPlxyXG4gICAgICBGaWx0ZXJcclxuICAgICAgPHNwYW4gY2xhc3M9XCJycC1jb3VudHBpbGxcIj57eyBmaWx0ZXJDb3VudCB9fTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFVzZXIgdmlldzogd2hlcmUgaW4gdGhlIGhpZXJhcmNoeSAtLT5cclxuICA8ZGl2IGNsYXNzPVwicnAtZHJpbGxiYXJcIiAqbmdJZj1cIiFpc1N0b3JlTW9kZVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBjcnVtYnM7IGxldCBsYXN0ID0gbGFzdDsgbGV0IGZpcnN0ID0gZmlyc3RcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJwLWRyaWxsY3J1bWJcIiBbY2xhc3MuaXMtY3VycmVudF09XCJsYXN0XCIgKGNsaWNrKT1cImdvVG9MZXZlbChjLmxldmVsKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicnAtZHJpbGxzZXBcIiAqbmdJZj1cIiFmaXJzdFwiPuKAujwvc3Bhbj57eyBjLmxhYmVsIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJycC1oaW50XCI+e3sgaGludCB9fTwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFNjb3BlIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJycC1zY29wZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJwLXNjb3BlLXRpdGxlXCI+e3sgc2NvcGVUaXRsZSB9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJwLXNjb3BlLW1ldGFcIj57eyBzY29wZU1ldGEgfX08L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBLUElzIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJycC1rcGlzXCI+XHJcbiAgICA8IS0tIE9sZCBDaGVja2xpc3Qgc3VtbWFyeSBjYXJkOiBmaWd1cmUgKyBsYWJlbCBpbiB0aGUgZ3JhZGllbnQgc3RyaXAsIG5vdGUgYmVsb3cuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZFwiICpuZ0Zvcj1cImxldCBrcGkgb2Yga3Bpc1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWNvdW50IHJwLWtwaS12YWx1ZVwiIFtjbGFzcy5pcy1nb29kXT1cImtwaS50b25lID09PSAnZ29vZCdcIiBbY2xhc3MuaXMtYmFkXT1cImtwaS50b25lID09PSAnYmFkJ1wiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBycC1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGtwaS52YWx1ZSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtdGV4dFwiPnt7IGtwaS5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS1ub3RlXCI+PC9zcGFuPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZ1wiIGNsYXNzPVwiYXYyLW9jYXJkLW5vdGVcIj57eyBrcGkubm90ZSB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFJlcG9ydCB0YWJsZSAtLT5cclxuICA8c2VjdGlvbiBjbGFzcz1cInJwLWNhcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJycC1jYXJkLWhlYWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJwLWNhcmQtdGV4dFwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N0b3JlTW9kZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWNhcmQtdGl0bGVcIj5TdG9yZSByZXBvcnQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1jYXJkLW1ldGFcIj57eyBzdG9yZVJvd3MubGVuZ3RoIH19IHt7IHN0b3JlUm93cy5sZW5ndGggPT09IDEgPyAnc3RvcmUnIDogJ3N0b3JlcycgfX0gwrcgYXVkaXRzIHN1Ym1pdHRlZCBpbiB0aGUgcGVyaW9kPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1N0b3JlTW9kZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWNhcmQtdGl0bGVcIj57eyB0YWJsZVRpdGxlIH19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtY2FyZC1tZXRhXCI+e3sgdGFibGVNZXRhIH19PC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiYXYyLXNlYXJjaCBycC1zZWFyY2hcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwiaXNTdG9yZU1vZGUgPyAnU2VhcmNoIHN0b3JlJyA6ICdTZWFyY2ggJyArIGxldmVsTGFiZWwudG9Mb3dlckNhc2UoKVwiXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKClcIj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0XCIgW2Rpc2FibGVkXT1cImxvYWRpbmdcIiAoY2xpY2spPVwiZXhwb3J0QWxsKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTEyIDE2VjRcIj48L3BhdGg+PHBvbHlsaW5lIHBvaW50cz1cIjcgOSAxMiA0IDE3IDlcIj48L3BvbHlsaW5lPjxwYXRoIGQ9XCJNNCAxNnY0aDE2di00XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgIEV4cG9ydFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cImxvYWRpbmdcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgIDwhLS0gU3RvcmUgdmlldzogb25lIHJvdyBwZXIgc3RvcmUgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cIiFsb2FkaW5nICYmIGlzU3RvcmVNb2RlICYmIHRhYmxlQ291bnRcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwicnAtdGFibGUgcnAtdGFibGUtLXN0b3Jlc1wiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnbmFtZScpXCI+U3RvcmUgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnbmFtZSdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnY2x1c3RlcicpXCI+Q2x1c3RlciA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdjbHVzdGVyJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhb20nKVwiPkFyZWEgbWFuYWdlciA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdhb20nXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnYXVkaXRlZCcpXCI+QXVkaXRlZCA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdhdWRpdGVkJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0LXJpZ2h0IGF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ3Njb3JlJylcIj5TY29yZSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdzY29yZSdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidC1yaWdodCBhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdzdGF0dXMnKVwiPlJlc3VsdCA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdzdGF0dXMnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnbGFzdEF1ZGl0JylcIj5MYXN0IGF1ZGl0IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ2xhc3RBdWRpdCdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidC1yaWdodFwiPkV4cG9ydDwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBzIG9mIHN0b3JlUGFnZVJvd3M7IHRyYWNrQnk6IHRyYWNrQnlLZXlcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiaXMtc3Ryb25nIHJwLWNlbGwtbmFtZVwiIFthdjJUaXBdPVwicy5uYW1lXCI+e3sgcy5uYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCIgW2F2MlRpcF09XCJzLmNsdXN0ZXJcIj57eyBzLmNsdXN0ZXIgfHwgJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIiBbYXYyVGlwXT1cInMuYW9tXCI+e3sgcy5hb20gfHwgJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCIgW2NsYXNzLmlzLW11dGVkXT1cIiFzLmF1ZGl0ZWRcIj57eyBzLmF1ZGl0ZWQgPyAnWWVzJyA6ICdObycgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0IGlzLXN0cm9uZ1wiIFtjbGFzcy5pcy1wYXNzXT1cInMuc3RhdHVzID09PSAncGFzcydcIiBbY2xhc3MuaXMtZmFpbF09XCJzLnN0YXR1cyA9PT0gJ2ZhaWwnXCJcclxuICAgICAgICAgICAgICBbY2xhc3MuaXMtbXV0ZWRdPVwicy5zY29yZSA9PT0gbnVsbFwiPnt7IHNjb3JlVGV4dChzKSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwLXJlc3VsdFwiIFtjbGFzcy5pcy1wYXNzXT1cInMuc3RhdHVzID09PSAncGFzcydcIiBbY2xhc3MuaXMtZmFpbF09XCJzLnN0YXR1cyA9PT0gJ2ZhaWwnXCI+e3sgcmVzdWx0VGV4dChzKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiIFtjbGFzcy5pcy1tdXRlZF09XCIhcy5sYXN0QXVkaXRcIj57eyBzLmxhc3RBdWRpdCB8fCAnTm8gYXVkaXQnIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnAtZXhwb3J0XCIgKGNsaWNrKT1cImV4cG9ydFN0b3JlKHMpXCI+RXhwb3J0PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPHRmb290PlxyXG4gICAgICAgICAgPHRyIGNsYXNzPVwicnAtdG90YWxcIj5cclxuICAgICAgICAgICAgPHRkPlRvdGFsPC90ZD5cclxuICAgICAgICAgICAgPHRkPjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgdG90YWxBdWRpdGVkT2YgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgdG90YWxBdmVyYWdlIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPnt7IHRvdGFscy5mYWlsZWQgfX0gZmFpbDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Zm9vdD5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVXNlciB2aWV3OiBjaXJjbGUgaGVhZCAvIHpvbmUgbWFuYWdlciAvIGFyZWEgbWFuYWdlciByb2xsLXVwIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhaXNTdG9yZU1vZGUgJiYgbGV2ZWwgIT09ICdzdG9yZScgJiYgdGFibGVDb3VudFwiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJycC10YWJsZVwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnbmFtZScpXCI+e3sgbGV2ZWxMYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICduYW1lJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0LXJpZ2h0IGF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ3RvdGFsJylcIj5Ub3RhbCBzdG9yZXMgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAndG90YWwnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnYXVkaXRlZCcpXCI+QXVkaXRlZCA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdhdWRpdGVkJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0LXJpZ2h0IGF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ25vdEF1ZGl0ZWQnKVwiPk5vdCBhdWRpdGVkIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ25vdEF1ZGl0ZWQnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnY292ZXJhZ2UnKVwiPkNvdmVyYWdlIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ2NvdmVyYWdlJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0LXJpZ2h0IGF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ2F2Z1Njb3JlJylcIj5BdmcgYXVkaXQgc2NvcmUgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnYXZnU2NvcmUnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnZmFpbGVkUGN0JylcIj5GYWlsZWQgc3RvcmUgJSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdmYWlsZWRQY3QnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHRcIj5SZXBvcnQ8L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBhZ2VSb3dzOyB0cmFja0J5OiB0cmFja0J5Um93XCIgY2xhc3M9XCJycC1yb3dcIiAoY2xpY2spPVwib3BlblJvdyhyb3cpXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycC1uYW1lLW1haW5cIj57eyByb3cubmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnAtbmFtZS1zdWJcIiAqbmdJZj1cInJvdy5lbWFpbFwiPnt7IHJvdy5lbWFpbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPnt7IHJvdy50b3RhbCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyByb3cuYXVkaXRlZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIiBbY2xhc3MuaXMtbXV0ZWRdPVwiIXJvdy5ub3RBdWRpdGVkXCI+e3sgcm93Lm5vdEF1ZGl0ZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgcm93LmNvdmVyYWdlIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodCBpcy1zdHJvbmdcIj57eyByb3cuYXZnU2NvcmUgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0IGlzLXN0cm9uZ1wiIFtjbGFzcy5pcy1mYWlsXT1cImlzSGlnaEZhaWwocm93KVwiPnt7IHJvdy5mYWlsZWRQY3QgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycC1leHBvcnRcIiAoY2xpY2spPVwiZXhwb3J0Um93KHJvdyk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPkV4cG9ydDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDx0Zm9vdD5cclxuICAgICAgICAgIDx0ciBjbGFzcz1cInJwLXRvdGFsXCI+XHJcbiAgICAgICAgICAgIDx0ZD5Ub3RhbDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyB0b3RhbHMudG90YWwgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgdG90YWxzLmF1ZGl0ZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgdG90YWxzLnRvdGFsIC0gdG90YWxzLmF1ZGl0ZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgdG90YWxDb3ZlcmFnZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyB0b3RhbEF2ZXJhZ2UgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgdG90YWxGYWlsZWRQY3QgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Zm9vdD5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVXNlciB2aWV3LCBkZWVwZXN0IGxldmVsOiB0aGUgYXJlYSBtYW5hZ2VyJ3Mgc3RvcmVzIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhaXNTdG9yZU1vZGUgJiYgbGV2ZWwgPT09ICdzdG9yZScgJiYgdGFibGVDb3VudFwiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJycC10YWJsZSBycC10YWJsZS0tdXNlcnN0b3Jlc1wiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnbmFtZScpXCI+U3RvcmUgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnbmFtZSdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnYW9tJylcIj5BcmVhIG1hbmFnZXIgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnYW9tJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCd6b25lJylcIj5ab25lIG1hbmFnZXIgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnem9uZSdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidC1yaWdodCBhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhdWRpdGVkJylcIj5BdWRpdGVkIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ2F1ZGl0ZWQnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnc2NvcmUnKVwiPlNjb3JlIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ3Njb3JlJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0LXJpZ2h0XCI+RXhwb3J0PC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHMgb2YgdXNlclN0b3JlUGFnZVJvd3M7IHRyYWNrQnk6IHRyYWNrQnlLZXlcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiaXMtc3Ryb25nIHJwLWNlbGwtbmFtZVwiIFthdjJUaXBdPVwicy5uYW1lXCI+e3sgcy5uYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCIgW2F2MlRpcF09XCJzLmFvbVwiPnt7IHMuYW9tIHx8ICfigJQnIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCIgW2F2MlRpcF09XCJzLnpvbmVcIj57eyBzLnpvbmUgfHwgJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCIgW2NsYXNzLmlzLW11dGVkXT1cIiFzLmF1ZGl0ZWRcIj57eyBzLmF1ZGl0ZWQgPyAnWWVzJyA6ICdObycgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0IGlzLXN0cm9uZ1wiIFtjbGFzcy5pcy1wYXNzXT1cInMuc3RhdHVzID09PSAncGFzcydcIiBbY2xhc3MuaXMtZmFpbF09XCJzLnN0YXR1cyA9PT0gJ2ZhaWwnXCJcclxuICAgICAgICAgICAgICBbY2xhc3MuaXMtbXV0ZWRdPVwicy5zY29yZSA9PT0gbnVsbFwiPnt7IHNjb3JlVGV4dChzKSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwLWV4cG9ydFwiIChjbGljayk9XCJleHBvcnRTdG9yZShzKVwiPkV4cG9ydDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDx0Zm9vdD5cclxuICAgICAgICAgIDx0ciBjbGFzcz1cInJwLXRvdGFsXCI+XHJcbiAgICAgICAgICAgIDx0ZD5Ub3RhbDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPnt7IHRvdGFsQXVkaXRlZE9mIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPnt7IHRvdGFsQXZlcmFnZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rmb290PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nICYmICF0YWJsZUNvdW50XCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+e3sgc2VhcmNoID8gJ05vIHJvd3MgbWF0Y2ggXCInICsgc2VhcmNoICsgJ1wiJyA6ICdObyBzdG9yZXMgbWF0Y2ggdGhlIGN1cnJlbnQgZmlsdGVycycgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFNoYXJlZCBwYWdlciAoMTAgLyAyMCAvIDMwKSwgYXMgb24gdGhlIG90aGVyIGF1ZGl0IGxpc3RzLiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJycC1wYWdlclwiICpuZ0lmPVwiIWxvYWRpbmcgJiYgdGFibGVDb3VudFwiPlxyXG4gICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJwYWdlU2l6ZVwiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnZVNpemVzXCIgW2N1cnJlbnRQYWdlXT1cInBhZ2VcIlxyXG4gICAgICAgIFt0b3RhbEl0ZW1zXT1cInRhYmxlQ291bnRcIiAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9zZWN0aW9uPlxyXG5cclxuICA8IS0tID09PT09PT09PT09PSBGSUxURVIgRFJBV0VSID09PT09PT09PT09PSAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWJhY2tkcm9wXCIgKm5nSWY9XCJmaWx0ZXJzT3BlblwiIChjbGljayk9XCJjbG9zZUZpbHRlcnMoKVwiPjwvZGl2PlxyXG5cclxuICA8IS0tIEV2ZXJ5IGNvbnRyb2wgZWRpdHMgdGhlIGRyYXdlcidzIGRyYWZ0IChkcik7IHRoZSBwYWdlIGJlaGluZCBjaGFuZ2VzIG9ubHkgb24gQXBwbHkgb3IgUmVzZXQgYWxsLiAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWRyYXdlclwiICpuZ0lmPVwiZmlsdGVyc09wZW4gJiYgZHJhZnQgYXMgZHJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItaGVhZFwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRyYXdlci10aXRsZVwiPkZpbHRlcnM8L3NwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwicnAtY291bnRwaWxsXCI+e3sgZHIuZmlsdGVyQ291bnQgfX08L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlYnRuXCIgKGNsaWNrKT1cImNsb3NlRmlsdGVycygpXCIgdGl0bGU9XCJDbG9zZVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1ib2R5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItbmF2XCI+XHJcbiAgICAgICAgPCEtLSB0cmFja0J5OiBmaWx0ZXJDYXRzIGlzIHJlYnVpbHQgb24gZXZlcnkgY2hlY2ssIGFuZCBsaWItYXVkaXQtdjItc2VsZWN0J3MgZG9jdW1lbnQ6bW91c2Vkb3duIHJ1bnMgb25lXHJcbiAgICAgICAgICAgICBiZXR3ZWVuIHByZXNzIGFuZCByZWxlYXNlOyB3aXRob3V0IGl0IHRoZSBidXR0b24gd2FzIHJlcGxhY2VkIG1pZC1jbGljayBhbmQgdGhlIGNsaWNrIG5ldmVyIGxhbmRlZC4gLS0+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkcmF3ZXItbmF2aXRlbVwiICpuZ0Zvcj1cImxldCBjIG9mIGRyLmZpbHRlckNhdHM7IHRyYWNrQnk6IHRyYWNrQnlDaGlwXCIgW2NsYXNzLm5hdml0ZW0tYWN0aXZlXT1cImFjdGl2ZUNhdCA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdChjLmtleSlcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dGV4dFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRpdGxlXCI+e3sgYy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ2YWx1ZVwiIFtjbGFzcy5pcy1kaXJ0eV09XCJjLmRpcnR5XCI+e3sgYy52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlydHlkb3RcIiAqbmdJZj1cImMuZGlydHlcIj48L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1wYW5lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmV0aXRsZVwiPnt7IGRyLnBhbmVUaXRsZSB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5laGludFwiPnt7IGRyLnBhbmVTdWIgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBEYXRlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLXN0YWNrXCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1kYXRlcGlja1wiPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWljb25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cmVjdCB4PVwiM1wiIHk9XCI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCIyXCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTZcIiB5MT1cIjJcIiB4Mj1cIjE2XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiOFwiIHkxPVwiMlwiIHgyPVwiOFwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjNcIiB5MT1cIjEwXCIgeDI9XCIyMVwiIHkyPVwiMTBcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWlucHV0IHJwLWRhdGVyYW5nZVwiIG5neERhdGVyYW5nZXBpY2tlck1kIHJlYWRvbmx5IGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGF0ZSByYW5nZVwiIFsobmdNb2RlbCldPVwiZHIucmFuZ2VcIiBbbG9jYWxlXT1cInBpY2tlckxvY2FsZVwiIFttYXhEYXRlXT1cInRvZGF5XCJcclxuICAgICAgICAgICAgICBbcmFuZ2VzXT1cInJhbmdlc1wiIFtzaG93Q3VzdG9tUmFuZ2VMYWJlbF09XCJ0cnVlXCIgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtrZWVwQ2FsZW5kYXJPcGVuaW5nV2l0aFJhbmdlXT1cInRydWVcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW2Ryb3BzXT1cIidkb3duJ1wiIFtvcGVuc109XCIncmlnaHQnXCIgKGRhdGVzVXBkYXRlZCk9XCJkci5vblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLXByZXNldHNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycC1wcmVzZXRcIiAqbmdGb3I9XCJsZXQgcCBvZiBwcmVzZXRzXCIgW2NsYXNzLmlzLW9uXT1cImRyLnByZXNldCA9PT0gcFwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRyLnNldFByZXNldChwKVwiPnt7IHAgfX08L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFZpZXcgYnkgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uc1wiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnbW9kZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJkci5pc1N0b3JlTW9kZVwiIChjbGljayk9XCJkci5zZXRNb2RlKCdzdG9yZScpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJkci5pc1N0b3JlTW9kZVwiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tbGFiZWxcIj5TdG9yZTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj5PbmUgcm93IHBlciBzdG9yZSB3aXRoIHNjb3JlLCByZXN1bHQgYW5kIGxhc3QgYXVkaXQgZGF0ZS48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cIiFkci5pc1N0b3JlTW9kZVwiIChjbGljayk9XCJkci5zZXRNb2RlKCd1c2VyJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cIiFkci5pc1N0b3JlTW9kZVwiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tbGFiZWxcIj5Vc2VyPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24taGVscFwiPlJvbGxlZCB1cCBieSBjaXJjbGUgaGVhZCwgem9uZSBtYW5hZ2VyIGFuZCBBT00sIGRyaWxsYWJsZSBkb3duIHRvIHN0b3Jlcy48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFN0b3JlcyAoU3RvcmUgdmlldykgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtc3RhY2tcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3Njb3BlJyAmJiBkci5pc1N0b3JlTW9kZVwiPlxyXG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXYyLXNlYXJjaCBycC1waWNrLXNlYXJjaFwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT48bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RvcmVcIiBbKG5nTW9kZWwpXT1cImRyLnN0b3JlUXVlcnlcIj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtcGlja2xpc3RcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRyLnN0b3JlUGlja0l0ZW1zLmxlbmd0aFwiPlxyXG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwLXBpY2sgaXMtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiZHIuc3RvcmVQaWNrQWxsQ2hlY2tlZFwiIChjaGFuZ2UpPVwiZHIudG9nZ2xlU3RvcmVQaWNrQWxsKClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlNlbGVjdCBBbGw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJycC1waWNrXCIgKm5nRm9yPVwibGV0IGl0IG9mIGRyLnN0b3JlUGlja0l0ZW1zOyB0cmFja0J5OiB0cmFja0J5UGlja1wiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cIml0LmNoZWNrZWRcIiAoY2hhbmdlKT1cImRyLnRvZ2dsZVN0b3JlUGljayhpdC5zdG9yZSlcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnAtcGljay1sYWJlbFwiPnt7IGl0LnN0b3JlLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwLXBpY2stc3ViXCI+e3sgaXQuc3RvcmUuY2x1c3RlciB8fCBpdC5zdG9yZS5hb20gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1waWNrLWVtcHR5XCIgKm5nSWY9XCIhZHIuc3RvcmVQaWNrSXRlbXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAge3sgZHIuc3RvcmVRdWVyeSA/ICdObyBzdG9yZXMgbWF0Y2ggXCInICsgZHIuc3RvcmVRdWVyeSArICdcIicgOiAnTm8gc3RvcmVzIGluIHNjb3BlJyB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLXJlYWRpbmdcIj5cclxuICAgICAgICAgICAgPHNwYW4+UmVhZGluZzwvc3Bhbj5cclxuICAgICAgICAgICAgPHN0cm9uZz57eyBkci5zdG9yZVBpY2tSZWFkaW5nIH19PC9zdHJvbmc+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLWdyb3dcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWxpbmsgcnAtcmVzZXRcIiAoY2xpY2spPVwiZHIucmVzZXRTdG9yZVBpY2soKVwiPlJlc2V0IHRvIGFsbCBzdG9yZXM8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFN0b3JlIGhpZXJhcmNoeSAoVXNlciB2aWV3KSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1zdGFja1wiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnc2NvcGUnICYmICFkci5pc1N0b3JlTW9kZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWZpZWxkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1maWVsZC1sYWJlbFwiPkNpcmNsZSBIZWFkIDxzcGFuPnt7IGRyLmNpcmNsZU9wdGlvbnMubGVuZ3RoIC0gMSB9fSB1c2Vyczwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgW3ZhbHVlXT1cImRyLmNpcmNsZUtleVwiIFtvcHRpb25zXT1cImRyLmNpcmNsZU9wdGlvbnNcIiBwbGFjZWhvbGRlcj1cIkFsbCBjaXJjbGVzXCJcclxuICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJDaXJjbGUgSGVhZFwiIChjaGFuZ2VkKT1cImRyLnBpY2tDaXJjbGUoJGV2ZW50LnRhcmdldC52YWx1ZSlcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1maWVsZFwiICpuZ0lmPVwiZHIuc2hvd1pvbmVQaWNrXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1maWVsZC1sYWJlbFwiPlpvbmUgTWFuYWdlciA8c3Bhbj57eyBkci56b25lT3B0aW9ucy5sZW5ndGggLSAxIH19IHt7IGRyLnpvbmVPcHRpb25zLmxlbmd0aCA9PT0gMiA/ICd1c2VyJyA6ICd1c2VycycgfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IFt2YWx1ZV09XCJkci56b25lS2V5XCIgW29wdGlvbnNdPVwiZHIuem9uZU9wdGlvbnNcIiBwbGFjZWhvbGRlcj1cIkFsbCB6b25lc1wiXHJcbiAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiWm9uZSBNYW5hZ2VyXCIgKGNoYW5nZWQpPVwiZHIucGlja1pvbmUoJGV2ZW50LnRhcmdldC52YWx1ZSlcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1maWVsZFwiICpuZ0lmPVwiZHIuem9uZUtleVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtZmllbGQtbGFiZWxcIj5BT00gPHNwYW4+e3sgZHIuYW9tT3B0aW9ucy5sZW5ndGggLSAxIH19IHt7IGRyLmFvbU9wdGlvbnMubGVuZ3RoID09PSAyID8gJ3VzZXInIDogJ3VzZXJzJyB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgW3ZhbHVlXT1cImRyLmFvbUtleVwiIFtvcHRpb25zXT1cImRyLmFvbU9wdGlvbnNcIiBwbGFjZWhvbGRlcj1cIkFsbCBBT01zXCJcclxuICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJBT01cIiAoY2hhbmdlZCk9XCJkci5waWNrQW9tKCRldmVudC50YXJnZXQudmFsdWUpXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtZmllbGRcIiAqbmdJZj1cImRyLmFvbUtleVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtZmllbGQtbGFiZWxcIj5TdG9yZSA8c3Bhbj57eyBkci5zdG9yZU9wdGlvbnMubGVuZ3RoIC0gMSB9fSBzdG9yZXM8L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IFt2YWx1ZV09XCJkci5zdG9yZUtleVwiIFtvcHRpb25zXT1cImRyLnN0b3JlT3B0aW9uc1wiIHBsYWNlaG9sZGVyPVwiQWxsIHN0b3Jlc1wiXHJcbiAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiU3RvcmVcIiAoY2hhbmdlZCk9XCJkci5waWNrU3RvcmUoJGV2ZW50LnRhcmdldC52YWx1ZSlcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1yZWFkaW5nXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPlJlYWRpbmc8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzdHJvbmc+e3sgZHIuaGllcmFyY2h5UmVhZGluZyB9fTwvc3Ryb25nPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1ncm93XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1saW5rIHJwLXJlc2V0XCIgKGNsaWNrKT1cImRyLmdvVG9MZXZlbCgnY2lyY2xlJylcIj5SZXNldCB0byBhbGwgY2lyY2xlczwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUmVzdWx0IChTdG9yZSB2aWV3KSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25zXCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdyZXN1bHQnICYmIGRyLmlzU3RvcmVNb2RlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwiZHIucmVzdWx0ID09PSAnYWxsJ1wiIChjbGljayk9XCJkci5zZXRSZXN1bHQoJ2FsbCcpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJkci5yZXN1bHQgPT09ICdhbGwnXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1sYWJlbFwiPkFsbDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj5FdmVyeSBzdG9yZSBpbiBzY29wZSwgYXVkaXRlZCBvciBub3QuPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJkci5yZXN1bHQgPT09ICdwYXNzJ1wiIChjbGljayk9XCJkci5zZXRSZXN1bHQoJ3Bhc3MnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwiZHIucmVzdWx0ID09PSAncGFzcydcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLXRleHRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWxhYmVsXCI+UGFzczwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj5Pbmx5IHN0b3JlcyBzY29yaW5nIGF0IG9yIGFib3ZlIHRoZSB7eyBwYXNzTWFyayB9fSUgcGFzcyBtYXJrLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwiZHIucmVzdWx0ID09PSAnZmFpbCdcIiAoY2xpY2spPVwiZHIuc2V0UmVzdWx0KCdmYWlsJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cImRyLnJlc3VsdCA9PT0gJ2ZhaWwnXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1sYWJlbFwiPkZhaWw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1oZWxwXCI+T25seSBzdG9yZXMgc2NvcmluZyBiZWxvdyB0aGUge3sgcGFzc01hcmsgfX0lIHBhc3MgbWFyay48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItZm9vdFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1saW5rIHJwLXJlc2V0XCIgKGNsaWNrKT1cInJlc2V0RmlsdGVycygpXCI+UmVzZXQgYWxsPC9idXR0b24+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS13aWRlXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCI+QXBwbHk8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==
957
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItcmVwb3J0cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL3JlcG9ydHMvYXVkaXQtdjItcmVwb3J0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL3JlcG9ydHMvYXVkaXQtdjItcmVwb3J0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3hELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUUsYUFBYSxFQUE0QixlQUFlLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7QUFzRC9ILHlGQUF5RjtBQUN6RixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFckIsb0ZBQW9GO0FBQ3BGLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQztBQUVsQyxvRkFBb0Y7QUFDcEYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBRXpCOzs7Ozs7R0FNRztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUE4RHhCO0lBQ0E7SUFDQTtJQUNBO0lBaEVWLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFFckIsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckQsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxZ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SUFFRCxVQUFVLENBQUMsQ0FBUyxFQUFFLENBQVc7UUFDL0IsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFTLEVBQUUsSUFBeUI7UUFDOUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVyxDQUFDLENBQVMsRUFBRSxDQUFrQjtRQUN2QyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDZixDQUFDO3dHQS81QlUsdUJBQXVCOzRGQUF2Qix1QkFBdUIsNERDakZwQyx5aHdCQXFaQTs7NEZEcFVhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUElDS0VSX0xPQ0FMRSwgUGlja2VkRGF0ZXMsIFBpY2tlclJhbmdlLCBmcm9tUGlja2VyUmFuZ2UsIHBpY2tlclJhbmdlcywgdG9QaWNrZXJSYW5nZSB9IGZyb20gJy4uL2F1ZGl0LXYyLWRhdGVwaWNrZXInO1xyXG5pbXBvcnQgeyBBdWRpdFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uL3NlbGVjdC9hdWRpdC12Mi1zZWxlY3QuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0S3BpIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgbm90ZTogc3RyaW5nO1xyXG4gIC8qKiBGaWd1cmUgY29sb3VyOiBncmVlbiAvIHJlZCBhZ2FpbnN0IHRoZSBwYXNzIG1hcmssIG9yIHBsYWluLiAqL1xyXG4gIHRvbmU6ICcnIHwgJ2dvb2QnIHwgJ2JhZCc7XHJcbn1cclxuXHJcbi8qKiBPbmUgcm93IG9mIHRoZSByb2xsLXVwIHRhYmxlIChjaXJjbGUgaGVhZCAvIHpvbmUgbWFuYWdlciAvIGFyZWEgbWFuYWdlcikuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0Um93IHtcclxuICBrZXk6IHN0cmluZztcclxuICBsZXZlbDogUmVwb3J0TGV2ZWw7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgdG90YWw6IG51bWJlcjtcclxuICBhdWRpdGVkOiBudW1iZXI7XHJcbiAgbm90QXVkaXRlZDogbnVtYmVyO1xyXG4gIGZhaWxlZDogbnVtYmVyO1xyXG4gIHNjb3JlU3VtOiBudW1iZXI7XHJcbiAgY292ZXJhZ2U6IHN0cmluZztcclxuICBhdmdTY29yZTogc3RyaW5nO1xyXG4gIGZhaWxlZFBjdDogc3RyaW5nO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuLyoqIE9uZSBzdG9yZSBvZiB0aGUgU3RvcmUgdmlldyAoYW5kIG9mIHRoZSBVc2VyIHZpZXcncyBkZWVwZXN0IGxldmVsKS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdG9yZVJvdyB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGNsdXN0ZXI6IHN0cmluZztcclxuICBjaXJjbGU6IHN0cmluZztcclxuICB6b25lOiBzdHJpbmc7XHJcbiAgYW9tOiBzdHJpbmc7XHJcbiAgY2lyY2xlS2V5OiBzdHJpbmc7XHJcbiAgem9uZUtleTogc3RyaW5nO1xyXG4gIGFvbUtleTogc3RyaW5nO1xyXG4gIGF1ZGl0ZWQ6IGJvb2xlYW47XHJcbiAgLyoqIDAtMTAwLCBudWxsIHdoZW4gdGhlIHN0b3JlIGhhcyBubyBzY29yZWQgYXVkaXQgaW4gdGhlIHBlcmlvZC4gKi9cclxuICBzY29yZTogbnVtYmVyIHwgbnVsbDtcclxuICBzdGF0dXM6ICdwYXNzJyB8ICdmYWlsJyB8ICduYSc7XHJcbiAgLyoqIFwiREQgTU1NIFlZWVlcIjsgJycgd2hlbiBub25lLiAqL1xyXG4gIGxhc3RBdWRpdDogc3RyaW5nO1xyXG4gIC8qKiBZWVlZLU1NLUREIG9mIHRoZSBsYXN0IGF1ZGl0LCBmb3Igc29ydGluZzsgJycgd2hlbiBub25lLiAqL1xyXG4gIGxhc3RBdWRpdElzbzogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIFJlcG9ydExldmVsID0gJ2NpcmNsZScgfCAnem9uZScgfCAnYW9tJyB8ICdzdG9yZSc7XHJcbnR5cGUgVmlld01vZGUgPSAnc3RvcmUnIHwgJ3VzZXInO1xyXG50eXBlIFJlc3VsdEZpbHRlciA9ICdhbGwnIHwgJ3Bhc3MnIHwgJ2ZhaWwnO1xyXG50eXBlIEZpbHRlckNhdCA9ICdkYXRlJyB8ICdtb2RlJyB8ICdzY29wZScgfCAncmVzdWx0JztcclxuXHJcbi8qKiBQYXNzIG1hcmsgc2hvd24gdW50aWwgdGhlIEFQSSBhbnN3ZXJzIChpdCBzZW5kcyB0aGUgcmVhbCBvbmUgaW4gc3VtbWFyeS5wYXNzTWFyaykuICovXHJcbmNvbnN0IFBBU1NfTUFSSyA9IDc1O1xyXG5cclxuLyoqIFJvd3Mgd2l0aG91dCBhIGNpcmNsZSBoZWFkIGluIHRoZSBzdG9yZSBoaWVyYXJjaHkgYXJlIGdyb3VwZWQgdW5kZXIgdGhpcyBrZXkuICovXHJcbmNvbnN0IFVOQVNTSUdORUQgPSAnX191bmFzc2lnbmVkJztcclxuXHJcbi8qKiBWaXNpdHMgcGVyIC9hdWRpdC9kYXNoYm9hcmQvZGV0YWlsIGNhbGwgd2hlbiBleHBvcnRpbmcgKHRoZSBBUEkncyBtYXggbGltaXQpLiAqL1xyXG5jb25zdCBFWFBPUlRfUEFHRSA9IDUwMDA7XHJcblxyXG4vKipcclxuICogUmVwb3J0cyAoXCJSZXBvcnRzIOKAlCBTdG9yZSBhdWRpdCByZXBvcnRcIiBwcm90b3R5cGUpLCByZWFkIGZyb20gUE9TVCAvdHJheC9hdWRpdC9yZXBvcnRzOiBvbmUgY2FsbCByZXR1cm5zIGV2ZXJ5XHJcbiAqIHN0b3JlIG9mIHRoZSBoZWFkZXIgc2NvcGUgd2l0aCBpdHMgc2NvcmUsIHJlc3VsdCwgbGFzdCBhdWRpdCwgY2x1c3RlciBhbmQgaGllcmFyY2h5IGxpbmUsIHBsdXMgdGhlIGNpcmNsZSBoZWFkIC9cclxuICogem9uZSBtYW5hZ2VyIC8gYXJlYSBtYW5hZ2VyIHJvbGwtdXBzLiBFdmVyeXRoaW5nIGJlbG93IHRoZSBkYXRlIHJhbmdlIGlzIGZpbHRlcmVkIGluIHRoZSBicm93c2VyOlxyXG4gKiAgIFZpZXcgYnkgU3RvcmUgLSBvbmUgcm93IHBlciBzdG9yZSwgbmFycm93ZWQgYnkgdGhlIFN0b3JlcyBwaWNrIGFuZCB0aGUgUmVzdWx0IGZpbHRlci5cclxuICogICBWaWV3IGJ5IFVzZXIgIC0gY2lyY2xlIGhlYWQgLT4gem9uZSBtYW5hZ2VyIC0+IGFyZWEgbWFuYWdlciAtPiBzdG9yZXMsIGJ5IGNsaWNraW5nIHJvd3Mgb3IgdGhlIEhpZXJhcmNoeSBwaWNrcy5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWF1ZGl0LXYyLXJlcG9ydHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1yZXBvcnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXVkaXQtdjItcmVwb3J0cy5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGl0VjJSZXBvcnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHBhc3NNYXJrID0gUEFTU19NQVJLO1xyXG5cclxuICBmcm9tID0gZGF5anMoKS5zdGFydE9mKCdtb250aCcpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gIHRvID0gZGF5anMoKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICBwcmVzZXQgPSAnVGhpcyBtb250aCc7XHJcbiAgcmVhZG9ubHkgcHJlc2V0cyA9IFsnVGhpcyBtb250aCcsICdMYXN0IG1vbnRoJywgJ0xhc3QgMzAgZGF5cyddO1xyXG4gIC8qKiBSYW5nZSBwaWNrZXIgbW9kZWwsIGtlcHQgaW4gc3RlcCB3aXRoIGZyb20gLyB0by4gKi9cclxuICByYW5nZTogUGlja2VyUmFuZ2UgfCBudWxsID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gIHJlYWRvbmx5IHBpY2tlckxvY2FsZSA9IFBJQ0tFUl9MT0NBTEU7XHJcbiAgcmVhZG9ubHkgcmFuZ2VzID0gcGlja2VyUmFuZ2VzKCk7XHJcbiAgcmVhZG9ubHkgdG9kYXkgPSBkYXlqcygpO1xyXG5cclxuICAvKiogVmlldyBieTogU3RvcmUgKHByb3RvdHlwZSBkZWZhdWx0KSBvciBVc2VyIChoaWVyYXJjaHkgcm9sbC11cCkuICovXHJcbiAgbW9kZTogVmlld01vZGUgPSAnc3RvcmUnO1xyXG4gIHJlc3VsdDogUmVzdWx0RmlsdGVyID0gJ2FsbCc7XHJcbiAgLyoqIFN0b3JlcyBwaWNrZWQgaW4gRmlsdGVycyAtPiBTdG9yZXM7IG51bGwgPSBldmVyeSBzdG9yZSBpbiBzY29wZS4gKi9cclxuICBzdG9yZVNlbDogU2V0PHN0cmluZz4gfCBudWxsID0gbnVsbDtcclxuICBzdG9yZVF1ZXJ5ID0gJyc7XHJcblxyXG4gIHNlYXJjaCA9ICcnO1xyXG5cclxuICAvLyBVc2VyIHZpZXcgcG9zaXRpb24uXHJcbiAgbGV2ZWw6IFJlcG9ydExldmVsID0gJ2NpcmNsZSc7XHJcbiAgY2lyY2xlS2V5ID0gJyc7XHJcbiAgem9uZUtleSA9ICcnO1xyXG4gIGFvbUtleSA9ICcnO1xyXG4gIC8qKiBPbmUgc3RvcmUgcGlja2VkIHVuZGVyIGFuIGFyZWEgbWFuYWdlciAoRmlsdGVycyAtPiBTdG9yZSBoaWVyYXJjaHkgLT4gU3RvcmUpLiAqL1xyXG4gIHN0b3JlS2V5ID0gJyc7XHJcbiAgY2lyY2xlSGVhZCA9ICcnO1xyXG4gIHpvbmVNYW5hZ2VyID0gJyc7XHJcbiAgYW9tID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbHRlciBkcmF3ZXIgKFFBIDkgT2N0KTogdGhlIGRyYXdlciBlZGl0cyBhIGRyYWZ0LCBhbmQgdGhlIHBhZ2UgYmVoaW5kIGNoYW5nZXMgb25seSBvbiBBcHBseSAob3IgUmVzZXQgYWxsKS5cclxuICAgKiBUaGUgZHJhZnQgaXMgT2JqZWN0LmNyZWF0ZSh0aGlzKTogaXQgcmVhZHMgdGhlIGxvYWRlZCByZXBvcnQgdGhyb3VnaCB0aGUgY29tcG9uZW50LCBzbyBldmVyeSBnZXR0ZXIgdGhlXHJcbiAgICogZHJhd2VyIHNob3dzIChzdG9yZSBwaWNrLCBoaWVyYXJjaHkgb3B0aW9ucywgcmVhZGluZ3MpIHdvcmtzIG9uIHRoZSBkcmFmdCdzIG93biBmaWx0ZXIgdmFsdWVzLlxyXG4gICAqL1xyXG4gIGZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgZHJhZnQ6IEF1ZGl0VjJSZXBvcnRzQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgLyoqIFNldCBvbiB0aGUgZHJhZnQgb25seTogZGF0ZSBwaWNrcyB3YWl0IGZvciBBcHBseSBpbnN0ZWFkIG9mIHJlZmV0Y2hpbmcuICovXHJcbiAgcHJpdmF0ZSBpc0RyYWZ0ID0gZmFsc2U7XHJcbiAgYWN0aXZlQ2F0OiBGaWx0ZXJDYXQgPSAnc2NvcGUnO1xyXG5cclxuICAvKiogU3RhcnRzIHRydWUgc28gdGhlIGZpcnN0IHBhaW50IHNoaW1tZXJzIGluc3RlYWQgb2Ygc2hvd2luZyB6ZXJvIEtQSXMgYW5kIGFuIGVtcHR5IHRhYmxlLiAqL1xyXG4gIGxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAvKiogQ29sdW1uIHNvcnQgKCcnID0gdGhlIEFQSSdzIG9yZGVyKTsgYSBoZWFkZXIgY2xpY2sgdG9nZ2xlcyBhc2NlbmRpbmcgLyBkZXNjZW5kaW5nLiAqL1xyXG4gIHNvcnRLZXkgPSAnJztcclxuICBzb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAvKiogVGFibGUgcGFnZXIgKHNoYXJlZCBsaWItcGFnaW5hdGlvbiwgMTAgLyAyMCAvIDMwIGxpa2UgZXZlcnkgYXVkaXQgbGlzdCk7IGJhY2sgdG8gcGFnZSAxIG9uIGFueSBmaWx0ZXIgY2hhbmdlLiAqL1xyXG4gIHBhZ2UgPSAxO1xyXG4gIHBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGFnZVNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG5cclxuICBwcml2YXRlIGRhdGE6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBhbGxTdG9yZXM6IFN0b3JlUm93W10gPSBbXTtcclxuICBwcml2YXRlIGhlYWRlckRhdGE6IGFueTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRyYXhTZXJ2aWNlOiBUcmF4U2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YT8uY2xpZW50KSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnN0IGNsaWVudENoYW5nZWQgPSB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCAhPT0gZGF0YS5jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJEYXRhID0gZGF0YTtcclxuICAgICAgICBpZiAoY2xpZW50Q2hhbmdlZCkge1xyXG4gICAgICAgICAgdGhpcy5nb1RvTGV2ZWwoJ2NpcmNsZScpO1xyXG4gICAgICAgICAgdGhpcy5zdG9yZVNlbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIEFQSSByZWplY3RzIHVua25vd24ga2V5cywgc28gb25seSB0aGUgc2NvcGUgaXMgc2VudC4gKi9cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGVhZGVyRGF0YT8uY2xpZW50KSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRSZXBvcnRzKHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YS5jbGllbnQsXHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZyb20sXHJcbiAgICAgIHRvRGF0ZTogdGhpcy50byxcclxuICAgICAgc3RvcmVJZDogKHRoaXMuaGVhZGVyRGF0YS5zdG9yZXMgfHwgW10pLmZpbHRlcigoczogYW55KSA9PiBzLmNoZWNrZWQpLm1hcCgoczogYW55KSA9PiBzLnN0b3JlSWQpXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gcmVzPy5jb2RlID09PSAyMDAgPyAocmVzLmRhdGEgfHwgbnVsbCkgOiBudWxsO1xyXG4gICAgICAgIHRoaXMucGFzc01hcmsgPSBOdW1iZXIodGhpcy5kYXRhPy5zdW1tYXJ5Py5wYXNzTWFyaykgfHwgUEFTU19NQVJLO1xyXG4gICAgICAgIHRoaXMuYWxsU3RvcmVzID0gKHRoaXMuZGF0YT8uc3RvcmVzIHx8IFtdKS5tYXAoKHM6IGFueSkgPT4gdGhpcy50b1N0b3JlKHMpKTtcclxuICAgICAgICAvLyBBIHBpY2sgb2Ygc3RvcmVzIHRoYXQgbGVmdCB0aGUgc2NvcGUgaXMgZHJvcHBlZC5cclxuICAgICAgICBpZiAodGhpcy5zdG9yZVNlbCkge1xyXG4gICAgICAgICAgY29uc3QgaWRzID0gbmV3IFNldCh0aGlzLmFsbFN0b3Jlcy5tYXAocyA9PiBzLmtleSkpO1xyXG4gICAgICAgICAgY29uc3Qga2VwdCA9IFsuLi50aGlzLnN0b3JlU2VsXS5maWx0ZXIoaWQgPT4gaWRzLmhhcyhpZCkpO1xyXG4gICAgICAgICAgdGhpcy5zdG9yZVNlbCA9IGtlcHQubGVuZ3RoICYmIGtlcHQubGVuZ3RoIDwgdGhpcy5hbGxTdG9yZXMubGVuZ3RoID8gbmV3IFNldChrZXB0KSA6IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hbGxTdG9yZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvU3RvcmUoczogYW55KTogU3RvcmVSb3cge1xyXG4gICAgY29uc3Qgc2NvcmUgPSBzPy5zY29yZSA9PT0gbnVsbCB8fCBzPy5zY29yZSA9PT0gdW5kZWZpbmVkIHx8IGlzTmFOKE51bWJlcihzLnNjb3JlKSkgPyBudWxsIDogTWF0aC5yb3VuZChOdW1iZXIocy5zY29yZSkpO1xyXG4gICAgY29uc3Qgc3RhdHVzID0gcz8uc3RhdHVzID09PSAncGFzcycgfHwgcz8uc3RhdHVzID09PSAnZmFpbCcgPyBzLnN0YXR1cyA6ICduYSc7XHJcbiAgICBjb25zdCBsYXN0ID0gcz8ubGFzdEF1ZGl0RGF0ZSAmJiBkYXlqcyhzLmxhc3RBdWRpdERhdGUpLmlzVmFsaWQoKSA/IGRheWpzKHMubGFzdEF1ZGl0RGF0ZSkgOiBudWxsO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAga2V5OiBTdHJpbmcocz8ua2V5ID8/ICcnKSxcclxuICAgICAgbmFtZTogcz8ubmFtZSB8fCAn4oCUJyxcclxuICAgICAgY2x1c3Rlcjogcz8uY2x1c3RlciB8fCAnJyxcclxuICAgICAgY2lyY2xlOiBzPy5jaXJjbGVOYW1lIHx8IHRoaXMubmFtZU9mKHRoaXMuZGF0YT8uY2lyY2xlcywgcz8uY2lyY2xlS2V5KSxcclxuICAgICAgem9uZTogcz8uem9uZU5hbWUgfHwgdGhpcy5uYW1lT2YodGhpcy5kYXRhPy56b25lcywgcz8uem9uZUtleSksXHJcbiAgICAgIGFvbTogcz8uYW9tTmFtZSB8fCB0aGlzLm5hbWVPZih0aGlzLmRhdGE/LmFvbXMsIHM/LmFvbUtleSksXHJcbiAgICAgIGNpcmNsZUtleTogcz8uY2lyY2xlS2V5IHx8ICcnLFxyXG4gICAgICB6b25lS2V5OiBzPy56b25lS2V5IHx8ICcnLFxyXG4gICAgICBhb21LZXk6IHM/LmFvbUtleSB8fCAnJyxcclxuICAgICAgYXVkaXRlZDogc2NvcmUgIT09IG51bGwsXHJcbiAgICAgIHNjb3JlLFxyXG4gICAgICBzdGF0dXM6IHNjb3JlID09PSBudWxsID8gJ25hJyA6IHN0YXR1cyxcclxuICAgICAgbGFzdEF1ZGl0OiBsYXN0ID8gbGFzdC5mb3JtYXQoJ0REIE1NTSBZWVlZJykgOiAnJyxcclxuICAgICAgbGFzdEF1ZGl0SXNvOiBsYXN0ID8gbGFzdC5mb3JtYXQoJ1lZWVktTU0tREQnKSA6ICcnXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYW1lT2YobGlzdDogYW55W10sIGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBrZXkgPyAoKGxpc3QgfHwgW10pLmZpbmQoKHI6IGFueSkgPT4gci5rZXkgPT09IGtleSk/Lm5hbWUgfHwgJycpIDogJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNTdG9yZU1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSAnc3RvcmUnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gU3RvcmUgdmlld1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogU3RvcmVzIG9mIHRoZSBTdG9yZXMgcGljaywgdGhlbiB0aGUgUmVzdWx0IGZpbHRlciAod2hhdCB0aGUgS1BJcyBhbmQgdGhlIHRhYmxlIHJlYWQpLiAqL1xyXG4gIGdldCBzdG9yZVNjb3BlKCk6IFN0b3JlUm93W10ge1xyXG4gICAgY29uc3QgcGlja2VkID0gdGhpcy5zdG9yZVNlbCA/IHRoaXMuYWxsU3RvcmVzLmZpbHRlcihzID0+IHRoaXMuc3RvcmVTZWwhLmhhcyhzLmtleSkpIDogdGhpcy5hbGxTdG9yZXM7XHJcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQgPT09ICdhbGwnID8gcGlja2VkIDogcGlja2VkLmZpbHRlcihzID0+IHMuc3RhdHVzID09PSB0aGlzLnJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmUgdGFibGUgcm93czogdGhlIHNjb3BlLCBuYXJyb3dlZCBieSB0aGUgc2VhcmNoIGJveCwgaW4gdGhlIGNvbHVtbiBzb3J0LiAqL1xyXG4gIGdldCBzdG9yZVJvd3MoKTogU3RvcmVSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5zZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBsaXN0ID0gcVxyXG4gICAgICA/IHRoaXMuc3RvcmVTY29wZS5maWx0ZXIocyA9PiAocy5uYW1lICsgJyAnICsgcy5rZXkgKyAnICcgKyBzLmNsdXN0ZXIgKyAnICcgKyBzLmFvbSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSlcclxuICAgICAgOiB0aGlzLnN0b3JlU2NvcGU7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0U3RvcmVzKGxpc3QpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0b3JlUGFnZVJvd3MoKTogU3RvcmVSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlT2YodGhpcy5zdG9yZVJvd3MpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0b3JlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnN0b3JlU2VsICYmICF0aGlzLnN0b3JlU2VsLnNpemUpIHsgcmV0dXJuICdObyBzdG9yZXMgc2VsZWN0ZWQnOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZVNlbFxyXG4gICAgICA/IHRoaXMuc3RvcmVTZWwuc2l6ZSArICh0aGlzLnN0b3JlU2VsLnNpemUgPT09IDEgPyAnIHN0b3JlJyA6ICcgc3RvcmVzJykgKyAnIHNlbGVjdGVkJ1xyXG4gICAgICA6ICdBbGwgc3RvcmVzICgnICsgdGhpcy5hbGxTdG9yZXMubGVuZ3RoICsgJyknO1xyXG4gIH1cclxuXHJcbiAgc2NvcmVUZXh0KHM6IFN0b3JlUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzLnNjb3JlID09PSBudWxsID8gJ+KAlCcgOiBzLnNjb3JlICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgcmVzdWx0VGV4dChzOiBTdG9yZVJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcy5zdGF0dXMgPT09ICdwYXNzJyA/ICdQYXNzJyA6IHMuc3RhdHVzID09PSAnZmFpbCcgPyAnRmFpbCcgOiAnTm90IGF1ZGl0ZWQnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gVXNlciB2aWV3IChyb2xsLXVwKVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogUm9sbC11cCByb3dzIG9mIHRoZSBjdXJyZW50IGxldmVsLCBuYXJyb3dlZCB0byB0aGUgc2VsZWN0ZWQgcGFyZW50IChzdG9yZXMgYXQgdGhlIGRlZXBlc3QgbGV2ZWwpLiAqL1xyXG4gIGdldCByb3dzKCk6IFJlcG9ydFJvd1tdIHtcclxuICAgIGlmICghdGhpcy5kYXRhKSB7IHJldHVybiBbXTsgfVxyXG4gICAgbGV0IGxpc3Q6IGFueVtdO1xyXG4gICAgaWYgKHRoaXMubGV2ZWwgPT09ICdjaXJjbGUnKSB7XHJcbiAgICAgIGxpc3QgPSBbLi4uKHRoaXMuZGF0YS5jaXJjbGVzIHx8IFtdKV07XHJcbiAgICAgIGNvbnN0IG9ycGhhbnMgPSAodGhpcy5kYXRhLnN0b3JlcyB8fCBbXSkuZmlsdGVyKChzOiBhbnkpID0+ICFzLmNpcmNsZUtleSk7XHJcbiAgICAgIGlmIChvcnBoYW5zLmxlbmd0aCkgeyBsaXN0LnB1c2godGhpcy5yb2xsdXAoVU5BU1NJR05FRCwgJ05vdCBpbiBoaWVyYXJjaHknLCBvcnBoYW5zKSk7IH1cclxuICAgIH0gZWxzZSBpZiAodGhpcy5sZXZlbCA9PT0gJ3pvbmUnKSB7XHJcbiAgICAgIGxpc3QgPSAodGhpcy5kYXRhLnpvbmVzIHx8IFtdKS5maWx0ZXIoKHo6IGFueSkgPT4gei5jaXJjbGVLZXkgPT09IHRoaXMuY2lyY2xlS2V5KTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5sZXZlbCA9PT0gJ2FvbScpIHtcclxuICAgICAgbGlzdCA9ICh0aGlzLmRhdGEuYW9tcyB8fCBbXSkuZmlsdGVyKChhOiBhbnkpID0+IGEuem9uZUtleSA9PT0gdGhpcy56b25lS2V5KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxpc3QgPSAodGhpcy5kYXRhLnN0b3JlcyB8fCBbXSkuZmlsdGVyKChzOiBhbnkpID0+XHJcbiAgICAgICAgKHRoaXMuYW9tS2V5ID8gcy5hb21LZXkgPT09IHRoaXMuYW9tS2V5IDogdGhpcy5jaXJjbGVLZXkgPT09IFVOQVNTSUdORUQgPyAhcy5jaXJjbGVLZXkgOiB0cnVlKVxyXG4gICAgICAgICYmICghdGhpcy5zdG9yZUtleSB8fCBzLmtleSA9PT0gdGhpcy5zdG9yZUtleSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxpc3QubWFwKChyOiBhbnkpID0+IHRoaXMudG9Sb3cocikpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlcyBvZiB0aGUgVXNlciB2aWV3J3MgZGVlcGVzdCBsZXZlbCAoU3RvcmUsIEFyZWEgbWFuYWdlciwgWm9uZSBtYW5hZ2VyLCBBdWRpdGVkLCBTY29yZSkuICovXHJcbiAgZ2V0IHVzZXJTdG9yZXMoKTogU3RvcmVSb3dbXSB7XHJcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldCh0aGlzLnJvd3MubWFwKHIgPT4gci5rZXkpKTtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRTdG9yZXModGhpcy5hbGxTdG9yZXMuZmlsdGVyKHMgPT4ga2V5cy5oYXMocy5rZXkpICYmICghcSB8fCAocy5uYW1lICsgJyAnICsgcy5rZXkpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdXNlclN0b3JlUGFnZVJvd3MoKTogU3RvcmVSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wYWdlT2YodGhpcy51c2VyU3RvcmVzKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGllbnQtc2lkZSByb2xsLXVwIChzYW1lIG1hdGhzIGFzIHRoZSBBUEkpIGZvciBzdG9yZXMgdGhlIGhpZXJhcmNoeSBkb2VzIG5vdCBsaXN0LiAqL1xyXG4gIHByaXZhdGUgcm9sbHVwKGtleTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHN0b3JlczogYW55W10pOiBhbnkge1xyXG4gICAgY29uc3QgYXVkaXRlZCA9IHN0b3Jlcy5maWx0ZXIocyA9PiBzLmF1ZGl0ZWQpO1xyXG4gICAgY29uc3QgZmFpbGVkID0gc3RvcmVzLmZpbHRlcihzID0+IHMuZmFpbGVkKS5sZW5ndGg7XHJcbiAgICBjb25zdCBzY29yZVN1bSA9IGF1ZGl0ZWQucmVkdWNlKChhLCBzKSA9PiBhICsgKE51bWJlcihzLmF2Z1Njb3JlKSB8fCAwKSwgMCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBsZXZlbDogJ2NpcmNsZScsIGtleSwgbmFtZSwgZW1haWw6ICcnLCBjaXJjbGVLZXk6ICcnLCB6b25lS2V5OiAnJywgYW9tS2V5OiAnJyxcclxuICAgICAgdG90YWw6IHN0b3Jlcy5sZW5ndGgsIGF1ZGl0ZWQ6IGF1ZGl0ZWQubGVuZ3RoLCBub3RBdWRpdGVkOiBzdG9yZXMubGVuZ3RoIC0gYXVkaXRlZC5sZW5ndGgsIGZhaWxlZCwgc2NvcmVTdW0sXHJcbiAgICAgIGNvdmVyYWdlOiBzdG9yZXMubGVuZ3RoID8gTWF0aC5yb3VuZChhdWRpdGVkLmxlbmd0aCAvIHN0b3Jlcy5sZW5ndGggKiAxMDApIDogbnVsbCxcclxuICAgICAgYXZnU2NvcmU6IGF1ZGl0ZWQubGVuZ3RoID8gTWF0aC5yb3VuZChzY29yZVN1bSAvIGF1ZGl0ZWQubGVuZ3RoKSA6IG51bGwsXHJcbiAgICAgIGZhaWxlZFBjdDogYXVkaXRlZC5sZW5ndGggPyBNYXRoLnJvdW5kKGZhaWxlZCAvIGF1ZGl0ZWQubGVuZ3RoICogMTAwKSA6IG51bGxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvUm93KHI6IGFueSk6IFJlcG9ydFJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBrZXk6IFN0cmluZyhyPy5rZXkgPz8gJycpLFxyXG4gICAgICBsZXZlbDogcj8ubGV2ZWwgfHwgdGhpcy5sZXZlbCxcclxuICAgICAgbmFtZTogcj8ubmFtZSB8fCAn4oCUJyxcclxuICAgICAgZW1haWw6IHI/LmVtYWlsIHx8ICcnLFxyXG4gICAgICB0b3RhbDogTnVtYmVyKHI/LnRvdGFsKSB8fCAwLFxyXG4gICAgICBhdWRpdGVkOiBOdW1iZXIocj8uYXVkaXRlZCkgfHwgMCxcclxuICAgICAgbm90QXVkaXRlZDogTnVtYmVyKHI/Lm5vdEF1ZGl0ZWQpIHx8IDAsXHJcbiAgICAgIGZhaWxlZDogTnVtYmVyKHI/LmZhaWxlZCkgfHwgMCxcclxuICAgICAgc2NvcmVTdW06IE51bWJlcihyPy5zY29yZVN1bSkgfHwgMCxcclxuICAgICAgY292ZXJhZ2U6IHRoaXMucGN0VGV4dChyPy5jb3ZlcmFnZSksXHJcbiAgICAgIGF2Z1Njb3JlOiB0aGlzLnBjdFRleHQocj8uYXZnU2NvcmUpLFxyXG4gICAgICBmYWlsZWRQY3Q6IHRoaXMucGN0VGV4dChyPy5mYWlsZWRQY3QpLFxyXG4gICAgICByYXc6IHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBjdFRleHQodjogYW55KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAnJyB8fCBpc05hTihOdW1iZXIodikpID8gJ+KAlCcgOiBNYXRoLnJvdW5kKE51bWJlcih2KSkgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBnZXQgY3J1bWJzKCk6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgbGV2ZWw6IFJlcG9ydExldmVsIH0+IHtcclxuICAgIGNvbnN0IHRyYWlsOiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IGxldmVsOiBSZXBvcnRMZXZlbCB9PiA9IFt7IGxhYmVsOiAnQWxsIGNpcmNsZXMnLCBsZXZlbDogJ2NpcmNsZScgfV07XHJcbiAgICBpZiAodGhpcy5jaXJjbGVIZWFkKSB7IHRyYWlsLnB1c2goeyBsYWJlbDogdGhpcy5jaXJjbGVIZWFkLCBsZXZlbDogJ3pvbmUnIH0pOyB9XHJcbiAgICBpZiAodGhpcy56b25lTWFuYWdlcikgeyB0cmFpbC5wdXNoKHsgbGFiZWw6IHRoaXMuem9uZU1hbmFnZXIsIGxldmVsOiAnYW9tJyB9KTsgfVxyXG4gICAgaWYgKHRoaXMuYW9tKSB7IHRyYWlsLnB1c2goeyBsYWJlbDogdGhpcy5hb20sIGxldmVsOiAnc3RvcmUnIH0pOyB9XHJcbiAgICByZXR1cm4gdHJhaWw7XHJcbiAgfVxyXG5cclxuICBnZXQgaGludCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMubGV2ZWwgPT09ICdjaXJjbGUnKSB7IHJldHVybiAnQ2xpY2sgYSBjaXJjbGUgaGVhZCB0byBvcGVuIHRoZWlyIHpvbmUgbWFuYWdlcnMnOyB9XHJcbiAgICBpZiAodGhpcy5sZXZlbCA9PT0gJ3pvbmUnKSB7IHJldHVybiAnQ2xpY2sgYSB6b25lIG1hbmFnZXIgdG8gb3BlbiB0aGVpciBhcmVhIG1hbmFnZXJzJzsgfVxyXG4gICAgaWYgKHRoaXMubGV2ZWwgPT09ICdhb20nKSB7IHJldHVybiAnQ2xpY2sgYW4gYXJlYSBtYW5hZ2VyIHRvIG9wZW4gdGhlaXIgc3RvcmVzJzsgfVxyXG4gICAgcmV0dXJuICdTdG9yZSBsZXZlbCDCtyB0aGUgZGVlcGVzdCB2aWV3JztcclxuICB9XHJcblxyXG4gIC8qKiBDb2x1bW4gaGVhZGluZyBmb3IgdGhlIGN1cnJlbnQgbGV2ZWwuICovXHJcbiAgZ2V0IGxldmVsTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmxldmVsID09PSAnY2lyY2xlJykgeyByZXR1cm4gJ0NpcmNsZSBoZWFkJzsgfVxyXG4gICAgaWYgKHRoaXMubGV2ZWwgPT09ICd6b25lJykgeyByZXR1cm4gJ1pvbmUgbWFuYWdlcic7IH1cclxuICAgIHJldHVybiB0aGlzLmxldmVsID09PSAnYW9tJyA/ICdBcmVhIG1hbmFnZXInIDogJ1N0b3JlJztcclxuICB9XHJcblxyXG4gIGdldCB0YWJsZVRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5sZXZlbCA9PT0gJ3N0b3JlJyA/ICdTdG9yZSByZXBvcnQnIDogdGhpcy5sZXZlbExhYmVsICsgJyBzdW1tYXJ5JztcclxuICB9XHJcblxyXG4gIGdldCB0YWJsZU1ldGEoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmxldmVsID09PSAnc3RvcmUnKSB7XHJcbiAgICAgIGNvbnN0IG4gPSB0aGlzLnVzZXJTdG9yZXMubGVuZ3RoO1xyXG4gICAgICByZXR1cm4gbiArIChuID09PSAxID8gJyBzdG9yZScgOiAnIHN0b3JlcycpICsgJyDCtyByb2xsZWQgdXAgZnJvbSBzdG9yZSBhdWRpdHMgaW4gdGhlIHBlcmlvZCc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuID0gdGhpcy5maWx0ZXJlZFJvd3MubGVuZ3RoO1xyXG4gICAgcmV0dXJuIG4gKyAobiA9PT0gMSA/ICcgcm93JyA6ICcgcm93cycpICsgJyDCtyByb2xsZWQgdXAgZnJvbSBzdG9yZSBhdWRpdHMgaW4gdGhlIHBlcmlvZCc7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRSb3dzKCk6IFJlcG9ydFJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IHJvd3MgPSBxID8gdGhpcy5yb3dzLmZpbHRlcihyID0+IChyLm5hbWUgKyAnICcgKyByLmVtYWlsKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMucm93cztcclxuICAgIHJldHVybiB0aGlzLnNvcnRSb3dzKHJvd3MpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhZ2VSb3dzKCk6IFJlcG9ydFJvd1tdIHtcclxuICAgIHJldHVybiB0aGlzLnBhZ2VPZih0aGlzLmZpbHRlcmVkUm93cyk7XHJcbiAgfVxyXG5cclxuICAvKiogRHJpbGwgb25lIGxldmVsIGRvd24gaW50byB0aGUgY2xpY2tlZCByb3cuICovXHJcbiAgb3BlblJvdyhyb3c6IFJlcG9ydFJvdyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubGV2ZWwgPT09ICdjaXJjbGUnKSB7XHJcbiAgICAgIHRoaXMuY2lyY2xlS2V5ID0gcm93LmtleTtcclxuICAgICAgdGhpcy5jaXJjbGVIZWFkID0gcm93Lm5hbWU7XHJcbiAgICAgIC8vIFN0b3JlcyBvdXRzaWRlIHRoZSBoaWVyYXJjaHkgaGF2ZSBubyB6b25lIC8gQU9NIHRvIGRyaWxsIHRocm91Z2guXHJcbiAgICAgIHRoaXMubGV2ZWwgPSByb3cua2V5ID09PSBVTkFTU0lHTkVEID8gJ3N0b3JlJyA6ICd6b25lJztcclxuICAgIH0gZWxzZSBpZiAodGhpcy5sZXZlbCA9PT0gJ3pvbmUnKSB7XHJcbiAgICAgIHRoaXMuem9uZUtleSA9IHJvdy5rZXk7XHJcbiAgICAgIHRoaXMuem9uZU1hbmFnZXIgPSByb3cubmFtZTtcclxuICAgICAgdGhpcy5sZXZlbCA9ICdhb20nO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmxldmVsID09PSAnYW9tJykge1xyXG4gICAgICB0aGlzLmFvbUtleSA9IHJvdy5rZXk7XHJcbiAgICAgIHRoaXMuYW9tID0gcm93Lm5hbWU7XHJcbiAgICAgIHRoaXMubGV2ZWwgPSAnc3RvcmUnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICBnb1RvTGV2ZWwobGV2ZWw6IFJlcG9ydExldmVsKTogdm9pZCB7XHJcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XHJcbiAgICBpZiAobGV2ZWwgPT09ICdjaXJjbGUnKSB7IHRoaXMuY2lyY2xlS2V5ID0gJyc7IHRoaXMuY2lyY2xlSGVhZCA9ICcnOyB9XHJcbiAgICBpZiAobGV2ZWwgPT09ICdjaXJjbGUnIHx8IGxldmVsID09PSAnem9uZScpIHsgdGhpcy56b25lS2V5ID0gJyc7IHRoaXMuem9uZU1hbmFnZXIgPSAnJzsgfVxyXG4gICAgaWYgKGxldmVsICE9PSAnc3RvcmUnKSB7IHRoaXMuYW9tS2V5ID0gJyc7IHRoaXMuYW9tID0gJyc7IH1cclxuICAgIHRoaXMuc3RvcmVLZXkgPSAnJztcclxuICAgIHRoaXMuc2VhcmNoID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gU29ydGluZyAoZXZlcnkgdGFibGUpXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHNvcnRCeShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0RGlyID0gdGhpcy5zb3J0S2V5ID09PSBrZXkgJiYgdGhpcy5zb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xyXG4gICAgdGhpcy5zb3J0S2V5ID0ga2V5O1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBOdW1iZXJzIGFzIG51bWJlcnMsIHRleHQgYXMgdGV4dCwgZW1wdHkgdmFsdWVzIChcIuKAlFwiKSBhbHdheXMgbGFzdC4gKi9cclxuICBwcml2YXRlIHNvcnRMaXN0PFQ+KHJvd3M6IFRbXSwgdmFsdWU6IChyOiBUKSA9PiBudW1iZXIgfCBzdHJpbmcgfCBudWxsKTogVFtdIHtcclxuICAgIGlmICghdGhpcy5zb3J0S2V5KSB7IHJldHVybiByb3dzOyB9XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLnNvcnREaXIgPT09ICdhc2MnID8gMSA6IC0xO1xyXG4gICAgcmV0dXJuIFsuLi5yb3dzXS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IHggPSB2YWx1ZShhKTtcclxuICAgICAgY29uc3QgeSA9IHZhbHVlKGIpO1xyXG4gICAgICBpZiAoeCA9PT0gbnVsbCB8fCB4ID09PSAnJyB8fCB5ID09PSBudWxsIHx8IHkgPT09ICcnKSB7XHJcbiAgICAgICAgY29uc3QgeGUgPSB4ID09PSBudWxsIHx8IHggPT09ICcnO1xyXG4gICAgICAgIGNvbnN0IHllID0geSA9PT0gbnVsbCB8fCB5ID09PSAnJztcclxuICAgICAgICByZXR1cm4geGUgPT09IHllID8gMCA6IHhlID8gMSA6IC0xO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT09ICdudW1iZXInKSB7IHJldHVybiAoeCAtIHkpICogZGlyOyB9XHJcbiAgICAgIHJldHVybiBTdHJpbmcoeCkubG9jYWxlQ29tcGFyZShTdHJpbmcoeSksIHVuZGVmaW5lZCwgeyBudW1lcmljOiB0cnVlLCBzZW5zaXRpdml0eTogJ2Jhc2UnIH0pICogZGlyO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogUm9sbC11cCByb3dzOiBjb3VudHMgYXMgbnVtYmVycywgdGhlICUgY29sdW1ucyBieSB0aGVpciBudW1iZXIsIHRoZSBuYW1lIGFzIHRleHQuICovXHJcbiAgcHJpdmF0ZSBzb3J0Um93cyhyb3dzOiBSZXBvcnRSb3dbXSk6IFJlcG9ydFJvd1tdIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuc29ydEtleSBhcyBrZXlvZiBSZXBvcnRSb3c7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0TGlzdChyb3dzLCAocikgPT4ge1xyXG4gICAgICBjb25zdCB2ID0gcltrZXldO1xyXG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdudW1iZXInKSB7IHJldHVybiB2OyB9XHJcbiAgICAgIGlmIChrZXkgPT09ICduYW1lJykgeyByZXR1cm4gU3RyaW5nKHYgfHwgJycpOyB9XHJcbiAgICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KFN0cmluZyh2KSk7XHJcbiAgICAgIHJldHVybiBpc05hTihuKSA/IG51bGwgOiBuO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnRTdG9yZXMocm93czogU3RvcmVSb3dbXSk6IFN0b3JlUm93W10ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5zb3J0S2V5O1xyXG4gICAgY29uc3QgcmFuayA9IHsgcGFzczogMiwgZmFpbDogMSwgbmE6IG51bGwgfSBhcyBjb25zdDtcclxuICAgIHJldHVybiB0aGlzLnNvcnRMaXN0KHJvd3MsIChzKSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgY2FzZSAnbmFtZSc6IHJldHVybiBzLm5hbWU7XHJcbiAgICAgICAgY2FzZSAnY2x1c3Rlcic6IHJldHVybiBzLmNsdXN0ZXI7XHJcbiAgICAgICAgY2FzZSAnYW9tJzogcmV0dXJuIHMuYW9tO1xyXG4gICAgICAgIGNhc2UgJ3pvbmUnOiByZXR1cm4gcy56b25lO1xyXG4gICAgICAgIGNhc2UgJ2F1ZGl0ZWQnOiByZXR1cm4gcy5hdWRpdGVkID8gMSA6IDA7XHJcbiAgICAgICAgY2FzZSAnc2NvcmUnOiByZXR1cm4gcy5zY29yZTtcclxuICAgICAgICBjYXNlICdzdGF0dXMnOiByZXR1cm4gcmFua1tzLnN0YXR1c107XHJcbiAgICAgICAgY2FzZSAnbGFzdEF1ZGl0JzogcmV0dXJuIHMubGFzdEF1ZGl0SXNvO1xyXG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIFNjb3BlIGhlYWRlciArIEtQSXMgKGJvdGggdmlld3MpXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIGdldCBkYXRlTGluZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZSh0aGlzLmZyb20pICsgJyB0byAnICsgdGhpcy5mb3JtYXREYXRlKHRoaXMudG8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGlzbzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBpc28gPyBkYXlqcyhpc28pLmZvcm1hdCgnREQgTU1NIFlZWVknKSA6IGlzbztcclxuICB9XHJcblxyXG4gIGdldCBoaWVyYXJjaHlUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlS2V5ID8gdGhpcy5hbGxTdG9yZXMuZmluZChzID0+IHMua2V5ID09PSB0aGlzLnN0b3JlS2V5KSA6IG51bGw7XHJcbiAgICByZXR1cm4gc3RvcmU/Lm5hbWUgfHwgdGhpcy5hb20gfHwgdGhpcy56b25lTWFuYWdlciB8fCB0aGlzLmNpcmNsZUhlYWQgfHwgJ0FsbCBjaXJjbGVzJztcclxuICB9XHJcblxyXG4gIGdldCBzY29wZVRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1N0b3JlTW9kZSA/IHRoaXMuc3RvcmVMYWJlbCA6IHRoaXMuaGllcmFyY2h5VGl0bGU7XHJcbiAgfVxyXG5cclxuICBnZXQgc2NvcGVNZXRhKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy50b3RhbHMudG90YWw7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRlTGluZSArICcgwrcgJyArIG4gKyAobiA9PT0gMSA/ICcgc3RvcmUnIDogJyBzdG9yZXMnKSArICcgaW4gc2NvcGUnO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRvdGFscyBvZiB3aGF0IGlzIG9uIHNjcmVlbjogdGhlIFN0b3JlIHZpZXcncyBzY29wZSwgb3IgdGhlIFVzZXIgdmlldydzIGN1cnJlbnQgbGV2ZWwuICovXHJcbiAgZ2V0IHRvdGFscygpOiB7IHRvdGFsOiBudW1iZXI7IGF1ZGl0ZWQ6IG51bWJlcjsgZmFpbGVkOiBudW1iZXI7IHNjb3JlU3VtOiBudW1iZXIgfSB7XHJcbiAgICBpZiAodGhpcy5pc1N0b3JlTW9kZSkge1xyXG4gICAgICBjb25zdCBsaXN0ID0gdGhpcy5zdG9yZVNjb3BlO1xyXG4gICAgICBjb25zdCBhdWRpdGVkID0gbGlzdC5maWx0ZXIocyA9PiBzLmF1ZGl0ZWQpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRvdGFsOiBsaXN0Lmxlbmd0aCxcclxuICAgICAgICBhdWRpdGVkOiBhdWRpdGVkLmxlbmd0aCxcclxuICAgICAgICBmYWlsZWQ6IGF1ZGl0ZWQuZmlsdGVyKHMgPT4gcy5zdGF0dXMgPT09ICdmYWlsJykubGVuZ3RoLFxyXG4gICAgICAgIHNjb3JlU3VtOiBhdWRpdGVkLnJlZHVjZSgoYSwgcykgPT4gYSArIChzLnNjb3JlIHx8IDApLCAwKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93cztcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRvdGFsOiByb3dzLnJlZHVjZSgoYSwgcikgPT4gYSArIHIudG90YWwsIDApLFxyXG4gICAgICBhdWRpdGVkOiByb3dzLnJlZHVjZSgoYSwgcikgPT4gYSArIHIuYXVkaXRlZCwgMCksXHJcbiAgICAgIGZhaWxlZDogcm93cy5yZWR1Y2UoKGEsIHIpID0+IGEgKyByLmZhaWxlZCwgMCksXHJcbiAgICAgIHNjb3JlU3VtOiByb3dzLnJlZHVjZSgoYSwgcikgPT4gYSArIHIuc2NvcmVTdW0sIDApXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvdmVyYWdlTnVtKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgdCA9IHRoaXMudG90YWxzO1xyXG4gICAgcmV0dXJuIHQudG90YWwgPyBNYXRoLnJvdW5kKHQuYXVkaXRlZCAvIHQudG90YWwgKiAxMDApIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGdldCBhdmVyYWdlTnVtKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgdCA9IHRoaXMudG90YWxzO1xyXG4gICAgcmV0dXJuIHQuYXVkaXRlZCA/IE1hdGgucm91bmQodC5zY29yZVN1bSAvIHQuYXVkaXRlZCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZhaWxlZFBjdE51bSgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGNvbnN0IHQgPSB0aGlzLnRvdGFscztcclxuICAgIHJldHVybiB0LmF1ZGl0ZWQgPyBNYXRoLnJvdW5kKHQuZmFpbGVkIC8gdC5hdWRpdGVkICogMTAwKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBjdCh2OiBudW1iZXIgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2ID09PSBudWxsID8gJ+KAlCcgOiB2ICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGtwaXMoKTogUmVwb3J0S3BpW10ge1xyXG4gICAgY29uc3QgdCA9IHRoaXMudG90YWxzO1xyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlTnVtO1xyXG4gICAgY29uc3QgZmFpbGVkID0gdGhpcy5mYWlsZWRQY3ROdW07XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7IGxhYmVsOiAnVG90YWwgc3RvcmVzJywgdmFsdWU6IFN0cmluZyh0LnRvdGFsKSwgbm90ZTogJ0luIHRoaXMgc2NvcGUnLCB0b25lOiAnJyB9LFxyXG4gICAgICB7IGxhYmVsOiAnQXVkaXRlZCBzdG9yZXMnLCB2YWx1ZTogU3RyaW5nKHQuYXVkaXRlZCksIG5vdGU6ICh0LnRvdGFsIC0gdC5hdWRpdGVkKSArICcgbm90IGF1ZGl0ZWQnLCB0b25lOiAnJyB9LFxyXG4gICAgICB7IGxhYmVsOiAnQXVkaXQgY292ZXJhZ2UnLCB2YWx1ZTogdGhpcy5wY3QodGhpcy5jb3ZlcmFnZU51bSksIG5vdGU6ICdTdG9yZXMgd2l0aCBhIHN1Ym1pdHRlZCBhdWRpdCcsIHRvbmU6ICcnIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ0F2ZXJhZ2UgYXVkaXQgc2NvcmUnLCB2YWx1ZTogdGhpcy5wY3QoYXZnKSwgbm90ZTogJ0Fjcm9zcyBhdWRpdGVkIHN0b3JlcycsXHJcbiAgICAgICAgdG9uZTogYXZnID09PSBudWxsID8gJycgOiBhdmcgPCB0aGlzLnBhc3NNYXJrID8gJ2JhZCcgOiAnZ29vZCdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnRmFpbGVkIHN0b3JlICUnLCB2YWx1ZTogdGhpcy5wY3QoZmFpbGVkKSwgbm90ZTogdC5mYWlsZWQgKyAnIGJlbG93IHRoZSAnICsgdGhpcy5wYXNzTWFyayArICclIHBhc3MgbWFyaycsXHJcbiAgICAgICAgdG9uZTogZmFpbGVkICE9PSBudWxsICYmIGZhaWxlZCA+IDUwID8gJ2JhZCcgOiAnJ1xyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRvdGFsIHJvdyB0ZXh0cy4gKi9cclxuICBnZXQgdG90YWxBdWRpdGVkT2YoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHQgPSB0aGlzLnRvdGFscztcclxuICAgIHJldHVybiB0LmF1ZGl0ZWQgKyAnIG9mICcgKyB0LnRvdGFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsQXZlcmFnZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGN0KHRoaXMuYXZlcmFnZU51bSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxDb3ZlcmFnZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGN0KHRoaXMuY292ZXJhZ2VOdW0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRvdGFsRmFpbGVkUGN0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5wY3QodGhpcy5mYWlsZWRQY3ROdW0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgcm9sbC11cCByb3cgd2hlcmUgbW9yZSB0aGFuIGhhbGYgb2YgdGhlIGF1ZGl0ZWQgc3RvcmVzIGZhaWxlZCByZWFkcyByZWQgKHByb3RvdHlwZSkuICovXHJcbiAgaXNIaWdoRmFpbChyb3c6IFJlcG9ydFJvdyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbiA9IHBhcnNlSW50KHJvdy5mYWlsZWRQY3QsIDEwKTtcclxuICAgIHJldHVybiAhaXNOYU4obikgJiYgbiA+IDUwO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gUGFnaW5nXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHByaXZhdGUgcGFnZU9mPFQ+KGxpc3Q6IFRbXSk6IFRbXSB7XHJcbiAgICBjb25zdCBwYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsaXN0Lmxlbmd0aCAvIHRoaXMucGFnZVNpemUpKTtcclxuICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1pbih0aGlzLnBhZ2UsIHBhZ2VzKTtcclxuICAgIHJldHVybiBsaXN0LnNsaWNlKChwYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplLCBwYWdlICogdGhpcy5wYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBvZiB0aGUgdGFibGUgb24gc2NyZWVuIChmb3IgdGhlIHBhZ2VyIGFuZCB0aGUgZW1wdHkgc3RhdGUpLiAqL1xyXG4gIGdldCB0YWJsZUNvdW50KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5pc1N0b3JlTW9kZSkgeyByZXR1cm4gdGhpcy5zdG9yZVJvd3MubGVuZ3RoOyB9XHJcbiAgICByZXR1cm4gdGhpcy5sZXZlbCA9PT0gJ3N0b3JlJyA/IHRoaXMudXNlclN0b3Jlcy5sZW5ndGggOiB0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSBOdW1iZXIocGFnZSkgfHwgMTtcclxuICB9XHJcblxyXG4gIG9uUGFnZVNpemVDaGFuZ2Uoc2l6ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gTnVtYmVyKHNpemUpIHx8IDEwO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEZpbHRlcnMgKGRyYXdlciArIGNoaXBzKVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogRGF0ZSBhbmQgVmlldyBieSBhbHdheXMgY291bnQ7IHRoZSBzY29wZSBwaWNrIGFuZCB0aGUgUmVzdWx0IGZpbHRlciB3aGVuIHNldCAocHJvdG90eXBlKS4gKi9cclxuICBnZXQgZmlsdGVyQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAyICsgKHRoaXMuc2NvcGVEaXJ0eSA/IDEgOiAwKSArICh0aGlzLmlzU3RvcmVNb2RlICYmIHRoaXMucmVzdWx0ICE9PSAnYWxsJyA/IDEgOiAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IHNjb3BlRGlydHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1N0b3JlTW9kZSA/ICEhdGhpcy5zdG9yZVNlbCA6ICEhKHRoaXMuY2lyY2xlS2V5IHx8IHRoaXMuc3RvcmVLZXkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlc3VsdExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQgPT09ICdwYXNzJyA/ICdQYXNzJyA6IHRoaXMucmVzdWx0ID09PSAnZmFpbCcgPyAnRmFpbCcgOiAnQWxsIHJlc3VsdHMnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoaXBzKCk6IEFycmF5PHsga2V5OiBGaWx0ZXJDYXQ7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgY2hpcHM6IEFycmF5PHsga2V5OiBGaWx0ZXJDYXQ7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXHJcbiAgICAgIHsga2V5OiAnZGF0ZScsIGxhYmVsOiAnRGF0ZScsIHZhbHVlOiB0aGlzLmRhdGVMaW5lIH0sXHJcbiAgICAgIHsga2V5OiAnbW9kZScsIGxhYmVsOiAnVmlldyBieScsIHZhbHVlOiB0aGlzLmlzU3RvcmVNb2RlID8gJ1N0b3JlJyA6ICdVc2VyJyB9LFxyXG4gICAgICB7IGtleTogJ3Njb3BlJywgbGFiZWw6IHRoaXMuaXNTdG9yZU1vZGUgPyAnU3RvcmVzJyA6ICdIaWVyYXJjaHknLCB2YWx1ZTogdGhpcy5pc1N0b3JlTW9kZSA/IHRoaXMuc3RvcmVMYWJlbCA6IHRoaXMuaGllcmFyY2h5VGl0bGUgfVxyXG4gICAgXTtcclxuICAgIGlmICh0aGlzLmlzU3RvcmVNb2RlKSB7IGNoaXBzLnB1c2goeyBrZXk6ICdyZXN1bHQnLCBsYWJlbDogJ1Jlc3VsdCcsIHZhbHVlOiB0aGlzLnJlc3VsdExhYmVsIH0pOyB9XHJcbiAgICByZXR1cm4gY2hpcHM7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyQ2F0cygpOiBBcnJheTx7IGtleTogRmlsdGVyQ2F0OyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBkaXJ0eTogYm9vbGVhbiB9PiB7XHJcbiAgICBjb25zdCBjYXRzOiBBcnJheTx7IGtleTogRmlsdGVyQ2F0OyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBkaXJ0eTogYm9vbGVhbiB9PiA9IFtcclxuICAgICAgeyBrZXk6ICdkYXRlJywgbGFiZWw6ICdEYXRlJywgdmFsdWU6IHRoaXMuZGF0ZUxpbmUsIGRpcnR5OiB0aGlzLnByZXNldCAhPT0gJ1RoaXMgbW9udGgnIH0sXHJcbiAgICAgIHsga2V5OiAnbW9kZScsIGxhYmVsOiAnVmlldyBieScsIHZhbHVlOiB0aGlzLmlzU3RvcmVNb2RlID8gJ1N0b3JlJyA6ICdVc2VyJywgZGlydHk6ICF0aGlzLmlzU3RvcmVNb2RlIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBrZXk6ICdzY29wZScsIGxhYmVsOiB0aGlzLmlzU3RvcmVNb2RlID8gJ1N0b3JlcycgOiAnU3RvcmUgaGllcmFyY2h5JyxcclxuICAgICAgICB2YWx1ZTogdGhpcy5pc1N0b3JlTW9kZSA/IHRoaXMuc3RvcmVMYWJlbCA6IHRoaXMuaGllcmFyY2h5VGl0bGUsIGRpcnR5OiB0aGlzLnNjb3BlRGlydHlcclxuICAgICAgfVxyXG4gICAgXTtcclxuICAgIGlmICh0aGlzLmlzU3RvcmVNb2RlKSB7IGNhdHMucHVzaCh7IGtleTogJ3Jlc3VsdCcsIGxhYmVsOiAnUmVzdWx0JywgdmFsdWU6IHRoaXMucmVzdWx0TGFiZWwsIGRpcnR5OiB0aGlzLnJlc3VsdCAhPT0gJ2FsbCcgfSk7IH1cclxuICAgIHJldHVybiBjYXRzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhbmVUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlQ2F0ID09PSAnZGF0ZScpIHsgcmV0dXJuICdEYXRlJzsgfVxyXG4gICAgaWYgKHRoaXMuYWN0aXZlQ2F0ID09PSAnbW9kZScpIHsgcmV0dXJuICdWaWV3IGJ5JzsgfVxyXG4gICAgaWYgKHRoaXMuYWN0aXZlQ2F0ID09PSAncmVzdWx0JykgeyByZXR1cm4gJ1Jlc3VsdCc7IH1cclxuICAgIHJldHVybiB0aGlzLmlzU3RvcmVNb2RlID8gJ1N0b3JlcycgOiAnU3RvcmUgaGllcmFyY2h5JztcclxuICB9XHJcblxyXG4gIGdldCBwYW5lU3ViKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVDYXQgPT09ICdkYXRlJykgeyByZXR1cm4gJ1BpY2sgdGhlIHdpbmRvdyB0aGUgd2hvbGUgcmVwb3J0IHJlYWRzLic7IH1cclxuICAgIGlmICh0aGlzLmFjdGl2ZUNhdCA9PT0gJ21vZGUnKSB7IHJldHVybiAnUmVhZCB0aGUgcmVwb3J0IHN0b3JlIGJ5IHN0b3JlLCBvciByb2xsZWQgdXAgYnkgdXNlci4nOyB9XHJcbiAgICBpZiAodGhpcy5hY3RpdmVDYXQgPT09ICdyZXN1bHQnKSB7IHJldHVybiAnU2hvdyBldmVyeSBzdG9yZSwgb3Igb25seSB0aGUgb25lcyB0aGF0IHBhc3NlZCBvciBmYWlsZWQuJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuaXNTdG9yZU1vZGUgPyAnU2VhcmNoIGFuZCBzZWxlY3QgdGhlIHN0b3JlcyB0aGUgcmVwb3J0IHJlYWRzLicgOiAnUGljayB0aGUgY2lyY2xlLCB6b25lLCBBT00gb3Igc3RvcmUgdGhlIHdob2xlIHJlcG9ydCByZWFkcy4nO1xyXG4gIH1cclxuXHJcbiAgb3BlbkZpbHRlcnMoY2F0PzogRmlsdGVyQ2F0KTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUNhdCA9IGNhdCB8fCB0aGlzLmFjdGl2ZUNhdDtcclxuICAgIGlmICh0aGlzLmFjdGl2ZUNhdCA9PT0gJ3Jlc3VsdCcgJiYgIXRoaXMuaXNTdG9yZU1vZGUpIHsgdGhpcy5hY3RpdmVDYXQgPSAnc2NvcGUnOyB9XHJcbiAgICBjb25zdCBkcmFmdCA9IE9iamVjdC5jcmVhdGUodGhpcykgYXMgQXVkaXRWMlJlcG9ydHNDb21wb25lbnQ7XHJcbiAgICBkcmFmdC5pc0RyYWZ0ID0gdHJ1ZTtcclxuICAgIGRyYWZ0LnN0b3JlUXVlcnkgPSAnJztcclxuICAgIHRoaXMuZHJhZnQgPSBkcmFmdDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsb3NlICh4LCBiYWNrZHJvcCk6IHRoZSBkcmFmdCBpcyBkcm9wcGVkLCB0aGUgcGFnZSBpcyBhcyBpdCB3YXMuICovXHJcbiAgY2xvc2VGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5kcmFmdCA9IG51bGw7XHJcbiAgICB0aGlzLnN0b3JlUXVlcnkgPSAnJztcclxuICB9XHJcblxyXG4gIC8qKiBBcHBseTogdGhlIGRyYWZ0J3MgZmlsdGVycyBiZWNvbWUgdGhlIHBhZ2UnczsgYSBuZXcgZGF0ZSByYW5nZSByZWZldGNoZXMuICovXHJcbiAgYXBwbHlGaWx0ZXJzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZCA9IHRoaXMuZHJhZnQ7XHJcbiAgICBpZiAoZCAmJiBkLm1vZGUgPT09ICdzdG9yZScgJiYgZC5zdG9yZVNlbCAmJiAhZC5zdG9yZVNlbC5zaXplKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlQ2F0ID0gJ3Njb3BlJztcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdTZWxlY3QgYXQgbGVhc3Qgb25lIHN0b3JlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChkKSB7XHJcbiAgICAgIGNvbnN0IGRhdGVzQ2hhbmdlZCA9IGQuZnJvbSAhPT0gdGhpcy5mcm9tIHx8IGQudG8gIT09IHRoaXMudG87XHJcbiAgICAgIHRoaXMuZnJvbSA9IGQuZnJvbTtcclxuICAgICAgdGhpcy50byA9IGQudG87XHJcbiAgICAgIHRoaXMucHJlc2V0ID0gZC5wcmVzZXQ7XHJcbiAgICAgIHRoaXMucmFuZ2UgPSBkLnJhbmdlO1xyXG4gICAgICB0aGlzLm1vZGUgPSBkLm1vZGU7XHJcbiAgICAgIHRoaXMucmVzdWx0ID0gZC5yZXN1bHQ7XHJcbiAgICAgIHRoaXMuc3RvcmVTZWwgPSBkLnN0b3JlU2VsO1xyXG4gICAgICB0aGlzLmxldmVsID0gZC5sZXZlbDtcclxuICAgICAgdGhpcy5jaXJjbGVLZXkgPSBkLmNpcmNsZUtleTtcclxuICAgICAgdGhpcy56b25lS2V5ID0gZC56b25lS2V5O1xyXG4gICAgICB0aGlzLmFvbUtleSA9IGQuYW9tS2V5O1xyXG4gICAgICB0aGlzLnN0b3JlS2V5ID0gZC5zdG9yZUtleTtcclxuICAgICAgdGhpcy5jaXJjbGVIZWFkID0gZC5jaXJjbGVIZWFkO1xyXG4gICAgICB0aGlzLnpvbmVNYW5hZ2VyID0gZC56b25lTWFuYWdlcjtcclxuICAgICAgdGhpcy5hb20gPSBkLmFvbTtcclxuICAgICAgdGhpcy5zZWFyY2ggPSBkLnNlYXJjaDtcclxuICAgICAgdGhpcy5zb3J0S2V5ID0gZC5zb3J0S2V5O1xyXG4gICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgICBpZiAoZGF0ZXNDaGFuZ2VkKSB7IHRoaXMubG9hZCgpOyB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsb3NlRmlsdGVycygpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0KGNhdDogRmlsdGVyQ2F0KTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUNhdCA9IGNhdDtcclxuICB9XHJcblxyXG4gIHNldE1vZGUobW9kZTogVmlld01vZGUpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1vZGUgPT09IG1vZGUpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLm1vZGUgPSBtb2RlO1xyXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcclxuICAgIHRoaXMuc29ydEtleSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIGlmIChtb2RlID09PSAndXNlcicpIHsgdGhpcy5nb1RvTGV2ZWwoJ2NpcmNsZScpOyB9XHJcbiAgfVxyXG5cclxuICBzZXRSZXN1bHQocmVzdWx0OiBSZXN1bHRGaWx0ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNldCBhbGw6IHRoZSBwcm90b3R5cGUncyBkZWZhdWx0cyAodGhpcyBtb250aCwgU3RvcmUgdmlldywgZXZlcnkgc3RvcmUsIGFsbCByZXN1bHRzKS4gKi9cclxuICByZXNldEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICAvLyBGcm9tIHRoZSBkcmF3ZXI6IHJlc2V0IHRoZSBwYWdlIGl0c2VsZiAodGhlIGRyYXdlcidzIGRyYWZ0IGlzIGRyb3BwZWQpLlxyXG4gICAgaWYgKHRoaXMuaXNEcmFmdCkgeyBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykucmVzZXRGaWx0ZXJzKCk7IHJldHVybjsgfVxyXG4gICAgdGhpcy5tb2RlID0gJ3N0b3JlJztcclxuICAgIHRoaXMucmVzdWx0ID0gJ2FsbCc7XHJcbiAgICB0aGlzLnN0b3JlU2VsID0gbnVsbDtcclxuICAgIHRoaXMuc3RvcmVRdWVyeSA9ICcnO1xyXG4gICAgdGhpcy5zb3J0S2V5ID0gJyc7XHJcbiAgICB0aGlzLmdvVG9MZXZlbCgnY2lyY2xlJyk7XHJcbiAgICBpZiAodGhpcy5wcmVzZXQgIT09ICdUaGlzIG1vbnRoJykgeyB0aGlzLnNldFByZXNldCgnVGhpcyBtb250aCcpOyB9XHJcbiAgICB0aGlzLmNsb3NlRmlsdGVycygpO1xyXG4gIH1cclxuXHJcbiAgLy8gU3RvcmVzIHBpY2sgKFN0b3JlIHZpZXcpLlxyXG5cclxuICBnZXQgc3RvcmVQaWNrSXRlbXMoKTogQXJyYXk8eyBzdG9yZTogU3RvcmVSb3c7IGNoZWNrZWQ6IGJvb2xlYW4gfT4ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuc3RvcmVRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLmFsbFN0b3Jlc1xyXG4gICAgICAuZmlsdGVyKHMgPT4gIXEgfHwgKHMubmFtZSArICcgJyArIHMua2V5KS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKVxyXG4gICAgICAubWFwKHMgPT4gKHsgc3RvcmU6IHMsIGNoZWNrZWQ6ICF0aGlzLnN0b3JlU2VsIHx8IHRoaXMuc3RvcmVTZWwuaGFzKHMua2V5KSB9KSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RvcmVQaWNrQWxsQ2hlY2tlZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5zdG9yZVBpY2tJdGVtcztcclxuICAgIHJldHVybiBpdGVtcy5sZW5ndGggPiAwICYmIGl0ZW1zLmV2ZXJ5KGkgPT4gaS5jaGVja2VkKTtcclxuICB9XHJcblxyXG4gIGdldCBzdG9yZVBpY2tSZWFkaW5nKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5zdG9yZVNjb3BlLmxlbmd0aDtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlTGFiZWwgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIHN0b3JlJyA6ICcgc3RvcmVzJykgKyAnIGluIHNjb3BlJztcclxuICB9XHJcblxyXG4gIC8qKiBudWxsID0gZXZlcnkgc3RvcmU7IGFuIGVtcHR5IHNldCA9IG5vbmUgdGlja2VkIChTZWxlY3QgQWxsIHVudGlja2VkKSwgd2hpY2ggQXBwbHkgZG9lcyBub3QgYWNjZXB0LiAqL1xyXG4gIHByaXZhdGUgYXBwbHlQaWNrKGlkczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IHVuaXEgPSBbLi4ubmV3IFNldChpZHMpXTtcclxuICAgIHRoaXMuc3RvcmVTZWwgPSB1bmlxLmxlbmd0aCA+PSB0aGlzLmFsbFN0b3Jlcy5sZW5ndGggPyBudWxsIDogbmV3IFNldCh1bmlxKTtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBwaWNrZWRJZHMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVTZWwgPyBbLi4udGhpcy5zdG9yZVNlbF0gOiB0aGlzLmFsbFN0b3Jlcy5tYXAocyA9PiBzLmtleSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTdG9yZVBpY2soczogU3RvcmVSb3cpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkcyA9IHRoaXMucGlja2VkSWRzO1xyXG4gICAgdGhpcy5hcHBseVBpY2soaWRzLmluY2x1ZGVzKHMua2V5KSA/IGlkcy5maWx0ZXIoaWQgPT4gaWQgIT09IHMua2V5KSA6IGlkcy5jb25jYXQocy5rZXkpKTtcclxuICB9XHJcblxyXG4gIC8qKiBTZWxlY3QgQWxsIHdvcmtzIG9uIHRoZSBzdG9yZXMgdGhlIHNlYXJjaCBzaG93cywgbGlrZSB0aGUgcHJvdG90eXBlLiAqL1xyXG4gIHRvZ2dsZVN0b3JlUGlja0FsbCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLnN0b3JlUGlja0l0ZW1zLm1hcChpID0+IGkuc3RvcmUua2V5KTtcclxuICAgIGNvbnN0IGlkcyA9IHRoaXMucGlja2VkSWRzO1xyXG4gICAgdGhpcy5hcHBseVBpY2sodGhpcy5zdG9yZVBpY2tBbGxDaGVja2VkID8gaWRzLmZpbHRlcihpZCA9PiAhdmlzaWJsZS5pbmNsdWRlcyhpZCkpIDogaWRzLmNvbmNhdCh2aXNpYmxlKSk7XHJcbiAgfVxyXG5cclxuICByZXNldFN0b3JlUGljaygpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmVTZWwgPSBudWxsO1xyXG4gICAgdGhpcy5zdG9yZVF1ZXJ5ID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLy8gU3RvcmUgaGllcmFyY2h5IHBpY2sgKFVzZXIgdmlldykuXHJcblxyXG4gIGdldCBjaXJjbGVPcHRpb25zKCk6IEF1ZGl0U2VsZWN0T3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIFt7IHZhbHVlOiAnJywgbGFiZWw6ICdBbGwgY2lyY2xlcycgfV0uY29uY2F0KCh0aGlzLmRhdGE/LmNpcmNsZXMgfHwgW10pLm1hcCgoYzogYW55KSA9PiAoeyB2YWx1ZTogYy5rZXksIGxhYmVsOiBjLm5hbWUgfSkpKTtcclxuICB9XHJcblxyXG4gIGdldCB6b25lT3B0aW9ucygpOiBBdWRpdFNlbGVjdE9wdGlvbltdIHtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiAnQWxsIHpvbmVzJyB9XS5jb25jYXQoKHRoaXMuZGF0YT8uem9uZXMgfHwgW10pXHJcbiAgICAgIC5maWx0ZXIoKHo6IGFueSkgPT4gei5jaXJjbGVLZXkgPT09IHRoaXMuY2lyY2xlS2V5KS5tYXAoKHo6IGFueSkgPT4gKHsgdmFsdWU6IHoua2V5LCBsYWJlbDogei5uYW1lIH0pKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYW9tT3B0aW9ucygpOiBBdWRpdFNlbGVjdE9wdGlvbltdIHtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiAnQWxsIEFPTXMnIH1dLmNvbmNhdCgodGhpcy5kYXRhPy5hb21zIHx8IFtdKVxyXG4gICAgICAuZmlsdGVyKChhOiBhbnkpID0+IGEuem9uZUtleSA9PT0gdGhpcy56b25lS2V5KS5tYXAoKGE6IGFueSkgPT4gKHsgdmFsdWU6IGEua2V5LCBsYWJlbDogYS5uYW1lIH0pKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RvcmVPcHRpb25zKCk6IEF1ZGl0U2VsZWN0T3B0aW9uW10ge1xyXG4gICAgcmV0dXJuIFt7IHZhbHVlOiAnJywgbGFiZWw6ICdBbGwgc3RvcmVzJyB9XS5jb25jYXQodGhpcy5hbGxTdG9yZXNcclxuICAgICAgLmZpbHRlcihzID0+IHMuYW9tS2V5ID09PSB0aGlzLmFvbUtleSkubWFwKHMgPT4gKHsgdmFsdWU6IHMua2V5LCBsYWJlbDogcy5uYW1lIH0pKSk7XHJcbiAgfVxyXG5cclxuICAvKiogWm9uZSAvIEFPTSBwaWNrcyBmb2xsb3cgdGhlIGNpcmNsZSBwaWNrIChcIk5vdCBpbiBoaWVyYXJjaHlcIiBoYXMgbm9uZSkuICovXHJcbiAgZ2V0IHNob3dab25lUGljaygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMuY2lyY2xlS2V5ICYmIHRoaXMuY2lyY2xlS2V5ICE9PSBVTkFTU0lHTkVEO1xyXG4gIH1cclxuXHJcbiAgcGlja0NpcmNsZShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgcm93ID0gKHRoaXMuZGF0YT8uY2lyY2xlcyB8fCBbXSkuZmluZCgoYzogYW55KSA9PiBjLmtleSA9PT0ga2V5KTtcclxuICAgIHRoaXMuZ29Ub0xldmVsKCdjaXJjbGUnKTtcclxuICAgIGlmIChyb3cpIHsgdGhpcy5vcGVuUm93KHRoaXMudG9Sb3cocm93KSk7IH1cclxuICB9XHJcblxyXG4gIHBpY2tab25lKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3cgPSAodGhpcy5kYXRhPy56b25lcyB8fCBbXSkuZmluZCgoejogYW55KSA9PiB6LmtleSA9PT0ga2V5KTtcclxuICAgIHRoaXMuZ29Ub0xldmVsKCd6b25lJyk7XHJcbiAgICBpZiAocm93KSB7IHRoaXMub3BlblJvdyh0aGlzLnRvUm93KHJvdykpOyB9XHJcbiAgfVxyXG5cclxuICBwaWNrQW9tKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3cgPSAodGhpcy5kYXRhPy5hb21zIHx8IFtdKS5maW5kKChhOiBhbnkpID0+IGEua2V5ID09PSBrZXkpO1xyXG4gICAgdGhpcy5nb1RvTGV2ZWwoJ2FvbScpO1xyXG4gICAgaWYgKHJvdykgeyB0aGlzLm9wZW5Sb3codGhpcy50b1Jvdyhyb3cpKTsgfVxyXG4gIH1cclxuXHJcbiAgcGlja1N0b3JlKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlS2V5ID0ga2V5IHx8ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIGdldCBoaWVyYXJjaHlSZWFkaW5nKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy50b3RhbHMudG90YWw7XHJcbiAgICByZXR1cm4gdGhpcy5oaWVyYXJjaHlUaXRsZSArICcgwrcgJyArIG4gKyAobiA9PT0gMSA/ICcgc3RvcmUnIDogJyBzdG9yZXMnKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIERhdGVzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBQcmVzZXRzIHNldCB0aGUgZGF0ZSByYW5nZSBhbmQgcmVmZXRjaC4gKi9cclxuICBzZXRQcmVzZXQocDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnByZXNldCA9IHA7XHJcbiAgICBjb25zdCB0b2RheSA9IGRheWpzKCk7XHJcbiAgICBpZiAocCA9PT0gJ1RoaXMgbW9udGgnKSB7XHJcbiAgICAgIHRoaXMuZnJvbSA9IHRvZGF5LnN0YXJ0T2YoJ21vbnRoJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgIHRoaXMudG8gPSB0b2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIH0gZWxzZSBpZiAocCA9PT0gJ0xhc3QgbW9udGgnKSB7XHJcbiAgICAgIGNvbnN0IGxtID0gdG9kYXkuc3VidHJhY3QoMSwgJ21vbnRoJyk7XHJcbiAgICAgIHRoaXMuZnJvbSA9IGxtLnN0YXJ0T2YoJ21vbnRoJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgIHRoaXMudG8gPSBsbS5lbmRPZignbW9udGgnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZnJvbSA9IHRvZGF5LnN1YnRyYWN0KDMwLCAnZGF5JykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgIHRoaXMudG8gPSB0b2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIH1cclxuICAgIHRoaXMucmFuZ2UgPSB0b1BpY2tlclJhbmdlKHRoaXMuZnJvbSwgdGhpcy50byk7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgLy8gSW4gdGhlIGRyYXdlciB0aGUgcmFuZ2Ugd2FpdHMgZm9yIEFwcGx5LlxyXG4gICAgaWYgKCF0aGlzLmlzRHJhZnQpIHsgdGhpcy5sb2FkKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKiBBIHJhbmdlIHBpY2tlZCBieSBoYW5kIHJlZmV0Y2hlcyB0b28gYW5kIGlzIG5vIGxvbmdlciBvbmUgb2YgdGhlIHByZXNldHMuICovXHJcbiAgb25SYW5nZVBpY2tlZChlOiBQaWNrZWREYXRlcyB8IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBpY2tlZCA9IGZyb21QaWNrZXJSYW5nZShlKTtcclxuICAgIGlmICghcGlja2VkIHx8IChwaWNrZWQuZnJvbSA9PT0gdGhpcy5mcm9tICYmIHBpY2tlZC50byA9PT0gdGhpcy50bykpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmZyb20gPSBwaWNrZWQuZnJvbTtcclxuICAgIHRoaXMudG8gPSBwaWNrZWQudG87XHJcbiAgICB0aGlzLnByZXNldCA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIGlmICghdGhpcy5pc0RyYWZ0KSB7IHRoaXMubG9hZCgpOyB9XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBFeHBvcnQgKFFBIDEyIE9jdCk6IGV2ZXJ5IGV4cG9ydCBvbiB0aGlzIHBhZ2UgaXMgdGhlIERhc2hib2FyZCBkZXRhaWwgKE1vbnRobHkgUGVyZm9ybWFuY2UpIFwiQXVkaXQgSW5mb1wiXHJcbiAgLy8gd29ya2Jvb2sgLSBvbmUgcm93IHBlciBhdWRpdCB2aXNpdCBvZiB0aGUgY2hvc2VuIHN0b3JlcyBpbiB0aGUgcmVwb3J0IHBlcmlvZCAtIHJlYWQgZnJvbVxyXG4gIC8vIFBPU1QgL3RyYXgvYXVkaXQvZGFzaGJvYXJkL2RldGFpbCB3aXRoIGJ5ICdzY29wZScgKG5vIHNpbmdsZSBhdWRpdCAvIHN0b3JlIC8gdXNlciksIDUwMDAgcm93cyBhIGNhbGwuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBUcnVlIHdoaWxlIGFuIGV4cG9ydCBpcyBiZWluZyBmZXRjaGVkOyBhIHNlY29uZCBjbGljayB3YWl0cyBmb3IgaXQuICovXHJcbiAgZXhwb3J0aW5nID0gZmFsc2U7XHJcblxyXG4gIC8qKiBUb3AgRXhwb3J0OiB0aGUgcmVwb3J0IGFzIGZpbHRlcmVkIChldmVyeSBwYWdlKTogaXRzIHN0b3JlcyBpbiB0aGUgU3RvcmUgdmlldywgdGhlIHN0b3JlcyB1bmRlciB0aGUgY3VycmVudCBsZXZlbCBpbiB0aGUgVXNlciB2aWV3LiAqL1xyXG4gIGV4cG9ydEFsbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmxvYWRpbmcpIHsgcmV0dXJuOyB9XHJcbiAgICBpZiAodGhpcy5pc1N0b3JlTW9kZSB8fCB0aGlzLmxldmVsID09PSAnc3RvcmUnKSB7XHJcbiAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLmlzU3RvcmVNb2RlID8gdGhpcy5zdG9yZVJvd3MgOiB0aGlzLnVzZXJTdG9yZXM7XHJcbiAgICAgIHRoaXMuZXhwb3J0VmlzaXRzKGxpc3QubWFwKHMgPT4gcy5rZXkpLCB0aGlzLmlzU3RvcmVNb2RlID8gJ1N0b3JlIHJlcG9ydCcgOiAnVXNlciByZXBvcnQgLSAnICsgdGhpcy5oaWVyYXJjaHlUaXRsZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHN0b3JlcyA9IHRoaXMuZmlsdGVyZWRSb3dzLnJlZHVjZSgoYWxsOiBTdG9yZVJvd1tdLCByb3cpID0+IGFsbC5jb25jYXQodGhpcy5zdG9yZXNVbmRlcihyb3cpKSwgW10pO1xyXG4gICAgdGhpcy5leHBvcnRWaXNpdHMoc3RvcmVzLm1hcChzID0+IHMua2V5KSwgJ1VzZXIgcmVwb3J0IC0gJyArIHRoaXMuaGllcmFyY2h5VGl0bGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJvdyBFeHBvcnQgaW4gYSBzdG9yZSB0YWJsZTogdGhhdCBzdG9yZSdzIHZpc2l0cy4gKi9cclxuICBleHBvcnRTdG9yZShzOiBTdG9yZVJvdyk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBvcnRWaXNpdHMoW3Mua2V5XSwgcy5uYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKiBSb3cgRXhwb3J0IGluIHRoZSByb2xsLXVwIHRhYmxlOiB0aGUgdmlzaXRzIG9mIGV2ZXJ5IHN0b3JlIHVuZGVyIHRoYXQgcm93LiAqL1xyXG4gIGV4cG9ydFJvdyhyb3c6IFJlcG9ydFJvdyk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBvcnRWaXNpdHModGhpcy5zdG9yZXNVbmRlcihyb3cpLm1hcChzID0+IHMua2V5KSwgcm93Lm5hbWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9yZXNVbmRlcihyb3c6IFJlcG9ydFJvdyk6IFN0b3JlUm93W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsU3RvcmVzLmZpbHRlcihzID0+IHtcclxuICAgICAgaWYgKHJvdy5rZXkgPT09IFVOQVNTSUdORUQpIHsgcmV0dXJuICFzLmNpcmNsZUtleTsgfVxyXG4gICAgICBpZiAocm93LmxldmVsID09PSAnY2lyY2xlJykgeyByZXR1cm4gcy5jaXJjbGVLZXkgPT09IHJvdy5rZXk7IH1cclxuICAgICAgaWYgKHJvdy5sZXZlbCA9PT0gJ3pvbmUnKSB7IHJldHVybiBzLnpvbmVLZXkgPT09IHJvdy5rZXk7IH1cclxuICAgICAgcmV0dXJuIHMuYW9tS2V5ID09PSByb3cua2V5O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV4cG9ydFZpc2l0cyhzdG9yZUlkczogc3RyaW5nW10sIHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkcyA9IFsuLi5uZXcgU2V0KHN0b3JlSWRzLmZpbHRlcihCb29sZWFuKSldO1xyXG4gICAgaWYgKCFpZHMubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gc3RvcmVzIHRvIGV4cG9ydCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5leHBvcnRpbmcpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmV4cG9ydGluZyA9IHRydWU7XHJcbiAgICBjb25zdCB2aXNpdHM6IGFueVtdID0gW107XHJcbiAgICBjb25zdCBkb25lID0gKGVycm9yPzogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMuZXhwb3J0aW5nID0gZmFsc2U7XHJcbiAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnJvcik7XHJcbiAgICAgIH0gZWxzZSBpZiAoIXZpc2l0cy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vIGF1ZGl0IHZpc2l0cyB0byBleHBvcnQgZm9yICcgKyB0aXRsZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRXb3JrYm9vayhbeyBuYW1lOiAnQXVkaXQgSW5mbycsIHJvd3M6IHZpc2l0cy5tYXAociA9PiB0aGlzLnZpc2l0TGluZShyKSkgfV0sXHJcbiAgICAgICAgICBgJHt0aXRsZX0gLSBhdWRpdCBpbmZvIC0gJHt0aGlzLmZyb219IHRvICR7dGhpcy50b31gKTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnUmVwb3J0IGV4cG9ydGVkIGZvciAnICsgdGl0bGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfTtcclxuICAgIGNvbnN0IGZldGNoUGFnZSA9IChvZmZzZXQ6IG51bWJlcikgPT4ge1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkRGV0YWlsKHtcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbSxcclxuICAgICAgICB0b0RhdGU6IHRoaXMudG8sXHJcbiAgICAgICAgc3RvcmVJZDogaWRzLFxyXG4gICAgICAgIGJ5OiAnc2NvcGUnLFxyXG4gICAgICAgIHN0YXR1czogJ2FsbCcsXHJcbiAgICAgICAgc2VhcmNoVmFsdWU6ICcnLFxyXG4gICAgICAgIGxpbWl0OiBFWFBPUlRfUEFHRSxcclxuICAgICAgICBvZmZzZXRcclxuICAgICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzPy5jb2RlICE9PSAyMDApIHsgZG9uZSgnVW5hYmxlIHRvIGV4cG9ydCcpOyByZXR1cm47IH1cclxuICAgICAgICAgIGNvbnN0IHBhZ2UgPSByZXMuZGF0YT8ucm93cyB8fCBbXTtcclxuICAgICAgICAgIHZpc2l0cy5wdXNoKC4uLnBhZ2UpO1xyXG4gICAgICAgICAgaWYgKHBhZ2UubGVuZ3RoID09PSBFWFBPUlRfUEFHRSAmJiB2aXNpdHMubGVuZ3RoIDwgKHJlcy5kYXRhPy50b3RhbENvdW50IHx8IDApKSB7XHJcbiAgICAgICAgICAgIGZldGNoUGFnZShvZmZzZXQgKyAxKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZG9uZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IGRvbmUoJ1VuYWJsZSB0byBleHBvcnQnKVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICBmZXRjaFBhZ2UoMSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIERhc2hib2FyZCBkZXRhaWwgZXhwb3J0J3MgY29sdW1ucyAoYXVkaXQtdjItZGV0YWlsIGV4cG9ydFJvd3MpLCBvbmUgdmlzaXQgcGVyIHJvdy4gKi9cclxuICBwcml2YXRlIHZpc2l0TGluZShyOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIGNvbnN0IHN0YXR1cyA9IHIuc3RhdHVzID09PSAnc3VibWl0JyA/ICdTdWJtaXR0ZWQnIDogKHIuc3RhdHVzID09PSAnaW5wcm9ncmVzcycgPyAnSW4gUHJvZ3Jlc3MnIDogJ09wZW4nKTtcclxuICAgIGNvbnN0IHRpbWUgPSAodjogc3RyaW5nIHwgbnVsbCkgPT4gKHYgPyBkYXlqcyh2KS5mb3JtYXQoJ2hoOm1tIEEsIEREIE1NTSBZWVlZJykgOiAnLS0nKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICdEYXRlJzogci5kYXRlID8gZGF5anMoci5kYXRlKS5mb3JtYXQoJ0REIE1NTSBZWVlZJykgOiAnLS0nLFxyXG4gICAgICAnQXVkaXQgTmFtZSc6IHIuY2hlY2tMaXN0TmFtZSxcclxuICAgICAgJ1N0b3JlIElEJzogci5zdG9yZUlkLFxyXG4gICAgICAnU3RvcmUgTmFtZSc6IHIuc3RvcmVOYW1lLFxyXG4gICAgICAnVXNlciBOYW1lJzogci51c2VyTmFtZSxcclxuICAgICAgJ1N1Ym1pdHRlZCBCeSc6IHIudXNlckVtYWlsLFxyXG4gICAgICAnU3RhdHVzJzogc3RhdHVzICsgKHIucmVkbyA/ICcgKFJlZG8pJyA6ICcnKSxcclxuICAgICAgJ1N1Ym1pdHRlZCBPbic6IHRpbWUoci5zdWJtaXR0ZWRPbiksXHJcbiAgICAgICdTdWJtaXNzaW9uIENvdW50Jzogci5zdWJtaXNzaW9uQ291bnQsXHJcbiAgICAgICdGbGFncyc6IHIuZmxhZ3MsXHJcbiAgICAgICdBcHByb3ZlZCBCeSc6IHIuYXBwcm92ZWRCeSB8fCAnLS0nLFxyXG4gICAgICAnQXBwcm92ZWQgT24nOiB0aW1lKHIuYXBwcm92ZWRPbilcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Um93KF86IG51bWJlciwgcm93OiBSZXBvcnRSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5rZXkgfHwgcm93Lm5hbWU7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5S2V5KF86IG51bWJlciwgczogU3RvcmVSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHMua2V5O1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBpY2soXzogbnVtYmVyLCBpdGVtOiB7IHN0b3JlOiBTdG9yZVJvdyB9KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBpdGVtLnN0b3JlLmtleTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlDaGlwKF86IG51bWJlciwgYzogeyBrZXk6IHN0cmluZyB9KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBjLmtleTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImF2Mi1wYWdlIGF1ZGl0LXJlcG9ydHNcIj5cblxuICA8IS0tIEJyZWFkY3J1bWIgKyB0aXRsZSAtLT5cbiAgPGRpdiBjbGFzcz1cInJwLWhlYWRcIj5cbiAgICA8ZGl2IGNsYXNzPVwicnAtY3J1bWJcIj5BdWRpdHMg4oC6IDxzcGFuIGNsYXNzPVwicnAtY3J1bWItY3VycmVudFwiPlJlcG9ydHM8L3NwYW4+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInJwLXRpdGxlXCI+U3RvcmUgYXVkaXQgcmVwb3J0PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRmlsdGVyIGNoaXBzLCBGaWx0ZXIgYnV0dG9uIGF0IHRoZSByaWdodCBlbmQgKFFBIDkgT2N0KTsgRXhwb3J0IG1vdmVkIHRvIHRoZSB0YWJsZSBoZWFkIGJlc2lkZSBpdHMgc2VhcmNoLiAtLT5cbiAgPGRpdiBjbGFzcz1cInJwLWNvbnRyb2xzXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycC1jaGlwXCIgKm5nRm9yPVwibGV0IGMgb2YgY2hpcHM7IHRyYWNrQnk6IHRyYWNrQnlDaGlwXCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKGMua2V5KVwiXG4gICAgICBbdGl0bGVdPVwiYy5sYWJlbCArICc6ICcgKyBjLnZhbHVlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInJwLWNoaXAta2V5XCI+e3sgYy5sYWJlbCB9fTwvc3Bhbj48c3BhbiBjbGFzcz1cInJwLWNoaXAtdmFsdWVcIj57eyBjLnZhbHVlIH19PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBycC1maWx0ZXJidG5cIiAoY2xpY2spPVwib3BlbkZpbHRlcnMoKVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlnb24gcG9pbnRzPVwiMjIgMyAyIDMgMTAgMTIuNDYgMTAgMTkgMTQgMjEgMTQgMTIuNDYgMjIgM1wiPjwvcG9seWdvbj48L3N2Zz5cbiAgICAgIEZpbHRlclxuICAgICAgPHNwYW4gY2xhc3M9XCJycC1jb3VudHBpbGxcIj57eyBmaWx0ZXJDb3VudCB9fTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBVc2VyIHZpZXc6IHdoZXJlIGluIHRoZSBoaWVyYXJjaHkgLS0+XG4gIDxkaXYgY2xhc3M9XCJycC1kcmlsbGJhclwiICpuZ0lmPVwiIWlzU3RvcmVNb2RlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYyBvZiBjcnVtYnM7IGxldCBsYXN0ID0gbGFzdDsgbGV0IGZpcnN0ID0gZmlyc3RcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJycC1kcmlsbGNydW1iXCIgW2NsYXNzLmlzLWN1cnJlbnRdPVwibGFzdFwiIChjbGljayk9XCJnb1RvTGV2ZWwoYy5sZXZlbClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJycC1kcmlsbHNlcFwiICpuZ0lmPVwiIWZpcnN0XCI+4oC6PC9zcGFuPnt7IGMubGFiZWwgfX1cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJycC1oaW50XCI+e3sgaGludCB9fTwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFNjb3BlIC0tPlxuICA8ZGl2IGNsYXNzPVwicnAtc2NvcGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwicnAtc2NvcGUtdGl0bGVcIj57eyBzY29wZVRpdGxlIH19PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInJwLXNjb3BlLW1ldGFcIj57eyBzY29wZU1ldGEgfX08L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBLUElzIC0tPlxuICA8ZGl2IGNsYXNzPVwicnAta3Bpc1wiPlxuICAgIDwhLS0gT2xkIENoZWNrbGlzdCBzdW1tYXJ5IGNhcmQ6IGZpZ3VyZSArIGxhYmVsIGluIHRoZSBncmFkaWVudCBzdHJpcCwgbm90ZSBiZWxvdy4gLS0+XG4gICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZFwiICpuZ0Zvcj1cImxldCBrcGkgb2Yga3Bpc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1oZWFkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtY291bnQgcnAta3BpLXZhbHVlXCIgW2NsYXNzLmlzLWdvb2RdPVwia3BpLnRvbmUgPT09ICdnb29kJ1wiIFtjbGFzcy5pcy1iYWRdPVwia3BpLnRvbmUgPT09ICdiYWQnXCI+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBycC1zay12YWx1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBrcGkudmFsdWUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtdGV4dFwiPnt7IGtwaS5sYWJlbCB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWJvZHlcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS1ub3RlXCI+PC9zcGFuPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmdcIiBjbGFzcz1cImF2Mi1vY2FyZC1ub3RlXCI+e3sga3BpLm5vdGUgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFJlcG9ydCB0YWJsZSAtLT5cbiAgPHNlY3Rpb24gY2xhc3M9XCJycC1jYXJkXCI+XG4gICAgPGRpdiBjbGFzcz1cInJwLWNhcmQtaGVhZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJwLWNhcmQtdGV4dFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNTdG9yZU1vZGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtY2FyZC10aXRsZVwiPlN0b3JlIHJlcG9ydDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1jYXJkLW1ldGFcIj57eyBzdG9yZVJvd3MubGVuZ3RoIH19IHt7IHN0b3JlUm93cy5sZW5ndGggPT09IDEgPyAnc3RvcmUnIDogJ3N0b3JlcycgfX0gwrcgYXVkaXRzIHN1Ym1pdHRlZCBpbiB0aGUgcGVyaW9kPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzU3RvcmVNb2RlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWNhcmQtdGl0bGVcIj57eyB0YWJsZVRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWNhcmQtbWV0YVwiPnt7IHRhYmxlTWV0YSB9fTwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJhdjItc2VhcmNoIHJwLXNlYXJjaFwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT5cbiAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJpc1N0b3JlTW9kZSA/ICdTZWFyY2ggc3RvcmUnIDogJ1NlYXJjaCAnICsgbGV2ZWxMYWJlbC50b0xvd2VyQ2FzZSgpXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKClcIj5cbiAgICAgIDwvbGFiZWw+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiBbZGlzYWJsZWRdPVwibG9hZGluZyB8fCBleHBvcnRpbmdcIiAoY2xpY2spPVwiZXhwb3J0QWxsKClcIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTIgMTZWNFwiPjwvcGF0aD48cG9seWxpbmUgcG9pbnRzPVwiNyA5IDEyIDQgMTcgOVwiPjwvcG9seWxpbmU+PHBhdGggZD1cIk00IDE2djRoMTZ2LTRcIj48L3BhdGg+PC9zdmc+XG4gICAgICAgIEV4cG9ydFxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJsb2FkaW5nXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cblxuICAgIDwhLS0gU3RvcmUgdmlldzogb25lIHJvdyBwZXIgc3RvcmUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCIhbG9hZGluZyAmJiBpc1N0b3JlTW9kZSAmJiB0YWJsZUNvdW50XCI+XG4gICAgICA8dGFibGUgY2xhc3M9XCJycC10YWJsZSBycC10YWJsZS0tc3RvcmVzXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCduYW1lJylcIj5TdG9yZSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICduYW1lJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnY2x1c3RlcicpXCI+Q2x1c3RlciA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdjbHVzdGVyJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwiYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnYW9tJylcIj5BcmVhIG1hbmFnZXIgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnYW9tJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidC1yaWdodCBhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhdWRpdGVkJylcIj5BdWRpdGVkIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ2F1ZGl0ZWQnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0LXJpZ2h0IGF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ3Njb3JlJylcIj5TY29yZSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdzY29yZSdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnc3RhdHVzJylcIj5SZXN1bHQgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnc3RhdHVzJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidC1yaWdodCBhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdsYXN0QXVkaXQnKVwiPkxhc3QgYXVkaXQgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnbGFzdEF1ZGl0J1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidC1yaWdodFwiPkV4cG9ydDwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcyBvZiBzdG9yZVBhZ2VSb3dzOyB0cmFja0J5OiB0cmFja0J5S2V5XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJpcy1zdHJvbmcgcnAtY2VsbC1uYW1lXCIgW2F2MlRpcF09XCJzLm5hbWVcIj57eyBzLm5hbWUgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCIgW2F2MlRpcF09XCJzLmNsdXN0ZXJcIj57eyBzLmNsdXN0ZXIgfHwgJ+KAlCcgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCIgW2F2MlRpcF09XCJzLmFvbVwiPnt7IHMuYW9tIHx8ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIiBbY2xhc3MuaXMtbXV0ZWRdPVwiIXMuYXVkaXRlZFwiPnt7IHMuYXVkaXRlZCA/ICdZZXMnIDogJ05vJyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0IGlzLXN0cm9uZ1wiIFtjbGFzcy5pcy1wYXNzXT1cInMuc3RhdHVzID09PSAncGFzcydcIiBbY2xhc3MuaXMtZmFpbF09XCJzLnN0YXR1cyA9PT0gJ2ZhaWwnXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLW11dGVkXT1cInMuc2NvcmUgPT09IG51bGxcIj57eyBzY29yZVRleHQocykgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwLXJlc3VsdFwiIFtjbGFzcy5pcy1wYXNzXT1cInMuc3RhdHVzID09PSAncGFzcydcIiBbY2xhc3MuaXMtZmFpbF09XCJzLnN0YXR1cyA9PT0gJ2ZhaWwnXCI+e3sgcmVzdWx0VGV4dChzKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCIgW2NsYXNzLmlzLW11dGVkXT1cIiFzLmxhc3RBdWRpdFwiPnt7IHMubGFzdEF1ZGl0IHx8ICdObyBhdWRpdCcgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwLWV4cG9ydFwiIFtkaXNhYmxlZF09XCJleHBvcnRpbmdcIiAoY2xpY2spPVwiZXhwb3J0U3RvcmUocylcIj5FeHBvcnQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPHRmb290PlxuICAgICAgICAgIDx0ciBjbGFzcz1cInJwLXRvdGFsXCI+XG4gICAgICAgICAgICA8dGQ+VG90YWw8L3RkPlxuICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyB0b3RhbEF1ZGl0ZWRPZiB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgdG90YWxBdmVyYWdlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyB0b3RhbHMuZmFpbGVkIH19IGZhaWw8L3RkPlxuICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rmb290PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVXNlciB2aWV3OiBjaXJjbGUgaGVhZCAvIHpvbmUgbWFuYWdlciAvIGFyZWEgbWFuYWdlciByb2xsLXVwIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwiIWxvYWRpbmcgJiYgIWlzU3RvcmVNb2RlICYmIGxldmVsICE9PSAnc3RvcmUnICYmIHRhYmxlQ291bnRcIj5cbiAgICAgIDx0YWJsZSBjbGFzcz1cInJwLXRhYmxlXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCduYW1lJylcIj57eyBsZXZlbExhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ25hbWUnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0LXJpZ2h0IGF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ3RvdGFsJylcIj5Ub3RhbCBzdG9yZXMgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAndG90YWwnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0LXJpZ2h0IGF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ2F1ZGl0ZWQnKVwiPkF1ZGl0ZWQgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnYXVkaXRlZCdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnbm90QXVkaXRlZCcpXCI+Tm90IGF1ZGl0ZWQgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnbm90QXVkaXRlZCdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnY292ZXJhZ2UnKVwiPkNvdmVyYWdlIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ2NvdmVyYWdlJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidC1yaWdodCBhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhdmdTY29yZScpXCI+QXZnIGF1ZGl0IHNjb3JlIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ2F2Z1Njb3JlJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidC1yaWdodCBhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdmYWlsZWRQY3QnKVwiPkZhaWxlZCBzdG9yZSAlIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ2ZhaWxlZFBjdCdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHRcIj5SZXBvcnQ8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwYWdlUm93czsgdHJhY2tCeTogdHJhY2tCeVJvd1wiIGNsYXNzPVwicnAtcm93XCIgKGNsaWNrKT1cIm9wZW5Sb3cocm93KVwiPlxuICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtbmFtZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnAtbmFtZS1tYWluXCI+e3sgcm93Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycC1uYW1lLXN1YlwiICpuZ0lmPVwicm93LmVtYWlsXCI+e3sgcm93LmVtYWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgcm93LnRvdGFsIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyByb3cuYXVkaXRlZCB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCIgW2NsYXNzLmlzLW11dGVkXT1cIiFyb3cubm90QXVkaXRlZFwiPnt7IHJvdy5ub3RBdWRpdGVkIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyByb3cuY292ZXJhZ2UgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodCBpcy1zdHJvbmdcIj57eyByb3cuYXZnU2NvcmUgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodCBpcy1zdHJvbmdcIiBbY2xhc3MuaXMtZmFpbF09XCJpc0hpZ2hGYWlsKHJvdylcIj57eyByb3cuZmFpbGVkUGN0IH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJycC1leHBvcnRcIiBbZGlzYWJsZWRdPVwiZXhwb3J0aW5nXCIgKGNsaWNrKT1cImV4cG9ydFJvdyhyb3cpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5FeHBvcnQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPHRmb290PlxuICAgICAgICAgIDx0ciBjbGFzcz1cInJwLXRvdGFsXCI+XG4gICAgICAgICAgICA8dGQ+VG90YWw8L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPnt7IHRvdGFscy50b3RhbCB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgdG90YWxzLmF1ZGl0ZWQgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPnt7IHRvdGFscy50b3RhbCAtIHRvdGFscy5hdWRpdGVkIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyB0b3RhbENvdmVyYWdlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyB0b3RhbEF2ZXJhZ2UgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPnt7IHRvdGFsRmFpbGVkUGN0IH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGZvb3Q+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBVc2VyIHZpZXcsIGRlZXBlc3QgbGV2ZWw6IHRoZSBhcmVhIG1hbmFnZXIncyBzdG9yZXMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhaXNTdG9yZU1vZGUgJiYgbGV2ZWwgPT09ICdzdG9yZScgJiYgdGFibGVDb3VudFwiPlxuICAgICAgPHRhYmxlIGNsYXNzPVwicnAtdGFibGUgcnAtdGFibGUtLXVzZXJzdG9yZXNcIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cImF2Mi1zb3J0YWJsZVwiIChjbGljayk9XCJzb3J0QnkoJ25hbWUnKVwiPlN0b3JlIDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gJ25hbWUnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdhb20nKVwiPkFyZWEgbWFuYWdlciA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdhb20nXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCd6b25lJylcIj5ab25lIG1hbmFnZXIgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnem9uZSdcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cInQtcmlnaHQgYXYyLXNvcnRhYmxlXCIgKGNsaWNrKT1cInNvcnRCeSgnYXVkaXRlZCcpXCI+QXVkaXRlZCA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09ICdhdWRpdGVkJ1wiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxuICAgICAgICAgICAgPHRoIGNsYXNzPVwidC1yaWdodCBhdjItc29ydGFibGVcIiAoY2xpY2spPVwic29ydEJ5KCdzY29yZScpXCI+U2NvcmUgPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSAnc2NvcmUnXCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ0LXJpZ2h0XCI+RXhwb3J0PC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBzIG9mIHVzZXJTdG9yZVBhZ2VSb3dzOyB0cmFja0J5OiB0cmFja0J5S2V5XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJpcy1zdHJvbmcgcnAtY2VsbC1uYW1lXCIgW2F2MlRpcF09XCJzLm5hbWVcIj57eyBzLm5hbWUgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCIgW2F2MlRpcF09XCJzLmFvbVwiPnt7IHMuYW9tIHx8ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiIFthdjJUaXBdPVwicy56b25lXCI+e3sgcy56b25lIHx8ICfigJQnIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIiBbY2xhc3MuaXMtbXV0ZWRdPVwiIXMuYXVkaXRlZFwiPnt7IHMuYXVkaXRlZCA/ICdZZXMnIDogJ05vJyB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0IGlzLXN0cm9uZ1wiIFtjbGFzcy5pcy1wYXNzXT1cInMuc3RhdHVzID09PSAncGFzcydcIiBbY2xhc3MuaXMtZmFpbF09XCJzLnN0YXR1cyA9PT0gJ2ZhaWwnXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLW11dGVkXT1cInMuc2NvcmUgPT09IG51bGxcIj57eyBzY29yZVRleHQocykgfX08L3RkPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwidC1yaWdodFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJwLWV4cG9ydFwiIFtkaXNhYmxlZF09XCJleHBvcnRpbmdcIiAoY2xpY2spPVwiZXhwb3J0U3RvcmUocylcIj5FeHBvcnQ8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPHRmb290PlxuICAgICAgICAgIDx0ciBjbGFzcz1cInJwLXRvdGFsXCI+XG4gICAgICAgICAgICA8dGQ+VG90YWw8L3RkPlxuICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cInQtcmlnaHRcIj57eyB0b3RhbEF1ZGl0ZWRPZiB9fTwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ0LXJpZ2h0XCI+e3sgdG90YWxBdmVyYWdlIH19PC90ZD5cbiAgICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGZvb3Q+XG4gICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nICYmICF0YWJsZUNvdW50XCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cbiAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHNlYXJjaCA/ICdObyByb3dzIG1hdGNoIFwiJyArIHNlYXJjaCArICdcIicgOiAnTm8gc3RvcmVzIG1hdGNoIHRoZSBjdXJyZW50IGZpbHRlcnMnIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU2hhcmVkIHBhZ2VyICgxMCAvIDIwIC8gMzApLCBhcyBvbiB0aGUgb3RoZXIgYXVkaXQgbGlzdHMuIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJycC1wYWdlclwiICpuZ0lmPVwiIWxvYWRpbmcgJiYgdGFibGVDb3VudFwiPlxuICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwicGFnZVNpemVcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2VTaXplc1wiIFtjdXJyZW50UGFnZV09XCJwYWdlXCJcbiAgICAgICAgW3RvdGFsSXRlbXNdPVwidGFibGVDb3VudFwiIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCIgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XG4gICAgPC9kaXY+XG4gIDwvc2VjdGlvbj5cblxuICA8IS0tID09PT09PT09PT09PSBGSUxURVIgRFJBV0VSID09PT09PT09PT09PSAtLT5cbiAgPGRpdiBjbGFzcz1cImZpbHRlci1iYWNrZHJvcFwiICpuZ0lmPVwiZmlsdGVyc09wZW5cIiAoY2xpY2spPVwiY2xvc2VGaWx0ZXJzKClcIj48L2Rpdj5cblxuICA8IS0tIEV2ZXJ5IGNvbnRyb2wgZWRpdHMgdGhlIGRyYXdlcidzIGRyYWZ0IChkcik7IHRoZSBwYWdlIGJlaGluZCBjaGFuZ2VzIG9ubHkgb24gQXBwbHkgb3IgUmVzZXQgYWxsLiAtLT5cbiAgPGRpdiBjbGFzcz1cImZpbHRlci1kcmF3ZXJcIiAqbmdJZj1cImZpbHRlcnNPcGVuICYmIGRyYWZ0IGFzIGRyXCI+XG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1oZWFkXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImRyYXdlci10aXRsZVwiPkZpbHRlcnM8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInJwLWNvdW50cGlsbFwiPnt7IGRyLmZpbHRlckNvdW50IH19PC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlYnRuXCIgKGNsaWNrKT1cImNsb3NlRmlsdGVycygpXCIgdGl0bGU9XCJDbG9zZVwiPlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48bGluZSB4MT1cIjZcIiB5MT1cIjZcIiB4Mj1cIjE4XCIgeTI9XCIxOFwiPjwvbGluZT48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiPjwvbGluZT48L3N2Zz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLW5hdlwiPlxuICAgICAgICA8IS0tIHRyYWNrQnk6IGZpbHRlckNhdHMgaXMgcmVidWlsdCBvbiBldmVyeSBjaGVjaywgYW5kIGxpYi1hdWRpdC12Mi1zZWxlY3QncyBkb2N1bWVudDptb3VzZWRvd24gcnVucyBvbmVcbiAgICAgICAgICAgICBiZXR3ZWVuIHByZXNzIGFuZCByZWxlYXNlOyB3aXRob3V0IGl0IHRoZSBidXR0b24gd2FzIHJlcGxhY2VkIG1pZC1jbGljayBhbmQgdGhlIGNsaWNrIG5ldmVyIGxhbmRlZC4gLS0+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZHJhd2VyLW5hdml0ZW1cIiAqbmdGb3I9XCJsZXQgYyBvZiBkci5maWx0ZXJDYXRzOyB0cmFja0J5OiB0cmFja0J5Q2hpcFwiIFtjbGFzcy5uYXZpdGVtLWFjdGl2ZV09XCJhY3RpdmVDYXQgPT09IGMua2V5XCJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2F0KGMua2V5KVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dGV4dFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ0aXRsZVwiPnt7IGMubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnZhbHVlXCIgW2NsYXNzLmlzLWRpcnR5XT1cImMuZGlydHlcIj57eyBjLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRpcnR5ZG90XCIgKm5nSWY9XCJjLmRpcnR5XCI+PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLXBhbmVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmV0aXRsZVwiPnt7IGRyLnBhbmVUaXRsZSB9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWhpbnRcIj57eyBkci5wYW5lU3ViIH19PC9kaXY+XG5cbiAgICAgICAgPCEtLSBEYXRlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1zdGFja1wiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnZGF0ZSdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWRhdGVwaWNrXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWljb25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMlwiPjwvcmVjdD5cbiAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiMlwiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCI4XCIgeTE9XCIyXCIgeDI9XCI4XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT48L3N2Zz5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWlucHV0IHJwLWRhdGVyYW5nZVwiIG5neERhdGVyYW5nZXBpY2tlck1kIHJlYWRvbmx5IGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGRhdGUgcmFuZ2VcIiBbKG5nTW9kZWwpXT1cImRyLnJhbmdlXCIgW2xvY2FsZV09XCJwaWNrZXJMb2NhbGVcIiBbbWF4RGF0ZV09XCJ0b2RheVwiXG4gICAgICAgICAgICAgIFtyYW5nZXNdPVwicmFuZ2VzXCIgW3Nob3dDdXN0b21SYW5nZUxhYmVsXT1cInRydWVcIiBbYWx3YXlzU2hvd0NhbGVuZGFyc109XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtrZWVwQ2FsZW5kYXJPcGVuaW5nV2l0aFJhbmdlXT1cInRydWVcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtkcm9wc109XCInZG93bidcIiBbb3BlbnNdPVwiJ3JpZ2h0J1wiIChkYXRlc1VwZGF0ZWQpPVwiZHIub25SYW5nZVBpY2tlZCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLXByZXNldHNcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicnAtcHJlc2V0XCIgKm5nRm9yPVwibGV0IHAgb2YgcHJlc2V0c1wiIFtjbGFzcy5pcy1vbl09XCJkci5wcmVzZXQgPT09IHBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZHIuc2V0UHJlc2V0KHApXCI+e3sgcCB9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFZpZXcgYnkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvbnNcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ21vZGUnXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cImRyLmlzU3RvcmVNb2RlXCIgKGNsaWNrKT1cImRyLnNldE1vZGUoJ3N0b3JlJylcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJkci5pc1N0b3JlTW9kZVwiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLXRleHRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1sYWJlbFwiPlN0b3JlPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj5PbmUgcm93IHBlciBzdG9yZSB3aXRoIHNjb3JlLCByZXN1bHQgYW5kIGxhc3QgYXVkaXQgZGF0ZS48L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cIiFkci5pc1N0b3JlTW9kZVwiIChjbGljayk9XCJkci5zZXRNb2RlKCd1c2VyJylcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCIhZHIuaXNTdG9yZU1vZGVcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi10ZXh0XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tbGFiZWxcIj5Vc2VyPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj5Sb2xsZWQgdXAgYnkgY2lyY2xlIGhlYWQsIHpvbmUgbWFuYWdlciBhbmQgQU9NLCBkcmlsbGFibGUgZG93biB0byBzdG9yZXMuPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFN0b3JlcyAoU3RvcmUgdmlldykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLXN0YWNrXCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdzY29wZScgJiYgZHIuaXNTdG9yZU1vZGVcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdjItc2VhcmNoIHJwLXBpY2stc2VhcmNoXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3XCI+PC9jaXJjbGU+PGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+PC9zdmc+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBzdG9yZVwiIFsobmdNb2RlbCldPVwiZHIuc3RvcmVRdWVyeVwiPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLXBpY2tsaXN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZHIuc3RvcmVQaWNrSXRlbXMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJwLXBpY2sgaXMtYWxsXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImRyLnN0b3JlUGlja0FsbENoZWNrZWRcIiAoY2hhbmdlKT1cImRyLnRvZ2dsZVN0b3JlUGlja0FsbCgpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+U2VsZWN0IEFsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicnAtcGlja1wiICpuZ0Zvcj1cImxldCBpdCBvZiBkci5zdG9yZVBpY2tJdGVtczsgdHJhY2tCeTogdHJhY2tCeVBpY2tcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXQuY2hlY2tlZFwiIChjaGFuZ2UpPVwiZHIudG9nZ2xlU3RvcmVQaWNrKGl0LnN0b3JlKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnAtcGljay1sYWJlbFwiPnt7IGl0LnN0b3JlLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycC1waWNrLXN1YlwiPnt7IGl0LnN0b3JlLmNsdXN0ZXIgfHwgaXQuc3RvcmUuYW9tIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtcGljay1lbXB0eVwiICpuZ0lmPVwiIWRyLnN0b3JlUGlja0l0ZW1zLmxlbmd0aFwiPlxuICAgICAgICAgICAgICB7eyBkci5zdG9yZVF1ZXJ5ID8gJ05vIHN0b3JlcyBtYXRjaCBcIicgKyBkci5zdG9yZVF1ZXJ5ICsgJ1wiJyA6ICdObyBzdG9yZXMgaW4gc2NvcGUnIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtcmVhZGluZ1wiPlxuICAgICAgICAgICAgPHNwYW4+UmVhZGluZzwvc3Bhbj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgZHIuc3RvcmVQaWNrUmVhZGluZyB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItZ3Jvd1wiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWxpbmsgcnAtcmVzZXRcIiAoY2xpY2spPVwiZHIucmVzZXRTdG9yZVBpY2soKVwiPlJlc2V0IHRvIGFsbCBzdG9yZXM8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTdG9yZSBoaWVyYXJjaHkgKFVzZXIgdmlldykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLXN0YWNrXCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdzY29wZScgJiYgIWRyLmlzU3RvcmVNb2RlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWZpZWxkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtZmllbGQtbGFiZWxcIj5DaXJjbGUgSGVhZCA8c3Bhbj57eyBkci5jaXJjbGVPcHRpb25zLmxlbmd0aCAtIDEgfX0gdXNlcnM8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBbdmFsdWVdPVwiZHIuY2lyY2xlS2V5XCIgW29wdGlvbnNdPVwiZHIuY2lyY2xlT3B0aW9uc1wiIHBsYWNlaG9sZGVyPVwiQWxsIGNpcmNsZXNcIlxuICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJDaXJjbGUgSGVhZFwiIChjaGFuZ2VkKT1cImRyLnBpY2tDaXJjbGUoJGV2ZW50LnRhcmdldC52YWx1ZSlcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWZpZWxkXCIgKm5nSWY9XCJkci5zaG93Wm9uZVBpY2tcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1maWVsZC1sYWJlbFwiPlpvbmUgTWFuYWdlciA8c3Bhbj57eyBkci56b25lT3B0aW9ucy5sZW5ndGggLSAxIH19IHt7IGRyLnpvbmVPcHRpb25zLmxlbmd0aCA9PT0gMiA/ICd1c2VyJyA6ICd1c2VycycgfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBbdmFsdWVdPVwiZHIuem9uZUtleVwiIFtvcHRpb25zXT1cImRyLnpvbmVPcHRpb25zXCIgcGxhY2Vob2xkZXI9XCJBbGwgem9uZXNcIlxuICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJab25lIE1hbmFnZXJcIiAoY2hhbmdlZCk9XCJkci5waWNrWm9uZSgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtZmllbGRcIiAqbmdJZj1cImRyLnpvbmVLZXlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1maWVsZC1sYWJlbFwiPkFPTSA8c3Bhbj57eyBkci5hb21PcHRpb25zLmxlbmd0aCAtIDEgfX0ge3sgZHIuYW9tT3B0aW9ucy5sZW5ndGggPT09IDIgPyAndXNlcicgOiAndXNlcnMnIH19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgW3ZhbHVlXT1cImRyLmFvbUtleVwiIFtvcHRpb25zXT1cImRyLmFvbU9wdGlvbnNcIiBwbGFjZWhvbGRlcj1cIkFsbCBBT01zXCJcbiAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiQU9NXCIgKGNoYW5nZWQpPVwiZHIucGlja0FvbSgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtZmllbGRcIiAqbmdJZj1cImRyLmFvbUtleVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWZpZWxkLWxhYmVsXCI+U3RvcmUgPHNwYW4+e3sgZHIuc3RvcmVPcHRpb25zLmxlbmd0aCAtIDEgfX0gc3RvcmVzPC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgW3ZhbHVlXT1cImRyLnN0b3JlS2V5XCIgW29wdGlvbnNdPVwiZHIuc3RvcmVPcHRpb25zXCIgcGxhY2Vob2xkZXI9XCJBbGwgc3RvcmVzXCJcbiAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiU3RvcmVcIiAoY2hhbmdlZCk9XCJkci5waWNrU3RvcmUoJGV2ZW50LnRhcmdldC52YWx1ZSlcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLXJlYWRpbmdcIj5cbiAgICAgICAgICAgIDxzcGFuPlJlYWRpbmc8L3NwYW4+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IGRyLmhpZXJhcmNoeVJlYWRpbmcgfX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLWdyb3dcIj48L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1saW5rIHJwLXJlc2V0XCIgKGNsaWNrKT1cImRyLmdvVG9MZXZlbCgnY2lyY2xlJylcIj5SZXNldCB0byBhbGwgY2lyY2xlczwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJlc3VsdCAoU3RvcmUgdmlldykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvbnNcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3Jlc3VsdCcgJiYgZHIuaXNTdG9yZU1vZGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwiZHIucmVzdWx0ID09PSAnYWxsJ1wiIChjbGljayk9XCJkci5zZXRSZXN1bHQoJ2FsbCcpXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwiZHIucmVzdWx0ID09PSAnYWxsJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLXRleHRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1sYWJlbFwiPkFsbDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1oZWxwXCI+RXZlcnkgc3RvcmUgaW4gc2NvcGUsIGF1ZGl0ZWQgb3Igbm90Ljwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwiZHIucmVzdWx0ID09PSAncGFzcydcIiAoY2xpY2spPVwiZHIuc2V0UmVzdWx0KCdwYXNzJylcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJkci5yZXN1bHQgPT09ICdwYXNzJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLXRleHRcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1sYWJlbFwiPlBhc3M8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24taGVscFwiPk9ubHkgc3RvcmVzIHNjb3JpbmcgYXQgb3IgYWJvdmUgdGhlIHt7IHBhc3NNYXJrIH19JSBwYXNzIG1hcmsuPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJkci5yZXN1bHQgPT09ICdmYWlsJ1wiIChjbGljayk9XCJkci5zZXRSZXN1bHQoJ2ZhaWwnKVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cImRyLnJlc3VsdCA9PT0gJ2ZhaWwnXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tdGV4dFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWxhYmVsXCI+RmFpbDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1oZWxwXCI+T25seSBzdG9yZXMgc2NvcmluZyBiZWxvdyB0aGUge3sgcGFzc01hcmsgfX0lIHBhc3MgbWFyay48L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWZvb3RcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWxpbmsgcnAtcmVzZXRcIiAoY2xpY2spPVwicmVzZXRGaWx0ZXJzKClcIj5SZXNldCBhbGw8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLXByaW1hcnkgYXYyLWJ0bi0td2lkZVwiIChjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiPkFwcGx5PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG48L2Rpdj5cbiJdfQ==