@cqa-lib/cqa-ui 1.1.530 → 1.1.531

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.
@@ -45,6 +45,11 @@ export class FolderSidebarComponent {
45
45
  this.renameDraft = '';
46
46
  /** Inline rename uses the same name rules as the New Folder dialog. */
47
47
  this.renameMaxLength = 20;
48
+ /** Transient flag: turns the rename input red briefly when the user keystrokes
49
+ * while already at `renameMaxLength`, so the silent maxlength clamp gets a
50
+ * visible "you've hit the cap" signal. Cleared by `renameLimitFlashTimer`. */
51
+ this.renameLimitFlash = false;
52
+ this.renameLimitFlashTimer = null;
48
53
  /** Id of the folder whose context menu is open, or null when closed. */
49
54
  this.contextMenuFolderId = null;
50
55
  /** Viewport-anchored position (client coordinates) for the floating menu. */
@@ -158,6 +163,7 @@ export class FolderSidebarComponent {
158
163
  cancelRename() {
159
164
  this.renamingId = null;
160
165
  this.renameDraft = '';
166
+ this.clearRenameLimitFlash();
161
167
  this.cdr.markForCheck();
162
168
  }
163
169
  onRenameKey(event, n) {
@@ -171,11 +177,54 @@ export class FolderSidebarComponent {
171
177
  if (!this.isRenameDraftValid)
172
178
  return;
173
179
  this.commitRename(n);
180
+ return;
174
181
  }
175
- else if (event.key === 'Escape') {
182
+ if (event.key === 'Escape') {
176
183
  event.preventDefault();
177
184
  this.cancelRename();
185
+ return;
186
+ }
187
+ // For any other keystroke, detect "user is trying to type past maxlength" and
188
+ // briefly flash the input red. The browser's `maxlength` attribute already
189
+ // silently blocks the character; this surfaces a visible "you've hit the cap"
190
+ // signal that would otherwise be missing.
191
+ if (this.isPrintableKey(event) && this.wouldExceedRenameLimit(event)) {
192
+ this.triggerRenameLimitFlash();
193
+ }
194
+ }
195
+ isPrintableKey(event) {
196
+ // Single-character keys are printables (a, B, 1, !, space). Modifier-driven
197
+ // shortcuts (Ctrl/Meta) shouldn't count — they don't insert text.
198
+ return event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;
199
+ }
200
+ wouldExceedRenameLimit(event) {
201
+ // The new length after the keystroke would be: current - selectionLength + 1.
202
+ // If a selection covers part of the value, typing replaces that range, so the
203
+ // net length might still fit under the cap.
204
+ const target = event.target;
205
+ const start = target?.selectionStart ?? 0;
206
+ const end = target?.selectionEnd ?? 0;
207
+ const selectedLen = Math.max(0, end - start);
208
+ const draftLen = (this.renameDraft || '').length;
209
+ return draftLen - selectedLen >= this.renameMaxLength;
210
+ }
211
+ triggerRenameLimitFlash() {
212
+ this.renameLimitFlash = true;
213
+ if (this.renameLimitFlashTimer)
214
+ clearTimeout(this.renameLimitFlashTimer);
215
+ this.renameLimitFlashTimer = setTimeout(() => {
216
+ this.renameLimitFlash = false;
217
+ this.renameLimitFlashTimer = null;
218
+ this.cdr.markForCheck();
219
+ }, FolderSidebarComponent.RENAME_LIMIT_FLASH_MS);
220
+ this.cdr.markForCheck();
221
+ }
222
+ clearRenameLimitFlash() {
223
+ if (this.renameLimitFlashTimer) {
224
+ clearTimeout(this.renameLimitFlashTimer);
225
+ this.renameLimitFlashTimer = null;
178
226
  }
227
+ this.renameLimitFlash = false;
179
228
  }
180
229
  deleteFolder(n, event) {
181
230
  if (!this.allowDelete)
@@ -369,6 +418,7 @@ export class FolderSidebarComponent {
369
418
  }
370
419
  ngOnDestroy() {
371
420
  this.clearAllExpandTimers();
421
+ this.clearRenameLimitFlash();
372
422
  }
373
423
  onRowKeydown(event, row, index) {
374
424
  const rows = this.rows;
@@ -430,11 +480,12 @@ export class FolderSidebarComponent {
430
480
  }, 0);
431
481
  }
432
482
  }
483
+ FolderSidebarComponent.RENAME_LIMIT_FLASH_MS = 600;
433
484
  FolderSidebarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FolderSidebarComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
434
- FolderSidebarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: FolderSidebarComponent, selector: "cqa-folder-sidebar", inputs: { folders: "folders", selectedFolderId: "selectedFolderId", expandedFolderIds: "expandedFolderIds", unorganisedCount: "unorganisedCount", allowCreate: "allowCreate", allowRename: "allowRename", allowDelete: "allowDelete", allowMove: "allowMove", allowDuplicate: "allowDuplicate", allowDrop: "allowDrop", showCounts: "showCounts", collapsed: "collapsed", labels: "labels" }, outputs: { folderSelected: "folderSelected", folderExpansionToggled: "folderExpansionToggled", folderCreated: "folderCreated", folderCreateRequested: "folderCreateRequested", folderRenamed: "folderRenamed", folderDeleted: "folderDeleted", folderMoveRequested: "folderMoveRequested", folderDuplicateRequested: "folderDuplicateRequested", testsDropped: "testsDropped", folderDropped: "folderDropped", collapsedChange: "collapsedChange" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscape()", "document:dragend": "onDocumentDragEnd()" }, classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<!-- Reusable folder icon. Render via <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: node.color }\"></ng-container>. -->\n<ng-template #folderIcon let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-shrink-0\">\n <svg width=\"13\" height=\"12\" viewBox=\"0 0 13 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.1916 9.85824C12.1916 10.1677 12.0687 10.4644 11.8499 10.6832C11.6311 10.902 11.3343 11.0249 11.0249 11.0249H1.69157C1.38215 11.0249 1.0854 10.902 0.866611 10.6832C0.647819 10.4644 0.524902 10.1677 0.524902 9.85824V1.69157C0.524902 1.38215 0.647819 1.0854 0.866611 0.866611C1.0854 0.647819 1.38215 0.524902 1.69157 0.524902H4.60824L5.7749 2.2749H11.0249C11.3343 2.2749 11.6311 2.39782 11.8499 2.61661C12.0687 2.8354 12.1916 3.13215 12.1916 3.44157V9.85824Z\" [attr.stroke]=\"color || '#99999E'\" stroke-width=\"1.05\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<aside\n class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-lg cqa-h-full cqa-min-h-0\"\n [class.cqa-w-[240px]]=\"!collapsed\"\n [class.cqa-w-[48px]]=\"collapsed\"\n style=\"transition: width 150ms ease;\"\n>\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-3 cqa-py-3\">\n <span *ngIf=\"!collapsed\" class=\"cqa-text-sm cqa-font-semibold cqa-text-neutral-900\">\n {{ labels.folders }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\" [class.cqa-w-full]=\"collapsed\" [class.cqa-justify-center]=\"collapsed\">\n <button\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"collapsed ? 'Expand folders panel' : 'Collapse folders panel'\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">\n {{ collapsed ? 'chevron_right' : 'keyboard_double_arrow_left' }}\n </mat-icon>\n </button>\n <button\n *ngIf=\"!collapsed && allowCreate\"\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"requestCreate(null)\"\n [attr.aria-label]=\"labels.newFolder\"\n [title]=\"labels.newFolder\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">add</mat-icon>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"!collapsed\">\n <!-- Search -->\n <div class=\"cqa-px-3 cqa-pb-2\">\n <cqa-search-bar\n size=\"sm\"\n [fullWidth]=\"true\"\n [value]=\"searchValue\"\n [placeholder]=\"labels.searchFoldersPlaceholder\"\n [showClear]=\"true\"\n (valueChange)=\"searchValue = $event\"\n (cleared)=\"searchValue = ''\"\n ></cqa-search-bar>\n </div>\n\n <!-- Tree (folders only \u2014 Unorganised is pinned below the scroll area) -->\n <div role=\"tree\" class=\"cqa-flex-1 cqa-min-h-0 cqa-max-h-[60vh] cqa-overflow-y-auto cqa-py-1 cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\">\n <ng-container *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\">\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? isExpanded(row.node.id) : null\"\n [attr.aria-selected]=\"isSelected(row.node.id)\"\n [attr.data-folder-row-id]=\"row.node.id\"\n [cqaFolderDrop]=\"row.node.id\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(row.node.id, $event)\"\n (folderDropped)=\"onFolderRowDropped(row.node.id, $event)\"\n [cqaFolderDrag]=\"row.node.id\"\n [dragEnabled]=\"allowDrop\"\n (dragstart)=\"onFolderDragStart(row.node)\"\n (dragend)=\"onFolderDragEnd()\"\n (dragover)=\"onFolderRowDragOver(row)\"\n (dragleave)=\"onFolderRowDragLeave(row)\"\n (click)=\"onSelect(row.node)\"\n (contextmenu)=\"openContextMenu(row.node, $event)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n class=\"cqa-group cqa-flex cqa-items-center cqa-gap-1 cqa-pr-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-neutral-50 focus:cqa-outline-none focus:cqa-bg-neutral-100 cqa-relative\"\n [class.cqa-bg-indigo-50]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n [attr.title]=\"row.node.totalCount != null ? (row.node.totalCount + ' total including subfolders') : null\"\n >\n <span\n *ngIf=\"isSelected(row.node.id)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <button\n type=\"button\"\n class=\"cqa-p-0 cqa-text-neutral-400\"\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\n (click)=\"onToggle(row.node, $event)\"\n [attr.aria-label]=\"isExpanded(row.node.id) ? 'Collapse' : 'Expand'\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">\n {{ isExpanded(row.node.id) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: row.node.color }\"></ng-container>\n\n <ng-container *ngIf=\"renamingId === row.node.id; else nameTpl\">\n <input\n type=\"text\"\n size=\"1\"\n [attr.data-folder-rename-input]=\"row.node.id\"\n [attr.maxlength]=\"renameMaxLength\"\n class=\"cqa-flex-1 cqa-min-w-0 cqa-w-full cqa-px-2 cqa-py-0.5 cqa-rounded cqa-border cqa-bg-white cqa-text-sm cqa-shadow-sm focus:cqa-outline-none focus:cqa-ring-1\"\n [ngClass]=\"isRenameDraftValid\n ? 'cqa-border-neutral-300 focus:cqa-border-indigo-400 focus:cqa-ring-indigo-200'\n : 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-[#FCA5A5]'\"\n [attr.aria-invalid]=\"!isRenameDraftValid\"\n [(ngModel)]=\"renameDraft\"\n (keydown)=\"onRenameKey($event, row.node)\"\n (keypress)=\"$event.stopPropagation()\"\n (keyup)=\"$event.stopPropagation()\"\n (blur)=\"commitRename(row.node)\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-container>\n <ng-template #nameTpl>\n <span\n class=\"cqa-flex-1 cqa-text-sm cqa-text-neutral-800 cqa-truncate\"\n (dblclick)=\"beginRename(row.node, $event)\"\n >{{ row.node.name }}</span>\n </ng-template>\n\n <!-- Count shown at rest; hidden on row hover when delete is allowed -->\n <span\n *ngIf=\"showCounts && row.node.count != null\"\n class=\"cqa-text-xs cqa-text-neutral-400 cqa-tabular-nums cqa-ml-1\"\n [class.group-hover:cqa-hidden]=\"allowDelete\"\n >{{ row.node.count }}</span>\n\n <button\n *ngIf=\"hasAnyContextAction\"\n type=\"button\"\n class=\"cqa-p-0.5 cqa-rounded hover:cqa-bg-neutral-200 cqa-text-neutral-500\"\n [class.cqa-hidden]=\"contextMenuFolderId !== row.node.id\"\n [class.group-hover:cqa-inline-flex]=\"true\"\n [class.cqa-inline-flex]=\"contextMenuFolderId === row.node.id\"\n (click)=\"openContextMenu(row.node, $event)\"\n [attr.aria-label]=\"'Open actions for ' + row.node.name\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"contextMenuFolderId === row.node.id\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">more_horiz</mat-icon>\n </button>\n </div>\n </ng-container>\n </div>\n\n <!-- Divider between folder tree and pinned Unorganised tab -->\n <div\n aria-hidden=\"true\"\n class=\"cqa-mx-3 cqa-shrink-0\"\n style=\"height: 1px; background-color: #E5E7EB; margin-top: 6px; margin-bottom: 6px;\"\n ></div>\n\n <!-- Unorganised \u2014 pinned below the scrollable folder tree so it stays visible regardless of folder count -->\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(null)\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-neutral-50 focus:cqa-outline-none focus:cqa-bg-neutral-100 cqa-relative cqa-shrink-0\"\n [class.cqa-bg-indigo-50]=\"isSelected(null)\"\n [cqaFolderDrop]=\"null\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(null, $event)\"\n (folderDropped)=\"onFolderRowDropped(null, $event)\"\n (click)=\"onSelectUnorganised()\"\n >\n <span\n *ngIf=\"isSelected(null)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <mat-icon class=\"cqa-text-neutral-500\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-neutral-700\">{{ labels.unorganised }}</span>\n <span *ngIf=\"showCounts\" class=\"cqa-text-xs cqa-text-neutral-400 cqa-tabular-nums\">{{ unorganisedCount }}</span>\n </div>\n\n <!-- Folder context menu (right-click / ellipsis). Anchored to viewport coords. -->\n <div\n *ngIf=\"contextMenuFolderId !== null\"\n role=\"menu\"\n class=\"cqa-fixed cqa-z-50 cqa-min-w-[180px] cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-md cqa-shadow-lg cqa-py-1\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\"\n (click)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n >\n <ng-container *ngIf=\"folderById(contextMenuFolderId) as menuNode\">\n <button\n *ngIf=\"allowCreate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextCreateSubfolder(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">create_new_folder</mat-icon>\n <span>{{ labels.folderMenuCreateSubfolder }}</span>\n </button>\n <button\n *ngIf=\"allowRename\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextRename(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">edit</mat-icon>\n <span>{{ labels.folderMenuRename }}</span>\n </button>\n <button\n *ngIf=\"allowMove\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextMove(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">drive_file_move</mat-icon>\n <span>{{ labels.folderMenuMove }}</span>\n </button>\n <button\n *ngIf=\"allowDuplicate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextDuplicate(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">content_copy</mat-icon>\n <span>{{ labels.folderMenuDuplicate }}</span>\n </button>\n <div *ngIf=\"allowDelete && (allowCreate || allowRename || allowMove || allowDuplicate)\" class=\"cqa-h-px cqa-bg-neutral-200 cqa-my-1\"></div>\n <button\n *ngIf=\"allowDelete\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-red-600 hover:cqa-bg-red-50 cqa-text-left\"\n (click)=\"onContextDelete(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">delete_outline</mat-icon>\n <span>{{ labels.folderMenuDelete }}</span>\n </button>\n </ng-container>\n </div>\n\n </ng-container>\n</aside>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.FolderDropDirective, selector: "[cqaFolderDrop]", inputs: ["cqaFolderDrop", "dropEnabled"], outputs: ["testsDropped", "folderDropped"] }, { type: i5.FolderDragDirective, selector: "[cqaFolderDrag]", inputs: ["cqaFolderDrag", "dragEnabled"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i6.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
485
+ FolderSidebarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: FolderSidebarComponent, selector: "cqa-folder-sidebar", inputs: { folders: "folders", selectedFolderId: "selectedFolderId", expandedFolderIds: "expandedFolderIds", unorganisedCount: "unorganisedCount", allowCreate: "allowCreate", allowRename: "allowRename", allowDelete: "allowDelete", allowMove: "allowMove", allowDuplicate: "allowDuplicate", allowDrop: "allowDrop", showCounts: "showCounts", collapsed: "collapsed", labels: "labels" }, outputs: { folderSelected: "folderSelected", folderExpansionToggled: "folderExpansionToggled", folderCreated: "folderCreated", folderCreateRequested: "folderCreateRequested", folderRenamed: "folderRenamed", folderDeleted: "folderDeleted", folderMoveRequested: "folderMoveRequested", folderDuplicateRequested: "folderDuplicateRequested", testsDropped: "testsDropped", folderDropped: "folderDropped", collapsedChange: "collapsedChange" }, host: { listeners: { "document:click": "onDocumentClick()", "document:keydown.escape": "onEscape()", "document:dragend": "onDocumentDragEnd()" }, classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<!-- Reusable folder icon. Render via <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: node.color }\"></ng-container>. -->\n<ng-template #folderIcon let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-shrink-0\">\n <svg width=\"13\" height=\"12\" viewBox=\"0 0 13 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.1916 9.85824C12.1916 10.1677 12.0687 10.4644 11.8499 10.6832C11.6311 10.902 11.3343 11.0249 11.0249 11.0249H1.69157C1.38215 11.0249 1.0854 10.902 0.866611 10.6832C0.647819 10.4644 0.524902 10.1677 0.524902 9.85824V1.69157C0.524902 1.38215 0.647819 1.0854 0.866611 0.866611C1.0854 0.647819 1.38215 0.524902 1.69157 0.524902H4.60824L5.7749 2.2749H11.0249C11.3343 2.2749 11.6311 2.39782 11.8499 2.61661C12.0687 2.8354 12.1916 3.13215 12.1916 3.44157V9.85824Z\" [attr.stroke]=\"color || '#99999E'\" stroke-width=\"1.05\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<aside\n class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-lg cqa-h-full cqa-min-h-0\"\n [class.cqa-w-[240px]]=\"!collapsed\"\n [class.cqa-w-[48px]]=\"collapsed\"\n style=\"transition: width 150ms ease;\"\n>\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-3 cqa-py-3\">\n <span *ngIf=\"!collapsed\" class=\"cqa-text-sm cqa-font-semibold cqa-text-neutral-900\">\n {{ labels.folders }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\" [class.cqa-w-full]=\"collapsed\" [class.cqa-justify-center]=\"collapsed\">\n <button\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"collapsed ? 'Expand folders panel' : 'Collapse folders panel'\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">\n {{ collapsed ? 'chevron_right' : 'keyboard_double_arrow_left' }}\n </mat-icon>\n </button>\n <button\n *ngIf=\"!collapsed && allowCreate\"\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"requestCreate(null)\"\n [attr.aria-label]=\"labels.newFolder\"\n [title]=\"labels.newFolder\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">add</mat-icon>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"!collapsed\">\n <!-- Search -->\n <div class=\"cqa-px-3 cqa-pb-2\">\n <cqa-search-bar\n size=\"sm\"\n [fullWidth]=\"true\"\n [value]=\"searchValue\"\n [placeholder]=\"labels.searchFoldersPlaceholder\"\n [showClear]=\"true\"\n (valueChange)=\"searchValue = $event\"\n (cleared)=\"searchValue = ''\"\n ></cqa-search-bar>\n </div>\n\n <!-- Tree (folders only \u2014 Unorganised is pinned below the scroll area) -->\n <div role=\"tree\" class=\"cqa-flex-1 cqa-min-h-0 cqa-max-h-[60vh] cqa-overflow-y-auto cqa-py-1 cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\">\n <ng-container *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\">\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? isExpanded(row.node.id) : null\"\n [attr.aria-selected]=\"isSelected(row.node.id)\"\n [attr.data-folder-row-id]=\"row.node.id\"\n [cqaFolderDrop]=\"row.node.id\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(row.node.id, $event)\"\n (folderDropped)=\"onFolderRowDropped(row.node.id, $event)\"\n [cqaFolderDrag]=\"row.node.id\"\n [dragEnabled]=\"allowDrop\"\n (dragstart)=\"onFolderDragStart(row.node)\"\n (dragend)=\"onFolderDragEnd()\"\n (dragover)=\"onFolderRowDragOver(row)\"\n (dragleave)=\"onFolderRowDragLeave(row)\"\n (click)=\"onSelect(row.node)\"\n (contextmenu)=\"openContextMenu(row.node, $event)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n class=\"cqa-group cqa-flex cqa-items-center cqa-gap-1 cqa-pr-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-neutral-50 focus:cqa-outline-none focus:cqa-bg-neutral-100 cqa-relative\"\n [class.cqa-bg-indigo-50]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n [attr.title]=\"row.node.totalCount != null ? (row.node.totalCount + ' total including subfolders') : null\"\n >\n <span\n *ngIf=\"isSelected(row.node.id)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <button\n type=\"button\"\n class=\"cqa-p-0 cqa-text-neutral-400\"\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\n (click)=\"onToggle(row.node, $event)\"\n [attr.aria-label]=\"isExpanded(row.node.id) ? 'Collapse' : 'Expand'\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">\n {{ isExpanded(row.node.id) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: row.node.color }\"></ng-container>\n\n <ng-container *ngIf=\"renamingId === row.node.id; else nameTpl\">\n <input\n type=\"text\"\n size=\"1\"\n [attr.data-folder-rename-input]=\"row.node.id\"\n [attr.maxlength]=\"renameMaxLength\"\n class=\"cqa-flex-1 cqa-min-w-0 cqa-w-full cqa-px-2 cqa-py-0.5 cqa-rounded cqa-border cqa-bg-white cqa-text-sm cqa-shadow-sm focus:cqa-outline-none focus:cqa-ring-1\"\n [ngClass]=\"(isRenameDraftValid && !renameLimitFlash)\n ? 'cqa-border-neutral-300 focus:cqa-border-indigo-400 focus:cqa-ring-indigo-200'\n : 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-[#FCA5A5]'\"\n [attr.aria-invalid]=\"!isRenameDraftValid || renameLimitFlash\"\n [(ngModel)]=\"renameDraft\"\n (keydown)=\"onRenameKey($event, row.node)\"\n (keypress)=\"$event.stopPropagation()\"\n (keyup)=\"$event.stopPropagation()\"\n (blur)=\"commitRename(row.node)\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-container>\n <ng-template #nameTpl>\n <span\n class=\"cqa-flex-1 cqa-text-sm cqa-text-neutral-800 cqa-truncate\"\n (dblclick)=\"beginRename(row.node, $event)\"\n >{{ row.node.name }}</span>\n </ng-template>\n\n <!-- Count shown at rest; hidden on row hover when delete is allowed -->\n <span\n *ngIf=\"showCounts && row.node.count != null\"\n class=\"cqa-text-xs cqa-text-neutral-400 cqa-tabular-nums cqa-ml-1\"\n [class.group-hover:cqa-hidden]=\"allowDelete\"\n >{{ row.node.count }}</span>\n\n <button\n *ngIf=\"hasAnyContextAction\"\n type=\"button\"\n class=\"cqa-p-0.5 cqa-rounded hover:cqa-bg-neutral-200 cqa-text-neutral-500\"\n [class.cqa-hidden]=\"contextMenuFolderId !== row.node.id\"\n [class.group-hover:cqa-inline-flex]=\"true\"\n [class.cqa-inline-flex]=\"contextMenuFolderId === row.node.id\"\n (click)=\"openContextMenu(row.node, $event)\"\n [attr.aria-label]=\"'Open actions for ' + row.node.name\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"contextMenuFolderId === row.node.id\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">more_horiz</mat-icon>\n </button>\n </div>\n </ng-container>\n </div>\n\n <!-- Divider between folder tree and pinned Unorganised tab -->\n <div\n aria-hidden=\"true\"\n class=\"cqa-mx-3 cqa-shrink-0\"\n style=\"height: 1px; background-color: #E5E7EB; margin-top: 6px; margin-bottom: 6px;\"\n ></div>\n\n <!-- Unorganised \u2014 pinned below the scrollable folder tree so it stays visible regardless of folder count -->\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(null)\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-neutral-50 focus:cqa-outline-none focus:cqa-bg-neutral-100 cqa-relative cqa-shrink-0\"\n [class.cqa-bg-indigo-50]=\"isSelected(null)\"\n [cqaFolderDrop]=\"null\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(null, $event)\"\n (folderDropped)=\"onFolderRowDropped(null, $event)\"\n (click)=\"onSelectUnorganised()\"\n >\n <span\n *ngIf=\"isSelected(null)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <mat-icon class=\"cqa-text-neutral-500\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-neutral-700\">{{ labels.unorganised }}</span>\n <span *ngIf=\"showCounts\" class=\"cqa-text-xs cqa-text-neutral-400 cqa-tabular-nums\">{{ unorganisedCount }}</span>\n </div>\n\n <!-- Folder context menu (right-click / ellipsis). Anchored to viewport coords. -->\n <div\n *ngIf=\"contextMenuFolderId !== null\"\n role=\"menu\"\n class=\"cqa-fixed cqa-z-50 cqa-min-w-[180px] cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-md cqa-shadow-lg cqa-py-1\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\"\n (click)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n >\n <ng-container *ngIf=\"folderById(contextMenuFolderId) as menuNode\">\n <button\n *ngIf=\"allowCreate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextCreateSubfolder(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">create_new_folder</mat-icon>\n <span>{{ labels.folderMenuCreateSubfolder }}</span>\n </button>\n <button\n *ngIf=\"allowRename\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextRename(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">edit</mat-icon>\n <span>{{ labels.folderMenuRename }}</span>\n </button>\n <button\n *ngIf=\"allowMove\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextMove(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">drive_file_move</mat-icon>\n <span>{{ labels.folderMenuMove }}</span>\n </button>\n <button\n *ngIf=\"allowDuplicate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextDuplicate(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">content_copy</mat-icon>\n <span>{{ labels.folderMenuDuplicate }}</span>\n </button>\n <div *ngIf=\"allowDelete && (allowCreate || allowRename || allowMove || allowDuplicate)\" class=\"cqa-h-px cqa-bg-neutral-200 cqa-my-1\"></div>\n <button\n *ngIf=\"allowDelete\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-red-600 hover:cqa-bg-red-50 cqa-text-left\"\n (click)=\"onContextDelete(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">delete_outline</mat-icon>\n <span>{{ labels.folderMenuDelete }}</span>\n </button>\n </ng-container>\n </div>\n\n </ng-container>\n</aside>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.FolderDropDirective, selector: "[cqaFolderDrop]", inputs: ["cqaFolderDrop", "dropEnabled"], outputs: ["testsDropped", "folderDropped"] }, { type: i5.FolderDragDirective, selector: "[cqaFolderDrag]", inputs: ["cqaFolderDrag", "dragEnabled"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i6.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
435
486
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FolderSidebarComponent, decorators: [{
436
487
  type: Component,
437
- args: [{ selector: 'cqa-folder-sidebar', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Reusable folder icon. Render via <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: node.color }\"></ng-container>. -->\n<ng-template #folderIcon let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-shrink-0\">\n <svg width=\"13\" height=\"12\" viewBox=\"0 0 13 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.1916 9.85824C12.1916 10.1677 12.0687 10.4644 11.8499 10.6832C11.6311 10.902 11.3343 11.0249 11.0249 11.0249H1.69157C1.38215 11.0249 1.0854 10.902 0.866611 10.6832C0.647819 10.4644 0.524902 10.1677 0.524902 9.85824V1.69157C0.524902 1.38215 0.647819 1.0854 0.866611 0.866611C1.0854 0.647819 1.38215 0.524902 1.69157 0.524902H4.60824L5.7749 2.2749H11.0249C11.3343 2.2749 11.6311 2.39782 11.8499 2.61661C12.0687 2.8354 12.1916 3.13215 12.1916 3.44157V9.85824Z\" [attr.stroke]=\"color || '#99999E'\" stroke-width=\"1.05\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<aside\n class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-lg cqa-h-full cqa-min-h-0\"\n [class.cqa-w-[240px]]=\"!collapsed\"\n [class.cqa-w-[48px]]=\"collapsed\"\n style=\"transition: width 150ms ease;\"\n>\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-3 cqa-py-3\">\n <span *ngIf=\"!collapsed\" class=\"cqa-text-sm cqa-font-semibold cqa-text-neutral-900\">\n {{ labels.folders }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\" [class.cqa-w-full]=\"collapsed\" [class.cqa-justify-center]=\"collapsed\">\n <button\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"collapsed ? 'Expand folders panel' : 'Collapse folders panel'\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">\n {{ collapsed ? 'chevron_right' : 'keyboard_double_arrow_left' }}\n </mat-icon>\n </button>\n <button\n *ngIf=\"!collapsed && allowCreate\"\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"requestCreate(null)\"\n [attr.aria-label]=\"labels.newFolder\"\n [title]=\"labels.newFolder\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">add</mat-icon>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"!collapsed\">\n <!-- Search -->\n <div class=\"cqa-px-3 cqa-pb-2\">\n <cqa-search-bar\n size=\"sm\"\n [fullWidth]=\"true\"\n [value]=\"searchValue\"\n [placeholder]=\"labels.searchFoldersPlaceholder\"\n [showClear]=\"true\"\n (valueChange)=\"searchValue = $event\"\n (cleared)=\"searchValue = ''\"\n ></cqa-search-bar>\n </div>\n\n <!-- Tree (folders only \u2014 Unorganised is pinned below the scroll area) -->\n <div role=\"tree\" class=\"cqa-flex-1 cqa-min-h-0 cqa-max-h-[60vh] cqa-overflow-y-auto cqa-py-1 cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\">\n <ng-container *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\">\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? isExpanded(row.node.id) : null\"\n [attr.aria-selected]=\"isSelected(row.node.id)\"\n [attr.data-folder-row-id]=\"row.node.id\"\n [cqaFolderDrop]=\"row.node.id\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(row.node.id, $event)\"\n (folderDropped)=\"onFolderRowDropped(row.node.id, $event)\"\n [cqaFolderDrag]=\"row.node.id\"\n [dragEnabled]=\"allowDrop\"\n (dragstart)=\"onFolderDragStart(row.node)\"\n (dragend)=\"onFolderDragEnd()\"\n (dragover)=\"onFolderRowDragOver(row)\"\n (dragleave)=\"onFolderRowDragLeave(row)\"\n (click)=\"onSelect(row.node)\"\n (contextmenu)=\"openContextMenu(row.node, $event)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n class=\"cqa-group cqa-flex cqa-items-center cqa-gap-1 cqa-pr-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-neutral-50 focus:cqa-outline-none focus:cqa-bg-neutral-100 cqa-relative\"\n [class.cqa-bg-indigo-50]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n [attr.title]=\"row.node.totalCount != null ? (row.node.totalCount + ' total including subfolders') : null\"\n >\n <span\n *ngIf=\"isSelected(row.node.id)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <button\n type=\"button\"\n class=\"cqa-p-0 cqa-text-neutral-400\"\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\n (click)=\"onToggle(row.node, $event)\"\n [attr.aria-label]=\"isExpanded(row.node.id) ? 'Collapse' : 'Expand'\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">\n {{ isExpanded(row.node.id) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: row.node.color }\"></ng-container>\n\n <ng-container *ngIf=\"renamingId === row.node.id; else nameTpl\">\n <input\n type=\"text\"\n size=\"1\"\n [attr.data-folder-rename-input]=\"row.node.id\"\n [attr.maxlength]=\"renameMaxLength\"\n class=\"cqa-flex-1 cqa-min-w-0 cqa-w-full cqa-px-2 cqa-py-0.5 cqa-rounded cqa-border cqa-bg-white cqa-text-sm cqa-shadow-sm focus:cqa-outline-none focus:cqa-ring-1\"\n [ngClass]=\"isRenameDraftValid\n ? 'cqa-border-neutral-300 focus:cqa-border-indigo-400 focus:cqa-ring-indigo-200'\n : 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-[#FCA5A5]'\"\n [attr.aria-invalid]=\"!isRenameDraftValid\"\n [(ngModel)]=\"renameDraft\"\n (keydown)=\"onRenameKey($event, row.node)\"\n (keypress)=\"$event.stopPropagation()\"\n (keyup)=\"$event.stopPropagation()\"\n (blur)=\"commitRename(row.node)\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-container>\n <ng-template #nameTpl>\n <span\n class=\"cqa-flex-1 cqa-text-sm cqa-text-neutral-800 cqa-truncate\"\n (dblclick)=\"beginRename(row.node, $event)\"\n >{{ row.node.name }}</span>\n </ng-template>\n\n <!-- Count shown at rest; hidden on row hover when delete is allowed -->\n <span\n *ngIf=\"showCounts && row.node.count != null\"\n class=\"cqa-text-xs cqa-text-neutral-400 cqa-tabular-nums cqa-ml-1\"\n [class.group-hover:cqa-hidden]=\"allowDelete\"\n >{{ row.node.count }}</span>\n\n <button\n *ngIf=\"hasAnyContextAction\"\n type=\"button\"\n class=\"cqa-p-0.5 cqa-rounded hover:cqa-bg-neutral-200 cqa-text-neutral-500\"\n [class.cqa-hidden]=\"contextMenuFolderId !== row.node.id\"\n [class.group-hover:cqa-inline-flex]=\"true\"\n [class.cqa-inline-flex]=\"contextMenuFolderId === row.node.id\"\n (click)=\"openContextMenu(row.node, $event)\"\n [attr.aria-label]=\"'Open actions for ' + row.node.name\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"contextMenuFolderId === row.node.id\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">more_horiz</mat-icon>\n </button>\n </div>\n </ng-container>\n </div>\n\n <!-- Divider between folder tree and pinned Unorganised tab -->\n <div\n aria-hidden=\"true\"\n class=\"cqa-mx-3 cqa-shrink-0\"\n style=\"height: 1px; background-color: #E5E7EB; margin-top: 6px; margin-bottom: 6px;\"\n ></div>\n\n <!-- Unorganised \u2014 pinned below the scrollable folder tree so it stays visible regardless of folder count -->\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(null)\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-neutral-50 focus:cqa-outline-none focus:cqa-bg-neutral-100 cqa-relative cqa-shrink-0\"\n [class.cqa-bg-indigo-50]=\"isSelected(null)\"\n [cqaFolderDrop]=\"null\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(null, $event)\"\n (folderDropped)=\"onFolderRowDropped(null, $event)\"\n (click)=\"onSelectUnorganised()\"\n >\n <span\n *ngIf=\"isSelected(null)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <mat-icon class=\"cqa-text-neutral-500\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-neutral-700\">{{ labels.unorganised }}</span>\n <span *ngIf=\"showCounts\" class=\"cqa-text-xs cqa-text-neutral-400 cqa-tabular-nums\">{{ unorganisedCount }}</span>\n </div>\n\n <!-- Folder context menu (right-click / ellipsis). Anchored to viewport coords. -->\n <div\n *ngIf=\"contextMenuFolderId !== null\"\n role=\"menu\"\n class=\"cqa-fixed cqa-z-50 cqa-min-w-[180px] cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-md cqa-shadow-lg cqa-py-1\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\"\n (click)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n >\n <ng-container *ngIf=\"folderById(contextMenuFolderId) as menuNode\">\n <button\n *ngIf=\"allowCreate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextCreateSubfolder(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">create_new_folder</mat-icon>\n <span>{{ labels.folderMenuCreateSubfolder }}</span>\n </button>\n <button\n *ngIf=\"allowRename\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextRename(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">edit</mat-icon>\n <span>{{ labels.folderMenuRename }}</span>\n </button>\n <button\n *ngIf=\"allowMove\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextMove(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">drive_file_move</mat-icon>\n <span>{{ labels.folderMenuMove }}</span>\n </button>\n <button\n *ngIf=\"allowDuplicate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextDuplicate(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">content_copy</mat-icon>\n <span>{{ labels.folderMenuDuplicate }}</span>\n </button>\n <div *ngIf=\"allowDelete && (allowCreate || allowRename || allowMove || allowDuplicate)\" class=\"cqa-h-px cqa-bg-neutral-200 cqa-my-1\"></div>\n <button\n *ngIf=\"allowDelete\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-red-600 hover:cqa-bg-red-50 cqa-text-left\"\n (click)=\"onContextDelete(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">delete_outline</mat-icon>\n <span>{{ labels.folderMenuDelete }}</span>\n </button>\n </ng-container>\n </div>\n\n </ng-container>\n</aside>\n", styles: [] }]
488
+ args: [{ selector: 'cqa-folder-sidebar', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Reusable folder icon. Render via <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: node.color }\"></ng-container>. -->\n<ng-template #folderIcon let-color=\"color\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-justify-center cqa-w-4 cqa-h-4 cqa-shrink-0\">\n <svg width=\"13\" height=\"12\" viewBox=\"0 0 13 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M12.1916 9.85824C12.1916 10.1677 12.0687 10.4644 11.8499 10.6832C11.6311 10.902 11.3343 11.0249 11.0249 11.0249H1.69157C1.38215 11.0249 1.0854 10.902 0.866611 10.6832C0.647819 10.4644 0.524902 10.1677 0.524902 9.85824V1.69157C0.524902 1.38215 0.647819 1.0854 0.866611 0.866611C1.0854 0.647819 1.38215 0.524902 1.69157 0.524902H4.60824L5.7749 2.2749H11.0249C11.3343 2.2749 11.6311 2.39782 11.8499 2.61661C12.0687 2.8354 12.1916 3.13215 12.1916 3.44157V9.85824Z\" [attr.stroke]=\"color || '#99999E'\" stroke-width=\"1.05\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </span>\n</ng-template>\n\n<aside\n class=\"cqa-flex cqa-flex-col cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-lg cqa-h-full cqa-min-h-0\"\n [class.cqa-w-[240px]]=\"!collapsed\"\n [class.cqa-w-[48px]]=\"collapsed\"\n style=\"transition: width 150ms ease;\"\n>\n <!-- Header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-3 cqa-py-3\">\n <span *ngIf=\"!collapsed\" class=\"cqa-text-sm cqa-font-semibold cqa-text-neutral-900\">\n {{ labels.folders }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-1\" [class.cqa-w-full]=\"collapsed\" [class.cqa-justify-center]=\"collapsed\">\n <button\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"collapsed ? 'Expand folders panel' : 'Collapse folders panel'\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">\n {{ collapsed ? 'chevron_right' : 'keyboard_double_arrow_left' }}\n </mat-icon>\n </button>\n <button\n *ngIf=\"!collapsed && allowCreate\"\n type=\"button\"\n class=\"cqa-p-1 cqa-rounded hover:cqa-bg-neutral-100 cqa-text-neutral-500\"\n (click)=\"requestCreate(null)\"\n [attr.aria-label]=\"labels.newFolder\"\n [title]=\"labels.newFolder\"\n >\n <mat-icon style=\"font-size:18px;width:18px;height:18px\">add</mat-icon>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"!collapsed\">\n <!-- Search -->\n <div class=\"cqa-px-3 cqa-pb-2\">\n <cqa-search-bar\n size=\"sm\"\n [fullWidth]=\"true\"\n [value]=\"searchValue\"\n [placeholder]=\"labels.searchFoldersPlaceholder\"\n [showClear]=\"true\"\n (valueChange)=\"searchValue = $event\"\n (cleared)=\"searchValue = ''\"\n ></cqa-search-bar>\n </div>\n\n <!-- Tree (folders only \u2014 Unorganised is pinned below the scroll area) -->\n <div role=\"tree\" class=\"cqa-flex-1 cqa-min-h-0 cqa-max-h-[60vh] cqa-overflow-y-auto cqa-py-1 cqa-scrollbar-thin cqa-scrollbar-track-transparent cqa-scrollbar-thumb-[#E5E7EB] cqa-scrollbar-thumb-rounded-full cqa-scrollbar-thumb-hover:cqa-bg-[#D1D5DB]\">\n <ng-container *ngFor=\"let row of rows; let i = index; trackBy: trackByRow\">\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-expanded]=\"row.hasChildren ? isExpanded(row.node.id) : null\"\n [attr.aria-selected]=\"isSelected(row.node.id)\"\n [attr.data-folder-row-id]=\"row.node.id\"\n [cqaFolderDrop]=\"row.node.id\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(row.node.id, $event)\"\n (folderDropped)=\"onFolderRowDropped(row.node.id, $event)\"\n [cqaFolderDrag]=\"row.node.id\"\n [dragEnabled]=\"allowDrop\"\n (dragstart)=\"onFolderDragStart(row.node)\"\n (dragend)=\"onFolderDragEnd()\"\n (dragover)=\"onFolderRowDragOver(row)\"\n (dragleave)=\"onFolderRowDragLeave(row)\"\n (click)=\"onSelect(row.node)\"\n (contextmenu)=\"openContextMenu(row.node, $event)\"\n (keydown)=\"onRowKeydown($event, row, i)\"\n class=\"cqa-group cqa-flex cqa-items-center cqa-gap-1 cqa-pr-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-neutral-50 focus:cqa-outline-none focus:cqa-bg-neutral-100 cqa-relative\"\n [class.cqa-bg-indigo-50]=\"isSelected(row.node.id) || contextMenuFolderId === row.node.id\"\n [style.paddingLeft.px]=\"8 + row.depth * 16\"\n [attr.title]=\"row.node.totalCount != null ? (row.node.totalCount + ' total including subfolders') : null\"\n >\n <span\n *ngIf=\"isSelected(row.node.id)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <button\n type=\"button\"\n class=\"cqa-p-0 cqa-text-neutral-400\"\n [style.visibility]=\"row.hasChildren ? 'visible' : 'hidden'\"\n (click)=\"onToggle(row.node, $event)\"\n [attr.aria-label]=\"isExpanded(row.node.id) ? 'Collapse' : 'Expand'\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">\n {{ isExpanded(row.node.id) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <ng-container *ngTemplateOutlet=\"folderIcon; context: { color: row.node.color }\"></ng-container>\n\n <ng-container *ngIf=\"renamingId === row.node.id; else nameTpl\">\n <input\n type=\"text\"\n size=\"1\"\n [attr.data-folder-rename-input]=\"row.node.id\"\n [attr.maxlength]=\"renameMaxLength\"\n class=\"cqa-flex-1 cqa-min-w-0 cqa-w-full cqa-px-2 cqa-py-0.5 cqa-rounded cqa-border cqa-bg-white cqa-text-sm cqa-shadow-sm focus:cqa-outline-none focus:cqa-ring-1\"\n [ngClass]=\"(isRenameDraftValid && !renameLimitFlash)\n ? 'cqa-border-neutral-300 focus:cqa-border-indigo-400 focus:cqa-ring-indigo-200'\n : 'cqa-border-[#EF4444] focus:cqa-border-[#EF4444] focus:cqa-ring-[#FCA5A5]'\"\n [attr.aria-invalid]=\"!isRenameDraftValid || renameLimitFlash\"\n [(ngModel)]=\"renameDraft\"\n (keydown)=\"onRenameKey($event, row.node)\"\n (keypress)=\"$event.stopPropagation()\"\n (keyup)=\"$event.stopPropagation()\"\n (blur)=\"commitRename(row.node)\"\n (click)=\"$event.stopPropagation()\"\n />\n </ng-container>\n <ng-template #nameTpl>\n <span\n class=\"cqa-flex-1 cqa-text-sm cqa-text-neutral-800 cqa-truncate\"\n (dblclick)=\"beginRename(row.node, $event)\"\n >{{ row.node.name }}</span>\n </ng-template>\n\n <!-- Count shown at rest; hidden on row hover when delete is allowed -->\n <span\n *ngIf=\"showCounts && row.node.count != null\"\n class=\"cqa-text-xs cqa-text-neutral-400 cqa-tabular-nums cqa-ml-1\"\n [class.group-hover:cqa-hidden]=\"allowDelete\"\n >{{ row.node.count }}</span>\n\n <button\n *ngIf=\"hasAnyContextAction\"\n type=\"button\"\n class=\"cqa-p-0.5 cqa-rounded hover:cqa-bg-neutral-200 cqa-text-neutral-500\"\n [class.cqa-hidden]=\"contextMenuFolderId !== row.node.id\"\n [class.group-hover:cqa-inline-flex]=\"true\"\n [class.cqa-inline-flex]=\"contextMenuFolderId === row.node.id\"\n (click)=\"openContextMenu(row.node, $event)\"\n [attr.aria-label]=\"'Open actions for ' + row.node.name\"\n [attr.aria-haspopup]=\"'menu'\"\n [attr.aria-expanded]=\"contextMenuFolderId === row.node.id\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">more_horiz</mat-icon>\n </button>\n </div>\n </ng-container>\n </div>\n\n <!-- Divider between folder tree and pinned Unorganised tab -->\n <div\n aria-hidden=\"true\"\n class=\"cqa-mx-3 cqa-shrink-0\"\n style=\"height: 1px; background-color: #E5E7EB; margin-top: 6px; margin-bottom: 6px;\"\n ></div>\n\n <!-- Unorganised \u2014 pinned below the scrollable folder tree so it stays visible regardless of folder count -->\n <div\n role=\"treeitem\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(null)\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-px-3 cqa-py-1.5 cqa-cursor-pointer hover:cqa-bg-neutral-50 focus:cqa-outline-none focus:cqa-bg-neutral-100 cqa-relative cqa-shrink-0\"\n [class.cqa-bg-indigo-50]=\"isSelected(null)\"\n [cqaFolderDrop]=\"null\"\n [dropEnabled]=\"allowDrop\"\n (testsDropped)=\"rowDropped(null, $event)\"\n (folderDropped)=\"onFolderRowDropped(null, $event)\"\n (click)=\"onSelectUnorganised()\"\n >\n <span\n *ngIf=\"isSelected(null)\"\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-bottom-0 cqa-w-[3px] cqa-bg-indigo-600\"\n ></span>\n <mat-icon class=\"cqa-text-neutral-500\" style=\"font-size:16px;width:16px;height:16px\">inbox</mat-icon>\n <span class=\"cqa-flex-1 cqa-text-sm cqa-text-neutral-700\">{{ labels.unorganised }}</span>\n <span *ngIf=\"showCounts\" class=\"cqa-text-xs cqa-text-neutral-400 cqa-tabular-nums\">{{ unorganisedCount }}</span>\n </div>\n\n <!-- Folder context menu (right-click / ellipsis). Anchored to viewport coords. -->\n <div\n *ngIf=\"contextMenuFolderId !== null\"\n role=\"menu\"\n class=\"cqa-fixed cqa-z-50 cqa-min-w-[180px] cqa-bg-white cqa-border cqa-border-neutral-200 cqa-rounded-md cqa-shadow-lg cqa-py-1\"\n [style.left.px]=\"contextMenuPosition.x\"\n [style.top.px]=\"contextMenuPosition.y\"\n (click)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n >\n <ng-container *ngIf=\"folderById(contextMenuFolderId) as menuNode\">\n <button\n *ngIf=\"allowCreate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextCreateSubfolder(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">create_new_folder</mat-icon>\n <span>{{ labels.folderMenuCreateSubfolder }}</span>\n </button>\n <button\n *ngIf=\"allowRename\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextRename(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">edit</mat-icon>\n <span>{{ labels.folderMenuRename }}</span>\n </button>\n <button\n *ngIf=\"allowMove\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextMove(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">drive_file_move</mat-icon>\n <span>{{ labels.folderMenuMove }}</span>\n </button>\n <button\n *ngIf=\"allowDuplicate\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-neutral-800 hover:cqa-bg-neutral-100 cqa-text-left\"\n (click)=\"onContextDuplicate(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">content_copy</mat-icon>\n <span>{{ labels.folderMenuDuplicate }}</span>\n </button>\n <div *ngIf=\"allowDelete && (allowCreate || allowRename || allowMove || allowDuplicate)\" class=\"cqa-h-px cqa-bg-neutral-200 cqa-my-1\"></div>\n <button\n *ngIf=\"allowDelete\"\n type=\"button\"\n role=\"menuitem\"\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-w-full cqa-px-3 cqa-py-1.5 cqa-text-sm cqa-text-red-600 hover:cqa-bg-red-50 cqa-text-left\"\n (click)=\"onContextDelete(menuNode)\"\n >\n <mat-icon style=\"font-size:16px;width:16px;height:16px\">delete_outline</mat-icon>\n <span>{{ labels.folderMenuDelete }}</span>\n </button>\n </ng-container>\n </div>\n\n </ng-container>\n</aside>\n", styles: [] }]
438
489
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { folders: [{
439
490
  type: Input
440
491
  }], selectedFolderId: [{
@@ -493,4 +544,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
493
544
  type: HostListener,
494
545
  args: ['document:dragend']
495
546
  }] } });
496
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9sZGVyLXNpZGViYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9mb2xkZXItc2lkZWJhci9mb2xkZXItc2lkZWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL2ZvbGRlci1zaWRlYmFyL2ZvbGRlci1zaWRlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEdBSXZCLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7O0FBZ0IxQyxNQUFNLE9BQU8sc0JBQXNCO0lBa0RqQyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWpEakMsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFDM0IscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUN2QyxzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFDakMscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBQzdCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFDMUIsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFDL0IsY0FBUyxHQUFZLElBQUksQ0FBQztRQUMxQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBQzNCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsV0FBTSxHQUFrQixFQUFFLEdBQUcsc0JBQXNCLEVBQUUsQ0FB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O2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBcU5QLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBTTlCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUI7Z0JBd0d2QyxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgRm9sZGVyTm9kZSxcbiAgRm9sZGVyUmVuYW1lZFBheWxvYWQsXG4gIE1vZHVsYXJMYWJlbHMsXG59IGZyb20gJy4uL21vZHVsYXItdGFibGUtdGVtcGxhdGUubW9kZWxzJztcblxuaW50ZXJmYWNlIFJlbmRlck5vZGUge1xuICBub2RlOiBGb2xkZXJOb2RlO1xuICBkZXB0aDogbnVtYmVyO1xuICB2aXNpYmxlOiBib29sZWFuO1xuICBoYXNDaGlsZHJlbjogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWZvbGRlci1zaWRlYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZvbGRlci1zaWRlYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRm9sZGVyU2lkZWJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGZvbGRlcnM6IEZvbGRlck5vZGVbXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3RlZEZvbGRlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZXhwYW5kZWRGb2xkZXJJZHM6IG51bWJlcltdID0gW107XG4gIEBJbnB1dCgpIHVub3JnYW5pc2VkQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGFsbG93Q3JlYXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dSZW5hbWU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd0RlbGV0ZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93TW92ZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93RHVwbGljYXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dEcm9wOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0NvdW50czogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBsYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcblxuICBAT3V0cHV0KCkgZm9sZGVyU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJFeHBhbnNpb25Ub2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXI7IGV4cGFuZGVkOiBib29sZWFuIH0+KCk7XG4gIC8qKiBFbWl0dGVkIGFmdGVyIHRoZSBob3N0IGNvbXBsZXRlcyBmb2xkZXIgY3JlYXRpb24gKGUuZy4sIGlubGluZSByZW5hbWUgZmxvdykuIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyQ3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbDsgbmFtZTogc3RyaW5nIH0+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBcIitcIiBoZWFkZXIgYnV0dG9uLiBIb3N0IHNob3VsZCBvcGVuIGEgY3JlYXRpb24gbW9kYWwuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJDcmVhdGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcGFyZW50SWQ6IG51bWJlciB8IG51bGwgfT4oKTtcbiAgLyoqIENhcnJpZXMgdGhlIGZ1bGwgcmVuYW1lZCBmb2xkZXIgbm9kZSArIHBhcmVudCBpZCBzbyBob3N0cyBjYW4gaXNzdWUgY29tcGxldGUgdXBkYXRlIHJlcXVlc3RzLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyUmVuYW1lZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyUmVuYW1lZFBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJEZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXIgfT4oKTtcbiAgLyoqIFVzZXIgcGlja2VkIFwiTW92ZSBmb2xkZXJcIiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIEhvc3Qgb3BlbnMgdGhlIGZvbGRlciBwaWNrZXIuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXIgfT4oKTtcbiAgLyoqIFVzZXIgcGlja2VkIFwiRHVwbGljYXRlIGZvbGRlclwiIGZyb20gdGhlIGNvbnRleHQgbWVudS4gSG9zdCBjbG9uZXMgdGhlIHN1YnRyZWUgKHRlc3RzIHJlZmVyZW5jZWQsIG5vdCBjb3BpZWQpLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIHRlc3RzRHJvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyB0ZXN0SWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+OyB0YXJnZXRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCB9PigpO1xuICAvKiogRmlyZXMgd2hlbiBhIGZvbGRlciByb3cgaXMgZHJvcHBlZCBvbnRvIGFub3RoZXIgZm9sZGVyIChvciB0aGUgVW5vcmdhbmlzZWQgcm93KS4gKi9cbiAgQE91dHB1dCgpIGZvbGRlckRyb3BwZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgbmV3UGFyZW50SWQ6IG51bWJlciB8IG51bGwgfT4oKTtcbiAgQE91dHB1dCgpIGNvbGxhcHNlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHJlbmFtaW5nSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICByZW5hbWVEcmFmdDogc3RyaW5nID0gJyc7XG4gIC8qKiBJbmxpbmUgcmVuYW1lIHVzZXMgdGhlIHNhbWUgbmFtZSBydWxlcyBhcyB0aGUgTmV3IEZvbGRlciBkaWFsb2cuICovXG4gIHJlYWRvbmx5IHJlbmFtZU1heExlbmd0aDogbnVtYmVyID0gMjA7XG5cbiAgLyoqIElkIG9mIHRoZSBmb2xkZXIgd2hvc2UgY29udGV4dCBtZW51IGlzIG9wZW4sIG9yIG51bGwgd2hlbiBjbG9zZWQuICovXG4gIGNvbnRleHRNZW51Rm9sZGVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogVmlld3BvcnQtYW5jaG9yZWQgcG9zaXRpb24gKGNsaWVudCBjb29yZGluYXRlcykgZm9yIHRoZSBmbG9hdGluZyBtZW51LiAqL1xuICBjb250ZXh0TWVudVBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcblxuICAvKiogUGVuZGluZyBhdXRvLWV4cGFuZCB0aW1lcnMgd2hpbGUgYSBmb2xkZXIgZHJhZyBpcyBob3ZlcmVkIG92ZXIgY29sbGFwc2VkIHJvd3MuICovXG4gIHByaXZhdGUgZHJhZ0V4cGFuZFRpbWVycyA9IG5ldyBNYXA8bnVtYmVyLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBEUkFHX0VYUEFORF9ERUxBWV9NUyA9IDYwMDtcbiAgLyoqIElkIG9mIHRoZSBmb2xkZXIgY3VycmVudGx5IGJlaW5nIGRyYWdnZWQ7IHVzZWQgdG8gc2tpcCBjeWNsZSB0YXJnZXRzIGFuZCBzb3VyY2UtaG92ZXIgZXhwYW5zaW9uLiAqL1xuICBwcml2YXRlIGFjdGl2ZUZvbGRlckRyYWdJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIGdldCBleHBhbmRlZFNldCgpOiBTZXQ8bnVtYmVyPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQodGhpcy5leHBhbmRlZEZvbGRlcklkcyB8fCBbXSk7XG4gIH1cblxuICAvKiogRmxhdHRlbmVkLCBkZXB0aC1hd2FyZSBsaXN0IG9mIHJvd3MgdG8gcmVuZGVyIGluIG9yZGVyLiBBbmNlc3RvcnMgb2YgbWF0Y2hlcyBhcmUga2VwdC4gKi9cbiAgZ2V0IHJvd3MoKTogUmVuZGVyTm9kZVtdIHtcbiAgICBjb25zdCBzZWFyY2ggPSAodGhpcy5zZWFyY2hWYWx1ZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkU2V0O1xuICAgIGNvbnN0IGtlZXBTZXQgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBpZiAoc2VhcmNoKSB7XG4gICAgICBjb25zdCBtYXJrID0gKG5vZGVzOiBGb2xkZXJOb2RlW10sIGFuY2VzdG9yczogbnVtYmVyW10pOiB2b2lkID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIG5vZGVzIHx8IFtdKSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IChuLm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKTtcbiAgICAgICAgICBjb25zdCBjaGlsZEFuY2VzdG9ycyA9IFsuLi5hbmNlc3RvcnMsIG4uaWRdO1xuICAgICAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYW5jZXN0b3JzKSBrZWVwU2V0LmFkZChhKTtcbiAgICAgICAgICAgIGtlZXBTZXQuYWRkKG4uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobi5jaGlsZHJlbj8ubGVuZ3RoKSBtYXJrKG4uY2hpbGRyZW4sIGNoaWxkQW5jZXN0b3JzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG1hcmsodGhpcy5mb2xkZXJzLCBbXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0OiBSZW5kZXJOb2RlW10gPSBbXTtcbiAgICBjb25zdCB3YWxrID0gKG5vZGVzOiBGb2xkZXJOb2RlW10sIGRlcHRoOiBudW1iZXIsIHBhcmVudFZpc2libGU6IGJvb2xlYW4pID0+IHtcbiAgICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgICBjb25zdCBzZWFyY2hWaXNpYmxlID0gIXNlYXJjaCB8fCBrZWVwU2V0LmhhcyhuLmlkKTtcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IHBhcmVudFZpc2libGUgJiYgc2VhcmNoVmlzaWJsZTtcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSAhIShuLmNoaWxkcmVuICYmIG4uY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgb3V0LnB1c2goeyBub2RlOiBuLCBkZXB0aCwgdmlzaWJsZSwgaGFzQ2hpbGRyZW4gfSk7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkQnlTZWFyY2ggPSAhIXNlYXJjaCAmJiBrZWVwU2V0LmhhcyhuLmlkKTtcbiAgICAgICAgY29uc3QgaXNOb2RlRXhwYW5kZWQgPSBleHBhbmRlZC5oYXMobi5pZCkgfHwgZXhwYW5kZWRCeVNlYXJjaDtcbiAgICAgICAgaWYgKGhhc0NoaWxkcmVuICYmIGlzTm9kZUV4cGFuZGVkKSB7XG4gICAgICAgICAgd2FsayhuLmNoaWxkcmVuISwgZGVwdGggKyAxLCB2aXNpYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgd2Fsayh0aGlzLmZvbGRlcnMsIDAsIHRydWUpO1xuICAgIHJldHVybiBvdXQuZmlsdGVyKHIgPT4gci52aXNpYmxlKTtcbiAgfVxuXG4gIGlzRXhwYW5kZWQoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkU2V0LmhhcyhpZCk7XG4gIH1cblxuICBpc1NlbGVjdGVkKGlkOiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKGlkID09IG51bGwgJiYgdGhpcy5zZWxlY3RlZEZvbGRlcklkID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBpZCAhPSBudWxsICYmIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCAhPSBudWxsICYmIGlkID09PSB0aGlzLnNlbGVjdGVkRm9sZGVySWQ7XG4gIH1cblxuICBvblRvZ2dsZShuOiBGb2xkZXJOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBleHBhbmRlZCA9ICF0aGlzLmlzRXhwYW5kZWQobi5pZCk7XG4gICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZDogbi5pZCwgZXhwYW5kZWQgfSk7XG4gIH1cblxuICBvblNlbGVjdChuOiBGb2xkZXJOb2RlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbmFtaW5nSWQgIT0gbnVsbCkgcmV0dXJuO1xuICAgIHRoaXMuZm9sZGVyU2VsZWN0ZWQuZW1pdChuID09IG51bGwgPyBudWxsIDogbi5pZCk7XG4gIH1cblxuICBvblNlbGVjdFVub3JnYW5pc2VkKCk6IHZvaWQge1xuICAgIC8vIFNlbnRpbmVsOiBob3N0cyB0aGF0IGtlZXAgYW4gXCJVbm9yZ2FuaXNlZFwiIGJ1Y2tldCBjYW4gdHJlYXQgYSBudWxsIHNlbGVjdGlvblxuICAgIC8vIGFzIFwic2hvdyB1bm9yZ2FuaXNlZFwiLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcm9vdCAobnVsbCkgc2VsZWN0aW9uIHBhdHRlcm4sXG4gICAgLy8gdGhpcyBtYXRjaGVzIGl0LiBIb3N0IGRlY2lkZXMgc2VtYW50aWNzLlxuICAgIHRoaXMuZm9sZGVyU2VsZWN0ZWQuZW1pdChudWxsKTtcbiAgfVxuXG4gIGJlZ2luUmVuYW1lKG46IEZvbGRlck5vZGUsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hbGxvd1JlbmFtZSkgcmV0dXJuO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVuYW1pbmdJZCA9IG4uaWQ7XG4gICAgdGhpcy5yZW5hbWVEcmFmdCA9IG4ubmFtZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmZvY3VzUmVuYW1lSW5wdXQobi5pZCk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoZSBhY3RpdmUgcmVuYW1lIGRyYWZ0IHBhc3NlcyB0aGUgbmFtZSBydWxlcyAobm9uLWVtcHR5LCB3aXRoaW4gbWF4IGxlbmd0aCkuICovXG4gIGdldCBpc1JlbmFtZURyYWZ0VmFsaWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHJpbW1lZCA9ICh0aGlzLnJlbmFtZURyYWZ0IHx8ICcnKS50cmltKCk7XG4gICAgcmV0dXJuIHRyaW1tZWQubGVuZ3RoID4gMCAmJiB0cmltbWVkLmxlbmd0aCA8PSB0aGlzLnJlbmFtZU1heExlbmd0aDtcbiAgfVxuXG4gIGNvbW1pdFJlbmFtZShuOiBGb2xkZXJOb2RlKTogdm9pZCB7XG4gICAgLy8gRGlzY2FyZCBpbnZhbGlkIGRyYWZ0cyAoZW1wdHkgLyB0b28gbG9uZykgaW5zdGVhZCBvZiBjb21taXR0aW5nIGEgYmFkIG5hbWUuXG4gICAgLy8gVGhlIHVzZXIgc2VlcyB0aGUgcmVkIGJvcmRlciB3aGlsZSBlZGl0aW5nOyBvbiBibHVyIHdlIHJldmVydCB0byB0aGUgb3JpZ2luYWwuXG4gICAgaWYgKCF0aGlzLmlzUmVuYW1lRHJhZnRWYWxpZCkge1xuICAgICAgdGhpcy5jYW5jZWxSZW5hbWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9ICh0aGlzLnJlbmFtZURyYWZ0IHx8ICcnKS50cmltKCk7XG4gICAgaWYgKG5hbWUgIT09IG4ubmFtZSkge1xuICAgICAgLy8gRW1pdCB0aGUgZnVsbCByZW5hbWVkIG5vZGUgKHdpdGggdGhlIG5ldyBuYW1lKSArIHBhcmVudCBjb250ZXh0IHNvIGhvc3RzIGNhblxuICAgICAgLy8gY2FsbCBgUFVUIC90ZXN0X2Nhc2VfZm9sZGVycy97aWR9YCB3aXRob3V0IHJlLXJlc29sdmluZyBmcm9tIHRoZWlyIGNhY2hlZCB0cmVlLlxuICAgICAgY29uc3QgZm9sZGVyOiBGb2xkZXJOb2RlID0geyAuLi5uLCBuYW1lIH07XG4gICAgICB0aGlzLmZvbGRlclJlbmFtZWQuZW1pdCh7XG4gICAgICAgIGZvbGRlcixcbiAgICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWRPZihuLmlkKSxcbiAgICAgICAgcHJldmlvdXNOYW1lOiBuLm5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5jYW5jZWxSZW5hbWUoKTtcbiAgfVxuXG4gIGNhbmNlbFJlbmFtZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmFtaW5nSWQgPSBudWxsO1xuICAgIHRoaXMucmVuYW1lRHJhZnQgPSAnJztcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uUmVuYW1lS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBuOiBGb2xkZXJOb2RlKTogdm9pZCB7XG4gICAgLy8gU3RvcCBidWJibGluZyBzbyB0aGUgcm93J3Mga2V5ZG93biBoYW5kbGVyICh3aGljaCB0cmVhdHMgU3BhY2UvRW50ZXIvQXJyb3dzIGFzXG4gICAgLy8gc2VsZWN0aW9uIC8gdHJlZSBuYXZpZ2F0aW9uKSBjYW4ndCBzd2FsbG93IGNoYXJhY3RlcnMgdHlwZWQgaW50byB0aGUgcmVuYW1lIGlucHV0LlxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBEb24ndCBzd2FsbG93IHRoZSB1c2VyJ3MgZWRpdCBvbiBFbnRlciB3aGVuIHRoZSBkcmFmdCBpcyBpbnZhbGlkIOKAlCBrZWVwXG4gICAgICAvLyB0aGUgaW5wdXQgb3BlbiAocmVkIGJvcmRlciBhbHJlYWR5IHNpZ25hbHMgdGhlIGlzc3VlKSBhbmQgbGV0IHRoZW0gZml4IGl0LlxuICAgICAgaWYgKCF0aGlzLmlzUmVuYW1lRHJhZnRWYWxpZCkgcmV0dXJuO1xuICAgICAgdGhpcy5jb21taXRSZW5hbWUobik7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jYW5jZWxSZW5hbWUoKTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVGb2xkZXIobjogRm9sZGVyTm9kZSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFsbG93RGVsZXRlKSByZXR1cm47XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5mb2xkZXJEZWxldGVkLmVtaXQoeyBpZDogbi5pZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgZm9sZGVyIGNvbnRleHQgbWVudSBhbmNob3JlZCBhdCB0aGUgZ2l2ZW4gY2xpZW50IGNvb3JkaW5hdGVzLlxuICAgKiBDYWxsZWQgZnJvbSBib3RoIChjb250ZXh0bWVudSkgb24gdGhlIHJvdyBhbmQgKGNsaWNrKSBvbiB0aGUgZWxsaXBzaXMgYnV0dG9uLlxuICAgKiBNZW51IHZpc2liaWxpdHkgaXMgY2xhbXBlZCBpbiB0aGUgdGVtcGxhdGUgdmlhIENTUyB0cmFuc2Zvcm1zIHNvIGl0IG5ldmVyIGxlYXZlcyB0aGUgdmlld3BvcnQuXG4gICAqL1xuICBvcGVuQ29udGV4dE1lbnUobjogRm9sZGVyTm9kZSwgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5oYXNBbnlDb250ZXh0QWN0aW9uKSByZXR1cm47XG4gICAgdGhpcy5jb250ZXh0TWVudUZvbGRlcklkID0gbi5pZDtcbiAgICB0aGlzLmNvbnRleHRNZW51UG9zaXRpb24gPSB7IHg6IGV2ZW50LmNsaWVudFgsIHk6IGV2ZW50LmNsaWVudFkgfTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNsb3NlQ29udGV4dE1lbnUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnVGb2xkZXJJZCA9PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5jb250ZXh0TWVudUZvbGRlcklkID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYXQgbGVhc3Qgb25lIG1lbnUgZW50cnkgaXMgZW5hYmxlZCDigJQgb3RoZXJ3aXNlIHRoZSB0cmlnZ2VyIGlzIHN1cHByZXNzZWQgZW50aXJlbHkuICovXG4gIGdldCBoYXNBbnlDb250ZXh0QWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsbG93Q3JlYXRlIHx8IHRoaXMuYWxsb3dSZW5hbWUgfHwgdGhpcy5hbGxvd01vdmUgfHwgdGhpcy5hbGxvd0R1cGxpY2F0ZSB8fCB0aGlzLmFsbG93RGVsZXRlO1xuICB9XG5cbiAgb25Db250ZXh0Q3JlYXRlU3ViZm9sZGVyKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dDcmVhdGUpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckNyZWF0ZVJlcXVlc3RlZC5lbWl0KHsgcGFyZW50SWQ6IG4uaWQgfSk7XG4gIH1cblxuICBvbkNvbnRleHRSZW5hbWUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xuICAgIGlmICghdGhpcy5hbGxvd1JlbmFtZSkgcmV0dXJuO1xuICAgIHRoaXMucmVuYW1pbmdJZCA9IG4uaWQ7XG4gICAgdGhpcy5yZW5hbWVEcmFmdCA9IG4ubmFtZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmZvY3VzUmVuYW1lSW5wdXQobi5pZCk7XG4gIH1cblxuICBvbkNvbnRleHRNb3ZlKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dNb3ZlKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJNb3ZlUmVxdWVzdGVkLmVtaXQoeyBpZDogbi5pZCB9KTtcbiAgfVxuXG4gIG9uQ29udGV4dER1cGxpY2F0ZShuOiBGb2xkZXJOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbnRleHRNZW51KCk7XG4gICAgaWYgKCF0aGlzLmFsbG93RHVwbGljYXRlKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJEdXBsaWNhdGVSZXF1ZXN0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgb25Db250ZXh0RGVsZXRlKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dEZWxldGUpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckRlbGV0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxuICBvbkRvY3VtZW50Q2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbnRleHRNZW51KCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScpXG4gIG9uRXNjYXBlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xuICB9XG5cbiAgLyoqIFRlbXBsYXRlIGhlbHBlcjogcmVzb2x2ZSBhIGZvbGRlciBub2RlIGJ5IGlkIGZyb20gdGhlIGlucHV0IHRyZWUuICovXG4gIGZvbGRlckJ5SWQoaWQ6IG51bWJlciB8IG51bGwpOiBGb2xkZXJOb2RlIHwgbnVsbCB7XG4gICAgaWYgKGlkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZpbmQgPSAobm9kZXM6IEZvbGRlck5vZGVbXSk6IEZvbGRlck5vZGUgfCBudWxsID0+IHtcbiAgICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgICBpZiAobi5pZCA9PT0gaWQpIHJldHVybiBuO1xuICAgICAgICBpZiAobi5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgaGl0ID0gZmluZChuLmNoaWxkcmVuKTtcbiAgICAgICAgICBpZiAoaGl0KSByZXR1cm4gaGl0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiBmaW5kKHRoaXMuZm9sZGVycyk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcGFyZW50IGlkIG9mIGBpZGAsIG9yIG51bGwgd2hlbiBgaWRgIGlzIGEgcm9vdCBmb2xkZXIgLyBub3QgZm91bmQuICovXG4gIHByaXZhdGUgcGFyZW50SWRPZihpZDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgZm9yIChjb25zdCBuIG9mIG5vZGVzIHx8IFtdKSB7XG4gICAgICAgIGlmIChuLmlkID09PSBpZCkge1xuICAgICAgICAgIHJlc3VsdCA9IHBhcmVudElkO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGggJiYgd2FsayhuLmNoaWxkcmVuLCBuLmlkKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICB3YWxrKHRoaXMuZm9sZGVycywgbnVsbCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJlcXVlc3RDcmVhdGUocGFyZW50SWQ6IG51bWJlciB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFsbG93Q3JlYXRlKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJDcmVhdGVSZXF1ZXN0ZWQuZW1pdCh7IHBhcmVudElkIH0pO1xuICB9XG5cbiAgdG9nZ2xlUGFuZWwoKTogdm9pZCB7XG4gICAgdGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQ7XG4gICAgdGhpcy5jb2xsYXBzZWRDaGFuZ2UuZW1pdCh0aGlzLmNvbGxhcHNlZCk7XG4gIH1cblxuICByb3dEcm9wcGVkKHRhcmdldElkOiBudW1iZXIgfCBudWxsLCBldmVudDogeyB0ZXN0SWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+OyB0YXJnZXRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCB9KTogdm9pZCB7XG4gICAgLy8gRGlyZWN0aXZlIGFscmVhZHkgZW1pdHMgd2l0aCB0aGUgYm91bmQgZm9sZGVyIGlkLCBidXQgbm9ybWFsaXNlIGluIGNhc2UgY2FsbGVyc1xuICAgIC8vIHdpcmUgcmF3IGV2ZW50cy5cbiAgICB0aGlzLnRlc3RzRHJvcHBlZC5lbWl0KHsgdGVzdElkczogZXZlbnQudGVzdElkcywgdGFyZ2V0Rm9sZGVySWQ6IHRhcmdldElkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGFyZ2V0IHJlY2VpdmVkIGEgZm9sZGVyIGRyYWcuIFZhbGlkYXRlIGFnYWluc3Qgc2VsZi9kZXNjZW5kYW50IGN5Y2xlcyBhbmRcbiAgICogZW1pdCBgZm9sZGVyRHJvcHBlZGAgaWYgdGhlIG1vdmUgaXMgbGVnYWwuIENhbGxlZCBmcm9tIHRoZSBkaXJlY3RpdmUnc1xuICAgKiBgKGZvbGRlckRyb3BwZWQpYCBvdXRwdXQgb24gZXZlcnkgcm93IGFuZCBvbiB0aGUgVW5vcmdhbmlzZWQgcm93LlxuICAgKi9cbiAgb25Gb2xkZXJSb3dEcm9wcGVkKHRhcmdldElkOiBudW1iZXIgfCBudWxsLCBldmVudDogeyBmb2xkZXJJZDogbnVtYmVyOyB0YXJnZXRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCB9KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckFsbEV4cGFuZFRpbWVycygpO1xuICAgIHRoaXMuYWN0aXZlRm9sZGVyRHJhZ0lkID0gbnVsbDtcbiAgICBjb25zdCBzb3VyY2VJZCA9IGV2ZW50LmZvbGRlcklkO1xuICAgIGlmICh0YXJnZXRJZCAhPSBudWxsICYmIHRhcmdldElkID09PSBzb3VyY2VJZCkgcmV0dXJuO1xuICAgIGlmICh0YXJnZXRJZCAhPSBudWxsICYmIHRoaXMuaXNEZXNjZW5kYW50T2Yoc291cmNlSWQsIHRhcmdldElkKSkgcmV0dXJuO1xuICAgIHRoaXMuZm9sZGVyRHJvcHBlZC5lbWl0KHsgaWQ6IHNvdXJjZUlkLCBuZXdQYXJlbnRJZDogdGFyZ2V0SWQgfSk7XG4gIH1cblxuICAvKiogUmVtZW1iZXIgdGhlIGRyYWdnZWQgZm9sZGVyIHNvIHdlIGNhbiBibG9jayBzZWxmLWhvdmVyIGV4cGFuc2lvbiBhbmQgY3ljbGUgZHJvcHMuICovXG4gIG9uRm9sZGVyRHJhZ1N0YXJ0KG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZUZvbGRlckRyYWdJZCA9IG4uaWQ7XG4gIH1cblxuICBvbkZvbGRlckRyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVGb2xkZXJEcmFnSWQgPSBudWxsO1xuICAgIHRoaXMuY2xlYXJBbGxFeHBhbmRUaW1lcnMoKTtcbiAgfVxuXG4gIC8qKiBTY2hlZHVsZSBhbiBhdXRvLWV4cGFuZCBmb3IgYSBjb2xsYXBzZWQgZm9sZGVyIHRoYXQgaGFzIGNoaWxkcmVuIGR1cmluZyBkcmFnLWhvdmVyLiAqL1xuICBvbkZvbGRlclJvd0RyYWdPdmVyKHJvdzogUmVuZGVyTm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gcm93Lm5vZGUuaWQ7XG4gICAgaWYgKCFyb3cuaGFzQ2hpbGRyZW4pIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0V4cGFuZGVkKGlkKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmFjdGl2ZUZvbGRlckRyYWdJZCA9PT0gaWQpIHJldHVybjsgLy8gZG9uJ3QgZXhwYW5kIHRoZSBzb3VyY2VcbiAgICBpZiAodGhpcy5kcmFnRXhwYW5kVGltZXJzLmhhcyhpZCkpIHJldHVybjtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLmRlbGV0ZShpZCk7XG4gICAgICBpZiAoIXRoaXMuaXNFeHBhbmRlZChpZCkpIHtcbiAgICAgICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZCwgZXhwYW5kZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5EUkFHX0VYUEFORF9ERUxBWV9NUyk7XG4gICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLnNldChpZCwgdGltZXIpO1xuICB9XG5cbiAgb25Gb2xkZXJSb3dEcmFnTGVhdmUocm93OiBSZW5kZXJOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSByb3cubm9kZS5pZDtcbiAgICBjb25zdCB0aW1lciA9IHRoaXMuZHJhZ0V4cGFuZFRpbWVycy5nZXQoaWQpO1xuICAgIGlmICh0aW1lciAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLmRlbGV0ZShpZCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6ZHJhZ2VuZCcpXG4gIG9uRG9jdW1lbnREcmFnRW5kKCk6IHZvaWQge1xuICAgIHRoaXMub25Gb2xkZXJEcmFnRW5kKCk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGBjYW5kaWRhdGVJZGAgaXMgYHNvdXJjZUlkYCBpdHNlbGYgb3IgYW55IGRlc2NlbmRhbnQgb2YgaXQuICovXG4gIHByaXZhdGUgaXNEZXNjZW5kYW50T2Yoc291cmNlSWQ6IG51bWJlciwgY2FuZGlkYXRlSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZm9sZGVyQnlJZChzb3VyY2VJZCk7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzdGFjazogRm9sZGVyTm9kZVtdID0gW3NvdXJjZV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgY29uc3QgbiA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGlmIChuLmlkID09PSBjYW5kaWRhdGVJZCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAobi5jaGlsZHJlbj8ubGVuZ3RoKSBzdGFjay5wdXNoKC4uLm4uY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyQWxsRXhwYW5kVGltZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ0V4cGFuZFRpbWVycy5mb3JFYWNoKHQgPT4gY2xlYXJUaW1lb3V0KHQpKTtcbiAgICB0aGlzLmRyYWdFeHBhbmRUaW1lcnMuY2xlYXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJBbGxFeHBhbmRUaW1lcnMoKTtcbiAgfVxuXG4gIHRyYWNrQnlSb3cgPSAoXzogbnVtYmVyLCByb3c6IFJlbmRlck5vZGUpID0+IHJvdy5ub2RlLmlkO1xuXG4gIG9uUm93S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgcm93OiBSZW5kZXJOb2RlLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93cztcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBuZXh0ID0gcm93c1tpbmRleCArIDFdO1xuICAgICAgICBpZiAobmV4dCkgdGhpcy5mb2N1c1Jvd0VsZW1lbnQobmV4dC5ub2RlLmlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1VwJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBwcmV2ID0gcm93c1tpbmRleCAtIDFdO1xuICAgICAgICBpZiAocHJldikgdGhpcy5mb2N1c1Jvd0VsZW1lbnQocHJldi5ub2RlLmlkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0Jzoge1xuICAgICAgICBpZiAocm93Lmhhc0NoaWxkcmVuICYmICF0aGlzLmlzRXhwYW5kZWQocm93Lm5vZGUuaWQpKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmZvbGRlckV4cGFuc2lvblRvZ2dsZWQuZW1pdCh7IGlkOiByb3cubm9kZS5pZCwgZXhwYW5kZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOiB7XG4gICAgICAgIGlmIChyb3cuaGFzQ2hpbGRyZW4gJiYgdGhpcy5pc0V4cGFuZGVkKHJvdy5ub2RlLmlkKSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZDogcm93Lm5vZGUuaWQsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJyAnOiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub25TZWxlY3Qocm93Lm5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzUm93RWxlbWVudChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2RhdGEtZm9sZGVyLXJvdy1pZD1cIiR7aWR9XCJdYCk7XG4gICAgICBlbD8uZm9jdXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VzIHRoZSBpbmxpbmUgcmVuYW1lIGlucHV0IGZvciB0aGUgZ2l2ZW4gZm9sZGVyLiBVc2VzIGBzZXRUaW1lb3V0YCAobm90XG4gICAqIG1pY3JvdGFzaykgYmVjYXVzZSB0aGUgaW5wdXQgaXMgZ2F0ZWQgYnkgYCpuZ0lmPVwicmVuYW1pbmdJZCA9PT0gLi4uXCJgIGFuZFxuICAgKiBtdXN0IHN1cnZpdmUgdGhlIG5leHQgT25QdXNoIGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUgYmVmb3JlIGl0J3MgaW4gdGhlIERPTS5cbiAgICovXG4gIHByaXZhdGUgZm9jdXNSZW5hbWVJbnB1dChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudD4oYFtkYXRhLWZvbGRlci1yZW5hbWUtaW5wdXQ9XCIke2lkfVwiXWApO1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgZWwuZm9jdXMoKTtcbiAgICAgIGVsLnNlbGVjdCgpO1xuICAgIH0sIDApO1xuICB9XG59XG4iLCI8IS0tIFJldXNhYmxlIGZvbGRlciBpY29uLiBSZW5kZXIgdmlhIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uOyBjb250ZXh0OiB7IGNvbG9yOiBub2RlLmNvbG9yIH1cIj48L25nLWNvbnRhaW5lcj4uIC0tPlxuPG5nLXRlbXBsYXRlICNmb2xkZXJJY29uIGxldC1jb2xvcj1cImNvbG9yXCI+XG4gIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS13LTQgY3FhLWgtNCBjcWEtc2hyaW5rLTBcIj5cbiAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTMgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgIDxwYXRoIGQ9XCJNMTIuMTkxNiA5Ljg1ODI0QzEyLjE5MTYgMTAuMTY3NyAxMi4wNjg3IDEwLjQ2NDQgMTEuODQ5OSAxMC42ODMyQzExLjYzMTEgMTAuOTAyIDExLjMzNDMgMTEuMDI0OSAxMS4wMjQ5IDExLjAyNDlIMS42OTE1N0MxLjM4MjE1IDExLjAyNDkgMS4wODU0IDEwLjkwMiAwLjg2NjYxMSAxMC42ODMyQzAuNjQ3ODE5IDEwLjQ2NDQgMC41MjQ5MDIgMTAuMTY3NyAwLjUyNDkwMiA5Ljg1ODI0VjEuNjkxNTdDMC41MjQ5MDIgMS4zODIxNSAwLjY0NzgxOSAxLjA4NTQgMC44NjY2MTEgMC44NjY2MTFDMS4wODU0IDAuNjQ3ODE5IDEuMzgyMTUgMC41MjQ5MDIgMS42OTE1NyAwLjUyNDkwMkg0LjYwODI0TDUuNzc0OSAyLjI3NDlIMTEuMDI0OUMxMS4zMzQzIDIuMjc0OSAxMS42MzExIDIuMzk3ODIgMTEuODQ5OSAyLjYxNjYxQzEyLjA2ODcgMi44MzU0IDEyLjE5MTYgMy4xMzIxNSAxMi4xOTE2IDMuNDQxNTdWOS44NTgyNFpcIiBbYXR0ci5zdHJva2VdPVwiY29sb3IgfHwgJyM5OTk5OUUnXCIgc3Ryb2tlLXdpZHRoPVwiMS4wNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICA8L3N2Zz5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPGFzaWRlXG4gIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItbmV1dHJhbC0yMDAgY3FhLXJvdW5kZWQtbGcgY3FhLWgtZnVsbCBjcWEtbWluLWgtMFwiXG4gIFtjbGFzcy5jcWEtdy1bMjQwcHhdXT1cIiFjb2xsYXBzZWRcIlxuICBbY2xhc3MuY3FhLXctWzQ4cHhdXT1cImNvbGxhcHNlZFwiXG4gIHN0eWxlPVwidHJhbnNpdGlvbjogd2lkdGggMTUwbXMgZWFzZTtcIlxuPlxuICA8IS0tIEhlYWRlciAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtMyBjcWEtcHktM1wiPlxuICAgIDxzcGFuICpuZ0lmPVwiIWNvbGxhcHNlZFwiIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtbmV1dHJhbC05MDBcIj5cbiAgICAgIHt7IGxhYmVscy5mb2xkZXJzIH19XG4gICAgPC9zcGFuPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMVwiIFtjbGFzcy5jcWEtdy1mdWxsXT1cImNvbGxhcHNlZFwiIFtjbGFzcy5jcWEtanVzdGlmeS1jZW50ZXJdPVwiY29sbGFwc2VkXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1wLTEgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtMTAwIGNxYS10ZXh0LW5ldXRyYWwtNTAwXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbGxhcHNlZCA/ICdFeHBhbmQgZm9sZGVycyBwYW5lbCcgOiAnQ29sbGFwc2UgZm9sZGVycyBwYW5lbCdcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MThweDt3aWR0aDoxOHB4O2hlaWdodDoxOHB4XCI+XG4gICAgICAgICAge3sgY29sbGFwc2VkID8gJ2NoZXZyb25fcmlnaHQnIDogJ2tleWJvYXJkX2RvdWJsZV9hcnJvd19sZWZ0JyB9fVxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiIWNvbGxhcHNlZCAmJiBhbGxvd0NyZWF0ZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImNxYS1wLTEgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtMTAwIGNxYS10ZXh0LW5ldXRyYWwtNTAwXCJcbiAgICAgICAgKGNsaWNrKT1cInJlcXVlc3RDcmVhdGUobnVsbClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVscy5uZXdGb2xkZXJcIlxuICAgICAgICBbdGl0bGVdPVwibGFiZWxzLm5ld0ZvbGRlclwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxOHB4O3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHhcIj5hZGQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sbGFwc2VkXCI+XG4gICAgPCEtLSBTZWFyY2ggLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1weC0zIGNxYS1wYi0yXCI+XG4gICAgICA8Y3FhLXNlYXJjaC1iYXJcbiAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImxhYmVscy5zZWFyY2hGb2xkZXJzUGxhY2Vob2xkZXJcIlxuICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwic2VhcmNoVmFsdWUgPSAkZXZlbnRcIlxuICAgICAgICAoY2xlYXJlZCk9XCJzZWFyY2hWYWx1ZSA9ICcnXCJcbiAgICAgID48L2NxYS1zZWFyY2gtYmFyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBUcmVlIChmb2xkZXJzIG9ubHkg4oCUIFVub3JnYW5pc2VkIGlzIHBpbm5lZCBiZWxvdyB0aGUgc2Nyb2xsIGFyZWEpIC0tPlxuICAgIDxkaXYgcm9sZT1cInRyZWVcIiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi1oLTAgY3FhLW1heC1oLVs2MHZoXSBjcWEtb3ZlcmZsb3cteS1hdXRvIGNxYS1weS0xIGNxYS1zY3JvbGxiYXItdGhpbiBjcWEtc2Nyb2xsYmFyLXRyYWNrLXRyYW5zcGFyZW50IGNxYS1zY3JvbGxiYXItdGh1bWItWyNFNUU3RUJdIGNxYS1zY3JvbGxiYXItdGh1bWItcm91bmRlZC1mdWxsIGNxYS1zY3JvbGxiYXItdGh1bWItaG92ZXI6Y3FhLWJnLVsjRDFENURCXVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3M7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlSb3dcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInJvdy5oYXNDaGlsZHJlbiA/IGlzRXhwYW5kZWQocm93Lm5vZGUuaWQpIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKHJvdy5ub2RlLmlkKVwiXG4gICAgICAgICAgW2F0dHIuZGF0YS1mb2xkZXItcm93LWlkXT1cInJvdy5ub2RlLmlkXCJcbiAgICAgICAgICBbY3FhRm9sZGVyRHJvcF09XCJyb3cubm9kZS5pZFwiXG4gICAgICAgICAgW2Ryb3BFbmFibGVkXT1cImFsbG93RHJvcFwiXG4gICAgICAgICAgKHRlc3RzRHJvcHBlZCk9XCJyb3dEcm9wcGVkKHJvdy5ub2RlLmlkLCAkZXZlbnQpXCJcbiAgICAgICAgICAoZm9sZGVyRHJvcHBlZCk9XCJvbkZvbGRlclJvd0Ryb3BwZWQocm93Lm5vZGUuaWQsICRldmVudClcIlxuICAgICAgICAgIFtjcWFGb2xkZXJEcmFnXT1cInJvdy5ub2RlLmlkXCJcbiAgICAgICAgICBbZHJhZ0VuYWJsZWRdPVwiYWxsb3dEcm9wXCJcbiAgICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uRm9sZGVyRHJhZ1N0YXJ0KHJvdy5ub2RlKVwiXG4gICAgICAgICAgKGRyYWdlbmQpPVwib25Gb2xkZXJEcmFnRW5kKClcIlxuICAgICAgICAgIChkcmFnb3Zlcik9XCJvbkZvbGRlclJvd0RyYWdPdmVyKHJvdylcIlxuICAgICAgICAgIChkcmFnbGVhdmUpPVwib25Gb2xkZXJSb3dEcmFnTGVhdmUocm93KVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0KHJvdy5ub2RlKVwiXG4gICAgICAgICAgKGNvbnRleHRtZW51KT1cIm9wZW5Db250ZXh0TWVudShyb3cubm9kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgKGtleWRvd24pPVwib25Sb3dLZXlkb3duKCRldmVudCwgcm93LCBpKVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZ3JvdXAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLXByLTMgY3FhLXB5LTEuNSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtNTAgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtYmctbmV1dHJhbC0xMDAgY3FhLXJlbGF0aXZlXCJcbiAgICAgICAgICBbY2xhc3MuY3FhLWJnLWluZGlnby01MF09XCJpc1NlbGVjdGVkKHJvdy5ub2RlLmlkKSB8fCBjb250ZXh0TWVudUZvbGRlcklkID09PSByb3cubm9kZS5pZFwiXG4gICAgICAgICAgW3N0eWxlLnBhZGRpbmdMZWZ0LnB4XT1cIjggKyByb3cuZGVwdGggKiAxNlwiXG4gICAgICAgICAgW2F0dHIudGl0bGVdPVwicm93Lm5vZGUudG90YWxDb3VudCAhPSBudWxsID8gKHJvdy5ub2RlLnRvdGFsQ291bnQgKyAnIHRvdGFsIGluY2x1ZGluZyBzdWJmb2xkZXJzJykgOiBudWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cImlzU2VsZWN0ZWQocm93Lm5vZGUuaWQpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1sZWZ0LTAgY3FhLXRvcC0wIGNxYS1ib3R0b20tMCBjcWEtdy1bM3B4XSBjcWEtYmctaW5kaWdvLTYwMFwiXG4gICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMCBjcWEtdGV4dC1uZXV0cmFsLTQwMFwiXG4gICAgICAgICAgICBbc3R5bGUudmlzaWJpbGl0eV09XCJyb3cuaGFzQ2hpbGRyZW4gPyAndmlzaWJsZScgOiAnaGlkZGVuJ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGUocm93Lm5vZGUsICRldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpc0V4cGFuZGVkKHJvdy5ub2RlLmlkKSA/ICdDb2xsYXBzZScgOiAnRXhwYW5kJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPlxuICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKHJvdy5ub2RlLmlkKSA/ICdleHBhbmRfbW9yZScgOiAnY2hldnJvbl9yaWdodCcgfX1cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvbGRlckljb247IGNvbnRleHQ6IHsgY29sb3I6IHJvdy5ub2RlLmNvbG9yIH1cIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZW5hbWluZ0lkID09PSByb3cubm9kZS5pZDsgZWxzZSBuYW1lVHBsXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBzaXplPVwiMVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9sZGVyLXJlbmFtZS1pbnB1dF09XCJyb3cubm9kZS5pZFwiXG4gICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJyZW5hbWVNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTAgY3FhLXctZnVsbCBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkIGNxYS1ib3JkZXIgY3FhLWJnLXdoaXRlIGNxYS10ZXh0LXNtIGNxYS1zaGFkb3ctc20gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtcmluZy0xXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXNSZW5hbWVEcmFmdFZhbGlkXG4gICAgICAgICAgICAgICAgPyAnY3FhLWJvcmRlci1uZXV0cmFsLTMwMCBmb2N1czpjcWEtYm9yZGVyLWluZGlnby00MDAgZm9jdXM6Y3FhLXJpbmctaW5kaWdvLTIwMCdcbiAgICAgICAgICAgICAgICA6ICdjcWEtYm9yZGVyLVsjRUY0NDQ0XSBmb2N1czpjcWEtYm9yZGVyLVsjRUY0NDQ0XSBmb2N1czpjcWEtcmluZy1bI0ZDQTVBNV0nXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIiFpc1JlbmFtZURyYWZ0VmFsaWRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlbmFtZURyYWZ0XCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwib25SZW5hbWVLZXkoJGV2ZW50LCByb3cubm9kZSlcIlxuICAgICAgICAgICAgICAoa2V5cHJlc3MpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgKGtleXVwKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cImNvbW1pdFJlbmFtZShyb3cubm9kZSlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNuYW1lVHBsPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtODAwIGNxYS10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgIChkYmxjbGljayk9XCJiZWdpblJlbmFtZShyb3cubm9kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICA+e3sgcm93Lm5vZGUubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPCEtLSBDb3VudCBzaG93biBhdCByZXN0OyBoaWRkZW4gb24gcm93IGhvdmVyIHdoZW4gZGVsZXRlIGlzIGFsbG93ZWQgLS0+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwic2hvd0NvdW50cyAmJiByb3cubm9kZS5jb3VudCAhPSBudWxsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtbmV1dHJhbC00MDAgY3FhLXRhYnVsYXItbnVtcyBjcWEtbWwtMVwiXG4gICAgICAgICAgICBbY2xhc3MuZ3JvdXAtaG92ZXI6Y3FhLWhpZGRlbl09XCJhbGxvd0RlbGV0ZVwiXG4gICAgICAgICAgPnt7IHJvdy5ub2RlLmNvdW50IH19PC9zcGFuPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJoYXNBbnlDb250ZXh0QWN0aW9uXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0wLjUgY3FhLXJvdW5kZWQgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtMjAwIGNxYS10ZXh0LW5ldXRyYWwtNTAwXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtaGlkZGVuXT1cImNvbnRleHRNZW51Rm9sZGVySWQgIT09IHJvdy5ub2RlLmlkXCJcbiAgICAgICAgICAgIFtjbGFzcy5ncm91cC1ob3ZlcjpjcWEtaW5saW5lLWZsZXhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3MuY3FhLWlubGluZS1mbGV4XT1cImNvbnRleHRNZW51Rm9sZGVySWQgPT09IHJvdy5ub2RlLmlkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29udGV4dE1lbnUocm93Lm5vZGUsICRldmVudClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT3BlbiBhY3Rpb25zIGZvciAnICsgcm93Lm5vZGUubmFtZVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidtZW51J1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImNvbnRleHRNZW51Rm9sZGVySWQgPT09IHJvdy5ub2RlLmlkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+bW9yZV9ob3JpejwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIERpdmlkZXIgYmV0d2VlbiBmb2xkZXIgdHJlZSBhbmQgcGlubmVkIFVub3JnYW5pc2VkIHRhYiAtLT5cbiAgICA8ZGl2XG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgY2xhc3M9XCJjcWEtbXgtMyBjcWEtc2hyaW5rLTBcIlxuICAgICAgc3R5bGU9XCJoZWlnaHQ6IDFweDsgYmFja2dyb3VuZC1jb2xvcjogI0U1RTdFQjsgbWFyZ2luLXRvcDogNnB4OyBtYXJnaW4tYm90dG9tOiA2cHg7XCJcbiAgICA+PC9kaXY+XG5cbiAgICA8IS0tIFVub3JnYW5pc2VkIOKAlCBwaW5uZWQgYmVsb3cgdGhlIHNjcm9sbGFibGUgZm9sZGVyIHRyZWUgc28gaXQgc3RheXMgdmlzaWJsZSByZWdhcmRsZXNzIG9mIGZvbGRlciBjb3VudCAtLT5cbiAgICA8ZGl2XG4gICAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChudWxsKVwiXG4gICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTUwIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLWJnLW5ldXRyYWwtMTAwIGNxYS1yZWxhdGl2ZSBjcWEtc2hyaW5rLTBcIlxuICAgICAgW2NsYXNzLmNxYS1iZy1pbmRpZ28tNTBdPVwiaXNTZWxlY3RlZChudWxsKVwiXG4gICAgICBbY3FhRm9sZGVyRHJvcF09XCJudWxsXCJcbiAgICAgIFtkcm9wRW5hYmxlZF09XCJhbGxvd0Ryb3BcIlxuICAgICAgKHRlc3RzRHJvcHBlZCk9XCJyb3dEcm9wcGVkKG51bGwsICRldmVudClcIlxuICAgICAgKGZvbGRlckRyb3BwZWQpPVwib25Gb2xkZXJSb3dEcm9wcGVkKG51bGwsICRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIm9uU2VsZWN0VW5vcmdhbmlzZWQoKVwiXG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCJpc1NlbGVjdGVkKG51bGwpXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWxlZnQtMCBjcWEtdG9wLTAgY3FhLWJvdHRvbS0wIGNxYS13LVszcHhdIGNxYS1iZy1pbmRpZ28tNjAwXCJcbiAgICAgID48L3NwYW4+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1uZXV0cmFsLTUwMFwiIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPmluYm94PC9tYXQtaWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTcwMFwiPnt7IGxhYmVscy51bm9yZ2FuaXNlZCB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwic2hvd0NvdW50c1wiIGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtbmV1dHJhbC00MDAgY3FhLXRhYnVsYXItbnVtc1wiPnt7IHVub3JnYW5pc2VkQ291bnQgfX08L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZvbGRlciBjb250ZXh0IG1lbnUgKHJpZ2h0LWNsaWNrIC8gZWxsaXBzaXMpLiBBbmNob3JlZCB0byB2aWV3cG9ydCBjb29yZHMuIC0tPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiY29udGV4dE1lbnVGb2xkZXJJZCAhPT0gbnVsbFwiXG4gICAgICByb2xlPVwibWVudVwiXG4gICAgICBjbGFzcz1cImNxYS1maXhlZCBjcWEtei01MCBjcWEtbWluLXctWzE4MHB4XSBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm9yZGVyLW5ldXRyYWwtMjAwIGNxYS1yb3VuZGVkLW1kIGNxYS1zaGFkb3ctbGcgY3FhLXB5LTFcIlxuICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29udGV4dE1lbnVQb3NpdGlvbi54XCJcbiAgICAgIFtzdHlsZS50b3AucHhdPVwiY29udGV4dE1lbnVQb3NpdGlvbi55XCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgKGNvbnRleHRtZW51KT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb2xkZXJCeUlkKGNvbnRleHRNZW51Rm9sZGVySWQpIGFzIG1lbnVOb2RlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cImFsbG93Q3JlYXRlXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXctZnVsbCBjcWEtcHgtMyBjcWEtcHktMS41IGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtODAwIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTEwMCBjcWEtdGV4dC1sZWZ0XCJcbiAgICAgICAgICAoY2xpY2spPVwib25Db250ZXh0Q3JlYXRlU3ViZm9sZGVyKG1lbnVOb2RlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+Y3JlYXRlX25ld19mb2xkZXI8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51Q3JlYXRlU3ViZm9sZGVyIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiYWxsb3dSZW5hbWVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC04MDAgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtMTAwIGNxYS10ZXh0LWxlZnRcIlxuICAgICAgICAgIChjbGljayk9XCJvbkNvbnRleHRSZW5hbWUobWVudU5vZGUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyBsYWJlbHMuZm9sZGVyTWVudVJlbmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cImFsbG93TW92ZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS13LWZ1bGwgY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTgwMCBob3ZlcjpjcWEtYmctbmV1dHJhbC0xMDAgY3FhLXRleHQtbGVmdFwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ29udGV4dE1vdmUobWVudU5vZGUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5kcml2ZV9maWxlX21vdmU8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51TW92ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cImFsbG93RHVwbGljYXRlXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXctZnVsbCBjcWEtcHgtMyBjcWEtcHktMS41IGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtODAwIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTEwMCBjcWEtdGV4dC1sZWZ0XCJcbiAgICAgICAgICAoY2xpY2spPVwib25Db250ZXh0RHVwbGljYXRlKG1lbnVOb2RlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICA8c3Bhbj57eyBsYWJlbHMuZm9sZGVyTWVudUR1cGxpY2F0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJhbGxvd0RlbGV0ZSAmJiAoYWxsb3dDcmVhdGUgfHwgYWxsb3dSZW5hbWUgfHwgYWxsb3dNb3ZlIHx8IGFsbG93RHVwbGljYXRlKVwiIGNsYXNzPVwiY3FhLWgtcHggY3FhLWJnLW5ldXRyYWwtMjAwIGNxYS1teS0xXCI+PC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cImFsbG93RGVsZXRlXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXctZnVsbCBjcWEtcHgtMyBjcWEtcHktMS41IGNxYS10ZXh0LXNtIGNxYS10ZXh0LXJlZC02MDAgaG92ZXI6Y3FhLWJnLXJlZC01MCBjcWEtdGV4dC1sZWZ0XCJcbiAgICAgICAgICAoY2xpY2spPVwib25Db250ZXh0RGVsZXRlKG1lbnVOb2RlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+ZGVsZXRlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51RGVsZXRlIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gIDwvbmctY29udGFpbmVyPlxuPC9hc2lkZT5cbiJdfQ==
547
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9sZGVyLXNpZGViYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvbW9kdWxhci10YWJsZS10ZW1wbGF0ZS9mb2xkZXItc2lkZWJhci9mb2xkZXItc2lkZWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3RlbXBsYXRlcy9tb2R1bGFyLXRhYmxlLXRlbXBsYXRlL2ZvbGRlci1zaWRlYmFyL2ZvbGRlci1zaWRlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEdBSXZCLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7O0FBZ0IxQyxNQUFNLE9BQU8sc0JBQXNCO0lBd0RqQyxZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXZEakMsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFDM0IscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUN2QyxzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFDakMscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBQzdCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQzVCLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFDMUIsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFDL0IsY0FBUyxHQUFZLElBQUksQ0FBQztRQUMxQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBQzNCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsV0FBTSxHQUFrQixFQUFFLEdBQUcsc0JBQXNCLEVBQUUsQ0FB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QUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFFRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBMlFQLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0I7Z0JBTTlCLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyx5QkFBeUI7Z0JBd0d2QyxpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RVTEFSX0xBQkVMUyxcbiAgRm9sZGVyTm9kZSxcbiAgRm9sZGVyUmVuYW1lZFBheWxvYWQsXG4gIE1vZHVsYXJMYWJlbHMsXG59IGZyb20gJy4uL21vZHVsYXItdGFibGUtdGVtcGxhdGUubW9kZWxzJztcblxuaW50ZXJmYWNlIFJlbmRlck5vZGUge1xuICBub2RlOiBGb2xkZXJOb2RlO1xuICBkZXB0aDogbnVtYmVyO1xuICB2aXNpYmxlOiBib29sZWFuO1xuICBoYXNDaGlsZHJlbjogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWZvbGRlci1zaWRlYmFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZvbGRlci1zaWRlYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRm9sZGVyU2lkZWJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGZvbGRlcnM6IEZvbGRlck5vZGVbXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3RlZEZvbGRlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZXhwYW5kZWRGb2xkZXJJZHM6IG51bWJlcltdID0gW107XG4gIEBJbnB1dCgpIHVub3JnYW5pc2VkQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGFsbG93Q3JlYXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dSZW5hbWU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd0RlbGV0ZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93TW92ZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93RHVwbGljYXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dEcm9wOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0NvdW50czogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGNvbGxhcHNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBsYWJlbHM6IE1vZHVsYXJMYWJlbHMgPSB7IC4uLkRFRkFVTFRfTU9EVUxBUl9MQUJFTFMgfTtcblxuICBAT3V0cHV0KCkgZm9sZGVyU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlciB8IG51bGw+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJFeHBhbnNpb25Ub2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXI7IGV4cGFuZGVkOiBib29sZWFuIH0+KCk7XG4gIC8qKiBFbWl0dGVkIGFmdGVyIHRoZSBob3N0IGNvbXBsZXRlcyBmb2xkZXIgY3JlYXRpb24gKGUuZy4sIGlubGluZSByZW5hbWUgZmxvdykuIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyQ3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbDsgbmFtZTogc3RyaW5nIH0+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBcIitcIiBoZWFkZXIgYnV0dG9uLiBIb3N0IHNob3VsZCBvcGVuIGEgY3JlYXRpb24gbW9kYWwuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJDcmVhdGVSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgcGFyZW50SWQ6IG51bWJlciB8IG51bGwgfT4oKTtcbiAgLyoqIENhcnJpZXMgdGhlIGZ1bGwgcmVuYW1lZCBmb2xkZXIgbm9kZSArIHBhcmVudCBpZCBzbyBob3N0cyBjYW4gaXNzdWUgY29tcGxldGUgdXBkYXRlIHJlcXVlc3RzLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyUmVuYW1lZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9sZGVyUmVuYW1lZFBheWxvYWQ+KCk7XG4gIEBPdXRwdXQoKSBmb2xkZXJEZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXIgfT4oKTtcbiAgLyoqIFVzZXIgcGlja2VkIFwiTW92ZSBmb2xkZXJcIiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIEhvc3Qgb3BlbnMgdGhlIGZvbGRlciBwaWNrZXIuICovXG4gIEBPdXRwdXQoKSBmb2xkZXJNb3ZlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXIgfT4oKTtcbiAgLyoqIFVzZXIgcGlja2VkIFwiRHVwbGljYXRlIGZvbGRlclwiIGZyb20gdGhlIGNvbnRleHQgbWVudS4gSG9zdCBjbG9uZXMgdGhlIHN1YnRyZWUgKHRlc3RzIHJlZmVyZW5jZWQsIG5vdCBjb3BpZWQpLiAqL1xuICBAT3V0cHV0KCkgZm9sZGVyRHVwbGljYXRlUmVxdWVzdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGlkOiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgpIHRlc3RzRHJvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyB0ZXN0SWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+OyB0YXJnZXRGb2xkZXJJZDogbnVtYmVyIHwgbnVsbCB9PigpO1xuICAvKiogRmlyZXMgd2hlbiBhIGZvbGRlciByb3cgaXMgZHJvcHBlZCBvbnRvIGFub3RoZXIgZm9sZGVyIChvciB0aGUgVW5vcmdhbmlzZWQgcm93KS4gKi9cbiAgQE91dHB1dCgpIGZvbGRlckRyb3BwZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaWQ6IG51bWJlcjsgbmV3UGFyZW50SWQ6IG51bWJlciB8IG51bGwgfT4oKTtcbiAgQE91dHB1dCgpIGNvbGxhcHNlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG4gIHJlbmFtaW5nSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICByZW5hbWVEcmFmdDogc3RyaW5nID0gJyc7XG4gIC8qKiBJbmxpbmUgcmVuYW1lIHVzZXMgdGhlIHNhbWUgbmFtZSBydWxlcyBhcyB0aGUgTmV3IEZvbGRlciBkaWFsb2cuICovXG4gIHJlYWRvbmx5IHJlbmFtZU1heExlbmd0aDogbnVtYmVyID0gMjA7XG4gIC8qKiBUcmFuc2llbnQgZmxhZzogdHVybnMgdGhlIHJlbmFtZSBpbnB1dCByZWQgYnJpZWZseSB3aGVuIHRoZSB1c2VyIGtleXN0cm9rZXNcbiAgICogIHdoaWxlIGFscmVhZHkgYXQgYHJlbmFtZU1heExlbmd0aGAsIHNvIHRoZSBzaWxlbnQgbWF4bGVuZ3RoIGNsYW1wIGdldHMgYVxuICAgKiAgdmlzaWJsZSBcInlvdSd2ZSBoaXQgdGhlIGNhcFwiIHNpZ25hbC4gQ2xlYXJlZCBieSBgcmVuYW1lTGltaXRGbGFzaFRpbWVyYC4gKi9cbiAgcmVuYW1lTGltaXRGbGFzaCA9IGZhbHNlO1xuICBwcml2YXRlIHJlbmFtZUxpbWl0Rmxhc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkVOQU1FX0xJTUlUX0ZMQVNIX01TID0gNjAwO1xuXG4gIC8qKiBJZCBvZiB0aGUgZm9sZGVyIHdob3NlIGNvbnRleHQgbWVudSBpcyBvcGVuLCBvciBudWxsIHdoZW4gY2xvc2VkLiAqL1xuICBjb250ZXh0TWVudUZvbGRlcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqIFZpZXdwb3J0LWFuY2hvcmVkIHBvc2l0aW9uIChjbGllbnQgY29vcmRpbmF0ZXMpIGZvciB0aGUgZmxvYXRpbmcgbWVudS4gKi9cbiAgY29udGV4dE1lbnVQb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0geyB4OiAwLCB5OiAwIH07XG5cbiAgLyoqIFBlbmRpbmcgYXV0by1leHBhbmQgdGltZXJzIHdoaWxlIGEgZm9sZGVyIGRyYWcgaXMgaG92ZXJlZCBvdmVyIGNvbGxhcHNlZCByb3dzLiAqL1xuICBwcml2YXRlIGRyYWdFeHBhbmRUaW1lcnMgPSBuZXcgTWFwPG51bWJlciwgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgRFJBR19FWFBBTkRfREVMQVlfTVMgPSA2MDA7XG4gIC8qKiBJZCBvZiB0aGUgZm9sZGVyIGN1cnJlbnRseSBiZWluZyBkcmFnZ2VkOyB1c2VkIHRvIHNraXAgY3ljbGUgdGFyZ2V0cyBhbmQgc291cmNlLWhvdmVyIGV4cGFuc2lvbi4gKi9cbiAgcHJpdmF0ZSBhY3RpdmVGb2xkZXJEcmFnSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBnZXQgZXhwYW5kZWRTZXQoKTogU2V0PG51bWJlcj4ge1xuICAgIHJldHVybiBuZXcgU2V0KHRoaXMuZXhwYW5kZWRGb2xkZXJJZHMgfHwgW10pO1xuICB9XG5cbiAgLyoqIEZsYXR0ZW5lZCwgZGVwdGgtYXdhcmUgbGlzdCBvZiByb3dzIHRvIHJlbmRlciBpbiBvcmRlci4gQW5jZXN0b3JzIG9mIG1hdGNoZXMgYXJlIGtlcHQuICovXG4gIGdldCByb3dzKCk6IFJlbmRlck5vZGVbXSB7XG4gICAgY29uc3Qgc2VhcmNoID0gKHRoaXMuc2VhcmNoVmFsdWUgfHwgJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gdGhpcy5leHBhbmRlZFNldDtcbiAgICBjb25zdCBrZWVwU2V0ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgY29uc3QgbWFyayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBhbmNlc3RvcnM6IG51bWJlcltdKTogdm9pZCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBub2RlcyB8fCBbXSkge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSAobi5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaCk7XG4gICAgICAgICAgY29uc3QgY2hpbGRBbmNlc3RvcnMgPSBbLi4uYW5jZXN0b3JzLCBuLmlkXTtcbiAgICAgICAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFuY2VzdG9ycykga2VlcFNldC5hZGQoYSk7XG4gICAgICAgICAgICBrZWVwU2V0LmFkZChuLmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG4uY2hpbGRyZW4/Lmxlbmd0aCkgbWFyayhuLmNoaWxkcmVuLCBjaGlsZEFuY2VzdG9ycyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBtYXJrKHRoaXMuZm9sZGVycywgW10pO1xuICAgIH1cblxuICAgIGNvbnN0IG91dDogUmVuZGVyTm9kZVtdID0gW107XG4gICAgY29uc3Qgd2FsayA9IChub2RlczogRm9sZGVyTm9kZVtdLCBkZXB0aDogbnVtYmVyLCBwYXJlbnRWaXNpYmxlOiBib29sZWFuKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoVmlzaWJsZSA9ICFzZWFyY2ggfHwga2VlcFNldC5oYXMobi5pZCk7XG4gICAgICAgIGNvbnN0IHZpc2libGUgPSBwYXJlbnRWaXNpYmxlICYmIHNlYXJjaFZpc2libGU7XG4gICAgICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gISEobi5jaGlsZHJlbiAmJiBuLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIG91dC5wdXNoKHsgbm9kZTogbiwgZGVwdGgsIHZpc2libGUsIGhhc0NoaWxkcmVuIH0pO1xuICAgICAgICBjb25zdCBleHBhbmRlZEJ5U2VhcmNoID0gISFzZWFyY2ggJiYga2VlcFNldC5oYXMobi5pZCk7XG4gICAgICAgIGNvbnN0IGlzTm9kZUV4cGFuZGVkID0gZXhwYW5kZWQuaGFzKG4uaWQpIHx8IGV4cGFuZGVkQnlTZWFyY2g7XG4gICAgICAgIGlmIChoYXNDaGlsZHJlbiAmJiBpc05vZGVFeHBhbmRlZCkge1xuICAgICAgICAgIHdhbGsobi5jaGlsZHJlbiEsIGRlcHRoICsgMSwgdmlzaWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGsodGhpcy5mb2xkZXJzLCAwLCB0cnVlKTtcbiAgICByZXR1cm4gb3V0LmZpbHRlcihyID0+IHIudmlzaWJsZSk7XG4gIH1cblxuICBpc0V4cGFuZGVkKGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZFNldC5oYXMoaWQpO1xuICB9XG5cbiAgaXNTZWxlY3RlZChpZDogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChpZCA9PSBudWxsICYmIHRoaXMuc2VsZWN0ZWRGb2xkZXJJZCA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gaWQgIT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkRm9sZGVySWQgIT0gbnVsbCAmJiBpZCA9PT0gdGhpcy5zZWxlY3RlZEZvbGRlcklkO1xuICB9XG5cbiAgb25Ub2dnbGUobjogRm9sZGVyTm9kZSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgZXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkKG4uaWQpO1xuICAgIHRoaXMuZm9sZGVyRXhwYW5zaW9uVG9nZ2xlZC5lbWl0KHsgaWQ6IG4uaWQsIGV4cGFuZGVkIH0pO1xuICB9XG5cbiAgb25TZWxlY3QobjogRm9sZGVyTm9kZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZW5hbWluZ0lkICE9IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlclNlbGVjdGVkLmVtaXQobiA9PSBudWxsID8gbnVsbCA6IG4uaWQpO1xuICB9XG5cbiAgb25TZWxlY3RVbm9yZ2FuaXNlZCgpOiB2b2lkIHtcbiAgICAvLyBTZW50aW5lbDogaG9zdHMgdGhhdCBrZWVwIGFuIFwiVW5vcmdhbmlzZWRcIiBidWNrZXQgY2FuIHRyZWF0IGEgbnVsbCBzZWxlY3Rpb25cbiAgICAvLyBhcyBcInNob3cgdW5vcmdhbmlzZWRcIi4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJvb3QgKG51bGwpIHNlbGVjdGlvbiBwYXR0ZXJuLFxuICAgIC8vIHRoaXMgbWF0Y2hlcyBpdC4gSG9zdCBkZWNpZGVzIHNlbWFudGljcy5cbiAgICB0aGlzLmZvbGRlclNlbGVjdGVkLmVtaXQobnVsbCk7XG4gIH1cblxuICBiZWdpblJlbmFtZShuOiBGb2xkZXJOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsb3dSZW5hbWUpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnJlbmFtaW5nSWQgPSBuLmlkO1xuICAgIHRoaXMucmVuYW1lRHJhZnQgPSBuLm5hbWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5mb2N1c1JlbmFtZUlucHV0KG4uaWQpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiB0aGUgYWN0aXZlIHJlbmFtZSBkcmFmdCBwYXNzZXMgdGhlIG5hbWUgcnVsZXMgKG5vbi1lbXB0eSwgd2l0aGluIG1heCBsZW5ndGgpLiAqL1xuICBnZXQgaXNSZW5hbWVEcmFmdFZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRyaW1tZWQgPSAodGhpcy5yZW5hbWVEcmFmdCB8fCAnJykudHJpbSgpO1xuICAgIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDAgJiYgdHJpbW1lZC5sZW5ndGggPD0gdGhpcy5yZW5hbWVNYXhMZW5ndGg7XG4gIH1cblxuICBjb21taXRSZW5hbWUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIC8vIERpc2NhcmQgaW52YWxpZCBkcmFmdHMgKGVtcHR5IC8gdG9vIGxvbmcpIGluc3RlYWQgb2YgY29tbWl0dGluZyBhIGJhZCBuYW1lLlxuICAgIC8vIFRoZSB1c2VyIHNlZXMgdGhlIHJlZCBib3JkZXIgd2hpbGUgZWRpdGluZzsgb24gYmx1ciB3ZSByZXZlcnQgdG8gdGhlIG9yaWdpbmFsLlxuICAgIGlmICghdGhpcy5pc1JlbmFtZURyYWZ0VmFsaWQpIHtcbiAgICAgIHRoaXMuY2FuY2VsUmVuYW1lKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSAodGhpcy5yZW5hbWVEcmFmdCB8fCAnJykudHJpbSgpO1xuICAgIGlmIChuYW1lICE9PSBuLm5hbWUpIHtcbiAgICAgIC8vIEVtaXQgdGhlIGZ1bGwgcmVuYW1lZCBub2RlICh3aXRoIHRoZSBuZXcgbmFtZSkgKyBwYXJlbnQgY29udGV4dCBzbyBob3N0cyBjYW5cbiAgICAgIC8vIGNhbGwgYFBVVCAvdGVzdF9jYXNlX2ZvbGRlcnMve2lkfWAgd2l0aG91dCByZS1yZXNvbHZpbmcgZnJvbSB0aGVpciBjYWNoZWQgdHJlZS5cbiAgICAgIGNvbnN0IGZvbGRlcjogRm9sZGVyTm9kZSA9IHsgLi4ubiwgbmFtZSB9O1xuICAgICAgdGhpcy5mb2xkZXJSZW5hbWVkLmVtaXQoe1xuICAgICAgICBmb2xkZXIsXG4gICAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkT2Yobi5pZCksXG4gICAgICAgIHByZXZpb3VzTmFtZTogbi5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY2FuY2VsUmVuYW1lKCk7XG4gIH1cblxuICBjYW5jZWxSZW5hbWUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5hbWluZ0lkID0gbnVsbDtcbiAgICB0aGlzLnJlbmFtZURyYWZ0ID0gJyc7XG4gICAgdGhpcy5jbGVhclJlbmFtZUxpbWl0Rmxhc2goKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uUmVuYW1lS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBuOiBGb2xkZXJOb2RlKTogdm9pZCB7XG4gICAgLy8gU3RvcCBidWJibGluZyBzbyB0aGUgcm93J3Mga2V5ZG93biBoYW5kbGVyICh3aGljaCB0cmVhdHMgU3BhY2UvRW50ZXIvQXJyb3dzIGFzXG4gICAgLy8gc2VsZWN0aW9uIC8gdHJlZSBuYXZpZ2F0aW9uKSBjYW4ndCBzd2FsbG93IGNoYXJhY3RlcnMgdHlwZWQgaW50byB0aGUgcmVuYW1lIGlucHV0LlxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyBEb24ndCBzd2FsbG93IHRoZSB1c2VyJ3MgZWRpdCBvbiBFbnRlciB3aGVuIHRoZSBkcmFmdCBpcyBpbnZhbGlkIOKAlCBrZWVwXG4gICAgICAvLyB0aGUgaW5wdXQgb3BlbiAocmVkIGJvcmRlciBhbHJlYWR5IHNpZ25hbHMgdGhlIGlzc3VlKSBhbmQgbGV0IHRoZW0gZml4IGl0LlxuICAgICAgaWYgKCF0aGlzLmlzUmVuYW1lRHJhZnRWYWxpZCkgcmV0dXJuO1xuICAgICAgdGhpcy5jb21taXRSZW5hbWUobik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jYW5jZWxSZW5hbWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRm9yIGFueSBvdGhlciBrZXlzdHJva2UsIGRldGVjdCBcInVzZXIgaXMgdHJ5aW5nIHRvIHR5cGUgcGFzdCBtYXhsZW5ndGhcIiBhbmRcbiAgICAvLyBicmllZmx5IGZsYXNoIHRoZSBpbnB1dCByZWQuIFRoZSBicm93c2VyJ3MgYG1heGxlbmd0aGAgYXR0cmlidXRlIGFscmVhZHlcbiAgICAvLyBzaWxlbnRseSBibG9ja3MgdGhlIGNoYXJhY3RlcjsgdGhpcyBzdXJmYWNlcyBhIHZpc2libGUgXCJ5b3UndmUgaGl0IHRoZSBjYXBcIlxuICAgIC8vIHNpZ25hbCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBtaXNzaW5nLlxuICAgIGlmICh0aGlzLmlzUHJpbnRhYmxlS2V5KGV2ZW50KSAmJiB0aGlzLndvdWxkRXhjZWVkUmVuYW1lTGltaXQoZXZlbnQpKSB7XG4gICAgICB0aGlzLnRyaWdnZXJSZW5hbWVMaW1pdEZsYXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ByaW50YWJsZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIC8vIFNpbmdsZS1jaGFyYWN0ZXIga2V5cyBhcmUgcHJpbnRhYmxlcyAoYSwgQiwgMSwgISwgc3BhY2UpLiBNb2RpZmllci1kcml2ZW5cbiAgICAvLyBzaG9ydGN1dHMgKEN0cmwvTWV0YSkgc2hvdWxkbid0IGNvdW50IOKAlCB0aGV5IGRvbid0IGluc2VydCB0ZXh0LlxuICAgIHJldHVybiBldmVudC5rZXkubGVuZ3RoID09PSAxICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5ICYmICFldmVudC5hbHRLZXk7XG4gIH1cblxuICBwcml2YXRlIHdvdWxkRXhjZWVkUmVuYW1lTGltaXQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAvLyBUaGUgbmV3IGxlbmd0aCBhZnRlciB0aGUga2V5c3Ryb2tlIHdvdWxkIGJlOiBjdXJyZW50IC0gc2VsZWN0aW9uTGVuZ3RoICsgMS5cbiAgICAvLyBJZiBhIHNlbGVjdGlvbiBjb3ZlcnMgcGFydCBvZiB0aGUgdmFsdWUsIHR5cGluZyByZXBsYWNlcyB0aGF0IHJhbmdlLCBzbyB0aGVcbiAgICAvLyBuZXQgbGVuZ3RoIG1pZ2h0IHN0aWxsIGZpdCB1bmRlciB0aGUgY2FwLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBzdGFydCA9IHRhcmdldD8uc2VsZWN0aW9uU3RhcnQgPz8gMDtcbiAgICBjb25zdCBlbmQgPSB0YXJnZXQ/LnNlbGVjdGlvbkVuZCA/PyAwO1xuICAgIGNvbnN0IHNlbGVjdGVkTGVuID0gTWF0aC5tYXgoMCwgZW5kIC0gc3RhcnQpO1xuICAgIGNvbnN0IGRyYWZ0TGVuID0gKHRoaXMucmVuYW1lRHJhZnQgfHwgJycpLmxlbmd0aDtcbiAgICByZXR1cm4gZHJhZnRMZW4gLSBzZWxlY3RlZExlbiA+PSB0aGlzLnJlbmFtZU1heExlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlclJlbmFtZUxpbWl0Rmxhc2goKTogdm9pZCB7XG4gICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnJlbmFtZUxpbWl0Rmxhc2hUaW1lcik7XG4gICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmVuYW1lTGltaXRGbGFzaCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSwgRm9sZGVyU2lkZWJhckNvbXBvbmVudC5SRU5BTUVfTElNSVRfRkxBU0hfTVMpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclJlbmFtZUxpbWl0Rmxhc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVuYW1lTGltaXRGbGFzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIpO1xuICAgICAgdGhpcy5yZW5hbWVMaW1pdEZsYXNoVGltZXIgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnJlbmFtZUxpbWl0Rmxhc2ggPSBmYWxzZTtcbiAgfVxuXG4gIGRlbGV0ZUZvbGRlcihuOiBGb2xkZXJOb2RlLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsb3dEZWxldGUpIHJldHVybjtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmZvbGRlckRlbGV0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBmb2xkZXIgY29udGV4dCBtZW51IGFuY2hvcmVkIGF0IHRoZSBnaXZlbiBjbGllbnQgY29vcmRpbmF0ZXMuXG4gICAqIENhbGxlZCBmcm9tIGJvdGggKGNvbnRleHRtZW51KSBvbiB0aGUgcm93IGFuZCAoY2xpY2spIG9uIHRoZSBlbGxpcHNpcyBidXR0b24uXG4gICAqIE1lbnUgdmlzaWJpbGl0eSBpcyBjbGFtcGVkIGluIHRoZSB0ZW1wbGF0ZSB2aWEgQ1NTIHRyYW5zZm9ybXMgc28gaXQgbmV2ZXIgbGVhdmVzIHRoZSB2aWV3cG9ydC5cbiAgICovXG4gIG9wZW5Db250ZXh0TWVudShuOiBGb2xkZXJOb2RlLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmhhc0FueUNvbnRleHRBY3Rpb24pIHJldHVybjtcbiAgICB0aGlzLmNvbnRleHRNZW51Rm9sZGVySWQgPSBuLmlkO1xuICAgIHRoaXMuY29udGV4dE1lbnVQb3NpdGlvbiA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2xvc2VDb250ZXh0TWVudSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudUZvbGRlcklkID09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLmNvbnRleHRNZW51Rm9sZGVySWQgPSBudWxsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBhdCBsZWFzdCBvbmUgbWVudSBlbnRyeSBpcyBlbmFibGVkIOKAlCBvdGhlcndpc2UgdGhlIHRyaWdnZXIgaXMgc3VwcHJlc3NlZCBlbnRpcmVseS4gKi9cbiAgZ2V0IGhhc0FueUNvbnRleHRBY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWxsb3dDcmVhdGUgfHwgdGhpcy5hbGxvd1JlbmFtZSB8fCB0aGlzLmFsbG93TW92ZSB8fCB0aGlzLmFsbG93RHVwbGljYXRlIHx8IHRoaXMuYWxsb3dEZWxldGU7XG4gIH1cblxuICBvbkNvbnRleHRDcmVhdGVTdWJmb2xkZXIobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xuICAgIGlmICghdGhpcy5hbGxvd0NyZWF0ZSkgcmV0dXJuO1xuICAgIHRoaXMuZm9sZGVyQ3JlYXRlUmVxdWVzdGVkLmVtaXQoeyBwYXJlbnRJZDogbi5pZCB9KTtcbiAgfVxuXG4gIG9uQ29udGV4dFJlbmFtZShuOiBGb2xkZXJOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbnRleHRNZW51KCk7XG4gICAgaWYgKCF0aGlzLmFsbG93UmVuYW1lKSByZXR1cm47XG4gICAgdGhpcy5yZW5hbWluZ0lkID0gbi5pZDtcbiAgICB0aGlzLnJlbmFtZURyYWZ0ID0gbi5uYW1lO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuZm9jdXNSZW5hbWVJbnB1dChuLmlkKTtcbiAgfVxuXG4gIG9uQ29udGV4dE1vdmUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xuICAgIGlmICghdGhpcy5hbGxvd01vdmUpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlck1vdmVSZXF1ZXN0ZWQuZW1pdCh7IGlkOiBuLmlkIH0pO1xuICB9XG5cbiAgb25Db250ZXh0RHVwbGljYXRlKG46IEZvbGRlck5vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICBpZiAoIXRoaXMuYWxsb3dEdXBsaWNhdGUpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckR1cGxpY2F0ZVJlcXVlc3RlZC5lbWl0KHsgaWQ6IG4uaWQgfSk7XG4gIH1cblxuICBvbkNvbnRleHREZWxldGUobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xuICAgIGlmICghdGhpcy5hbGxvd0RlbGV0ZSkgcmV0dXJuO1xuICAgIHRoaXMuZm9sZGVyRGVsZXRlZC5lbWl0KHsgaWQ6IG4uaWQgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXG4gIG9uRG9jdW1lbnRDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNvbnRleHRNZW51KCk7XG4gIH1cblxuICAvKiogVGVtcGxhdGUgaGVscGVyOiByZXNvbHZlIGEgZm9sZGVyIG5vZGUgYnkgaWQgZnJvbSB0aGUgaW5wdXQgdHJlZS4gKi9cbiAgZm9sZGVyQnlJZChpZDogbnVtYmVyIHwgbnVsbCk6IEZvbGRlck5vZGUgfCBudWxsIHtcbiAgICBpZiAoaWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZmluZCA9IChub2RlczogRm9sZGVyTm9kZVtdKTogRm9sZGVyTm9kZSB8IG51bGwgPT4ge1xuICAgICAgZm9yIChjb25zdCBuIG9mIG5vZGVzIHx8IFtdKSB7XG4gICAgICAgIGlmIChuLmlkID09PSBpZCkgcmV0dXJuIG47XG4gICAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBoaXQgPSBmaW5kKG4uY2hpbGRyZW4pO1xuICAgICAgICAgIGlmIChoaXQpIHJldHVybiBoaXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIGZpbmQodGhpcy5mb2xkZXJzKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBwYXJlbnQgaWQgb2YgYGlkYCwgb3IgbnVsbCB3aGVuIGBpZGAgaXMgYSByb290IGZvbGRlciAvIG5vdCBmb3VuZC4gKi9cbiAgcHJpdmF0ZSBwYXJlbnRJZE9mKGlkOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB3YWxrID0gKG5vZGVzOiBGb2xkZXJOb2RlW10sIHBhcmVudElkOiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMgfHwgW10pIHtcbiAgICAgICAgaWYgKG4uaWQgPT09IGlkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcGFyZW50SWQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4uY2hpbGRyZW4/Lmxlbmd0aCAmJiB3YWxrKG4uY2hpbGRyZW4sIG4uaWQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIHdhbGsodGhpcy5mb2xkZXJzLCBudWxsKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmVxdWVzdENyZWF0ZShwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWxsb3dDcmVhdGUpIHJldHVybjtcbiAgICB0aGlzLmZvbGRlckNyZWF0ZVJlcXVlc3RlZC5lbWl0KHsgcGFyZW50SWQgfSk7XG4gIH1cblxuICB0b2dnbGVQYW5lbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcbiAgICB0aGlzLmNvbGxhcHNlZENoYW5nZS5lbWl0KHRoaXMuY29sbGFwc2VkKTtcbiAgfVxuXG4gIHJvd0Ryb3BwZWQodGFyZ2V0SWQ6IG51bWJlciB8IG51bGwsIGV2ZW50OiB7IHRlc3RJZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj47IHRhcmdldEZvbGRlcklkOiBudW1iZXIgfCBudWxsIH0pOiB2b2lkIHtcbiAgICAvLyBEaXJlY3RpdmUgYWxyZWFkeSBlbWl0cyB3aXRoIHRoZSBib3VuZCBmb2xkZXIgaWQsIGJ1dCBub3JtYWxpc2UgaW4gY2FzZSBjYWxsZXJzXG4gICAgLy8gd2lyZSByYXcgZXZlbnRzLlxuICAgIHRoaXMudGVzdHNEcm9wcGVkLmVtaXQoeyB0ZXN0SWRzOiBldmVudC50ZXN0SWRzLCB0YXJnZXRGb2xkZXJJZDogdGFyZ2V0SWQgfSk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcCB0YXJnZXQgcmVjZWl2ZWQgYSBmb2xkZXIgZHJhZy4gVmFsaWRhdGUgYWdhaW5zdCBzZWxmL2Rlc2NlbmRhbnQgY3ljbGVzIGFuZFxuICAgKiBlbWl0IGBmb2xkZXJEcm9wcGVkYCBpZiB0aGUgbW92ZSBpcyBsZWdhbC4gQ2FsbGVkIGZyb20gdGhlIGRpcmVjdGl2ZSdzXG4gICAqIGAoZm9sZGVyRHJvcHBlZClgIG91dHB1dCBvbiBldmVyeSByb3cgYW5kIG9uIHRoZSBVbm9yZ2FuaXNlZCByb3cuXG4gICAqL1xuICBvbkZvbGRlclJvd0Ryb3BwZWQodGFyZ2V0SWQ6IG51bWJlciB8IG51bGwsIGV2ZW50OiB7IGZvbGRlcklkOiBudW1iZXI7IHRhcmdldEZvbGRlcklkOiBudW1iZXIgfCBudWxsIH0pOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyQWxsRXhwYW5kVGltZXJzKCk7XG4gICAgdGhpcy5hY3RpdmVGb2xkZXJEcmFnSWQgPSBudWxsO1xuICAgIGNvbnN0IHNvdXJjZUlkID0gZXZlbnQuZm9sZGVySWQ7XG4gICAgaWYgKHRhcmdldElkICE9IG51bGwgJiYgdGFyZ2V0SWQgPT09IHNvdXJjZUlkKSByZXR1cm47XG4gICAgaWYgKHRhcmdldElkICE9IG51bGwgJiYgdGhpcy5pc0Rlc2NlbmRhbnRPZihzb3VyY2VJZCwgdGFyZ2V0SWQpKSByZXR1cm47XG4gICAgdGhpcy5mb2xkZXJEcm9wcGVkLmVtaXQoeyBpZDogc291cmNlSWQsIG5ld1BhcmVudElkOiB0YXJnZXRJZCB9KTtcbiAgfVxuXG4gIC8qKiBSZW1lbWJlciB0aGUgZHJhZ2dlZCBmb2xkZXIgc28gd2UgY2FuIGJsb2NrIHNlbGYtaG92ZXIgZXhwYW5zaW9uIGFuZCBjeWNsZSBkcm9wcy4gKi9cbiAgb25Gb2xkZXJEcmFnU3RhcnQobjogRm9sZGVyTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlRm9sZGVyRHJhZ0lkID0gbi5pZDtcbiAgfVxuXG4gIG9uRm9sZGVyRHJhZ0VuZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZUZvbGRlckRyYWdJZCA9IG51bGw7XG4gICAgdGhpcy5jbGVhckFsbEV4cGFuZFRpbWVycygpO1xuICB9XG5cbiAgLyoqIFNjaGVkdWxlIGFuIGF1dG8tZXhwYW5kIGZvciBhIGNvbGxhcHNlZCBmb2xkZXIgdGhhdCBoYXMgY2hpbGRyZW4gZHVyaW5nIGRyYWctaG92ZXIuICovXG4gIG9uRm9sZGVyUm93RHJhZ092ZXIocm93OiBSZW5kZXJOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSByb3cubm9kZS5pZDtcbiAgICBpZiAoIXJvdy5oYXNDaGlsZHJlbikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzRXhwYW5kZWQoaWQpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuYWN0aXZlRm9sZGVyRHJhZ0lkID09PSBpZCkgcmV0dXJuOyAvLyBkb24ndCBleHBhbmQgdGhlIHNvdXJjZVxuICAgIGlmICh0aGlzLmRyYWdFeHBhbmRUaW1lcnMuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRyYWdFeHBhbmRUaW1lcnMuZGVsZXRlKGlkKTtcbiAgICAgIGlmICghdGhpcy5pc0V4cGFuZGVkKGlkKSkge1xuICAgICAgICB0aGlzLmZvbGRlckV4cGFuc2lvblRvZ2dsZWQuZW1pdCh7IGlkLCBleHBhbmRlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLkRSQUdfRVhQQU5EX0RFTEFZX01TKTtcbiAgICB0aGlzLmRyYWdFeHBhbmRUaW1lcnMuc2V0KGlkLCB0aW1lcik7XG4gIH1cblxuICBvbkZvbGRlclJvd0RyYWdMZWF2ZShyb3c6IFJlbmRlck5vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IHJvdy5ub2RlLmlkO1xuICAgIGNvbnN0IHRpbWVyID0gdGhpcy5kcmFnRXhwYW5kVGltZXJzLmdldChpZCk7XG4gICAgaWYgKHRpbWVyICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLmRyYWdFeHBhbmRUaW1lcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpkcmFnZW5kJylcbiAgb25Eb2N1bWVudERyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5vbkZvbGRlckRyYWdFbmQoKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYGNhbmRpZGF0ZUlkYCBpcyBgc291cmNlSWRgIGl0c2VsZiBvciBhbnkgZGVzY2VuZGFudCBvZiBpdC4gKi9cbiAgcHJpdmF0ZSBpc0Rlc2NlbmRhbnRPZihzb3VyY2VJZDogbnVtYmVyLCBjYW5kaWRhdGVJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5mb2xkZXJCeUlkKHNvdXJjZUlkKTtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHN0YWNrOiBGb2xkZXJOb2RlW10gPSBbc291cmNlXTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICBjb25zdCBuID0gc3RhY2sucG9wKCkhO1xuICAgICAgaWYgKG4uaWQgPT09IGNhbmRpZGF0ZUlkKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChuLmNoaWxkcmVuPy5sZW5ndGgpIHN0YWNrLnB1c2goLi4ubi5jaGlsZHJlbik7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJBbGxFeHBhbmRUaW1lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnRXhwYW5kVGltZXJzLmZvckVhY2godCA9PiBjbGVhclRpbWVvdXQodCkpO1xuICAgIHRoaXMuZHJhZ0V4cGFuZFRpbWVycy5jbGVhcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckFsbEV4cGFuZFRpbWVycygpO1xuICAgIHRoaXMuY2xlYXJSZW5hbWVMaW1pdEZsYXNoKCk7XG4gIH1cblxuICB0cmFja0J5Um93ID0gKF86IG51bWJlciwgcm93OiBSZW5kZXJOb2RlKSA9PiByb3cubm9kZS5pZDtcblxuICBvblJvd0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHJvdzogUmVuZGVyTm9kZSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgbmV4dCA9IHJvd3NbaW5kZXggKyAxXTtcbiAgICAgICAgaWYgKG5leHQpIHRoaXMuZm9jdXNSb3dFbGVtZW50KG5leHQubm9kZS5pZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgcHJldiA9IHJvd3NbaW5kZXggLSAxXTtcbiAgICAgICAgaWYgKHByZXYpIHRoaXMuZm9jdXNSb3dFbGVtZW50KHByZXYubm9kZS5pZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6IHtcbiAgICAgICAgaWYgKHJvdy5oYXNDaGlsZHJlbiAmJiAhdGhpcy5pc0V4cGFuZGVkKHJvdy5ub2RlLmlkKSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5mb2xkZXJFeHBhbnNpb25Ub2dnbGVkLmVtaXQoeyBpZDogcm93Lm5vZGUuaWQsIGV4cGFuZGVkOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQXJyb3dMZWZ0Jzoge1xuICAgICAgICBpZiAocm93Lmhhc0NoaWxkcmVuICYmIHRoaXMuaXNFeHBhbmRlZChyb3cubm9kZS5pZCkpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuZm9sZGVyRXhwYW5zaW9uVG9nZ2xlZC5lbWl0KHsgaWQ6IHJvdy5ub2RlLmlkLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICBjYXNlICcgJzoge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0KHJvdy5ub2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c1Jvd0VsZW1lbnQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLWZvbGRlci1yb3ctaWQ9XCIke2lkfVwiXWApO1xuICAgICAgZWw/LmZvY3VzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRm9jdXNlcyB0aGUgaW5saW5lIHJlbmFtZSBpbnB1dCBmb3IgdGhlIGdpdmVuIGZvbGRlci4gVXNlcyBgc2V0VGltZW91dGAgKG5vdFxuICAgKiBtaWNyb3Rhc2spIGJlY2F1c2UgdGhlIGlucHV0IGlzIGdhdGVkIGJ5IGAqbmdJZj1cInJlbmFtaW5nSWQgPT09IC4uLlwiYCBhbmRcbiAgICogbXVzdCBzdXJ2aXZlIHRoZSBuZXh0IE9uUHVzaCBjaGFuZ2UtZGV0ZWN0aW9uIGN5Y2xlIGJlZm9yZSBpdCdzIGluIHRoZSBET00uXG4gICAqL1xuICBwcml2YXRlIGZvY3VzUmVuYW1lSW5wdXQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KGBbZGF0YS1mb2xkZXItcmVuYW1lLWlucHV0PVwiJHtpZH1cIl1gKTtcbiAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgIGVsLmZvY3VzKCk7XG4gICAgICBlbC5zZWxlY3QoKTtcbiAgICB9LCAwKTtcbiAgfVxufVxuIiwiPCEtLSBSZXVzYWJsZSBmb2xkZXIgaWNvbi4gUmVuZGVyIHZpYSA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZm9sZGVySWNvbjsgY29udGV4dDogeyBjb2xvcjogbm9kZS5jb2xvciB9XCI+PC9uZy1jb250YWluZXI+LiAtLT5cbjxuZy10ZW1wbGF0ZSAjZm9sZGVySWNvbiBsZXQtY29sb3I9XCJjb2xvclwiPlxuICA8c3BhbiBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdy00IGNxYS1oLTQgY3FhLXNocmluay0wXCI+XG4gICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEzIDEyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8cGF0aCBkPVwiTTEyLjE5MTYgOS44NTgyNEMxMi4xOTE2IDEwLjE2NzcgMTIuMDY4NyAxMC40NjQ0IDExLjg0OTkgMTAuNjgzMkMxMS42MzExIDEwLjkwMiAxMS4zMzQzIDExLjAyNDkgMTEuMDI0OSAxMS4wMjQ5SDEuNjkxNTdDMS4zODIxNSAxMS4wMjQ5IDEuMDg1NCAxMC45MDIgMC44NjY2MTEgMTAuNjgzMkMwLjY0NzgxOSAxMC40NjQ0IDAuNTI0OTAyIDEwLjE2NzcgMC41MjQ5MDIgOS44NTgyNFYxLjY5MTU3QzAuNTI0OTAyIDEuMzgyMTUgMC42NDc4MTkgMS4wODU0IDAuODY2NjExIDAuODY2NjExQzEuMDg1NCAwLjY0NzgxOSAxLjM4MjE1IDAuNTI0OTAyIDEuNjkxNTcgMC41MjQ5MDJINC42MDgyNEw1Ljc3NDkgMi4yNzQ5SDExLjAyNDlDMTEuMzM0MyAyLjI3NDkgMTEuNjMxMSAyLjM5NzgyIDExLjg0OTkgMi42MTY2MUMxMi4wNjg3IDIuODM1NCAxMi4xOTE2IDMuMTMyMTUgMTIuMTkxNiAzLjQ0MTU3VjkuODU4MjRaXCIgW2F0dHIuc3Ryb2tlXT1cImNvbG9yIHx8ICcjOTk5OTlFJ1wiIHN0cm9rZS13aWR0aD1cIjEuMDVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgPC9zdmc+XG4gIDwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxhc2lkZVxuICBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtYmctd2hpdGUgY3FhLWJvcmRlciBjcWEtYm9yZGVyLW5ldXRyYWwtMjAwIGNxYS1yb3VuZGVkLWxnIGNxYS1oLWZ1bGwgY3FhLW1pbi1oLTBcIlxuICBbY2xhc3MuY3FhLXctWzI0MHB4XV09XCIhY29sbGFwc2VkXCJcbiAgW2NsYXNzLmNxYS13LVs0OHB4XV09XCJjb2xsYXBzZWRcIlxuICBzdHlsZT1cInRyYW5zaXRpb246IHdpZHRoIDE1MG1zIGVhc2U7XCJcbj5cbiAgPCEtLSBIZWFkZXIgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXB4LTMgY3FhLXB5LTNcIj5cbiAgICA8c3BhbiAqbmdJZj1cIiFjb2xsYXBzZWRcIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LW5ldXRyYWwtOTAwXCI+XG4gICAgICB7eyBsYWJlbHMuZm9sZGVycyB9fVxuICAgIDwvc3Bhbj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTFcIiBbY2xhc3MuY3FhLXctZnVsbF09XCJjb2xsYXBzZWRcIiBbY2xhc3MuY3FhLWp1c3RpZnktY2VudGVyXT1cImNvbGxhcHNlZFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1yb3VuZGVkIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTEwMCBjcWEtdGV4dC1uZXV0cmFsLTUwMFwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVQYW5lbCgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjb2xsYXBzZWQgPyAnRXhwYW5kIGZvbGRlcnMgcGFuZWwnIDogJ0NvbGxhcHNlIGZvbGRlcnMgcGFuZWwnXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE4cHg7d2lkdGg6MThweDtoZWlnaHQ6MThweFwiPlxuICAgICAgICAgIHt7IGNvbGxhcHNlZCA/ICdjaGV2cm9uX3JpZ2h0JyA6ICdrZXlib2FyZF9kb3VibGVfYXJyb3dfbGVmdCcgfX1cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIiFjb2xsYXBzZWQgJiYgYWxsb3dDcmVhdGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1yb3VuZGVkIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTEwMCBjcWEtdGV4dC1uZXV0cmFsLTUwMFwiXG4gICAgICAgIChjbGljayk9XCJyZXF1ZXN0Q3JlYXRlKG51bGwpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbHMubmV3Rm9sZGVyXCJcbiAgICAgICAgW3RpdGxlXT1cImxhYmVscy5uZXdGb2xkZXJcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6MThweDt3aWR0aDoxOHB4O2hlaWdodDoxOHB4XCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbGxhcHNlZFwiPlxuICAgIDwhLS0gU2VhcmNoIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtcHgtMyBjcWEtcGItMlwiPlxuICAgICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJsYWJlbHMuc2VhcmNoRm9sZGVyc1BsYWNlaG9sZGVyXCJcbiAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInNlYXJjaFZhbHVlID0gJGV2ZW50XCJcbiAgICAgICAgKGNsZWFyZWQpPVwic2VhcmNoVmFsdWUgPSAnJ1wiXG4gICAgICA+PC9jcWEtc2VhcmNoLWJhcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVHJlZSAoZm9sZGVycyBvbmx5IOKAlCBVbm9yZ2FuaXNlZCBpcyBwaW5uZWQgYmVsb3cgdGhlIHNjcm9sbCBhcmVhKSAtLT5cbiAgICA8ZGl2IHJvbGU9XCJ0cmVlXCIgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4taC0wIGNxYS1tYXgtaC1bNjB2aF0gY3FhLW92ZXJmbG93LXktYXV0byBjcWEtcHktMSBjcWEtc2Nyb2xsYmFyLXRoaW4gY3FhLXNjcm9sbGJhci10cmFjay10cmFuc3BhcmVudCBjcWEtc2Nyb2xsYmFyLXRodW1iLVsjRTVFN0VCXSBjcWEtc2Nyb2xsYmFyLXRodW1iLXJvdW5kZWQtZnVsbCBjcWEtc2Nyb2xsYmFyLXRodW1iLWhvdmVyOmNxYS1iZy1bI0QxRDVEQl1cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Um93XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICByb2xlPVwidHJlZWl0ZW1cIlxuICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyb3cuaGFzQ2hpbGRyZW4gPyBpc0V4cGFuZGVkKHJvdy5ub2RlLmlkKSA6IG51bGxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChyb3cubm9kZS5pZClcIlxuICAgICAgICAgIFthdHRyLmRhdGEtZm9sZGVyLXJvdy1pZF09XCJyb3cubm9kZS5pZFwiXG4gICAgICAgICAgW2NxYUZvbGRlckRyb3BdPVwicm93Lm5vZGUuaWRcIlxuICAgICAgICAgIFtkcm9wRW5hYmxlZF09XCJhbGxvd0Ryb3BcIlxuICAgICAgICAgICh0ZXN0c0Ryb3BwZWQpPVwicm93RHJvcHBlZChyb3cubm9kZS5pZCwgJGV2ZW50KVwiXG4gICAgICAgICAgKGZvbGRlckRyb3BwZWQpPVwib25Gb2xkZXJSb3dEcm9wcGVkKHJvdy5ub2RlLmlkLCAkZXZlbnQpXCJcbiAgICAgICAgICBbY3FhRm9sZGVyRHJhZ109XCJyb3cubm9kZS5pZFwiXG4gICAgICAgICAgW2RyYWdFbmFibGVkXT1cImFsbG93RHJvcFwiXG4gICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkZvbGRlckRyYWdTdGFydChyb3cubm9kZSlcIlxuICAgICAgICAgIChkcmFnZW5kKT1cIm9uRm9sZGVyRHJhZ0VuZCgpXCJcbiAgICAgICAgICAoZHJhZ292ZXIpPVwib25Gb2xkZXJSb3dEcmFnT3Zlcihyb3cpXCJcbiAgICAgICAgICAoZHJhZ2xlYXZlKT1cIm9uRm9sZGVyUm93RHJhZ0xlYXZlKHJvdylcIlxuICAgICAgICAgIChjbGljayk9XCJvblNlbGVjdChyb3cubm9kZSlcIlxuICAgICAgICAgIChjb250ZXh0bWVudSk9XCJvcGVuQ29udGV4dE1lbnUocm93Lm5vZGUsICRldmVudClcIlxuICAgICAgICAgIChrZXlkb3duKT1cIm9uUm93S2V5ZG93bigkZXZlbnQsIHJvdywgaSlcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWdyb3VwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1wci0zIGNxYS1weS0xLjUgY3FhLWN1cnNvci1wb2ludGVyIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTUwIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLWJnLW5ldXRyYWwtMTAwIGNxYS1yZWxhdGl2ZVwiXG4gICAgICAgICAgW2NsYXNzLmNxYS1iZy1pbmRpZ28tNTBdPVwiaXNTZWxlY3RlZChyb3cubm9kZS5pZCkgfHwgY29udGV4dE1lbnVGb2xkZXJJZCA9PT0gcm93Lm5vZGUuaWRcIlxuICAgICAgICAgIFtzdHlsZS5wYWRkaW5nTGVmdC5weF09XCI4ICsgcm93LmRlcHRoICogMTZcIlxuICAgICAgICAgIFthdHRyLnRpdGxlXT1cInJvdy5ub2RlLnRvdGFsQ291bnQgIT0gbnVsbCA/IChyb3cubm9kZS50b3RhbENvdW50ICsgJyB0b3RhbCBpbmNsdWRpbmcgc3ViZm9sZGVycycpIDogbnVsbFwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJpc1NlbGVjdGVkKHJvdy5ub2RlLmlkKVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtYm90dG9tLTAgY3FhLXctWzNweF0gY3FhLWJnLWluZGlnby02MDBcIlxuICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1wLTAgY3FhLXRleHQtbmV1dHJhbC00MDBcIlxuICAgICAgICAgICAgW3N0eWxlLnZpc2liaWxpdHldPVwicm93Lmhhc0NoaWxkcmVuID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlKHJvdy5ub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXNFeHBhbmRlZChyb3cubm9kZS5pZCkgPyAnQ29sbGFwc2UnIDogJ0V4cGFuZCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5cbiAgICAgICAgICAgICAge3sgaXNFeHBhbmRlZChyb3cubm9kZS5pZCkgPyAnZXhwYW5kX21vcmUnIDogJ2NoZXZyb25fcmlnaHQnIH19XG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb2xkZXJJY29uOyBjb250ZXh0OiB7IGNvbG9yOiByb3cubm9kZS5jb2xvciB9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVuYW1pbmdJZCA9PT0gcm93Lm5vZGUuaWQ7IGVsc2UgbmFtZVRwbFwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgc2l6ZT1cIjFcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvbGRlci1yZW5hbWUtaW5wdXRdPVwicm93Lm5vZGUuaWRcIlxuICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwicmVuYW1lTWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wIGNxYS13LWZ1bGwgY3FhLXB4LTIgY3FhLXB5LTAuNSBjcWEtcm91bmRlZCBjcWEtYm9yZGVyIGNxYS1iZy13aGl0ZSBjcWEtdGV4dC1zbSBjcWEtc2hhZG93LXNtIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLXJpbmctMVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihpc1JlbmFtZURyYWZ0VmFsaWQgJiYgIXJlbmFtZUxpbWl0Rmxhc2gpXG4gICAgICAgICAgICAgICAgPyAnY3FhLWJvcmRlci1uZXV0cmFsLTMwMCBmb2N1czpjcWEtYm9yZGVyLWluZGlnby00MDAgZm9jdXM6Y3FhLXJpbmctaW5kaWdvLTIwMCdcbiAgICAgICAgICAgICAgICA6ICdjcWEtYm9yZGVyLVsjRUY0NDQ0XSBmb2N1czpjcWEtYm9yZGVyLVsjRUY0NDQ0XSBmb2N1czpjcWEtcmluZy1bI0ZDQTVBNV0nXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIiFpc1JlbmFtZURyYWZ0VmFsaWQgfHwgcmVuYW1lTGltaXRGbGFzaFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVuYW1lRHJhZnRcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblJlbmFtZUtleSgkZXZlbnQsIHJvdy5ub2RlKVwiXG4gICAgICAgICAgICAgIChrZXlwcmVzcyk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAoa2V5dXApPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiY29tbWl0UmVuYW1lKHJvdy5ub2RlKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25hbWVUcGw+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC04MDAgY3FhLXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgKGRibGNsaWNrKT1cImJlZ2luUmVuYW1lKHJvdy5ub2RlLCAkZXZlbnQpXCJcbiAgICAgICAgICAgID57eyByb3cubm9kZS5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8IS0tIENvdW50IHNob3duIGF0IHJlc3Q7IGhpZGRlbiBvbiByb3cgaG92ZXIgd2hlbiBkZWxldGUgaXMgYWxsb3dlZCAtLT5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJzaG93Q291bnRzICYmIHJvdy5ub2RlLmNvdW50ICE9IG51bGxcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1uZXV0cmFsLTQwMCBjcWEtdGFidWxhci1udW1zIGNxYS1tbC0xXCJcbiAgICAgICAgICAgIFtjbGFzcy5ncm91cC1ob3ZlcjpjcWEtaGlkZGVuXT1cImFsbG93RGVsZXRlXCJcbiAgICAgICAgICA+e3sgcm93Lm5vZGUuY291bnQgfX08L3NwYW4+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc0FueUNvbnRleHRBY3Rpb25cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1wLTAuNSBjcWEtcm91bmRlZCBob3ZlcjpjcWEtYmctbmV1dHJhbC0yMDAgY3FhLXRleHQtbmV1dHJhbC01MDBcIlxuICAgICAgICAgICAgW2NsYXNzLmNxYS1oaWRkZW5dPVwiY29udGV4dE1lbnVGb2xkZXJJZCAhPT0gcm93Lm5vZGUuaWRcIlxuICAgICAgICAgICAgW2NsYXNzLmdyb3VwLWhvdmVyOmNxYS1pbmxpbmUtZmxleF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtaW5saW5lLWZsZXhdPVwiY29udGV4dE1lbnVGb2xkZXJJZCA9PT0gcm93Lm5vZGUuaWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Db250ZXh0TWVudShyb3cubm9kZSwgJGV2ZW50KVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidPcGVuIGFjdGlvbnMgZm9yICcgKyByb3cubm9kZS5uYW1lXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ21lbnUnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiY29udGV4dE1lbnVGb2xkZXJJZCA9PT0gcm93Lm5vZGUuaWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5tb3JlX2hvcml6PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRGl2aWRlciBiZXR3ZWVuIGZvbGRlciB0cmVlIGFuZCBwaW5uZWQgVW5vcmdhbmlzZWQgdGFiIC0tPlxuICAgIDxkaXZcbiAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICBjbGFzcz1cImNxYS1teC0zIGNxYS1zaHJpbmstMFwiXG4gICAgICBzdHlsZT1cImhlaWdodDogMXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjRTVFN0VCOyBtYXJnaW4tdG9wOiA2cHg7IG1hcmdpbi1ib3R0b206IDZweDtcIlxuICAgID48L2Rpdj5cblxuICAgIDwhLS0gVW5vcmdhbmlzZWQg4oCUIHBpbm5lZCBiZWxvdyB0aGUgc2Nyb2xsYWJsZSBmb2xkZXIgdHJlZSBzbyBpdCBzdGF5cyB2aXNpYmxlIHJlZ2FyZGxlc3Mgb2YgZm9sZGVyIGNvdW50IC0tPlxuICAgIDxkaXZcbiAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkKG51bGwpXCJcbiAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtNTAgZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtYmctbmV1dHJhbC0xMDAgY3FhLXJlbGF0aXZlIGNxYS1zaHJpbmstMFwiXG4gICAgICBbY2xhc3MuY3FhLWJnLWluZGlnby01MF09XCJpc1NlbGVjdGVkKG51bGwpXCJcbiAgICAgIFtjcWFGb2xkZXJEcm9wXT1cIm51bGxcIlxuICAgICAgW2Ryb3BFbmFibGVkXT1cImFsbG93RHJvcFwiXG4gICAgICAodGVzdHNEcm9wcGVkKT1cInJvd0Ryb3BwZWQobnVsbCwgJGV2ZW50KVwiXG4gICAgICAoZm9sZGVyRHJvcHBlZCk9XCJvbkZvbGRlclJvd0Ryb3BwZWQobnVsbCwgJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwib25TZWxlY3RVbm9yZ2FuaXNlZCgpXCJcbiAgICA+XG4gICAgICA8c3BhblxuICAgICAgICAqbmdJZj1cImlzU2VsZWN0ZWQobnVsbClcIlxuICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtYm90dG9tLTAgY3FhLXctWzNweF0gY3FhLWJnLWluZGlnby02MDBcIlxuICAgICAgPjwvc3Bhbj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LW5ldXRyYWwtNTAwXCIgc3R5bGU9XCJmb250LXNpemU6MTZweDt3aWR0aDoxNnB4O2hlaWdodDoxNnB4XCI+aW5ib3g8L21hdC1pY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZmxleC0xIGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtNzAwXCI+e3sgbGFiZWxzLnVub3JnYW5pc2VkIH19PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJzaG93Q291bnRzXCIgY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1uZXV0cmFsLTQwMCBjcWEtdGFidWxhci1udW1zXCI+e3sgdW5vcmdhbmlzZWRDb3VudCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRm9sZGVyIGNvbnRleHQgbWVudSAocmlnaHQtY2xpY2sgLyBlbGxpcHNpcykuIEFuY2hvcmVkIHRvIHZpZXdwb3J0IGNvb3Jkcy4gLS0+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJjb250ZXh0TWVudUZvbGRlcklkICE9PSBudWxsXCJcbiAgICAgIHJvbGU9XCJtZW51XCJcbiAgICAgIGNsYXNzPVwiY3FhLWZpeGVkIGNxYS16LTUwIGNxYS1taW4tdy1bMTgwcHhdIGNxYS1iZy13aGl0ZSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItbmV1dHJhbC0yMDAgY3FhLXJvdW5kZWQtbWQgY3FhLXNoYWRvdy1sZyBjcWEtcHktMVwiXG4gICAgICBbc3R5bGUubGVmdC5weF09XCJjb250ZXh0TWVudVBvc2l0aW9uLnhcIlxuICAgICAgW3N0eWxlLnRvcC5weF09XCJjb250ZXh0TWVudVBvc2l0aW9uLnlcIlxuICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAoY29udGV4dG1lbnUpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZvbGRlckJ5SWQoY29udGV4dE1lbnVGb2xkZXJJZCkgYXMgbWVudU5vZGVcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiYWxsb3dDcmVhdGVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC04MDAgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtMTAwIGNxYS10ZXh0LWxlZnRcIlxuICAgICAgICAgIChjbGljayk9XCJvbkNvbnRleHRDcmVhdGVTdWJmb2xkZXIobWVudU5vZGUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5jcmVhdGVfbmV3X2ZvbGRlcjwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+e3sgbGFiZWxzLmZvbGRlck1lbnVDcmVhdGVTdWJmb2xkZXIgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJhbGxvd1JlbmFtZVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS13LWZ1bGwgY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1uZXV0cmFsLTgwMCBob3ZlcjpjcWEtYmctbmV1dHJhbC0xMDAgY3FhLXRleHQtbGVmdFwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ29udGV4dFJlbmFtZShtZW51Tm9kZSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51UmVuYW1lIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiYWxsb3dNb3ZlXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXctZnVsbCBjcWEtcHgtMyBjcWEtcHktMS41IGNxYS10ZXh0LXNtIGNxYS10ZXh0LW5ldXRyYWwtODAwIGhvdmVyOmNxYS1iZy1uZXV0cmFsLTEwMCBjcWEtdGV4dC1sZWZ0XCJcbiAgICAgICAgICAoY2xpY2spPVwib25Db250ZXh0TW92ZShtZW51Tm9kZSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOjE2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTZweFwiPmRyaXZlX2ZpbGVfbW92ZTwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+e3sgbGFiZWxzLmZvbGRlck1lbnVNb3ZlIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiYWxsb3dEdXBsaWNhdGVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC04MDAgaG92ZXI6Y3FhLWJnLW5ldXRyYWwtMTAwIGNxYS10ZXh0LWxlZnRcIlxuICAgICAgICAgIChjbGljayk9XCJvbkNvbnRleHREdXBsaWNhdGUobWVudU5vZGUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgIDxzcGFuPnt7IGxhYmVscy5mb2xkZXJNZW51RHVwbGljYXRlIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImFsbG93RGVsZXRlICYmIChhbGxvd0NyZWF0ZSB8fCBhbGxvd1JlbmFtZSB8fCBhbGxvd01vdmUgfHwgYWxsb3dEdXBsaWNhdGUpXCIgY2xhc3M9XCJjcWEtaC1weCBjcWEtYmctbmV1dHJhbC0yMDAgY3FhLW15LTFcIj48L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiYWxsb3dEZWxldGVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtdy1mdWxsIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtc20gY3FhLXRleHQtcmVkLTYwMCBob3ZlcjpjcWEtYmctcmVkLTUwIGNxYS10ZXh0LWxlZnRcIlxuICAgICAgICAgIChjbGljayk9XCJvbkNvbnRleHREZWxldGUobWVudU5vZGUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZToxNnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHhcIj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgPHNwYW4+e3sgbGFiZWxzLmZvbGRlck1lbnVEZWxldGUgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgPC9uZy1jb250YWluZXI+XG48L2FzaWRlPlxuIl19