tango-app-ui-manage-settings 3.7.48 → 3.7.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.
@@ -30,6 +30,8 @@ export class BrandDocumentsComponent {
30
30
  noData = false;
31
31
  configured = true;
32
32
  pagination = { offset: 1, limit: 10, totalCount: 0 };
33
+ sortColumn = 'createdAt';
34
+ sortDirection = -1;
33
35
  paginationSizes = PAGE_SIZES;
34
36
  /** Row whose signed link is being prepared; its actions are disabled meanwhile. */
35
37
  busyId = null;
@@ -146,12 +148,26 @@ export class BrandDocumentsComponent {
146
148
  return {
147
149
  clientId: this.clientId,
148
150
  scope: 'brand',
149
- sortColumn: 'createdAt',
150
- sortBy: -1,
151
+ sortColumn: this.sortColumn,
152
+ sortBy: this.sortDirection,
151
153
  offset: this.pagination.offset,
152
154
  limit: this.pagination.limit,
153
155
  };
154
156
  }
157
+ // ---------- sort ----------
158
+ /** Same behaviour as the Documents page: a new column sorts ascending, the same column flips. Sorted by the API across all pages. */
159
+ onSort(column) {
160
+ if (this.sortColumn === column) {
161
+ this.sortDirection = this.sortDirection === 1 ? -1 : 1;
162
+ }
163
+ else {
164
+ this.sortColumn = column;
165
+ this.sortDirection = 1;
166
+ }
167
+ this.pagination.offset = 1;
168
+ this.stopPolling();
169
+ this.load();
170
+ }
155
171
  load(silent = false) {
156
172
  this.reload$.next(silent);
157
173
  }
@@ -343,10 +359,10 @@ export class BrandDocumentsComponent {
343
359
  return names.slice(0, 15).join(', ') + (names.length > 15 ? ` +${names.length - 15} more` : '');
344
360
  }
345
361
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrandDocumentsComponent, deps: [{ token: i1.ClientApiService }, { token: i2.GlobalStateService }, { token: i3.ToastService }, { token: i4.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
346
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrandDocumentsComponent, selector: "lib-brand-documents", ngImport: i0, template: "<div *ngIf=\"canView\" class=\"documents-card\">\r\n <div class=\"d-flex justify-content-between align-items-start flex-wrap gap-3 mb-6\">\r\n <div>\r\n <div class=\"header\">Brand documents <span *ngIf=\"configured && !loading\" class=\"blue-badge ms-2\">{{ pagination.totalCount }}</span></div>\r\n <div class=\"sub-text\">Files uploaded at brand level and shared with stores. Upload and edit them on the Documents page.</div>\r\n </div>\r\n <div class=\"d-flex align-items-center flex-shrink-0\">\r\n <button type=\"button\" (click)=\"goToDocuments()\" class=\"btn btn-outline rounded-3 toolbar-control toolbar-control--primary\">\r\n <span>Open Documents</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M7 17 17 7M8 7h9v9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!configured\" class=\"empty-state\">\r\n <div class=\"text-sub\">Documents API URL is not configured.</div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"configured\">\r\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\r\n <table class=\"table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th>Document</th>\r\n <th>Document ID</th>\r\n <th>Type</th>\r\n <th>Available to</th>\r\n <th>Valid till</th>\r\n <th>Status</th>\r\n <th>Uploaded</th>\r\n <th>Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let doc of documents; trackBy: trackById\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"file-badge file-badge--{{ fileKind(doc.extension) }}\">{{ doc.extension || 'file' }}</span>\r\n <div class=\"ms-3 file-cell\">\r\n <div class=\"table-title text-truncate\" [ngbTooltip]=\"doc.fileName\" container=\"body\">{{ doc.fileName }}</div>\r\n <div class=\"table-sub\">{{ formatFileSize(doc.fileSize) }}</div>\r\n </div>\r\n </div>\r\n </td>\r\n <td><span class=\"doc-code\">{{ doc.documentCode || '-' }}</span></td>\r\n <td>\r\n <ng-container *ngIf=\"doc.ocrStatus === 'processing'\">\r\n <span class=\"text-sub\"><span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>Detecting...</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"doc.ocrStatus === 'failed'\">\r\n <span class=\"text-sub\">{{ doc.type || 'Not detected' }}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"doc.ocrStatus === 'done'\">{{ doc.type || '-' }}</ng-container>\r\n </td>\r\n <td>\r\n <span [ngClass]=\"doc.storeIds?.length ? 'gray-badge' : 'blue-badge'\" [ngbTooltip]=\"sharedTooltip(doc)\" container=\"body\">{{ sharedText(doc) }}</span>\r\n </td>\r\n <td>\r\n <ng-container *ngIf=\"doc.ocrStatus === 'processing'; else expiryCell\">\r\n <span class=\"text-sub\">Detecting...</span>\r\n </ng-container>\r\n <ng-template #expiryCell>\r\n <ng-container *ngIf=\"doc.expiryDate; else noExpiry\">\r\n <div class=\"table-title\">{{ doc.expiryDate | customDateFormat }}</div>\r\n <div class=\"table-sub\" [class.text-danger]=\"isExpired(doc)\">{{ expiryText(doc) }}</div>\r\n </ng-container>\r\n <ng-template #noExpiry>\r\n <div class=\"table-title\">No expiry</div>\r\n <div class=\"table-sub\">No validity date</div>\r\n </ng-template>\r\n </ng-template>\r\n </td>\r\n <td><span [ngClass]=\"statusBadge[statusOf(doc)]\">{{ statusLabels[statusOf(doc)] }}</span></td>\r\n <td>\r\n <div class=\"table-title\">{{ doc.createdAt | customDateFormat }}</div> </td>\r\n <td class=\"text-nowrap\">\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <a class=\"action-icon\" [class.action-icon--busy]=\"busyId === doc._id\" ngbTooltip=\"View\" container=\"body\" (click)=\"openDocument(doc)\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\r\n </a>\r\n <a class=\"action-icon\" [class.action-icon--busy]=\"busyId === doc._id\" ngbTooltip=\"Download\" container=\"body\" (click)=\"downloadDocument(doc)\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!loading && !noData\" class=\"mt-6\">\r\n <lib-pagination [itemsPerPage]=\"pagination.limit\" [currentPage]=\"pagination.offset\" [totalItems]=\"pagination.totalCount\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"paginationSize()\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n\r\n <div *ngIf=\"loading\" class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!loading && noData\" class=\"empty-state\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n <div class=\"text-sub mt-3\">No brand documents uploaded yet</div>\r\n </div>\r\n </ng-container>\r\n</div>\r\n", styles: [".documents-card{border-radius:10px;background:#fff;padding:16px}.header{color:var(--Gray-700, #344054);font-family:Inter;font-size:18px;font-weight:600;line-height:28px}.header .blue-badge{vertical-align:middle}.sub-text{color:var(--Gray-500, #667085);font-size:14px;line-height:20px;margin-top:2px}.toolbar-control{height:40px!important;display:inline-flex!important;align-items:center;gap:8px;padding:0 16px!important;font-size:14px!important;font-weight:600!important;line-height:20px!important;white-space:nowrap;color:var(--Gray-700, #344054)!important;transition:background-color .15s ease,border-color .15s ease}.toolbar-control svg{flex-shrink:0}.toolbar-control--primary{color:var(--Primary-700, #009BF3)!important;border-color:#a6e0ff!important}.toolbar-control--primary:hover{background:var(--Primary-50, #EAF8FF)!important}td{vertical-align:middle}.text-sub{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.table-title{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.table-sub{line-height:20px!important;color:var(--Gray-500, #667085)!important;font-size:13px}.file-cell{max-width:260px}.doc-code{font-size:13px;font-weight:500;color:var(--Gray-700, #344054);letter-spacing:.2px}.gray-badge,.red-badge,.blue-badge,.yellow-badge,.green-badge{font-size:12px;font-weight:500;line-height:18px;border-radius:16px;padding:2px 8px;white-space:nowrap}.green-badge{color:#027a48;background:#ecfdf3}.yellow-badge{color:#b54708;background:#fffaeb}.blue-badge{color:#009bf3;background:#eaf8ff}.red-badge{color:#b42318;background:#fef3f2}.gray-badge{color:#344054;background:#f2f4f7}.file-badge{display:inline-block;min-width:40px;text-align:center;padding:3px 6px;border-radius:4px;font-size:11px;font-weight:700;text-transform:uppercase;color:#667085;background:#eaecf0}.file-badge--pdf{color:#b42318;background:#fef3f2}.file-badge--image{color:#6941c6;background:#f4f3ff}.action-icon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:6px;cursor:pointer;color:var(--Gray-500, #667085);transition:background-color .15s ease,color .15s ease}.action-icon svg{width:18px;height:18px;stroke:currentColor}.action-icon:hover{background:#f2f4f7;color:var(--Primary-700, #009BF3)}.action-icon--busy{opacity:.5;pointer-events:none}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 0}.empty-state .img-src{width:25%;height:50%}@media (prefers-reduced-motion: reduce){.toolbar-control,.action-icon{transition:none}}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "pipe", type: i3.CustomDateFormatPipe, name: "customDateFormat" }] });
362
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrandDocumentsComponent, selector: "lib-brand-documents", ngImport: i0, template: "<!-- Same sort arrow as the Documents page: blue on the active column, pointing up when ascending. -->\n<ng-template #sortIcon let-col=\"col\">\n <svg class=\"sort-icon\" [class.rotate]=\"sortColumn === col && sortDirection === 1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumn === col ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n</ng-template>\n\n<div *ngIf=\"canView\" class=\"documents-card\">\n <div class=\"d-flex justify-content-between align-items-center flex-wrap gap-3 mb-6\">\n <div>\n <div class=\"header\">Brand documents <span *ngIf=\"configured && !loading\" class=\"blue-badge ms-2\">{{ pagination.totalCount }}</span></div>\n </div>\n <div class=\"d-flex align-items-center flex-shrink-0\">\n <button type=\"button\" (click)=\"goToDocuments()\" class=\"btn btn-outline rounded-3 toolbar-control toolbar-control--primary\">\n <span>Open Documents</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M7 17 17 7M8 7h9v9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"!configured\" class=\"empty-state\">\n <div class=\"text-sub\">Documents API URL is not configured.</div>\n </div>\n\n <ng-container *ngIf=\"configured\">\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\n <table class=\"table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"sortable\" (click)=\"onSort('fileName')\">Document <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'fileName' }\"></ng-container></th>\n <th>Document ID</th>\n <th class=\"sortable\" (click)=\"onSort('type')\">Type <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'type' }\"></ng-container></th>\n <th>Available to</th>\n <th class=\"sortable\" (click)=\"onSort('expiryDate')\">Valid till <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'expiryDate' }\"></ng-container></th>\n <th class=\"sortable\" (click)=\"onSort('status')\">Status <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'status' }\"></ng-container></th>\n <th class=\"sortable\" (click)=\"onSort('createdAt')\">Uploaded <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'createdAt' }\"></ng-container></th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let doc of documents; trackBy: trackById\">\n <td>\n <div class=\"d-flex align-items-center\">\n <span class=\"file-badge file-badge--{{ fileKind(doc.extension) }}\">{{ doc.extension || 'file' }}</span>\n <div class=\"ms-3 file-cell\">\n <div class=\"table-title text-truncate\" [ngbTooltip]=\"doc.fileName\" container=\"body\">{{ doc.fileName }}</div>\n <div class=\"table-sub\">{{ formatFileSize(doc.fileSize) }}</div>\n </div>\n </div>\n </td>\n <td><span class=\"doc-code\">{{ doc.documentCode || '-' }}</span></td>\n <td>\n <ng-container *ngIf=\"doc.ocrStatus === 'processing'\">\n <span class=\"text-sub\">NA</span>\n </ng-container>\n <ng-container *ngIf=\"doc.ocrStatus === 'failed'\">\n <span class=\"text-sub\">{{ doc.type || 'Not detected' }}</span>\n </ng-container>\n <ng-container *ngIf=\"doc.ocrStatus === 'done'\">{{ doc.type || '-' }}</ng-container>\n </td>\n <td>\n <span [ngClass]=\"doc.storeIds?.length ? 'gray-badge' : 'blue-badge'\" [ngbTooltip]=\"sharedTooltip(doc)\" container=\"body\">{{ sharedText(doc) }}</span>\n </td>\n <td>\n <ng-container *ngIf=\"doc.ocrStatus === 'processing'; else expiryCell\">\n <span class=\"text-sub\">NA</span>\n </ng-container>\n <ng-template #expiryCell>\n <ng-container *ngIf=\"doc.expiryDate; else noExpiry\">\n <div class=\"table-title\">{{ doc.expiryDate | customDateFormat }}</div>\n <div class=\"table-sub\" [class.text-danger]=\"isExpired(doc)\">{{ expiryText(doc) }}</div>\n </ng-container>\n <ng-template #noExpiry>\n <div class=\"table-title\">No expiry</div>\n <div class=\"table-sub\">No validity date</div>\n </ng-template>\n </ng-template>\n </td>\n <td><span [ngClass]=\"statusBadge[statusOf(doc)]\">{{ statusLabels[statusOf(doc)] }}</span></td>\n <td>\n <div class=\"table-title\">{{ doc.createdAt | customDateFormat }}</div> </td>\n <td class=\"text-nowrap\">\n <div class=\"d-flex align-items-center gap-1\">\n <a class=\"action-icon\" [class.action-icon--busy]=\"busyId === doc._id\" ngbTooltip=\"View\" container=\"body\" (click)=\"openDocument(doc)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </a>\n <a class=\"action-icon\" [class.action-icon--busy]=\"busyId === doc._id\" ngbTooltip=\"Download\" container=\"body\" (click)=\"downloadDocument(doc)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </a>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"!loading && !noData\" class=\"mt-6\">\n <lib-pagination [itemsPerPage]=\"pagination.limit\" [currentPage]=\"pagination.offset\" [totalItems]=\"pagination.totalCount\"\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"paginationSize()\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n\n <div *ngIf=\"loading\" class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!loading && noData\" class=\"empty-state\">\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n <div class=\"text-sub mt-3\">No brand documents uploaded yet</div>\n </div>\n </ng-container>\n</div>\n", styles: [".documents-card{border-radius:10px;background:#fff;padding:16px}.header{color:var(--Gray-700, #344054);font-family:Inter;font-size:18px;font-weight:600;line-height:28px}.header .blue-badge{vertical-align:middle}.sub-text{color:var(--Gray-500, #667085);font-size:14px;line-height:20px;margin-top:2px}.toolbar-control{height:40px!important;display:inline-flex!important;align-items:center;gap:8px;padding:0 16px!important;font-size:14px!important;font-weight:600!important;line-height:20px!important;white-space:nowrap;color:var(--Gray-700, #344054)!important;transition:background-color .15s ease,border-color .15s ease}.toolbar-control svg{flex-shrink:0}.toolbar-control--primary{color:var(--Primary-700, #009BF3)!important;border-color:#a6e0ff!important}.toolbar-control--primary:hover{background:var(--Primary-50, #EAF8FF)!important}td{vertical-align:middle}th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.sort-icon{vertical-align:-3px;transition:rotate .2s ease}.sort-icon.rotate{rotate:180deg}@media (prefers-reduced-motion: reduce){.sort-icon{transition:none}}.text-sub{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.table-title{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.table-sub{line-height:20px!important;color:var(--Gray-500, #667085)!important;font-size:13px}.file-cell{max-width:260px}.doc-code{font-size:13px;font-weight:500;color:var(--Gray-700, #344054);letter-spacing:.2px}.gray-badge,.red-badge,.blue-badge,.yellow-badge,.green-badge{font-size:12px;font-weight:500;line-height:18px;border-radius:16px;padding:2px 8px;white-space:nowrap}.green-badge{color:#027a48;background:#ecfdf3}.yellow-badge{color:#b54708;background:#fffaeb}.blue-badge{color:#009bf3;background:#eaf8ff}.red-badge{color:#b42318;background:#fef3f2}.gray-badge{color:#344054;background:#f2f4f7}.file-badge{display:inline-block;min-width:40px;text-align:center;padding:3px 6px;border-radius:4px;font-size:11px;font-weight:700;text-transform:uppercase;color:#667085;background:#eaecf0}.file-badge--pdf{color:#b42318;background:#fef3f2}.file-badge--image{color:#6941c6;background:#f4f3ff}.action-icon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:6px;cursor:pointer;color:var(--Gray-500, #667085);transition:background-color .15s ease,color .15s ease}.action-icon svg{width:18px;height:18px;stroke:currentColor}.action-icon:hover{background:#f2f4f7;color:var(--Primary-700, #009BF3)}.action-icon--busy{opacity:.5;pointer-events:none}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 0}.empty-state .img-src{width:25%;height:50%}@media (prefers-reduced-motion: reduce){.toolbar-control,.action-icon{transition:none}}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "pipe", type: i3.CustomDateFormatPipe, name: "customDateFormat" }] });
347
363
  }
348
364
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrandDocumentsComponent, decorators: [{
349
365
  type: Component,
350
- args: [{ selector: 'lib-brand-documents', template: "<div *ngIf=\"canView\" class=\"documents-card\">\r\n <div class=\"d-flex justify-content-between align-items-start flex-wrap gap-3 mb-6\">\r\n <div>\r\n <div class=\"header\">Brand documents <span *ngIf=\"configured && !loading\" class=\"blue-badge ms-2\">{{ pagination.totalCount }}</span></div>\r\n <div class=\"sub-text\">Files uploaded at brand level and shared with stores. Upload and edit them on the Documents page.</div>\r\n </div>\r\n <div class=\"d-flex align-items-center flex-shrink-0\">\r\n <button type=\"button\" (click)=\"goToDocuments()\" class=\"btn btn-outline rounded-3 toolbar-control toolbar-control--primary\">\r\n <span>Open Documents</span>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M7 17 17 7M8 7h9v9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!configured\" class=\"empty-state\">\r\n <div class=\"text-sub\">Documents API URL is not configured.</div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"configured\">\r\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\r\n <table class=\"table bottom-border text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th>Document</th>\r\n <th>Document ID</th>\r\n <th>Type</th>\r\n <th>Available to</th>\r\n <th>Valid till</th>\r\n <th>Status</th>\r\n <th>Uploaded</th>\r\n <th>Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let doc of documents; trackBy: trackById\">\r\n <td>\r\n <div class=\"d-flex align-items-center\">\r\n <span class=\"file-badge file-badge--{{ fileKind(doc.extension) }}\">{{ doc.extension || 'file' }}</span>\r\n <div class=\"ms-3 file-cell\">\r\n <div class=\"table-title text-truncate\" [ngbTooltip]=\"doc.fileName\" container=\"body\">{{ doc.fileName }}</div>\r\n <div class=\"table-sub\">{{ formatFileSize(doc.fileSize) }}</div>\r\n </div>\r\n </div>\r\n </td>\r\n <td><span class=\"doc-code\">{{ doc.documentCode || '-' }}</span></td>\r\n <td>\r\n <ng-container *ngIf=\"doc.ocrStatus === 'processing'\">\r\n <span class=\"text-sub\"><span class=\"spinner-border spinner-border-sm me-2\" role=\"status\"></span>Detecting...</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"doc.ocrStatus === 'failed'\">\r\n <span class=\"text-sub\">{{ doc.type || 'Not detected' }}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"doc.ocrStatus === 'done'\">{{ doc.type || '-' }}</ng-container>\r\n </td>\r\n <td>\r\n <span [ngClass]=\"doc.storeIds?.length ? 'gray-badge' : 'blue-badge'\" [ngbTooltip]=\"sharedTooltip(doc)\" container=\"body\">{{ sharedText(doc) }}</span>\r\n </td>\r\n <td>\r\n <ng-container *ngIf=\"doc.ocrStatus === 'processing'; else expiryCell\">\r\n <span class=\"text-sub\">Detecting...</span>\r\n </ng-container>\r\n <ng-template #expiryCell>\r\n <ng-container *ngIf=\"doc.expiryDate; else noExpiry\">\r\n <div class=\"table-title\">{{ doc.expiryDate | customDateFormat }}</div>\r\n <div class=\"table-sub\" [class.text-danger]=\"isExpired(doc)\">{{ expiryText(doc) }}</div>\r\n </ng-container>\r\n <ng-template #noExpiry>\r\n <div class=\"table-title\">No expiry</div>\r\n <div class=\"table-sub\">No validity date</div>\r\n </ng-template>\r\n </ng-template>\r\n </td>\r\n <td><span [ngClass]=\"statusBadge[statusOf(doc)]\">{{ statusLabels[statusOf(doc)] }}</span></td>\r\n <td>\r\n <div class=\"table-title\">{{ doc.createdAt | customDateFormat }}</div> </td>\r\n <td class=\"text-nowrap\">\r\n <div class=\"d-flex align-items-center gap-1\">\r\n <a class=\"action-icon\" [class.action-icon--busy]=\"busyId === doc._id\" ngbTooltip=\"View\" container=\"body\" (click)=\"openDocument(doc)\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\r\n </a>\r\n <a class=\"action-icon\" [class.action-icon--busy]=\"busyId === doc._id\" ngbTooltip=\"Download\" container=\"body\" (click)=\"downloadDocument(doc)\">\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!loading && !noData\" class=\"mt-6\">\r\n <lib-pagination [itemsPerPage]=\"pagination.limit\" [currentPage]=\"pagination.offset\" [totalItems]=\"pagination.totalCount\"\r\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"paginationSize()\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n\r\n <div *ngIf=\"loading\" class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!loading && noData\" class=\"empty-state\">\r\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n <div class=\"text-sub mt-3\">No brand documents uploaded yet</div>\r\n </div>\r\n </ng-container>\r\n</div>\r\n", styles: [".documents-card{border-radius:10px;background:#fff;padding:16px}.header{color:var(--Gray-700, #344054);font-family:Inter;font-size:18px;font-weight:600;line-height:28px}.header .blue-badge{vertical-align:middle}.sub-text{color:var(--Gray-500, #667085);font-size:14px;line-height:20px;margin-top:2px}.toolbar-control{height:40px!important;display:inline-flex!important;align-items:center;gap:8px;padding:0 16px!important;font-size:14px!important;font-weight:600!important;line-height:20px!important;white-space:nowrap;color:var(--Gray-700, #344054)!important;transition:background-color .15s ease,border-color .15s ease}.toolbar-control svg{flex-shrink:0}.toolbar-control--primary{color:var(--Primary-700, #009BF3)!important;border-color:#a6e0ff!important}.toolbar-control--primary:hover{background:var(--Primary-50, #EAF8FF)!important}td{vertical-align:middle}.text-sub{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.table-title{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.table-sub{line-height:20px!important;color:var(--Gray-500, #667085)!important;font-size:13px}.file-cell{max-width:260px}.doc-code{font-size:13px;font-weight:500;color:var(--Gray-700, #344054);letter-spacing:.2px}.gray-badge,.red-badge,.blue-badge,.yellow-badge,.green-badge{font-size:12px;font-weight:500;line-height:18px;border-radius:16px;padding:2px 8px;white-space:nowrap}.green-badge{color:#027a48;background:#ecfdf3}.yellow-badge{color:#b54708;background:#fffaeb}.blue-badge{color:#009bf3;background:#eaf8ff}.red-badge{color:#b42318;background:#fef3f2}.gray-badge{color:#344054;background:#f2f4f7}.file-badge{display:inline-block;min-width:40px;text-align:center;padding:3px 6px;border-radius:4px;font-size:11px;font-weight:700;text-transform:uppercase;color:#667085;background:#eaecf0}.file-badge--pdf{color:#b42318;background:#fef3f2}.file-badge--image{color:#6941c6;background:#f4f3ff}.action-icon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:6px;cursor:pointer;color:var(--Gray-500, #667085);transition:background-color .15s ease,color .15s ease}.action-icon svg{width:18px;height:18px;stroke:currentColor}.action-icon:hover{background:#f2f4f7;color:var(--Primary-700, #009BF3)}.action-icon--busy{opacity:.5;pointer-events:none}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 0}.empty-state .img-src{width:25%;height:50%}@media (prefers-reduced-motion: reduce){.toolbar-control,.action-icon{transition:none}}\n"] }]
366
+ args: [{ selector: 'lib-brand-documents', template: "<!-- Same sort arrow as the Documents page: blue on the active column, pointing up when ascending. -->\n<ng-template #sortIcon let-col=\"col\">\n <svg class=\"sort-icon\" [class.rotate]=\"sortColumn === col && sortDirection === 1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"sortColumn === col ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n</ng-template>\n\n<div *ngIf=\"canView\" class=\"documents-card\">\n <div class=\"d-flex justify-content-between align-items-center flex-wrap gap-3 mb-6\">\n <div>\n <div class=\"header\">Brand documents <span *ngIf=\"configured && !loading\" class=\"blue-badge ms-2\">{{ pagination.totalCount }}</span></div>\n </div>\n <div class=\"d-flex align-items-center flex-shrink-0\">\n <button type=\"button\" (click)=\"goToDocuments()\" class=\"btn btn-outline rounded-3 toolbar-control toolbar-control--primary\">\n <span>Open Documents</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M7 17 17 7M8 7h9v9\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"!configured\" class=\"empty-state\">\n <div class=\"text-sub\">Documents API URL is not configured.</div>\n </div>\n\n <ng-container *ngIf=\"configured\">\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\n <table class=\"table bottom-border text-nowrap\">\n <thead>\n <tr>\n <th class=\"sortable\" (click)=\"onSort('fileName')\">Document <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'fileName' }\"></ng-container></th>\n <th>Document ID</th>\n <th class=\"sortable\" (click)=\"onSort('type')\">Type <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'type' }\"></ng-container></th>\n <th>Available to</th>\n <th class=\"sortable\" (click)=\"onSort('expiryDate')\">Valid till <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'expiryDate' }\"></ng-container></th>\n <th class=\"sortable\" (click)=\"onSort('status')\">Status <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'status' }\"></ng-container></th>\n <th class=\"sortable\" (click)=\"onSort('createdAt')\">Uploaded <ng-container *ngTemplateOutlet=\"sortIcon; context: { col: 'createdAt' }\"></ng-container></th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let doc of documents; trackBy: trackById\">\n <td>\n <div class=\"d-flex align-items-center\">\n <span class=\"file-badge file-badge--{{ fileKind(doc.extension) }}\">{{ doc.extension || 'file' }}</span>\n <div class=\"ms-3 file-cell\">\n <div class=\"table-title text-truncate\" [ngbTooltip]=\"doc.fileName\" container=\"body\">{{ doc.fileName }}</div>\n <div class=\"table-sub\">{{ formatFileSize(doc.fileSize) }}</div>\n </div>\n </div>\n </td>\n <td><span class=\"doc-code\">{{ doc.documentCode || '-' }}</span></td>\n <td>\n <ng-container *ngIf=\"doc.ocrStatus === 'processing'\">\n <span class=\"text-sub\">NA</span>\n </ng-container>\n <ng-container *ngIf=\"doc.ocrStatus === 'failed'\">\n <span class=\"text-sub\">{{ doc.type || 'Not detected' }}</span>\n </ng-container>\n <ng-container *ngIf=\"doc.ocrStatus === 'done'\">{{ doc.type || '-' }}</ng-container>\n </td>\n <td>\n <span [ngClass]=\"doc.storeIds?.length ? 'gray-badge' : 'blue-badge'\" [ngbTooltip]=\"sharedTooltip(doc)\" container=\"body\">{{ sharedText(doc) }}</span>\n </td>\n <td>\n <ng-container *ngIf=\"doc.ocrStatus === 'processing'; else expiryCell\">\n <span class=\"text-sub\">NA</span>\n </ng-container>\n <ng-template #expiryCell>\n <ng-container *ngIf=\"doc.expiryDate; else noExpiry\">\n <div class=\"table-title\">{{ doc.expiryDate | customDateFormat }}</div>\n <div class=\"table-sub\" [class.text-danger]=\"isExpired(doc)\">{{ expiryText(doc) }}</div>\n </ng-container>\n <ng-template #noExpiry>\n <div class=\"table-title\">No expiry</div>\n <div class=\"table-sub\">No validity date</div>\n </ng-template>\n </ng-template>\n </td>\n <td><span [ngClass]=\"statusBadge[statusOf(doc)]\">{{ statusLabels[statusOf(doc)] }}</span></td>\n <td>\n <div class=\"table-title\">{{ doc.createdAt | customDateFormat }}</div> </td>\n <td class=\"text-nowrap\">\n <div class=\"d-flex align-items-center gap-1\">\n <a class=\"action-icon\" [class.action-icon--busy]=\"busyId === doc._id\" ngbTooltip=\"View\" container=\"body\" (click)=\"openDocument(doc)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2.036 12.322a1.012 1.012 0 0 1 0-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178Z\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </a>\n <a class=\"action-icon\" [class.action-icon--busy]=\"busyId === doc._id\" ngbTooltip=\"Download\" container=\"body\" (click)=\"downloadDocument(doc)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3\" stroke-width=\"1.7\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </a>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"!loading && !noData\" class=\"mt-6\">\n <lib-pagination [itemsPerPage]=\"pagination.limit\" [currentPage]=\"pagination.offset\" [totalItems]=\"pagination.totalCount\"\n [paginationSizes]=\"paginationSizes\" [pageSize]=\"paginationSize()\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n\n <div *ngIf=\"loading\" class=\"row loader d-flex justify-content-center align-items-center\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!loading && noData\" class=\"empty-state\">\n <img class=\"img-src\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n <div class=\"text-sub mt-3\">No brand documents uploaded yet</div>\n </div>\n </ng-container>\n</div>\n", styles: [".documents-card{border-radius:10px;background:#fff;padding:16px}.header{color:var(--Gray-700, #344054);font-family:Inter;font-size:18px;font-weight:600;line-height:28px}.header .blue-badge{vertical-align:middle}.sub-text{color:var(--Gray-500, #667085);font-size:14px;line-height:20px;margin-top:2px}.toolbar-control{height:40px!important;display:inline-flex!important;align-items:center;gap:8px;padding:0 16px!important;font-size:14px!important;font-weight:600!important;line-height:20px!important;white-space:nowrap;color:var(--Gray-700, #344054)!important;transition:background-color .15s ease,border-color .15s ease}.toolbar-control svg{flex-shrink:0}.toolbar-control--primary{color:var(--Primary-700, #009BF3)!important;border-color:#a6e0ff!important}.toolbar-control--primary:hover{background:var(--Primary-50, #EAF8FF)!important}td{vertical-align:middle}th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.sort-icon{vertical-align:-3px;transition:rotate .2s ease}.sort-icon.rotate{rotate:180deg}@media (prefers-reduced-motion: reduce){.sort-icon{transition:none}}.text-sub{color:var(--Gray-500, #667085)!important;font-size:14px!important;font-weight:400!important;line-height:20px}.table-title{color:var(--Gray-700, #344054);font-size:14px;font-weight:500;line-height:20px}.table-sub{line-height:20px!important;color:var(--Gray-500, #667085)!important;font-size:13px}.file-cell{max-width:260px}.doc-code{font-size:13px;font-weight:500;color:var(--Gray-700, #344054);letter-spacing:.2px}.gray-badge,.red-badge,.blue-badge,.yellow-badge,.green-badge{font-size:12px;font-weight:500;line-height:18px;border-radius:16px;padding:2px 8px;white-space:nowrap}.green-badge{color:#027a48;background:#ecfdf3}.yellow-badge{color:#b54708;background:#fffaeb}.blue-badge{color:#009bf3;background:#eaf8ff}.red-badge{color:#b42318;background:#fef3f2}.gray-badge{color:#344054;background:#f2f4f7}.file-badge{display:inline-block;min-width:40px;text-align:center;padding:3px 6px;border-radius:4px;font-size:11px;font-weight:700;text-transform:uppercase;color:#667085;background:#eaecf0}.file-badge--pdf{color:#b42318;background:#fef3f2}.file-badge--image{color:#6941c6;background:#f4f3ff}.action-icon{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:6px;cursor:pointer;color:var(--Gray-500, #667085);transition:background-color .15s ease,color .15s ease}.action-icon svg{width:18px;height:18px;stroke:currentColor}.action-icon:hover{background:#f2f4f7;color:var(--Primary-700, #009BF3)}.action-icon--busy{opacity:.5;pointer-events:none}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 0}.empty-state .img-src{width:25%;height:50%}@media (prefers-reduced-motion: reduce){.toolbar-control,.action-icon{transition:none}}\n"] }]
351
367
  }], ctorParameters: () => [{ type: i1.ClientApiService }, { type: i2.GlobalStateService }, { type: i3.ToastService }, { type: i4.Router }, { type: i0.ChangeDetectorRef }] });
352
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQtZG9jdW1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1zZXR0aW5ncy9zcmMvbGliL2NvbXBvbmVudHMvZG9jdW1lbnRzL2JyYW5kLWRvY3VtZW50cy9icmFuZC1kb2N1bWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLXNldHRpbmdzL3NyYy9saWIvY29tcG9uZW50cy9kb2N1bWVudHMvYnJhbmQtZG9jdW1lbnRzL2JyYW5kLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQTBCbkcsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQztBQUN0QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFckI7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUFpQ3hCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFwQ1YsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2QsU0FBUyxHQUF1QixFQUFFLENBQUM7SUFDbkMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFN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O1FBQzlCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQzlELENBQUM7SUFFRCxhQUFhLENBQUMsR0FBcUI7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7U0FBRTtRQUN6QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNyRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7d0dBeFRVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDJEQzVDcEMsbWhRQXlIQTs7NEZEN0VhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcclxuXHJcbnR5cGUgRG9jdW1lbnRTdGF0dXMgPSAncHJvY2Vzc2luZycgfCAndmFsaWQnIHwgJ2V4cGlyaW5nX3Nvb24nIHwgJ2V4cGlyZWQnIHwgJ25vX2V4cGlyeSc7XHJcbnR5cGUgRmlsZUtpbmQgPSAncGRmJyB8ICdpbWFnZScgfCAnb3RoZXInO1xyXG5cclxuLyoqIFJvdyBzaGFwZSBvZiBQT1NUIC9kb2N1bWVudC9saXN0LCBsaW1pdGVkIHRvIHdoYXQgdGhpcyB0YWJsZSBzaG93cy4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBCcmFuZERvY3VtZW50Um93IHtcclxuICBfaWQ6IHN0cmluZztcclxuICBkb2N1bWVudENvZGU/OiBzdHJpbmcgfCBudWxsO1xyXG4gIHNjb3BlOiAnYnJhbmQnIHwgJ3N0b3JlJztcclxuICBzdG9yZUlkczogc3RyaW5nW107ICAgICAgICAgIC8vIFtdID0gZXZlcnkgc3RvcmUgb2YgdGhlIGJyYW5kLCBpbmNsdWRpbmcgc3RvcmVzIGFkZGVkIGxhdGVyXHJcbiAgc3RvcmVOYW1lcz86IHN0cmluZ1tdO1xyXG4gIGZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgZmlsZVNpemU6IG51bWJlcjtcclxuICBleHRlbnNpb246IHN0cmluZyB8IG51bGw7XHJcbiAgdHlwZTogc3RyaW5nIHwgbnVsbDtcclxuICBleHBpcnlEYXRlOiBzdHJpbmcgfCBudWxsOyAgIC8vICdZWVlZLU1NLUREJ1xyXG4gIG9jclN0YXR1czogJ3Byb2Nlc3NpbmcnIHwgJ2RvbmUnIHwgJ2ZhaWxlZCc7XHJcbiAgaXNBY3RpdmU6IGJvb2xlYW47XHJcbiAgdXBsb2FkZWRCeT86IHsgdXNlcklkPzogc3RyaW5nOyBuYW1lPzogc3RyaW5nIH07XHJcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IFBBR0VfU0laRVMgPSBbMTAsIDIwLCAzMF07XHJcbmNvbnN0IEVYUElSWV9TT09OX0RBWVMgPSAzMDtcclxuY29uc3QgUE9MTF9NUyA9IDE1MDAwO1xyXG5jb25zdCBNQVhfUE9MTFMgPSAyMDtcclxuXHJcbi8qKlxyXG4gKiBSZWFkLW9ubHkgbGlzdCBvZiB0aGUgYnJhbmQtbGV2ZWwgZG9jdW1lbnRzIG9mIHRoZSBzZWxlY3RlZCBicmFuZCwgc2hvd24gdW5kZXIgdGhlIEtZQyBjYXJkIG9uXHJcbiAqIFNldHRpbmdzID4gRG9jdW1lbnRzLiBTYW1lIGxpc3QgZW5kcG9pbnQgYW5kIHN0YXR1cyBydWxlIGFzIHRoZSBEb2N1bWVudHMgcGFnZTsgdXBsb2FkaW5nIGFuZFxyXG4gKiBlZGl0aW5nIHN0YXkgb24gdGhhdCBwYWdlLiBTaG93biBvbmx5IHdpdGggdGhlIEdsb2JhbCA+IERvY3VtZW50cyBWaWV3IHBlcm1pc3Npb24uXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1icmFuZC1kb2N1bWVudHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9icmFuZC1kb2N1bWVudHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9icmFuZC1kb2N1bWVudHMuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQnJhbmREb2N1bWVudHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY2FuVmlldyA9IGZhbHNlO1xyXG4gIGNsaWVudElkID0gJyc7XHJcbiAgZG9jdW1lbnRzOiBCcmFuZERvY3VtZW50Um93W10gPSBbXTtcclxuICBsb2FkaW5nID0gZmFsc2U7XHJcbiAgbm9EYXRhID0gZmFsc2U7XHJcbiAgY29uZmlndXJlZCA9IHRydWU7XHJcbiAgcGFnaW5hdGlvbiA9IHsgb2Zmc2V0OiAxLCBsaW1pdDogMTAsIHRvdGFsQ291bnQ6IDAgfTtcclxuICBwYWdpbmF0aW9uU2l6ZXM6IG51bWJlcltdID0gUEFHRV9TSVpFUztcclxuICAvKiogUm93IHdob3NlIHNpZ25lZCBsaW5rIGlzIGJlaW5nIHByZXBhcmVkOyBpdHMgYWN0aW9ucyBhcmUgZGlzYWJsZWQgbWVhbndoaWxlLiAqL1xyXG4gIGJ1c3lJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHJlYWRvbmx5IHN0YXR1c0xhYmVsczogUmVjb3JkPERvY3VtZW50U3RhdHVzLCBzdHJpbmc+ID0ge1xyXG4gICAgcHJvY2Vzc2luZzogJ1Byb2Nlc3NpbmcnLFxyXG4gICAgdmFsaWQ6ICdWYWxpZCcsXHJcbiAgICBleHBpcmluZ19zb29uOiAnRXhwaXJpbmcgc29vbicsXHJcbiAgICBleHBpcmVkOiAnRXhwaXJlZCcsXHJcbiAgICBub19leHBpcnk6ICdObyBleHBpcnknLFxyXG4gIH07XHJcbiAgcmVhZG9ubHkgc3RhdHVzQmFkZ2U6IFJlY29yZDxEb2N1bWVudFN0YXR1cywgc3RyaW5nPiA9IHtcclxuICAgIHByb2Nlc3Npbmc6ICdibHVlLWJhZGdlJyxcclxuICAgIHZhbGlkOiAnZ3JlZW4tYmFkZ2UnLFxyXG4gICAgZXhwaXJpbmdfc29vbjogJ3llbGxvdy1iYWRnZScsXHJcbiAgICBleHBpcmVkOiAncmVkLWJhZGdlJyxcclxuICAgIG5vX2V4cGlyeTogJ2dyYXktYmFkZ2UnLFxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgcG9sbFN1Yj86IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIGNsaWVudFN1Yj86IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlbG9hZCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYXBpU2VydmljZTogQ2xpZW50QXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHtcclxuICAgIC8vIE9uZSBwaXBlbGluZSwgc28gYnJhbmQsIHBhZ2luZyBhbmQgcG9sbCB0cmlnZ2VycyBuZXZlciByYWNlIGVhY2ggb3RoZXIuXHJcbiAgICB0aGlzLnJlbG9hZCQucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChzaWxlbnQpID0+IHtcclxuICAgICAgICBpZiAoIXNpbGVudCkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMubm9EYXRhID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5saXN0RG9jdW1lbnRzKHRoaXMuYnVpbGRRdWVyeSgpKS5waXBlKFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gKHsgcmVzLCBmYWlsZWQ6IGZhbHNlIH0pKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnQ291bGQgbm90IGxvYWQgZG9jdW1lbnRzJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih7IHJlczogbnVsbCwgZmFpbGVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICkuc3Vic2NyaWJlKCh7IHJlcywgZmFpbGVkIH0pID0+IHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIGlmIChmYWlsZWQgfHwgIXJlcyB8fCByZXMuY29kZSAhPT0gMjAwKSB7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXTtcclxuICAgICAgICB0aGlzLm5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZG9jdW1lbnRzID0gcmVzLmRhdGE/LnJlc3VsdCB8fCBbXTtcclxuICAgICAgY29uc3QgY291bnQgPSByZXMuZGF0YT8uY291bnQgfHwgMDtcclxuICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIHRvdGFsQ291bnQ6IGNvdW50IH07XHJcbiAgICAgIHRoaXMucGFnaW5hdGlvblNpemVzID0gY291bnQgPCAxMCA/IFtjb3VudF0gOiBQQUdFX1NJWkVTO1xyXG4gICAgICB0aGlzLm5vRGF0YSA9IHRoaXMuZG9jdW1lbnRzLmxlbmd0aCA9PT0gMDtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMubWFuYWdlUG9sbGluZygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlndXJlZCA9IHRoaXMuYXBpU2VydmljZS5pc0RvY3VtZW50c0NvbmZpZ3VyZWQ7XHJcbiAgICAvLyBBY2Nlc3MgaXMgdGhlIEdsb2JhbCA+IERvY3VtZW50cyBWaWV3IHBlcm1pc3Npb247IGl0IGFycml2ZXMgd2l0aCB0aGUgcHJvZmlsZSBjYWxsLlxyXG4gICAgdGhpcy5ncy51c2VyQWNjZXNzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFjY2VzczogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhblZpZXcgPSBhY2Nlc3M/Lkdsb2JhbF9Eb2N1bWVudHNfaXNBZGQgPT09IHRydWU7XHJcbiAgICAgIGlmIChjYW5WaWV3ID09PSB0aGlzLmNhblZpZXcpIHsgcmV0dXJuOyB9XHJcbiAgICAgIHRoaXMuY2FuVmlldyA9IGNhblZpZXc7XHJcbiAgICAgIGlmIChjYW5WaWV3KSB7XHJcbiAgICAgICAgdGhpcy53YXRjaENsaWVudCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcclxuICAgICAgICB0aGlzLmNsaWVudFN1Yj8udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB0aGlzLmNsaWVudFN1YiA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgc2VsZWN0ZWQgYnJhbmQ6IGhlYWRlciBkcm9wZG93biBmb3IgdGFuZ28gdXNlcnMsIG93biBjbGllbnQgZm9yIGNsaWVudCB1c2Vycy4gKi9cclxuICBwcml2YXRlIHdhdGNoQ2xpZW50KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGllbnRTdWI/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmNsaWVudFN1YiA9IHRoaXMuYXBpU2VydmljZS5jbGllbnRJZFxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKGlkKSA9PiB0aGlzLnJlc29sdmVDbGllbnRJZChpZCkpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKGNsaWVudElkKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkO1xyXG4gICAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcclxuICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJlZCB8fCAhY2xpZW50SWQpIHtcclxuICAgICAgICAgIHRoaXMuZG9jdW1lbnRzID0gW107XHJcbiAgICAgICAgICB0aGlzLm5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uLm9mZnNldCA9IDE7XHJcbiAgICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsaWVudCB1c2VycyBhbHdheXMgcXVlcnkgdGhlaXIgb3duIGNsaWVudCwgd2hhdGV2ZXIgdGhlIGhlYWRlciBob2xkcy4gKi9cclxuICBwcml2YXRlIHJlc29sdmVDbGllbnRJZChoZWFkZXJDbGllbnQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgbGV0IHVzZXI6IGFueSA9IHt9O1xyXG4gICAgdHJ5IHsgdXNlciA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3VzZXItaW5mbycpIHx8ICd7fScpOyB9IGNhdGNoIHsgdXNlciA9IHt9OyB9XHJcbiAgICBpZiAodXNlcj8udXNlclR5cGUgPT09ICdjbGllbnQnICYmIHVzZXI/LmNsaWVudElkKSB7IHJldHVybiBTdHJpbmcodXNlci5jbGllbnRJZCk7IH1cclxuICAgIHJldHVybiBoZWFkZXJDbGllbnQgPyBTdHJpbmcoaGVhZGVyQ2xpZW50KSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFF1ZXJ5KCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICBzY29wZTogJ2JyYW5kJyxcclxuICAgICAgc29ydENvbHVtbjogJ2NyZWF0ZWRBdCcsXHJcbiAgICAgIHNvcnRCeTogLTEsXHJcbiAgICAgIG9mZnNldDogdGhpcy5wYWdpbmF0aW9uLm9mZnNldCxcclxuICAgICAgbGltaXQ6IHRoaXMucGFnaW5hdGlvbi5saW1pdCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBsb2FkKHNpbGVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbG9hZCQubmV4dChzaWxlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLSBwcm9jZXNzaW5nIHJlZnJlc2ggLS0tLS0tLS0tLVxyXG5cclxuICAvKiogV2hpbGUgYW55IHJvdyBpcyBzdGlsbCBiZWluZyBwcm9jZXNzZWQsIHNpbGVudGx5IHJlZnJlc2ggZXZlcnkgMTUgcywgY2FwcGVkIGF0IDIwIHBvbGxzLiAqL1xyXG4gIHByaXZhdGUgbWFuYWdlUG9sbGluZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHByb2Nlc3NpbmcgPSB0aGlzLmRvY3VtZW50cy5zb21lKChkKSA9PiBkLm9jclN0YXR1cyA9PT0gJ3Byb2Nlc3NpbmcnKTtcclxuICAgIGlmICghcHJvY2Vzc2luZykge1xyXG4gICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBvbGxTdWIpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnBvbGxTdWIgPSB0aW1lcihQT0xMX01TLCBQT0xMX01TKVxyXG4gICAgICAucGlwZSh0YWtlKE1BWF9QT0xMUyksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmxvYWQodHJ1ZSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9wUG9sbGluZygpOiB2b2lkIHtcclxuICAgIHRoaXMucG9sbFN1Yj8udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMucG9sbFN1YiA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0gcGFnaW5nIC0tLS0tLS0tLS1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdpbmF0aW9uLm9mZnNldCA9IE51bWJlcihwYWdlKTtcclxuICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5saW1pdCA9IE51bWJlcihzaXplKTtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5vZmZzZXQgPSAxO1xyXG4gICAgdGhpcy5zdG9wUG9sbGluZygpO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgfVxyXG5cclxuICBwYWdpbmF0aW9uU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvbi50b3RhbENvdW50IDwgMTAgPyB0aGlzLnBhZ2luYXRpb24udG90YWxDb3VudCA6IHRoaXMucGFnaW5hdGlvbi5saW1pdDtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0gYWN0aW9ucyAtLS0tLS0tLS0tXHJcblxyXG4gIGdvVG9Eb2N1bWVudHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9tYW5hZ2UvZG9jdW1lbnRzJ10sIHsgcXVlcnlQYXJhbXM6IHsgdGFiOiAnYnJhbmQnIH0gfSk7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbnMgdGhlIGZpbGUgaW4gYSBuZXcgdGFiLiBUaGUgdGFiIGlzIG9wZW5lZCBvbiB0aGUgY2xpY2sgaXRzZWxmIHNvIHBvcHVwIGJsb2NrZXJzIGFsbG93IGl0LiAqL1xyXG4gIG9wZW5Eb2N1bWVudChkb2M6IEJyYW5kRG9jdW1lbnRSb3cpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmJ1c3lJZCkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IHRhYiA9IHdpbmRvdy5vcGVuKCcnLCAnX2JsYW5rJyk7XHJcbiAgICBpZiAodGFiKSB7IHRhYi5vcGVuZXIgPSBudWxsOyB9XHJcbiAgICB0aGlzLmJ1c3lJZCA9IGRvYy5faWQ7XHJcbiAgICB0aGlzLmFwaVNlcnZpY2UuZ2V0RG9jdW1lbnRVcmwodGhpcy5jbGllbnRJZCwgZG9jLl9pZCwgZmFsc2UpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmJ1c3lJZCA9IG51bGw7XHJcbiAgICAgICAgICBjb25zdCB1cmwgPSByZXM/LmRhdGE/LnVybDtcclxuICAgICAgICAgIGlmICh1cmwgJiYgdGFiKSB7XHJcbiAgICAgICAgICAgIHRhYi5sb2NhdGlvbi5ocmVmID0gdXJsO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGFiPy5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBvcGVuIHRoZSBmaWxlJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmJ1c3lJZCA9IG51bGw7XHJcbiAgICAgICAgICB0YWI/LmNsb3NlKCk7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnQ291bGQgbm90IG9wZW4gdGhlIGZpbGUnKTtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFza3MgZm9yIGFuIGF0dGFjaG1lbnQgbGluayBzbyB0aGUgYnJvd3NlciBzYXZlcyB0aGUgZmlsZSBpbnN0ZWFkIG9mIG9wZW5pbmcgaXQuICovXHJcbiAgZG93bmxvYWREb2N1bWVudChkb2M6IEJyYW5kRG9jdW1lbnRSb3cpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmJ1c3lJZCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuYnVzeUlkID0gZG9jLl9pZDtcclxuICAgIHRoaXMuYXBpU2VydmljZS5nZXREb2N1bWVudFVybCh0aGlzLmNsaWVudElkLCBkb2MuX2lkLCB0cnVlKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5idXN5SWQgPSBudWxsO1xyXG4gICAgICAgICAgY29uc3QgdXJsID0gcmVzPy5kYXRhPy51cmw7XHJcbiAgICAgICAgICBpZiAodXJsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcclxuICAgICAgICAgICAgbGluay5yZWwgPSAnbm9vcGVuZXInO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgICAgICAgICBsaW5rLmNsaWNrKCk7XHJcbiAgICAgICAgICAgIGxpbmsucmVtb3ZlKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBkb3dubG9hZCB0aGUgZmlsZScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5idXN5SWQgPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0NvdWxkIG5vdCBkb3dubG9hZCB0aGUgZmlsZScpO1xyXG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tIGNlbGwgaGVscGVycyAtLS0tLS0tLS0tXHJcblxyXG4gIHRyYWNrQnlJZChfOiBudW1iZXIsIGRvYzogQnJhbmREb2N1bWVudFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZG9jLl9pZDtcclxuICB9XHJcblxyXG4gIGZpbGVLaW5kKGV4dDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IEZpbGVLaW5kIHtcclxuICAgIHN3aXRjaCAoKGV4dCB8fCAnJykudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdwZGYnOiByZXR1cm4gJ3BkZic7XHJcbiAgICAgIGNhc2UgJ2pwZyc6IGNhc2UgJ2pwZWcnOiBjYXNlICdwbmcnOiByZXR1cm4gJ2ltYWdlJztcclxuICAgICAgZGVmYXVsdDogcmV0dXJuICdvdGhlcic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3JtYXRGaWxlU2l6ZShieXRlczogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWJ5dGVzIHx8IGJ5dGVzIDw9IDApIHsgcmV0dXJuICctJzsgfVxyXG4gICAgaWYgKGJ5dGVzIDwgMTAyNCkgeyByZXR1cm4gYCR7Ynl0ZXN9IEJgOyB9XHJcbiAgICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgeyByZXR1cm4gYCR7TWF0aC5yb3VuZChieXRlcyAvIDEwMjQpfSBLQmA7IH1cclxuICAgIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpfSBNQmA7XHJcbiAgfVxyXG5cclxuICAvKiogV2hvbGUgZGF5cyBmcm9tIHRvZGF5IChsb2NhbCkgdG8gYSAnWVlZWS1NTS1ERCcgZGF0ZTsgbmVnYXRpdmUgd2hlbiBpbiB0aGUgcGFzdC4gKi9cclxuICBwcml2YXRlIGRheXNVbnRpbChkYXRlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAoIWRhdGUpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBEYXRlKGAke2RhdGUuc2xpY2UoMCwgMTApfVQwMDowMDowMGApO1xyXG4gICAgaWYgKGlzTmFOKHRhcmdldC5nZXRUaW1lKCkpKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuICAgIHJldHVybiBNYXRoLnJvdW5kKCh0YXJnZXQuZ2V0VGltZSgpIC0gdG9kYXkuZ2V0VGltZSgpKSAvIDg2NDAwMDAwKTtcclxuICB9XHJcblxyXG4gIC8qKiBTYW1lIHJ1bGUgYXMgdGhlIERvY3VtZW50cyBwYWdlIGJhZGdlIGFuZCB0aGUgbW9iaWxlIGxpc3QuICovXHJcbiAgc3RhdHVzT2YoZG9jOiBCcmFuZERvY3VtZW50Um93KTogRG9jdW1lbnRTdGF0dXMge1xyXG4gICAgaWYgKGRvYy5vY3JTdGF0dXMgPT09ICdwcm9jZXNzaW5nJykgeyByZXR1cm4gJ3Byb2Nlc3NpbmcnOyB9XHJcbiAgICBjb25zdCBkYXlzID0gdGhpcy5kYXlzVW50aWwoZG9jLmV4cGlyeURhdGUpO1xyXG4gICAgaWYgKGRheXMgPT09IG51bGwpIHsgcmV0dXJuICdub19leHBpcnknOyB9XHJcbiAgICBpZiAoZGF5cyA8IDApIHsgcmV0dXJuICdleHBpcmVkJzsgfVxyXG4gICAgaWYgKGRheXMgPD0gRVhQSVJZX1NPT05fREFZUykgeyByZXR1cm4gJ2V4cGlyaW5nX3Nvb24nOyB9XHJcbiAgICByZXR1cm4gJ3ZhbGlkJztcclxuICB9XHJcblxyXG4gIGV4cGlyeVRleHQoZG9jOiBCcmFuZERvY3VtZW50Um93KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRheXMgPSB0aGlzLmRheXNVbnRpbChkb2MuZXhwaXJ5RGF0ZSk7XHJcbiAgICBpZiAoZGF5cyA9PT0gbnVsbCkgeyByZXR1cm4gJ05vIHZhbGlkaXR5IGRhdGUnOyB9XHJcbiAgICBpZiAoZGF5cyA9PT0gMCkgeyByZXR1cm4gJ0V4cGlyZXMgdG9kYXknOyB9XHJcbiAgICBpZiAoZGF5cyA8IDApIHsgcmV0dXJuIGBFeHBpcmVkICR7TWF0aC5hYnMoZGF5cyl9IGRheSR7TWF0aC5hYnMoZGF5cykgPT09IDEgPyAnJyA6ICdzJ30gYWdvYDsgfVxyXG4gICAgcmV0dXJuIGAke2RheXN9IGRheSR7ZGF5cyA9PT0gMSA/ICcnIDogJ3MnfSBsZWZ0YDtcclxuICB9XHJcblxyXG4gIGlzRXhwaXJlZChkb2M6IEJyYW5kRG9jdW1lbnRSb3cpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGRheXMgPSB0aGlzLmRheXNVbnRpbChkb2MuZXhwaXJ5RGF0ZSk7XHJcbiAgICByZXR1cm4gZGF5cyAhPT0gbnVsbCAmJiBkYXlzIDwgMDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGljaCBzdG9yZXMgc2VlIHRoZSBmaWxlOiBhbGwgb2YgdGhlbSwgb3IgdGhlIGNob3NlbiBmZXcuICovXHJcbiAgc2hhcmVkVGV4dChkb2M6IEJyYW5kRG9jdW1lbnRSb3cpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IGRvYy5zdG9yZUlkcz8ubGVuZ3RoIHx8IDA7XHJcbiAgICByZXR1cm4gbiA/IGAke259IHN0b3JlJHtuID09PSAxID8gJycgOiAncyd9YCA6ICdBbGwgc3RvcmVzJztcclxuICB9XHJcblxyXG4gIHNoYXJlZFRvb2x0aXAoZG9jOiBCcmFuZERvY3VtZW50Um93KTogc3RyaW5nIHtcclxuICAgIGlmICghZG9jLnN0b3JlSWRzPy5sZW5ndGgpIHsgcmV0dXJuICcnOyB9XHJcbiAgICBjb25zdCBuYW1lcyA9IGRvYy5zdG9yZU5hbWVzPy5sZW5ndGggPyBkb2Muc3RvcmVOYW1lcyA6IGRvYy5zdG9yZUlkcztcclxuICAgIHJldHVybiBuYW1lcy5zbGljZSgwLCAxNSkuam9pbignLCAnKSArIChuYW1lcy5sZW5ndGggPiAxNSA/IGAgKyR7bmFtZXMubGVuZ3RoIC0gMTV9IG1vcmVgIDogJycpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2ICpuZ0lmPVwiY2FuVmlld1wiIGNsYXNzPVwiZG9jdW1lbnRzLWNhcmRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnQgZmxleC13cmFwIGdhcC0zIG1iLTZcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+QnJhbmQgZG9jdW1lbnRzIDxzcGFuICpuZ0lmPVwiY29uZmlndXJlZCAmJiAhbG9hZGluZ1wiIGNsYXNzPVwiYmx1ZS1iYWRnZSBtcy0yXCI+e3sgcGFnaW5hdGlvbi50b3RhbENvdW50IH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRleHRcIj5GaWxlcyB1cGxvYWRlZCBhdCBicmFuZCBsZXZlbCBhbmQgc2hhcmVkIHdpdGggc3RvcmVzLiBVcGxvYWQgYW5kIGVkaXQgdGhlbSBvbiB0aGUgRG9jdW1lbnRzIHBhZ2UuPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1zaHJpbmstMFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZ29Ub0RvY3VtZW50cygpXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgcm91bmRlZC0zIHRvb2xiYXItY29udHJvbCB0b29sYmFyLWNvbnRyb2wtLXByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPk9wZW4gRG9jdW1lbnRzPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03IDE3IDE3IDdNOCA3aDl2OVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIiFjb25maWd1cmVkXCIgY2xhc3M9XCJlbXB0eS1zdGF0ZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN1YlwiPkRvY3VtZW50cyBBUEkgVVJMIGlzIG5vdCBjb25maWd1cmVkLjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpZ3VyZWRcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcgJiYgIW5vRGF0YVwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBib3R0b20tYm9yZGVyIHRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+RG9jdW1lbnQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+RG9jdW1lbnQgSUQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+VHlwZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BdmFpbGFibGUgdG88L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+VmFsaWQgdGlsbDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TdGF0dXM8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+VXBsb2FkZWQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+QWN0aW9uczwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkb2Mgb2YgZG9jdW1lbnRzOyB0cmFja0J5OiB0cmFja0J5SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtYmFkZ2UgZmlsZS1iYWRnZS0te3sgZmlsZUtpbmQoZG9jLmV4dGVuc2lvbikgfX1cIj57eyBkb2MuZXh0ZW5zaW9uIHx8ICdmaWxlJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXMtMyBmaWxlLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlIHRleHQtdHJ1bmNhdGVcIiBbbmdiVG9vbHRpcF09XCJkb2MuZmlsZU5hbWVcIiBjb250YWluZXI9XCJib2R5XCI+e3sgZG9jLmZpbGVOYW1lIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1zdWJcIj57eyBmb3JtYXRGaWxlU2l6ZShkb2MuZmlsZVNpemUpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxzcGFuIGNsYXNzPVwiZG9jLWNvZGVcIj57eyBkb2MuZG9jdW1lbnRDb2RlIHx8ICctJyB9fTwvc3Bhbj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZG9jLm9jclN0YXR1cyA9PT0gJ3Byb2Nlc3NpbmcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXN1YlwiPjxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gbWUtMlwiIHJvbGU9XCJzdGF0dXNcIj48L3NwYW4+RGV0ZWN0aW5nLi4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZG9jLm9jclN0YXR1cyA9PT0gJ2ZhaWxlZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc3ViXCI+e3sgZG9jLnR5cGUgfHwgJ05vdCBkZXRlY3RlZCcgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkb2Mub2NyU3RhdHVzID09PSAnZG9uZSdcIj57eyBkb2MudHlwZSB8fCAnLScgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiZG9jLnN0b3JlSWRzPy5sZW5ndGggPyAnZ3JheS1iYWRnZScgOiAnYmx1ZS1iYWRnZSdcIiBbbmdiVG9vbHRpcF09XCJzaGFyZWRUb29sdGlwKGRvYylcIiBjb250YWluZXI9XCJib2R5XCI+e3sgc2hhcmVkVGV4dChkb2MpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZG9jLm9jclN0YXR1cyA9PT0gJ3Byb2Nlc3NpbmcnOyBlbHNlIGV4cGlyeUNlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc3ViXCI+RGV0ZWN0aW5nLi4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2V4cGlyeUNlbGw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRvYy5leHBpcnlEYXRlOyBlbHNlIG5vRXhwaXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7IGRvYy5leHBpcnlEYXRlIHwgY3VzdG9tRGF0ZUZvcm1hdCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtc3ViXCIgW2NsYXNzLnRleHQtZGFuZ2VyXT1cImlzRXhwaXJlZChkb2MpXCI+e3sgZXhwaXJ5VGV4dChkb2MpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0V4cGlyeT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+Tm8gZXhwaXJ5PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1zdWJcIj5ObyB2YWxpZGl0eSBkYXRlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBbbmdDbGFzc109XCJzdGF0dXNCYWRnZVtzdGF0dXNPZihkb2MpXVwiPnt7IHN0YXR1c0xhYmVsc1tzdGF0dXNPZihkb2MpXSB9fTwvc3Bhbj48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBkb2MuY3JlYXRlZEF0IHwgY3VzdG9tRGF0ZUZvcm1hdCB9fTwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYWN0aW9uLWljb25cIiBbY2xhc3MuYWN0aW9uLWljb24tLWJ1c3ldPVwiYnVzeUlkID09PSBkb2MuX2lkXCIgbmdiVG9vbHRpcD1cIlZpZXdcIiBjb250YWluZXI9XCJib2R5XCIgKGNsaWNrKT1cIm9wZW5Eb2N1bWVudChkb2MpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPjxwYXRoIGQ9XCJNMi4wMzYgMTIuMzIyYTEuMDEyIDEuMDEyIDAgMCAxIDAtLjYzOUMzLjQyMyA3LjUxIDcuMzYgNC41IDEyIDQuNWM0LjYzOCAwIDguNTczIDMuMDA3IDkuOTYzIDcuMTc4LjA3LjIwNy4wNy40MzEgMCAuNjM5QzIwLjU3NyAxNi40OSAxNi42NCAxOS41IDEyIDE5LjVjLTQuNjM4IDAtOC41NzMtMy4wMDctOS45NjMtNy4xNzhaXCIgc3Ryb2tlLXdpZHRoPVwiMS43XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjxwYXRoIGQ9XCJNMTUgMTJhMyAzIDAgMSAxLTYgMCAzIDMgMCAwIDEgNiAwWlwiIHN0cm9rZS13aWR0aD1cIjEuN1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhY3Rpb24taWNvblwiIFtjbGFzcy5hY3Rpb24taWNvbi0tYnVzeV09XCJidXN5SWQgPT09IGRvYy5faWRcIiBuZ2JUb29sdGlwPVwiRG93bmxvYWRcIiBjb250YWluZXI9XCJib2R5XCIgKGNsaWNrKT1cImRvd25sb2FkRG9jdW1lbnQoZG9jKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTMgMTYuNXYyLjI1QTIuMjUgMi4yNSAwIDAgMCA1LjI1IDIxaDEzLjVBMi4yNSAyLjI1IDAgMCAwIDIxIDE4Ljc1VjE2LjVNMTYuNSAxMiAxMiAxNi41bTAgMEw3LjUgMTJtNC41IDQuNVYzXCIgc3Ryb2tlLXdpZHRoPVwiMS43XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcgJiYgIW5vRGF0YVwiIGNsYXNzPVwibXQtNlwiPlxyXG4gICAgICAgICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJwYWdpbmF0aW9uLmxpbWl0XCIgW2N1cnJlbnRQYWdlXT1cInBhZ2luYXRpb24ub2Zmc2V0XCIgW3RvdGFsSXRlbXNdPVwicGFnaW5hdGlvbi50b3RhbENvdW50XCJcclxuICAgICAgICAgICAgICAgIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2luYXRpb25TaXplKClcIlxyXG4gICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIiAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiBub0RhdGFcIiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XHJcbiAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zdWIgbXQtM1wiPk5vIGJyYW5kIGRvY3VtZW50cyB1cGxvYWRlZCB5ZXQ8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuIl19
368
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhbmQtZG9jdW1lbnRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1zZXR0aW5ncy9zcmMvbGliL2NvbXBvbmVudHMvZG9jdW1lbnRzL2JyYW5kLWRvY3VtZW50cy9icmFuZC1kb2N1bWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLXNldHRpbmdzL3NyYy9saWIvY29tcG9uZW50cy9kb2N1bWVudHMvYnJhbmQtZG9jdW1lbnRzL2JyYW5kLWRvY3VtZW50cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7OztBQTBCbkcsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBSWhDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQztBQUN0QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFckI7Ozs7R0FJRztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUFtQ3hCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUF0Q1YsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2QsU0FBUyxHQUF1QixFQUFFLENBQUM7SUFDbkMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2YsVUFBVSxHQUFHLElBQUksQ0FBQztJQUNsQixVQUFVLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3JELFVBQVUsR0FBNEIsV0FBVyxDQUFDO0lBQ2xELGFBQWEsR0FBVyxDQUFDLENBQUMsQ0FBQztJQUMzQixlQUFlLEdBQWEsVUFBVSxDQUFDO0lBQ3ZDLG1GQUFtRjtJQUNuRixNQUFNLEdBQWtCLElBQUksQ0FBQztJQUVwQixZQUFZLEdBQW1DO1FBQ3RELFVBQVUsRUFBRSxZQUFZO1FBQ3hCLEtBQUssRUFBRSxPQUFPO1FBQ2QsYUFBYSxFQUFFLGVBQWU7UUFDOUIsT0FBTyxFQUFFLFNBQVM7UUFDbEIsU0FBUyxFQUFFLFdBQVc7S0FDdkIsQ0FBQztJQUNPLFdBQVcsR0FBbUM7UUFDckQsVUFBVSxFQUFFLFlBQVk7UUFDeEIsS0FBSyxFQUFFLGFBQWE7UUFDcEIsYUFBYSxFQUFFLGNBQWM7UUFDN0IsT0FBTyxFQUFFLFdBQVc7UUFDcEIsU0FBUyxFQUFFLFlBQVk7S0FDeEIsQ0FBQztJQUVNLE9BQU8sQ0FBZ0I7SUFDdkIsU0FBUyxDQUFnQjtJQUNoQixPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztJQUNqQyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVoRCxZQUNVLFVBQTRCLEVBQzVCLEVBQXNCLEVBQ3RCLEtBQW1CLEVBQ25CLE1BQWMsRUFDZCxFQUFxQjtRQUpyQixlQUFVLEdBQVYsVUFBVSxDQUFrQjtRQUM1QixPQUFFLEdBQUYsRUFBRSxDQUFvQjtRQUN0QixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUU3QiwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDekI7WUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDMUQsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQzNDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxDQUFDO2dCQUNqRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtZQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN4QixPQUFPO2FBQ1I7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDekQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQztRQUN4RCxzRkFBc0Y7UUFDdEYsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUMxRSxNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsc0JBQXNCLEtBQUssSUFBSSxDQUFDO1lBQ3hELElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQUUsT0FBTzthQUFFO1lBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNwQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsd0ZBQXdGO0lBQ2hGLFdBQVc7UUFDakIsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTthQUN0QyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3JDLG9CQUFvQixFQUFFLEVBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCO2FBQ0EsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCw2RUFBNkU7SUFDckUsZUFBZSxDQUFDLFlBQXVDO1FBQzdELElBQUksSUFBSSxHQUFRLEVBQUUsQ0FBQztRQUNuQixJQUFJO1lBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztTQUFFO1FBQUMsTUFBTTtZQUFFLElBQUksR0FBRyxFQUFFLENBQUM7U0FBRTtRQUMxRixJQUFJLElBQUksRUFBRSxRQUFRLEtBQUssUUFBUSxJQUFJLElBQUksRUFBRSxRQUFRLEVBQUU7WUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FBRTtRQUNwRixPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVPLFVBQVU7UUFDaEIsT0FBTztZQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixLQUFLLEVBQUUsT0FBTztZQUNkLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDMUIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTTtZQUM5QixLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO1NBQzdCLENBQUM7SUFDSixDQUFDO0lBRUQsNkJBQTZCO0lBRTdCLHFJQUFxSTtJQUNySSxNQUFNLENBQUMsTUFBK0I7UUFDcEMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hEO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztZQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztTQUN4QjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSztRQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsMkNBQTJDO0lBRTNDLCtGQUErRjtJQUN2RixhQUFhO1FBQ25CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7YUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQy9DLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLFdBQVc7UUFDakIsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBRUQsK0JBQStCO0lBRS9CLFlBQVksQ0FBQyxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVk7UUFDM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQzlGLENBQUM7SUFFRCxnQ0FBZ0M7SUFFaEMsYUFBYTtRQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELHFHQUFxRztJQUNyRyxZQUFZLENBQUMsR0FBcUI7UUFDaEMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzVCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLElBQUksR0FBRyxFQUFFO1lBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FBRTtRQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQzthQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ25CLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDO2dCQUMzQixJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7b0JBQ2QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2lCQUN6QjtxQkFBTTtvQkFDTCxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7b0JBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztpQkFDckQ7Z0JBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ25CLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO2dCQUNoRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsdUZBQXVGO0lBQ3ZGLGdCQUFnQixDQUFDLEdBQXFCO1FBQ3BDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUFFLE9BQU87U0FBRTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQzthQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUM7WUFDVCxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ25CLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDO2dCQUMzQixJQUFJLEdBQUcsRUFBRTtvQkFDUCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUM7b0JBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2lCQUNmO3FCQUFNO29CQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQUM7aUJBQ3pEO2dCQUNELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSw2QkFBNkIsQ0FBQyxDQUFDO2dCQUNwRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzFCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQscUNBQXFDO0lBRXJDLFNBQVMsQ0FBQyxDQUFTLEVBQUUsR0FBcUI7UUFDeEMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBOEI7UUFDckMsUUFBUSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNqQyxLQUFLLEtBQUssQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDO1lBQ3pCLEtBQUssS0FBSyxDQUFDO1lBQUMsS0FBSyxNQUFNLENBQUM7WUFBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFnQztRQUM3QyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPLEdBQUcsQ0FBQztTQUFFO1FBQ3pDLElBQUksS0FBSyxHQUFHLElBQUksRUFBRTtZQUFFLE9BQU8sR0FBRyxLQUFLLElBQUksQ0FBQztTQUFFO1FBQzFDLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUU7WUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUFFO1FBQ3JFLE9BQU8sR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3BELENBQUM7SUFFRCx1RkFBdUY7SUFDL0UsU0FBUyxDQUFDLElBQStCO1FBQy9DLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztTQUFFO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7U0FBRTtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsUUFBUSxDQUFDLEdBQXFCO1FBQzVCLElBQUksR0FBRyxDQUFDLFNBQVMsS0FBSyxZQUFZLEVBQUU7WUFBRSxPQUFPLFlBQVksQ0FBQztTQUFFO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUFFLE9BQU8sV0FBVyxDQUFDO1NBQUU7UUFDMUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUM7U0FBRTtRQUNuQyxJQUFJLElBQUksSUFBSSxnQkFBZ0IsRUFBRTtZQUFFLE9BQU8sZUFBZSxDQUFDO1NBQUU7UUFDekQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFxQjtRQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFBRSxPQUFPLGtCQUFrQixDQUFDO1NBQUU7UUFDakQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTyxlQUFlLENBQUM7U0FBRTtRQUMzQyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7WUFBRSxPQUFPLFdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztTQUFFO1FBQy9GLE9BQU8sR0FBRyxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztJQUNwRCxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQXFCO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxpRUFBaUU7SUFDakUsVUFBVSxDQUFDLEdBQXFCO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNwQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBQzlELENBQUM7SUFFRCxhQUFhLENBQUMsR0FBcUI7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7U0FBRTtRQUN6QyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNyRSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7d0dBelVVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDJEQy9DcEMsbzJSQWdJQTs7NEZEakZhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXAsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XG5pbXBvcnQgeyBDbGllbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2xpZW50LWFwaS5zZXJ2aWNlJztcblxudHlwZSBEb2N1bWVudFN0YXR1cyA9ICdwcm9jZXNzaW5nJyB8ICd2YWxpZCcgfCAnZXhwaXJpbmdfc29vbicgfCAnZXhwaXJlZCcgfCAnbm9fZXhwaXJ5JztcbnR5cGUgRmlsZUtpbmQgPSAncGRmJyB8ICdpbWFnZScgfCAnb3RoZXInO1xuXG4vKiogUm93IHNoYXBlIG9mIFBPU1QgL2RvY3VtZW50L2xpc3QsIGxpbWl0ZWQgdG8gd2hhdCB0aGlzIHRhYmxlIHNob3dzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmFuZERvY3VtZW50Um93IHtcbiAgX2lkOiBzdHJpbmc7XG4gIGRvY3VtZW50Q29kZT86IHN0cmluZyB8IG51bGw7XG4gIHNjb3BlOiAnYnJhbmQnIHwgJ3N0b3JlJztcbiAgc3RvcmVJZHM6IHN0cmluZ1tdOyAgICAgICAgICAvLyBbXSA9IGV2ZXJ5IHN0b3JlIG9mIHRoZSBicmFuZCwgaW5jbHVkaW5nIHN0b3JlcyBhZGRlZCBsYXRlclxuICBzdG9yZU5hbWVzPzogc3RyaW5nW107XG4gIGZpbGVOYW1lOiBzdHJpbmc7XG4gIGZpbGVTaXplOiBudW1iZXI7XG4gIGV4dGVuc2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgZXhwaXJ5RGF0ZTogc3RyaW5nIHwgbnVsbDsgICAvLyAnWVlZWS1NTS1ERCdcbiAgb2NyU3RhdHVzOiAncHJvY2Vzc2luZycgfCAnZG9uZScgfCAnZmFpbGVkJztcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIHVwbG9hZGVkQnk/OiB7IHVzZXJJZD86IHN0cmluZzsgbmFtZT86IHN0cmluZyB9O1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbn1cblxuY29uc3QgUEFHRV9TSVpFUyA9IFsxMCwgMjAsIDMwXTtcblxuLy8gQ29sdW1ucyB0aGUgZG9jdW1lbnRzIEFQSSBjYW4gc29ydCBieSBvbiB0aGlzIHRhYmxlICgnc3RhdHVzJyBpcyBjb21wdXRlZCBieSB0aGUgQVBJKS5cbmV4cG9ydCB0eXBlIEJyYW5kRG9jdW1lbnRTb3J0Q29sdW1uID0gJ2ZpbGVOYW1lJyB8ICd0eXBlJyB8ICdjcmVhdGVkQXQnIHwgJ2V4cGlyeURhdGUnIHwgJ3N0YXR1cyc7XG5jb25zdCBFWFBJUllfU09PTl9EQVlTID0gMzA7XG5jb25zdCBQT0xMX01TID0gMTUwMDA7XG5jb25zdCBNQVhfUE9MTFMgPSAyMDtcblxuLyoqXG4gKiBSZWFkLW9ubHkgbGlzdCBvZiB0aGUgYnJhbmQtbGV2ZWwgZG9jdW1lbnRzIG9mIHRoZSBzZWxlY3RlZCBicmFuZCwgc2hvd24gdW5kZXIgdGhlIEtZQyBjYXJkIG9uXG4gKiBTZXR0aW5ncyA+IERvY3VtZW50cy4gU2FtZSBsaXN0IGVuZHBvaW50IGFuZCBzdGF0dXMgcnVsZSBhcyB0aGUgRG9jdW1lbnRzIHBhZ2U7IHVwbG9hZGluZyBhbmRcbiAqIGVkaXRpbmcgc3RheSBvbiB0aGF0IHBhZ2UuIFNob3duIG9ubHkgd2l0aCB0aGUgR2xvYmFsID4gRG9jdW1lbnRzIFZpZXcgcGVybWlzc2lvbi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJyYW5kLWRvY3VtZW50cycsXG4gIHRlbXBsYXRlVXJsOiAnLi9icmFuZC1kb2N1bWVudHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYnJhbmQtZG9jdW1lbnRzLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQnJhbmREb2N1bWVudHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGNhblZpZXcgPSBmYWxzZTtcbiAgY2xpZW50SWQgPSAnJztcbiAgZG9jdW1lbnRzOiBCcmFuZERvY3VtZW50Um93W10gPSBbXTtcbiAgbG9hZGluZyA9IGZhbHNlO1xuICBub0RhdGEgPSBmYWxzZTtcbiAgY29uZmlndXJlZCA9IHRydWU7XG4gIHBhZ2luYXRpb24gPSB7IG9mZnNldDogMSwgbGltaXQ6IDEwLCB0b3RhbENvdW50OiAwIH07XG4gIHNvcnRDb2x1bW46IEJyYW5kRG9jdW1lbnRTb3J0Q29sdW1uID0gJ2NyZWF0ZWRBdCc7XG4gIHNvcnREaXJlY3Rpb246IDEgfCAtMSA9IC0xO1xuICBwYWdpbmF0aW9uU2l6ZXM6IG51bWJlcltdID0gUEFHRV9TSVpFUztcbiAgLyoqIFJvdyB3aG9zZSBzaWduZWQgbGluayBpcyBiZWluZyBwcmVwYXJlZDsgaXRzIGFjdGlvbnMgYXJlIGRpc2FibGVkIG1lYW53aGlsZS4gKi9cbiAgYnVzeUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICByZWFkb25seSBzdGF0dXNMYWJlbHM6IFJlY29yZDxEb2N1bWVudFN0YXR1cywgc3RyaW5nPiA9IHtcbiAgICBwcm9jZXNzaW5nOiAnUHJvY2Vzc2luZycsXG4gICAgdmFsaWQ6ICdWYWxpZCcsXG4gICAgZXhwaXJpbmdfc29vbjogJ0V4cGlyaW5nIHNvb24nLFxuICAgIGV4cGlyZWQ6ICdFeHBpcmVkJyxcbiAgICBub19leHBpcnk6ICdObyBleHBpcnknLFxuICB9O1xuICByZWFkb25seSBzdGF0dXNCYWRnZTogUmVjb3JkPERvY3VtZW50U3RhdHVzLCBzdHJpbmc+ID0ge1xuICAgIHByb2Nlc3Npbmc6ICdibHVlLWJhZGdlJyxcbiAgICB2YWxpZDogJ2dyZWVuLWJhZGdlJyxcbiAgICBleHBpcmluZ19zb29uOiAneWVsbG93LWJhZGdlJyxcbiAgICBleHBpcmVkOiAncmVkLWJhZGdlJyxcbiAgICBub19leHBpcnk6ICdncmF5LWJhZGdlJyxcbiAgfTtcblxuICBwcml2YXRlIHBvbGxTdWI/OiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgY2xpZW50U3ViPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbG9hZCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFwaVNlcnZpY2U6IENsaWVudEFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICAvLyBPbmUgcGlwZWxpbmUsIHNvIGJyYW5kLCBwYWdpbmcgYW5kIHBvbGwgdHJpZ2dlcnMgbmV2ZXIgcmFjZSBlYWNoIG90aGVyLlxuICAgIHRoaXMucmVsb2FkJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKChzaWxlbnQpID0+IHtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIHRoaXMubm9EYXRhID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5saXN0RG9jdW1lbnRzKHRoaXMuYnVpbGRRdWVyeSgpKS5waXBlKFxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+ICh7IHJlcywgZmFpbGVkOiBmYWxzZSB9KSksXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnQ291bGQgbm90IGxvYWQgZG9jdW1lbnRzJyk7XG4gICAgICAgICAgICByZXR1cm4gb2YoeyByZXM6IG51bGwsIGZhaWxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICkuc3Vic2NyaWJlKCh7IHJlcywgZmFpbGVkIH0pID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgaWYgKGZhaWxlZCB8fCAhcmVzIHx8IHJlcy5jb2RlICE9PSAyMDApIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5ub0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5kb2N1bWVudHMgPSByZXMuZGF0YT8ucmVzdWx0IHx8IFtdO1xuICAgICAgY29uc3QgY291bnQgPSByZXMuZGF0YT8uY291bnQgfHwgMDtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCB0b3RhbENvdW50OiBjb3VudCB9O1xuICAgICAgdGhpcy5wYWdpbmF0aW9uU2l6ZXMgPSBjb3VudCA8IDEwID8gW2NvdW50XSA6IFBBR0VfU0laRVM7XG4gICAgICB0aGlzLm5vRGF0YSA9IHRoaXMuZG9jdW1lbnRzLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5tYW5hZ2VQb2xsaW5nKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ3VyZWQgPSB0aGlzLmFwaVNlcnZpY2UuaXNEb2N1bWVudHNDb25maWd1cmVkO1xuICAgIC8vIEFjY2VzcyBpcyB0aGUgR2xvYmFsID4gRG9jdW1lbnRzIFZpZXcgcGVybWlzc2lvbjsgaXQgYXJyaXZlcyB3aXRoIHRoZSBwcm9maWxlIGNhbGwuXG4gICAgdGhpcy5ncy51c2VyQWNjZXNzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGFjY2VzczogYW55KSA9PiB7XG4gICAgICBjb25zdCBjYW5WaWV3ID0gYWNjZXNzPy5HbG9iYWxfRG9jdW1lbnRzX2lzQWRkID09PSB0cnVlO1xuICAgICAgaWYgKGNhblZpZXcgPT09IHRoaXMuY2FuVmlldykgeyByZXR1cm47IH1cbiAgICAgIHRoaXMuY2FuVmlldyA9IGNhblZpZXc7XG4gICAgICBpZiAoY2FuVmlldykge1xuICAgICAgICB0aGlzLndhdGNoQ2xpZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgICAgIHRoaXMuY2xpZW50U3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmNsaWVudFN1YiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2VsZWN0ZWQgYnJhbmQ6IGhlYWRlciBkcm9wZG93biBmb3IgdGFuZ28gdXNlcnMsIG93biBjbGllbnQgZm9yIGNsaWVudCB1c2Vycy4gKi9cbiAgcHJpdmF0ZSB3YXRjaENsaWVudCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWVudFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNsaWVudFN1YiA9IHRoaXMuYXBpU2VydmljZS5jbGllbnRJZFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoaWQpID0+IHRoaXMucmVzb2x2ZUNsaWVudElkKGlkKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGNsaWVudElkKSA9PiB7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcbiAgICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJlZCB8fCAhY2xpZW50SWQpIHtcbiAgICAgICAgICB0aGlzLmRvY3VtZW50cyA9IFtdO1xuICAgICAgICAgIHRoaXMubm9EYXRhID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uLm9mZnNldCA9IDE7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKiogQ2xpZW50IHVzZXJzIGFsd2F5cyBxdWVyeSB0aGVpciBvd24gY2xpZW50LCB3aGF0ZXZlciB0aGUgaGVhZGVyIGhvbGRzLiAqL1xuICBwcml2YXRlIHJlc29sdmVDbGllbnRJZChoZWFkZXJDbGllbnQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGxldCB1c2VyOiBhbnkgPSB7fTtcbiAgICB0cnkgeyB1c2VyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7IH0gY2F0Y2ggeyB1c2VyID0ge307IH1cbiAgICBpZiAodXNlcj8udXNlclR5cGUgPT09ICdjbGllbnQnICYmIHVzZXI/LmNsaWVudElkKSB7IHJldHVybiBTdHJpbmcodXNlci5jbGllbnRJZCk7IH1cbiAgICByZXR1cm4gaGVhZGVyQ2xpZW50ID8gU3RyaW5nKGhlYWRlckNsaWVudCkgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRRdWVyeSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgc2NvcGU6ICdicmFuZCcsXG4gICAgICBzb3J0Q29sdW1uOiB0aGlzLnNvcnRDb2x1bW4sXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydERpcmVjdGlvbixcbiAgICAgIG9mZnNldDogdGhpcy5wYWdpbmF0aW9uLm9mZnNldCxcbiAgICAgIGxpbWl0OiB0aGlzLnBhZ2luYXRpb24ubGltaXQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gc29ydCAtLS0tLS0tLS0tXG5cbiAgLyoqIFNhbWUgYmVoYXZpb3VyIGFzIHRoZSBEb2N1bWVudHMgcGFnZTogYSBuZXcgY29sdW1uIHNvcnRzIGFzY2VuZGluZywgdGhlIHNhbWUgY29sdW1uIGZsaXBzLiBTb3J0ZWQgYnkgdGhlIEFQSSBhY3Jvc3MgYWxsIHBhZ2VzLiAqL1xuICBvblNvcnQoY29sdW1uOiBCcmFuZERvY3VtZW50U29ydENvbHVtbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNvcnRDb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gdGhpcy5zb3J0RGlyZWN0aW9uID09PSAxID8gLTEgOiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRDb2x1bW4gPSBjb2x1bW47XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSAxO1xuICAgIH1cbiAgICB0aGlzLnBhZ2luYXRpb24ub2Zmc2V0ID0gMTtcbiAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICBsb2FkKHNpbGVudCA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5yZWxvYWQkLm5leHQoc2lsZW50KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gcHJvY2Vzc2luZyByZWZyZXNoIC0tLS0tLS0tLS1cblxuICAvKiogV2hpbGUgYW55IHJvdyBpcyBzdGlsbCBiZWluZyBwcm9jZXNzZWQsIHNpbGVudGx5IHJlZnJlc2ggZXZlcnkgMTUgcywgY2FwcGVkIGF0IDIwIHBvbGxzLiAqL1xuICBwcml2YXRlIG1hbmFnZVBvbGxpbmcoKTogdm9pZCB7XG4gICAgY29uc3QgcHJvY2Vzc2luZyA9IHRoaXMuZG9jdW1lbnRzLnNvbWUoKGQpID0+IGQub2NyU3RhdHVzID09PSAncHJvY2Vzc2luZycpO1xuICAgIGlmICghcHJvY2Vzc2luZykge1xuICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wb2xsU3ViKSB7IHJldHVybjsgfVxuICAgIHRoaXMucG9sbFN1YiA9IHRpbWVyKFBPTExfTVMsIFBPTExfTVMpXG4gICAgICAucGlwZSh0YWtlKE1BWF9QT0xMUyksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5sb2FkKHRydWUpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFBvbGxpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5wb2xsU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucG9sbFN1YiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0gcGFnaW5nIC0tLS0tLS0tLS1cblxuICBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5wYWdpbmF0aW9uLm9mZnNldCA9IE51bWJlcihwYWdlKTtcbiAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICBvblBhZ2VTaXplQ2hhbmdlKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvbi5saW1pdCA9IE51bWJlcihzaXplKTtcbiAgICB0aGlzLnBhZ2luYXRpb24ub2Zmc2V0ID0gMTtcbiAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICBwYWdpbmF0aW9uU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb24udG90YWxDb3VudCA8IDEwID8gdGhpcy5wYWdpbmF0aW9uLnRvdGFsQ291bnQgOiB0aGlzLnBhZ2luYXRpb24ubGltaXQ7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tIGFjdGlvbnMgLS0tLS0tLS0tLVxuXG4gIGdvVG9Eb2N1bWVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbWFuYWdlL2RvY3VtZW50cyddLCB7IHF1ZXJ5UGFyYW1zOiB7IHRhYjogJ2JyYW5kJyB9IH0pO1xuICB9XG5cbiAgLyoqIE9wZW5zIHRoZSBmaWxlIGluIGEgbmV3IHRhYi4gVGhlIHRhYiBpcyBvcGVuZWQgb24gdGhlIGNsaWNrIGl0c2VsZiBzbyBwb3B1cCBibG9ja2VycyBhbGxvdyBpdC4gKi9cbiAgb3BlbkRvY3VtZW50KGRvYzogQnJhbmREb2N1bWVudFJvdyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJ1c3lJZCkgeyByZXR1cm47IH1cbiAgICBjb25zdCB0YWIgPSB3aW5kb3cub3BlbignJywgJ19ibGFuaycpO1xuICAgIGlmICh0YWIpIHsgdGFiLm9wZW5lciA9IG51bGw7IH1cbiAgICB0aGlzLmJ1c3lJZCA9IGRvYy5faWQ7XG4gICAgdGhpcy5hcGlTZXJ2aWNlLmdldERvY3VtZW50VXJsKHRoaXMuY2xpZW50SWQsIGRvYy5faWQsIGZhbHNlKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuYnVzeUlkID0gbnVsbDtcbiAgICAgICAgICBjb25zdCB1cmwgPSByZXM/LmRhdGE/LnVybDtcbiAgICAgICAgICBpZiAodXJsICYmIHRhYikge1xuICAgICAgICAgICAgdGFiLmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhYj8uY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQ291bGQgbm90IG9wZW4gdGhlIGZpbGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5idXN5SWQgPSBudWxsO1xuICAgICAgICAgIHRhYj8uY2xvc2UoKTtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8uZXJyb3IgfHwgZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnQ291bGQgbm90IG9wZW4gdGhlIGZpbGUnKTtcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqIEFza3MgZm9yIGFuIGF0dGFjaG1lbnQgbGluayBzbyB0aGUgYnJvd3NlciBzYXZlcyB0aGUgZmlsZSBpbnN0ZWFkIG9mIG9wZW5pbmcgaXQuICovXG4gIGRvd25sb2FkRG9jdW1lbnQoZG9jOiBCcmFuZERvY3VtZW50Um93KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYnVzeUlkKSB7IHJldHVybjsgfVxuICAgIHRoaXMuYnVzeUlkID0gZG9jLl9pZDtcbiAgICB0aGlzLmFwaVNlcnZpY2UuZ2V0RG9jdW1lbnRVcmwodGhpcy5jbGllbnRJZCwgZG9jLl9pZCwgdHJ1ZSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmJ1c3lJZCA9IG51bGw7XG4gICAgICAgICAgY29uc3QgdXJsID0gcmVzPy5kYXRhPy51cmw7XG4gICAgICAgICAgaWYgKHVybCkge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICAgIGxpbmsucmVsID0gJ25vb3BlbmVyJztcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgICAgICBsaW5rLnJlbW92ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0NvdWxkIG5vdCBkb3dubG9hZCB0aGUgZmlsZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLmJ1c3lJZCA9IG51bGw7XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/LmVycm9yIHx8IGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0NvdWxkIG5vdCBkb3dubG9hZCB0aGUgZmlsZScpO1xuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tIGNlbGwgaGVscGVycyAtLS0tLS0tLS0tXG5cbiAgdHJhY2tCeUlkKF86IG51bWJlciwgZG9jOiBCcmFuZERvY3VtZW50Um93KTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9jLl9pZDtcbiAgfVxuXG4gIGZpbGVLaW5kKGV4dDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IEZpbGVLaW5kIHtcbiAgICBzd2l0Y2ggKChleHQgfHwgJycpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ3BkZic6IHJldHVybiAncGRmJztcbiAgICAgIGNhc2UgJ2pwZyc6IGNhc2UgJ2pwZWcnOiBjYXNlICdwbmcnOiByZXR1cm4gJ2ltYWdlJztcbiAgICAgIGRlZmF1bHQ6IHJldHVybiAnb3RoZXInO1xuICAgIH1cbiAgfVxuXG4gIGZvcm1hdEZpbGVTaXplKGJ5dGVzOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIWJ5dGVzIHx8IGJ5dGVzIDw9IDApIHsgcmV0dXJuICctJzsgfVxuICAgIGlmIChieXRlcyA8IDEwMjQpIHsgcmV0dXJuIGAke2J5dGVzfSBCYDsgfVxuICAgIGlmIChieXRlcyA8IDEwMjQgKiAxMDI0KSB7IHJldHVybiBgJHtNYXRoLnJvdW5kKGJ5dGVzIC8gMTAyNCl9IEtCYDsgfVxuICAgIHJldHVybiBgJHsoYnl0ZXMgLyAoMTAyNCAqIDEwMjQpKS50b0ZpeGVkKDEpfSBNQmA7XG4gIH1cblxuICAvKiogV2hvbGUgZGF5cyBmcm9tIHRvZGF5IChsb2NhbCkgdG8gYSAnWVlZWS1NTS1ERCcgZGF0ZTsgbmVnYXRpdmUgd2hlbiBpbiB0aGUgcGFzdC4gKi9cbiAgcHJpdmF0ZSBkYXlzVW50aWwoZGF0ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICghZGF0ZSkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBEYXRlKGAke2RhdGUuc2xpY2UoMCwgMTApfVQwMDowMDowMGApO1xuICAgIGlmIChpc05hTih0YXJnZXQuZ2V0VGltZSgpKSkgeyByZXR1cm4gbnVsbDsgfVxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgodGFyZ2V0LmdldFRpbWUoKSAtIHRvZGF5LmdldFRpbWUoKSkgLyA4NjQwMDAwMCk7XG4gIH1cblxuICAvKiogU2FtZSBydWxlIGFzIHRoZSBEb2N1bWVudHMgcGFnZSBiYWRnZSBhbmQgdGhlIG1vYmlsZSBsaXN0LiAqL1xuICBzdGF0dXNPZihkb2M6IEJyYW5kRG9jdW1lbnRSb3cpOiBEb2N1bWVudFN0YXR1cyB7XG4gICAgaWYgKGRvYy5vY3JTdGF0dXMgPT09ICdwcm9jZXNzaW5nJykgeyByZXR1cm4gJ3Byb2Nlc3NpbmcnOyB9XG4gICAgY29uc3QgZGF5cyA9IHRoaXMuZGF5c1VudGlsKGRvYy5leHBpcnlEYXRlKTtcbiAgICBpZiAoZGF5cyA9PT0gbnVsbCkgeyByZXR1cm4gJ25vX2V4cGlyeSc7IH1cbiAgICBpZiAoZGF5cyA8IDApIHsgcmV0dXJuICdleHBpcmVkJzsgfVxuICAgIGlmIChkYXlzIDw9IEVYUElSWV9TT09OX0RBWVMpIHsgcmV0dXJuICdleHBpcmluZ19zb29uJzsgfVxuICAgIHJldHVybiAndmFsaWQnO1xuICB9XG5cbiAgZXhwaXJ5VGV4dChkb2M6IEJyYW5kRG9jdW1lbnRSb3cpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRheXMgPSB0aGlzLmRheXNVbnRpbChkb2MuZXhwaXJ5RGF0ZSk7XG4gICAgaWYgKGRheXMgPT09IG51bGwpIHsgcmV0dXJuICdObyB2YWxpZGl0eSBkYXRlJzsgfVxuICAgIGlmIChkYXlzID09PSAwKSB7IHJldHVybiAnRXhwaXJlcyB0b2RheSc7IH1cbiAgICBpZiAoZGF5cyA8IDApIHsgcmV0dXJuIGBFeHBpcmVkICR7TWF0aC5hYnMoZGF5cyl9IGRheSR7TWF0aC5hYnMoZGF5cykgPT09IDEgPyAnJyA6ICdzJ30gYWdvYDsgfVxuICAgIHJldHVybiBgJHtkYXlzfSBkYXkke2RheXMgPT09IDEgPyAnJyA6ICdzJ30gbGVmdGA7XG4gIH1cblxuICBpc0V4cGlyZWQoZG9jOiBCcmFuZERvY3VtZW50Um93KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZGF5cyA9IHRoaXMuZGF5c1VudGlsKGRvYy5leHBpcnlEYXRlKTtcbiAgICByZXR1cm4gZGF5cyAhPT0gbnVsbCAmJiBkYXlzIDwgMDtcbiAgfVxuXG4gIC8qKiBXaGljaCBzdG9yZXMgc2VlIHRoZSBmaWxlOiBhbGwgb2YgdGhlbSwgb3IgdGhlIGNob3NlbiBmZXcuICovXG4gIHNoYXJlZFRleHQoZG9jOiBCcmFuZERvY3VtZW50Um93KTogc3RyaW5nIHtcbiAgICBjb25zdCBuID0gZG9jLnN0b3JlSWRzPy5sZW5ndGggfHwgMDtcbiAgICByZXR1cm4gbiA/IGAke259IHN0b3JlJHtuID09PSAxID8gJycgOiAncyd9YCA6ICdBbGwgc3RvcmVzJztcbiAgfVxuXG4gIHNoYXJlZFRvb2x0aXAoZG9jOiBCcmFuZERvY3VtZW50Um93KTogc3RyaW5nIHtcbiAgICBpZiAoIWRvYy5zdG9yZUlkcz8ubGVuZ3RoKSB7IHJldHVybiAnJzsgfVxuICAgIGNvbnN0IG5hbWVzID0gZG9jLnN0b3JlTmFtZXM/Lmxlbmd0aCA/IGRvYy5zdG9yZU5hbWVzIDogZG9jLnN0b3JlSWRzO1xuICAgIHJldHVybiBuYW1lcy5zbGljZSgwLCAxNSkuam9pbignLCAnKSArIChuYW1lcy5sZW5ndGggPiAxNSA/IGAgKyR7bmFtZXMubGVuZ3RoIC0gMTV9IG1vcmVgIDogJycpO1xuICB9XG59XG4iLCI8IS0tIFNhbWUgc29ydCBhcnJvdyBhcyB0aGUgRG9jdW1lbnRzIHBhZ2U6IGJsdWUgb24gdGhlIGFjdGl2ZSBjb2x1bW4sIHBvaW50aW5nIHVwIHdoZW4gYXNjZW5kaW5nLiAtLT5cbjxuZy10ZW1wbGF0ZSAjc29ydEljb24gbGV0LWNvbD1cImNvbFwiPlxuICAgIDxzdmcgY2xhc3M9XCJzb3J0LWljb25cIiBbY2xhc3Mucm90YXRlXT1cInNvcnRDb2x1bW4gPT09IGNvbCAmJiBzb3J0RGlyZWN0aW9uID09PSAxXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICA8cGF0aCBkPVwiTTguMDAwMTYgMy4zMzMzN1YxMi42NjY3TTguMDAwMTYgMTIuNjY2N0wxMi42NjY4IDguMDAwMDRNOC4wMDAxNiAxMi42NjY3TDMuMzMzNSA4LjAwMDA0XCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzb3J0Q29sdW1uID09PSBjb2wgPyAnIzAwQTNGRicgOiAnIzY2NzA4NSdcIiBzdHJva2Utd2lkdGg9XCIxLjMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICA8L3N2Zz5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgKm5nSWY9XCJjYW5WaWV3XCIgY2xhc3M9XCJkb2N1bWVudHMtY2FyZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMyBtYi02XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+QnJhbmQgZG9jdW1lbnRzIDxzcGFuICpuZ0lmPVwiY29uZmlndXJlZCAmJiAhbG9hZGluZ1wiIGNsYXNzPVwiYmx1ZS1iYWRnZSBtcy0yXCI+e3sgcGFnaW5hdGlvbi50b3RhbENvdW50IH19PC9zcGFuPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdvVG9Eb2N1bWVudHMoKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lIHJvdW5kZWQtMyB0b29sYmFyLWNvbnRyb2wgdG9vbGJhci1jb250cm9sLS1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+T3BlbiBEb2N1bWVudHM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNyAxNyAxNyA3TTggN2g5djlcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhY29uZmlndXJlZFwiIGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc3ViXCI+RG9jdW1lbnRzIEFQSSBVUkwgaXMgbm90IGNvbmZpZ3VyZWQuPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlndXJlZFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcgJiYgIW5vRGF0YVwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYm90dG9tLWJvcmRlciB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwib25Tb3J0KCdmaWxlTmFtZScpXCI+RG9jdW1lbnQgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNvcnRJY29uOyBjb250ZXh0OiB7IGNvbDogJ2ZpbGVOYW1lJyB9XCI+PC9uZy1jb250YWluZXI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Eb2N1bWVudCBJRDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJvblNvcnQoJ3R5cGUnKVwiPlR5cGUgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNvcnRJY29uOyBjb250ZXh0OiB7IGNvbDogJ3R5cGUnIH1cIj48L25nLWNvbnRhaW5lcj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkF2YWlsYWJsZSB0bzwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJzb3J0YWJsZVwiIChjbGljayk9XCJvblNvcnQoJ2V4cGlyeURhdGUnKVwiPlZhbGlkIHRpbGwgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNvcnRJY29uOyBjb250ZXh0OiB7IGNvbDogJ2V4cGlyeURhdGUnIH1cIj48L25nLWNvbnRhaW5lcj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwic29ydGFibGVcIiAoY2xpY2spPVwib25Tb3J0KCdzdGF0dXMnKVwiPlN0YXR1cyA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic29ydEljb247IGNvbnRleHQ6IHsgY29sOiAnc3RhdHVzJyB9XCI+PC9uZy1jb250YWluZXI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInNvcnRhYmxlXCIgKGNsaWNrKT1cIm9uU29ydCgnY3JlYXRlZEF0JylcIj5VcGxvYWRlZCA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic29ydEljb247IGNvbnRleHQ6IHsgY29sOiAnY3JlYXRlZEF0JyB9XCI+PC9uZy1jb250YWluZXI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb25zPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkb2Mgb2YgZG9jdW1lbnRzOyB0cmFja0J5OiB0cmFja0J5SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtYmFkZ2UgZmlsZS1iYWRnZS0te3sgZmlsZUtpbmQoZG9jLmV4dGVuc2lvbikgfX1cIj57eyBkb2MuZXh0ZW5zaW9uIHx8ICdmaWxlJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1zLTMgZmlsZS1jZWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgdGV4dC10cnVuY2F0ZVwiIFtuZ2JUb29sdGlwXT1cImRvYy5maWxlTmFtZVwiIGNvbnRhaW5lcj1cImJvZHlcIj57eyBkb2MuZmlsZU5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1zdWJcIj57eyBmb3JtYXRGaWxlU2l6ZShkb2MuZmlsZVNpemUpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz1cImRvYy1jb2RlXCI+e3sgZG9jLmRvY3VtZW50Q29kZSB8fCAnLScgfX08L3NwYW4+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZG9jLm9jclN0YXR1cyA9PT0gJ3Byb2Nlc3NpbmcnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zdWJcIj5OQTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZG9jLm9jclN0YXR1cyA9PT0gJ2ZhaWxlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXN1YlwiPnt7IGRvYy50eXBlIHx8ICdOb3QgZGV0ZWN0ZWQnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkb2Mub2NyU3RhdHVzID09PSAnZG9uZSdcIj57eyBkb2MudHlwZSB8fCAnLScgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiZG9jLnN0b3JlSWRzPy5sZW5ndGggPyAnZ3JheS1iYWRnZScgOiAnYmx1ZS1iYWRnZSdcIiBbbmdiVG9vbHRpcF09XCJzaGFyZWRUb29sdGlwKGRvYylcIiBjb250YWluZXI9XCJib2R5XCI+e3sgc2hhcmVkVGV4dChkb2MpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZG9jLm9jclN0YXR1cyA9PT0gJ3Byb2Nlc3NpbmcnOyBlbHNlIGV4cGlyeUNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXN1YlwiPk5BPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZXhwaXJ5Q2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRvYy5leHBpcnlEYXRlOyBlbHNlIG5vRXhwaXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBkb2MuZXhwaXJ5RGF0ZSB8IGN1c3RvbURhdGVGb3JtYXQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1zdWJcIiBbY2xhc3MudGV4dC1kYW5nZXJdPVwiaXNFeHBpcmVkKGRvYylcIj57eyBleHBpcnlUZXh0KGRvYykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9FeHBpcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj5ObyBleHBpcnk8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1zdWJcIj5ObyB2YWxpZGl0eSBkYXRlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHNwYW4gW25nQ2xhc3NdPVwic3RhdHVzQmFkZ2Vbc3RhdHVzT2YoZG9jKV1cIj57eyBzdGF0dXNMYWJlbHNbc3RhdHVzT2YoZG9jKV0gfX08L3NwYW4+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyBkb2MuY3JlYXRlZEF0IHwgY3VzdG9tRGF0ZUZvcm1hdCB9fTwvZGl2PiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYWN0aW9uLWljb25cIiBbY2xhc3MuYWN0aW9uLWljb24tLWJ1c3ldPVwiYnVzeUlkID09PSBkb2MuX2lkXCIgbmdiVG9vbHRpcD1cIlZpZXdcIiBjb250YWluZXI9XCJib2R5XCIgKGNsaWNrKT1cIm9wZW5Eb2N1bWVudChkb2MpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj48cGF0aCBkPVwiTTIuMDM2IDEyLjMyMmExLjAxMiAxLjAxMiAwIDAgMSAwLS42MzlDMy40MjMgNy41MSA3LjM2IDQuNSAxMiA0LjVjNC42MzggMCA4LjU3MyAzLjAwNyA5Ljk2MyA3LjE3OC4wNy4yMDcuMDcuNDMxIDAgLjYzOUMyMC41NzcgMTYuNDkgMTYuNjQgMTkuNSAxMiAxOS41Yy00LjYzOCAwLTguNTczLTMuMDA3LTkuOTYzLTcuMTc4WlwiIHN0cm9rZS13aWR0aD1cIjEuN1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48cGF0aCBkPVwiTTE1IDEyYTMgMyAwIDEgMS02IDAgMyAzIDAgMCAxIDYgMFpcIiBzdHJva2Utd2lkdGg9XCIxLjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhY3Rpb24taWNvblwiIFtjbGFzcy5hY3Rpb24taWNvbi0tYnVzeV09XCJidXN5SWQgPT09IGRvYy5faWRcIiBuZ2JUb29sdGlwPVwiRG93bmxvYWRcIiBjb250YWluZXI9XCJib2R5XCIgKGNsaWNrKT1cImRvd25sb2FkRG9jdW1lbnQoZG9jKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0zIDE2LjV2Mi4yNUEyLjI1IDIuMjUgMCAwIDAgNS4yNSAyMWgxMy41QTIuMjUgMi4yNSAwIDAgMCAyMSAxOC43NVYxNi41TTE2LjUgMTIgMTIgMTYuNW0wIDBMNy41IDEybTQuNSA0LjVWM1wiIHN0cm9rZS13aWR0aD1cIjEuN1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nICYmICFub0RhdGFcIiBjbGFzcz1cIm10LTZcIj5cbiAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cInBhZ2luYXRpb24ubGltaXRcIiBbY3VycmVudFBhZ2VdPVwicGFnaW5hdGlvbi5vZmZzZXRcIiBbdG90YWxJdGVtc109XCJwYWdpbmF0aW9uLnRvdGFsQ291bnRcIlxuICAgICAgICAgICAgICAgIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnaW5hdGlvblNpemVzXCIgW3BhZ2VTaXplXT1cInBhZ2luYXRpb25TaXplKClcIlxuICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCIgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiBub0RhdGFcIiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1nLXNyY1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXN1YiBtdC0zXCI+Tm8gYnJhbmQgZG9jdW1lbnRzIHVwbG9hZGVkIHlldDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19