@tsi-developpement/tsi-shared-ui 1.8.37 → 1.8.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/esm2022/lib/consts/business-class-names.mjs +3 -1
  2. package/esm2022/lib/end-points/endpoints.mjs +7 -2
  3. package/esm2022/lib/models/actionErp/actionErp.mjs +7 -1
  4. package/esm2022/lib/models/actionErp/nature-action.mjs +6 -0
  5. package/esm2022/lib/models/tsi-card/tsi-card.mjs +1 -1
  6. package/esm2022/lib/services/actionErp/nature-action-service.service.mjs +23 -0
  7. package/esm2022/lib/tsi-components/manage-import-export/manage-import-export.component.mjs +9 -1
  8. package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +18 -3
  9. package/esm2022/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.mjs +1 -1
  10. package/esm2022/lib/tsi-components/tsi-action-erp-create-or-edit/tsi-action-erp-create-or-edit.component.mjs +182 -25
  11. package/esm2022/lib/tsi-components/tsi-calender/context-menu/context-menu.component.mjs +16 -4
  12. package/esm2022/lib/tsi-components/tsi-calender/tsi-calender.component.mjs +30 -3
  13. package/esm2022/lib/tsi-components/tsi-card/tsi-card.component.mjs +50 -23
  14. package/esm2022/lib/tsi-components/tsi-card-list/tsi-card-list.component.mjs +14 -4
  15. package/esm2022/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.mjs +17 -5
  16. package/esm2022/lib/tsi-components/tsi-kanban/tsi-kanban.component.mjs +48 -22
  17. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +395 -84
  18. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
  19. package/lib/consts/business-class-names.d.ts +2 -0
  20. package/lib/end-points/endpoints.d.ts +5 -0
  21. package/lib/models/actionErp/actionErp.d.ts +10 -0
  22. package/lib/models/actionErp/nature-action.d.ts +12 -0
  23. package/lib/models/tsi-card/tsi-card.d.ts +1 -0
  24. package/lib/providers/shared-ui-tsi.provider.d.ts +1 -1
  25. package/lib/services/actionErp/nature-action-service.service.d.ts +12 -0
  26. package/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.d.ts +3 -0
  27. package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +6 -1
  28. package/lib/tsi-components/tsi-action-erp-create-or-edit/tsi-action-erp-create-or-edit.component.d.ts +19 -4
  29. package/lib/tsi-components/tsi-calender/context-menu/context-menu.component.d.ts +5 -1
  30. package/lib/tsi-components/tsi-calender/tsi-calender.component.d.ts +6 -1
  31. package/lib/tsi-components/tsi-card/tsi-card.component.d.ts +15 -5
  32. package/lib/tsi-components/tsi-card-list/tsi-card-list.component.d.ts +5 -1
  33. package/lib/tsi-components/tsi-kanban/tsi-kanban.component.d.ts +14 -6
  34. package/package.json +1 -1
@@ -9,9 +9,13 @@ import * as i2 from "../../pipes/localize.pipe";
9
9
  import * as i3 from "../../services/status/entityStatus.service";
10
10
  import * as i4 from "../../services/notification/tsi-notification.service";
11
11
  import * as i5 from "@angular/common";
12
- import * as i6 from "primeng/paginator";
13
- import * as i7 from "../button-components/tsi-button/tsi-button.component";
14
- import * as i8 from "../spinner/spinner.component";
12
+ import * as i6 from "primeng/button";
13
+ import * as i7 from "primeng/api";
14
+ import * as i8 from "primeng/menu";
15
+ import * as i9 from "primeng/paginator";
16
+ import * as i10 from "primeng/badge";
17
+ import * as i11 from "../button-components/tsi-button/tsi-button.component";
18
+ import * as i12 from "../spinner/spinner.component";
15
19
  /**
16
20
  * TsiKanbanComponent
17
21
  * Description: Displays a Kanban board view for TSI entities.
@@ -31,6 +35,11 @@ export class TsiKanbanComponent extends AppBaseComponent {
31
35
  this._notificationService = _notificationService;
32
36
  this.buttonClicked = new EventEmitter();
33
37
  this.callSearch = new EventEmitter();
38
+ this.overflowActionsMenu = [];
39
+ this.hasOverflowActions = false;
40
+ this.overflowActionColumns = [];
41
+ this.selectKeyOnly = true;
42
+ this.key = 'uid';
34
43
  this.cards = [];
35
44
  this.cardMapByStatus = new Map();
36
45
  this.draggedCard = null;
@@ -171,7 +180,8 @@ export class TsiKanbanComponent extends AppBaseComponent {
171
180
  subHeaderTitle: `${item[keys[col2]] ?? ''}`,
172
181
  description: `${item[keys[col3]] ?? ''}`,
173
182
  status: finalStatus,
174
- photo: item[keys[photo]] || defaultCardHeader.image
183
+ photo: item[keys[photo]] || defaultCardHeader.image,
184
+ fullRecord: item,
175
185
  };
176
186
  });
177
187
  }
@@ -206,40 +216,50 @@ export class TsiKanbanComponent extends AppBaseComponent {
206
216
  }))
207
217
  ];
208
218
  }
209
- edit(uid) {
210
- if (uid) {
211
- this.openModalComponent(uid, 'edit');
219
+ getOverflowMenuModel() {
220
+ if (!this.hasOverflowActions) {
221
+ return [];
212
222
  }
223
+ return this.overflowActionColumns.map(col => ({
224
+ id: col.field,
225
+ label: col.header,
226
+ iconClass: col.buttonIcon,
227
+ styleClass: col.styleClass,
228
+ iconStyleClass: col.iconStyleClass,
229
+ }));
213
230
  }
214
- consult(uid) {
215
- if (uid) {
216
- this.openModalComponent(uid, 'consult');
217
- }
231
+ overflowColumnClicked(menu, event, row) {
232
+ this.currentActionRow = row;
233
+ menu.toggle(event);
218
234
  }
219
- upload(uid) {
220
- if (uid) {
221
- this.openModalComponent(uid, 'upload');
235
+ onOverflowActionClicked(card, menuItem) {
236
+ if (!card || !menuItem || !menuItem.id) {
237
+ return;
222
238
  }
239
+ this.handleButtonClicked(card?.fullRecord ?? card, menuItem.id);
223
240
  }
224
- info(uid) {
225
- if (uid) {
226
- this.openModalComponent(uid, 'info');
241
+ handleButtonClicked(item, field) {
242
+ if (this.selectKeyOnly) {
243
+ this.buttonClicked.emit({ field: field, key: item[this.key], selectKeyOnly: this.selectKeyOnly });
244
+ }
245
+ else {
246
+ this.buttonClicked.emit({ field: field, key: item, selectKeyOnly: this.selectKeyOnly });
227
247
  }
228
248
  }
229
- delete(uid) {
249
+ edit(uid) {
230
250
  if (uid) {
231
- this.openModalComponent(uid, 'delete');
251
+ this.openModalComponent(uid, 'edit');
232
252
  }
233
253
  }
234
254
  openModalComponent(uid, mode) {
235
255
  this.buttonClicked.emit({ field: mode, key: uid, selectKeyOnly: true });
236
256
  }
237
257
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiKanbanComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.EntityConfigurationService }, { token: i2.LocalizePipe }, { token: i3.EntityStatusService }, { token: i4.TsiNotificationService }], target: i0.ɵɵFactoryTarget.Component }); }
238
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiKanbanComponent, selector: "Tsi-kanban", inputs: { cardBusinessClass: "cardBusinessClass", header: "header", id: "id", page$: "page$", crudService: "crudService", page: "page" }, outputs: { buttonClicked: "buttonClicked", callSearch: "callSearch" }, usesInheritance: true, ngImport: i0, template: "<div class=\"card flex justify-content-center\">\r\n <p-paginator\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalCount\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {first} {{'to' | localize}} {last} {{ 'of' | localize }} {totalRecords}\">\r\n </p-paginator>\r\n</div>\r\n\r\n<div class=\"kanban-board flex gap-4 overflow-auto\">\r\n <div *ngFor=\"let status of localizedStatusLabels; trackBy: trackByStatus\"\r\n class=\"kanban-column flex flex-column border-round surface-0 shadow-2\"\r\n (dragover)=\"allowDrop($event)\"\r\n (drop)=\"drop($event, status.key)\">\r\n \r\n <div class=\"column-header p-3 border-bottom-1 surface-border font-semibold\">\r\n {{ status.localized }}\r\n <span class=\"text-sm font-normal text-gray-500\">\r\n ({{ cardMapByStatus.get(status.key)?.length || 0 }})\r\n </span>\r\n </div>\r\n\r\n <div class=\"column-cards flex-1 overflow-auto p-3\">\r\n <div *ngFor=\"let card of cardMapByStatus.get(status.key); trackBy: trackByCard\"\r\n class=\"kanban-card p-3 border-round bg-white mb-3 shadow-1\"\r\n [ngClass]=\"getStatusClass(card)\"\r\n draggable=\"true\"\r\n (dragstart)=\"dragStart($event, card)\"\r\n (dragend)=\"dragEnd()\">\r\n\r\n <div class=\"font-bold mb-2\">{{ card.headerTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.subHeaderTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.description }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">\r\n <span class=\"font-semibold\">{{ 'gesc_document_statut' | localize }}:</span>\r\n <span>{{ getLocalizedStatus(card.status) }}</span>\r\n </div>\r\n <Tsi-Button\r\n [styleClass]=\"'p-button-rounded p-button-text p-0-5'\"\r\n type=\"button\"\r\n icon=\"p-button-icon pi pi-eye\"\r\n (click)=\"consult(card.uid)\">\r\n </Tsi-Button>\r\n <Tsi-Button\r\n [styleClass]=\"'p-button-rounded p-button-text p-0-5'\"\r\n type=\"button\"\r\n icon=\"pi pi-pencil\"\r\n (click)=\"edit(card.uid)\">\r\n </Tsi-Button>\r\n <Tsi-Button\r\n [styleClass]=\"'p-button-rounded p-button-text p-button-danger p-0-5'\"\r\n type=\"button\"\r\n icon=\"p-button-icon pi pi-trash\"\r\n (click)=\"delete(card.uid)\">\r\n </Tsi-Button>\r\n <Tsi-Button \r\n [styleClass]=\"'p-button-rounded p-button-text p-0-5'\"\r\n type=\"button\" icon=\"pi pi-paperclip\"\r\n (click)=\"upload(card.uid)\">\r\n </Tsi-Button>\r\n <Tsi-Button \r\n [styleClass]=\"'p-button-rounded p-button-text p-0-5'\"\r\n type=\"button\" icon=\"pi pi-info\"\r\n (click)=\"info(card.uid)\">\r\n </Tsi-Button>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"overlay\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-wrapper\">\r\n <app-spinner></app-spinner>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;padding:1rem}[draggable=true]{-webkit-user-select:none;user-select:none}.kanban-board{height:calc(100vh - 100px);padding:1rem}.kanban-column{width:300px;max-height:100%;display:flex;flex-direction:column;background-color:#f8f9fa}.column-header{font-size:1rem;font-weight:700;background-color:#fff;border-radius:6px 6px 0 0}.column-cards{overflow-y:auto;flex:1}.kanban-card{border-left:4px solid;cursor:move;transition:border-color .3s ease}.status-0{border-left-color:#7269ef}.status-1{border-left-color:#00c853}.status-2{border-left-color:#ffab00}.status-3{border-left-color:#d50000}[class*=status-]{border-left-style:solid;border-left-width:4px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "component", type: i7.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i8.SpinnerComponent, selector: "app-spinner" }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }] }); }
258
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiKanbanComponent, selector: "Tsi-kanban", inputs: { cardBusinessClass: "cardBusinessClass", header: "header", id: "id", page$: "page$", crudService: "crudService", overflowActionsMenu: "overflowActionsMenu", selectKeyOnly: "selectKeyOnly", key: "key", page: "page" }, outputs: { buttonClicked: "buttonClicked", callSearch: "callSearch" }, usesInheritance: true, ngImport: i0, template: "<div class=\"card flex justify-content-center\">\r\n <p-paginator [first]=\"first\" [rows]=\"rows\" [totalRecords]=\"totalCount\" [rowsPerPageOptions]=\"[1, 10, 25, 50]\"\r\n (onPageChange)=\"onPageChange($event)\" [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {first} {{'to' | localize}} {last} {{ 'of' | localize }} {totalRecords}\">\r\n </p-paginator>\r\n</div>\r\n\r\n<div class=\"kanban-board flex gap-4 overflow-auto\">\r\n <div *ngFor=\"let status of localizedStatusLabels; trackBy: trackByStatus\"\r\n class=\"kanban-column flex flex-column border-round surface-0 shadow-2\" (dragover)=\"allowDrop($event)\"\r\n (drop)=\"drop($event, status.key)\">\r\n\r\n <div class=\"column-header p-3 border-bottom-1 surface-border font-semibold\">\r\n {{ status.localized }}\r\n <span class=\"text-sm font-normal text-gray-500\">\r\n ({{ cardMapByStatus.get(status.key)?.length || 0 }})\r\n </span>\r\n </div>\r\n\r\n <div class=\"column-cards flex-1 overflow-auto p-3\">\r\n <div *ngFor=\"let card of cardMapByStatus.get(status.key); trackBy: trackByCard\"\r\n class=\"kanban-card p-3 border-round bg-white mb-3 shadow-1\"\r\n [ngClass]=\"getStatusClass(card)\"\r\n draggable=\"true\"\r\n (dragstart)=\"dragStart($event, card)\" \r\n (dragend)=\"dragEnd()\">\r\n\r\n <div class=\"font-bold mb-2\">{{ card.headerTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.subHeaderTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.description }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">\r\n <span class=\"font-semibold\">{{ 'gesc_document_statut' | localize }}:</span>\r\n <span>{{ getLocalizedStatus(card.status) }}</span>\r\n </div>\r\n <p-menu appendTo=\"body\" #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\" styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a pRipple class=\"flex align-items-center p-menuitem-link\" \r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(card, menuItem)\">\r\n <i *ngIf=\"menuItem.id === 'notes'\" class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\" pBadge severity=\"danger\" \r\n [value]=\"card.fullRecord.notesCount\"\r\n [badgeDisabled]=\"card.fullRecord.notesCount == null\" badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i *ngIf=\"menuItem.id !== 'notes'\" class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n\r\n <div class=\"flex justify-content-end align-items-center mt-1 gap-2 p-0\">\r\n <Tsi-Button [styleClass]=\"'p-button-rounded p-button-text p-0-5'\" type=\"button\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(card.uid)\">\r\n </Tsi-Button>\r\n <p-button type=\"button\" icon=\"pi pi-ellipsis-v\" styleClass=\"overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, card)\">\r\n </p-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"overlay\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-wrapper\">\r\n <app-spinner></app-spinner>\r\n </div>\r\n </div>", styles: [":host{display:block;padding:1rem}[draggable=true]{-webkit-user-select:none;user-select:none}.kanban-board{height:calc(100vh - 100px);padding:1rem}.kanban-column{width:300px;max-height:100%;display:flex;flex-direction:column;background-color:#f8f9fa}.column-header{font-size:1rem;font-weight:700;background-color:#fff;border-radius:6px 6px 0 0}.column-cards{overflow-y:auto;flex:1}.kanban-card{border-left:4px solid;cursor:move;transition:border-color .3s ease}.status-0{border-left-color:#7269ef}.status-1{border-left-color:#00c853}.status-2{border-left-color:#ffab00}.status-3{border-left-color:#d50000}[class*=status-]{border-left-style:solid;border-left-width:4px}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i8.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i9.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "directive", type: i10.BadgeDirective, selector: "[pBadge]", inputs: ["badgeDisabled", "badgeSize", "size", "severity", "value", "badgeStyle", "badgeStyleClass"] }, { kind: "component", type: i11.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i12.SpinnerComponent, selector: "app-spinner" }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }] }); }
239
259
  }
240
260
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiKanbanComponent, decorators: [{
241
261
  type: Component,
242
- args: [{ selector: 'Tsi-kanban', template: "<div class=\"card flex justify-content-center\">\r\n <p-paginator\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalCount\"\r\n [rowsPerPageOptions]=\"[1, 10, 25, 50]\"\r\n (onPageChange)=\"onPageChange($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {first} {{'to' | localize}} {last} {{ 'of' | localize }} {totalRecords}\">\r\n </p-paginator>\r\n</div>\r\n\r\n<div class=\"kanban-board flex gap-4 overflow-auto\">\r\n <div *ngFor=\"let status of localizedStatusLabels; trackBy: trackByStatus\"\r\n class=\"kanban-column flex flex-column border-round surface-0 shadow-2\"\r\n (dragover)=\"allowDrop($event)\"\r\n (drop)=\"drop($event, status.key)\">\r\n \r\n <div class=\"column-header p-3 border-bottom-1 surface-border font-semibold\">\r\n {{ status.localized }}\r\n <span class=\"text-sm font-normal text-gray-500\">\r\n ({{ cardMapByStatus.get(status.key)?.length || 0 }})\r\n </span>\r\n </div>\r\n\r\n <div class=\"column-cards flex-1 overflow-auto p-3\">\r\n <div *ngFor=\"let card of cardMapByStatus.get(status.key); trackBy: trackByCard\"\r\n class=\"kanban-card p-3 border-round bg-white mb-3 shadow-1\"\r\n [ngClass]=\"getStatusClass(card)\"\r\n draggable=\"true\"\r\n (dragstart)=\"dragStart($event, card)\"\r\n (dragend)=\"dragEnd()\">\r\n\r\n <div class=\"font-bold mb-2\">{{ card.headerTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.subHeaderTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.description }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">\r\n <span class=\"font-semibold\">{{ 'gesc_document_statut' | localize }}:</span>\r\n <span>{{ getLocalizedStatus(card.status) }}</span>\r\n </div>\r\n <Tsi-Button\r\n [styleClass]=\"'p-button-rounded p-button-text p-0-5'\"\r\n type=\"button\"\r\n icon=\"p-button-icon pi pi-eye\"\r\n (click)=\"consult(card.uid)\">\r\n </Tsi-Button>\r\n <Tsi-Button\r\n [styleClass]=\"'p-button-rounded p-button-text p-0-5'\"\r\n type=\"button\"\r\n icon=\"pi pi-pencil\"\r\n (click)=\"edit(card.uid)\">\r\n </Tsi-Button>\r\n <Tsi-Button\r\n [styleClass]=\"'p-button-rounded p-button-text p-button-danger p-0-5'\"\r\n type=\"button\"\r\n icon=\"p-button-icon pi pi-trash\"\r\n (click)=\"delete(card.uid)\">\r\n </Tsi-Button>\r\n <Tsi-Button \r\n [styleClass]=\"'p-button-rounded p-button-text p-0-5'\"\r\n type=\"button\" icon=\"pi pi-paperclip\"\r\n (click)=\"upload(card.uid)\">\r\n </Tsi-Button>\r\n <Tsi-Button \r\n [styleClass]=\"'p-button-rounded p-button-text p-0-5'\"\r\n type=\"button\" icon=\"pi pi-info\"\r\n (click)=\"info(card.uid)\">\r\n </Tsi-Button>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"overlay\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-wrapper\">\r\n <app-spinner></app-spinner>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block;padding:1rem}[draggable=true]{-webkit-user-select:none;user-select:none}.kanban-board{height:calc(100vh - 100px);padding:1rem}.kanban-column{width:300px;max-height:100%;display:flex;flex-direction:column;background-color:#f8f9fa}.column-header{font-size:1rem;font-weight:700;background-color:#fff;border-radius:6px 6px 0 0}.column-cards{overflow-y:auto;flex:1}.kanban-card{border-left:4px solid;cursor:move;transition:border-color .3s ease}.status-0{border-left-color:#7269ef}.status-1{border-left-color:#00c853}.status-2{border-left-color:#ffab00}.status-3{border-left-color:#d50000}[class*=status-]{border-left-style:solid;border-left-width:4px}\n"] }]
262
+ args: [{ selector: 'Tsi-kanban', template: "<div class=\"card flex justify-content-center\">\r\n <p-paginator [first]=\"first\" [rows]=\"rows\" [totalRecords]=\"totalCount\" [rowsPerPageOptions]=\"[1, 10, 25, 50]\"\r\n (onPageChange)=\"onPageChange($event)\" [showCurrentPageReport]=\"true\"\r\n currentPageReportTemplate=\"{{ 'Showing' | localize }} {first} {{'to' | localize}} {last} {{ 'of' | localize }} {totalRecords}\">\r\n </p-paginator>\r\n</div>\r\n\r\n<div class=\"kanban-board flex gap-4 overflow-auto\">\r\n <div *ngFor=\"let status of localizedStatusLabels; trackBy: trackByStatus\"\r\n class=\"kanban-column flex flex-column border-round surface-0 shadow-2\" (dragover)=\"allowDrop($event)\"\r\n (drop)=\"drop($event, status.key)\">\r\n\r\n <div class=\"column-header p-3 border-bottom-1 surface-border font-semibold\">\r\n {{ status.localized }}\r\n <span class=\"text-sm font-normal text-gray-500\">\r\n ({{ cardMapByStatus.get(status.key)?.length || 0 }})\r\n </span>\r\n </div>\r\n\r\n <div class=\"column-cards flex-1 overflow-auto p-3\">\r\n <div *ngFor=\"let card of cardMapByStatus.get(status.key); trackBy: trackByCard\"\r\n class=\"kanban-card p-3 border-round bg-white mb-3 shadow-1\"\r\n [ngClass]=\"getStatusClass(card)\"\r\n draggable=\"true\"\r\n (dragstart)=\"dragStart($event, card)\" \r\n (dragend)=\"dragEnd()\">\r\n\r\n <div class=\"font-bold mb-2\">{{ card.headerTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.subHeaderTitle }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">{{ card.description }}</div>\r\n <div class=\"text-sm text-gray-600 mb-3\">\r\n <span class=\"font-semibold\">{{ 'gesc_document_statut' | localize }}:</span>\r\n <span>{{ getLocalizedStatus(card.status) }}</span>\r\n </div>\r\n <p-menu appendTo=\"body\" #menuMoreActions \r\n [model]=\"overflowActionsMenu\" \r\n [popup]=\"true\" styleClass=\"overflow-menu\"\r\n [style]=\"{ 'width': 'auto', 'min-width': '0px' }\">\r\n <ng-template pTemplate=\"item\" let-menuItem>\r\n <a pRipple class=\"flex align-items-center p-menuitem-link\" \r\n [ngClass]=\"menuItem.styleClass\"\r\n (click)=\"onOverflowActionClicked(card, menuItem)\">\r\n <i *ngIf=\"menuItem.id === 'notes'\" class=\"{{ menuItem.iconClass }} p-menuitem-icon badge-icon has-badge\"\r\n [ngClass]=\"menuItem.iconStyleClass\" pBadge severity=\"danger\" \r\n [value]=\"card.fullRecord.notesCount\"\r\n [badgeDisabled]=\"card.fullRecord.notesCount == null\" badgePosition=\"top-right\">\r\n </i>\r\n\r\n <i *ngIf=\"menuItem.id !== 'notes'\" class=\"{{menuItem.iconClass}} p-menuitem-icon\"\r\n [ngClass]=\"menuItem.iconStyleClass\">\r\n </i>\r\n\r\n <span class=\"menu-label\">\r\n {{ menuItem.label | localize }}\r\n </span>\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n\r\n <div class=\"flex justify-content-end align-items-center mt-1 gap-2 p-0\">\r\n <Tsi-Button [styleClass]=\"'p-button-rounded p-button-text p-0-5'\" type=\"button\" icon=\"pi pi-pencil\"\r\n (click)=\"edit(card.uid)\">\r\n </Tsi-Button>\r\n <p-button type=\"button\" icon=\"pi pi-ellipsis-v\" styleClass=\"overflow-btn\"\r\n (onClick)=\"overflowColumnClicked(menuMoreActions, $event, card)\">\r\n </p-button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"overlay\" *ngIf=\"isLoading\">\r\n <div class=\"spinner-wrapper\">\r\n <app-spinner></app-spinner>\r\n </div>\r\n </div>", styles: [":host{display:block;padding:1rem}[draggable=true]{-webkit-user-select:none;user-select:none}.kanban-board{height:calc(100vh - 100px);padding:1rem}.kanban-column{width:300px;max-height:100%;display:flex;flex-direction:column;background-color:#f8f9fa}.column-header{font-size:1rem;font-weight:700;background-color:#fff;border-radius:6px 6px 0 0}.column-cards{overflow-y:auto;flex:1}.kanban-card{border-left:4px solid;cursor:move;transition:border-color .3s ease}.status-0{border-left-color:#7269ef}.status-1{border-left-color:#00c853}.status-2{border-left-color:#ffab00}.status-3{border-left-color:#d50000}[class*=status-]{border-left-style:solid;border-left-width:4px}\n"] }]
243
263
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.EntityConfigurationService }, { type: i2.LocalizePipe }, { type: i3.EntityStatusService }, { type: i4.TsiNotificationService }], propDecorators: { buttonClicked: [{
244
264
  type: Output
245
265
  }], callSearch: [{
@@ -254,7 +274,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
254
274
  type: Input
255
275
  }], crudService: [{
256
276
  type: Input
277
+ }], overflowActionsMenu: [{
278
+ type: Input
279
+ }], selectKeyOnly: [{
280
+ type: Input
281
+ }], key: [{
282
+ type: Input
257
283
  }], page: [{
258
284
  type: Input
259
285
  }] } });
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWthbmJhbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvdHNpLWthbmJhbi90c2kta2FuYmFuLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2kta2FuYmFuL3RzaS1rYW5iYW4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFRNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdURBQXVELENBQUM7Ozs7Ozs7Ozs7QUFFekY7OztHQUdHO0FBTUgsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGdCQUFnQjtJQVlwRCxJQUFhLElBQUksQ0FBQyxLQUFVO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSxJQUFJLEtBQUssT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQWtCakMsWUFDWSxHQUFzQixFQUN0QixhQUF5QyxFQUN6QyxTQUF1QixFQUN2QixvQkFBeUMsRUFDekMsb0JBQTRDO1FBRXBELEtBQUssRUFBRSxDQUFDO1FBTkEsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsa0JB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QiwwUkN2Qi9CLHN1R0ErRUE7OzRGRHhEYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0ksWUFBWTtpT0FNWixhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUUsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR08sSUFBSTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFBhZ2luYXRvclN0YXRlIH0gZnJvbSAncHJpbWVuZy9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExvY2FsaXphdGlvbktleXMgfSBmcm9tICcuLi8uLi9jb25zdHMvbG9jYWxpemF0aW9uLWtleSc7XHJcbmltcG9ydCB7IGRlZmF1bHRDYXJkSGVhZGVyIH0gZnJvbSAnLi4vLi4vY29uc3RzL3RzaS1jb25zdHMnO1xyXG5pbXBvcnQgeyBCdXR0b25DbGlja1Jlc3VsdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBUc2lDYXJkIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgTG9jYWxpemVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvbG9jYWxpemUucGlwZSc7XHJcbmltcG9ydCB7IENydWRCYXNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Jhc2UvY3J1ZC1iYXNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbmZpZ3VyYXRpb24vZW50aXR5LWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vdHNpLW5vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5U3RhdHVzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0YXR1cy9lbnRpdHlTdGF0dXMuc2VydmljZSc7XHJcbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi90c2ktYmFzZS9jb21wb25lbnRzL2FwcC1iYXNlL2FwcC1iYXNlLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogVHNpS2FuYmFuQ29tcG9uZW50XHJcbiAqIERlc2NyaXB0aW9uOiBEaXNwbGF5cyBhIEthbmJhbiBib2FyZCB2aWV3IGZvciBUU0kgZW50aXRpZXMuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnVHNpLWthbmJhbicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdHNpLWthbmJhbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybDogJy4vdHNpLWthbmJhbi5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lLYW5iYW5Db21wb25lbnQgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQ2xpY2tSZXN1bHQ+KCk7XHJcbiAgICBAT3V0cHV0KCkgY2FsbFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIEBJbnB1dCgpIGNhcmRCdXNpbmVzc0NsYXNzOiBhbnk7XHJcbiAgICBASW5wdXQoKSBoZWFkZXI6IGFueTtcclxuICAgIEBJbnB1dCgpIGlkOiBhbnk7XHJcbiAgICBASW5wdXQoKSBwYWdlJCE6IEJlaGF2aW9yU3ViamVjdDxhbnk+O1xyXG4gICAgQElucHV0KCkgY3J1ZFNlcnZpY2U/OiBDcnVkQmFzZVNlcnZpY2U8YW55LCBhbnksIGFueSwgYW55PjtcclxuXHJcbiAgICBwcml2YXRlIF9wYWdlOiBhbnk7XHJcbiAgICBASW5wdXQoKSBzZXQgcGFnZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5fcGFnZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBnZXQgcGFnZSgpIHsgcmV0dXJuIHRoaXMuX3BhZ2U7IH1cclxuXHJcbiAgICBjYXJkczogVHNpQ2FyZFtdID0gW107XHJcbiAgICBjYXJkTWFwQnlTdGF0dXM6IE1hcDxzdHJpbmcsIFRzaUNhcmRbXT4gPSBuZXcgTWFwKCk7XHJcblxyXG4gICAgZHJhZ2dlZENhcmQ6IFRzaUNhcmQgfCBudWxsID0gbnVsbDtcclxuICAgIGZpcnN0ID0gMDtcclxuICAgIHJvd3MgPSAxMDtcclxuICAgIHRvdGFsQ291bnQgPSAwO1xyXG4gICAgaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgb3JpZ2luYWxTdGF0dXM6IHN0cmluZyA9ICcnO1xyXG4gICAgcHJldmlvdXNTdGF0dXM6IGFueTtcclxuXHJcbiAgICBsb2NhbGl6ZWRTdGF0dXNMYWJlbHM6IHsga2V5OiBzdHJpbmc7IGxvY2FsaXplZDogc3RyaW5nIH1bXSA9XHJcbiAgICAgICAgW1xyXG4gICAgICAgIF07XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgIHByaXZhdGUgX2VudGl0eUNvbmZpZzogRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfbG9jYWxpemU6IExvY2FsaXplUGlwZSxcclxuICAgICAgICBwcml2YXRlIF9lbnRpdHlTdGF0dXNTZXJ2aWNlOiBFbnRpdHlTdGF0dXNTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX25vdGlmaWNhdGlvblNlcnZpY2U6IFRzaU5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMubG9jYWxpemVkU3RhdHVzTGFiZWxzID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBrZXk6ICduZXcnLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxpemVkOiB0aGlzLl9sb2NhbGl6ZS50cmFuc2Zvcm0oJ2dlc2NfcGFyYW1fYXJ0aWNsZV9zdGF0dXRfZW51bXNfbmV3JykudHJpbSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRCdXNpbmVzc0NsYXNzU3RhdHVzKHRoaXMuY2FyZEJ1c2luZXNzQ2xhc3MpO1xyXG5cclxuICAgICAgICB0aGlzLnBhZ2UkLnN1YnNjcmliZShhc3luYyBwYWdlID0+IHtcclxuICAgICAgICAgICAgaWYgKHBhZ2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gISFwYWdlLmxvYWRpbmc7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVBhZ2VDaGFuZ2UocGFnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkcmFnU3RhcnQoXzogRHJhZ0V2ZW50LCBjYXJkOiBUc2lDYXJkKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kcmFnZ2VkQ2FyZCA9IGNhcmQ7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1N0YXR1cyA9IHRoaXMuZHJhZ2dlZENhcmQuc3RhdHVzO1xyXG4gICAgfVxyXG5cclxuICAgIGRyYWdFbmQoKTogdm9pZCB7IHRoaXMuZHJhZ2dlZENhcmQgPSBudWxsOyB9XHJcblxyXG4gICAgYWxsb3dEcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHsgZXZlbnQucHJldmVudERlZmF1bHQoKTsgfVxyXG5cclxuICAgIHRyYWNrQnlTdGF0dXMoaW5kZXg6IG51bWJlciwgc3RhdHVzOiB7IGtleTogc3RyaW5nOyBsb2NhbGl6ZWQ6IHN0cmluZyB9KSB7IHJldHVybiBzdGF0dXMua2V5OyB9XHJcblxyXG4gICAgdHJhY2tCeUNhcmQoaW5kZXg6IG51bWJlciwgY2FyZDogVHNpQ2FyZCkgeyByZXR1cm4gY2FyZC51aWQ7IH1cclxuXHJcbiAgICBkcm9wKGV2ZW50OiBEcmFnRXZlbnQsIG5ld1N0YXR1c0tleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRyYWdnZWRDYXJkKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGNhcmQgPSB0aGlzLmRyYWdnZWRDYXJkO1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdHVzID0gdGhpcy5wcmV2aW91c1N0YXR1cztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dlZENhcmQuc3RhdHVzICE9PSBuZXdTdGF0dXNLZXkpIHtcclxuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkQ2FyZC5zdGF0dXMgPSBuZXdTdGF0dXNLZXk7XHJcblxyXG4gICAgICAgICAgICBsZXQgdWlkID0gdGhpcy5kcmFnZ2VkQ2FyZC51aWQhO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZT8uZ2V0QnlJZCh1aWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWxTdGF0dXNLZXkgPSBPYmplY3Qua2V5cyhyZXNwKS5maW5kKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09IHRoaXMub3JpZ2luYWxTdGF0dXMudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVhbFN0YXR1c0tleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdnZWRDYXJkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJkTWFwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRJdGVtID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXNwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcmVhbFN0YXR1c0tleV06IG5ld1N0YXR1c0tleVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2U/LnVwZGF0ZSh1cGRhdGVkSXRlbSwgdWlkKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiAocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybShMb2NhbGl6YXRpb25LZXlzLnNhdmVkU3VjY2Vzc2Z1bGx5KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdnZWRDYXJkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FyZE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyb20gPSB0aGlzLl9sb2NhbGl6ZS50cmFuc2Zvcm0oXCJnZXNjX3BhcmFtX2Vycm9yX3N3aXRjaF9zdGF0dXNfZnJvbVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0byA9IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybShcImdlc2NfcGFyYW1fZXJyb3Jfc3dpdGNoX3N0YXR1c190b1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGAke2Zyb219ICcke3RoaXMuZ2V0TG9jYWxpemVkU3RhdHVzKHRoaXMucHJldmlvdXNTdGF0dXMpfScgJHt0b30gJyR7dGhpcy5nZXRMb2NhbGl6ZWRTdGF0dXMoY2FyZC5zdGF0dXMpfSdgO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLnN0YXR1cyA9IHByZXZpb3VzU3RhdHVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2VkQ2FyZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRNYXAoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjYXJkLnN0YXR1cyA9IHByZXZpb3VzU3RhdHVzO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dlZENhcmQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FyZE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FyZE1hcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kcmFnZ2VkQ2FyZCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgb25QYWdlQ2hhbmdlKGV2ZW50OiBQYWdpbmF0b3JTdGF0ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZmlyc3QgPSBldmVudC5maXJzdCA/PyAwO1xyXG4gICAgICAgIHRoaXMucm93cyA9IGV2ZW50LnJvd3MgPz8gMTA7XHJcbiAgICAgICAgdGhpcy5jYWxsU2VhcmNoLmVtaXQoeyBza2lwQ291bnQ6IHRoaXMuZmlyc3QsIG1heFJlc3VsdENvdW50OiB0aGlzLnJvd3MgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RhdHVzQ2xhc3MoY2FyZDogVHNpQ2FyZCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxvY2FsaXplZFN0YXR1c0xhYmVscy5maW5kSW5kZXgobCA9PiBsLmtleSA9PT0gY2FyZC5zdGF0dXMpO1xyXG4gICAgICAgIHJldHVybiBgc3RhdHVzLSR7aW5kZXggPj0gMCA/IGluZGV4IDogJ2RlZmF1bHQnfWA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TG9jYWxpemVkU3RhdHVzKGtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoIWtleSkgcmV0dXJuICcnO1xyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5sb2NhbGl6ZWRTdGF0dXNMYWJlbHMuZmluZChzID0+IHMua2V5ID09PSBrZXkpO1xyXG4gICAgICAgIHJldHVybiBtYXRjaD8ubG9jYWxpemVkID8/IGtleTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVBhZ2VDaGFuZ2UocGFnZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKCFwYWdlPy5pdGVtcykgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNhcmRzID0gYXdhaXQgdGhpcy5tYXBJdGVtc1RvQ2FyZHMocGFnZS5pdGVtcyk7XHJcbiAgICAgICAgdGhpcy50b3RhbENvdW50ID0gcGFnZS50b3RhbENvdW50O1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ2FyZE1hcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0RW50aXR5SW5mbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLmVudGl0eUluZm8gPSBhd2FpdCB0aGlzLl9lbnRpdHlDb25maWcuZ2V0RW50aXR5SW5mb0Zyb21DYWNoZSh0aGlzLmNhcmRCdXNpbmVzc0NsYXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENvbEtleXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgcGhvdG86IHRoaXMuZW50aXR5SW5mbz8uY2FyZEhlYWRlclBob3RvQ29sdW1uPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxyXG4gICAgICAgICAgICBjb2wxOiB0aGlzLmVudGl0eUluZm8/LmNhcmRUaXRsZUNvbHVtbj8udG9Mb3dlckNhc2UoKSA/PyAnJyxcclxuICAgICAgICAgICAgY29sMjogdGhpcy5lbnRpdHlJbmZvPy5jYXJkU3ViSGVhZGVyQ29sdW1uPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxyXG4gICAgICAgICAgICBjb2wzOiB0aGlzLmVudGl0eUluZm8/LmNhcmREZXNjcmlwdGlvbkNvbHVtbj8udG9Mb3dlckNhc2UoKSA/PyAnJyxcclxuICAgICAgICAgICAgc3RhdHVzOiB0aGlzLmVudGl0eUluZm8/LnN0YXR1c0NvbHVtbk5hbWU/LnRvTG93ZXJDYXNlKCkgPz8gJydcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgbWFwSXRlbXNUb0NhcmRzKGl0ZW1zOiBhbnlbXSk6IFByb21pc2U8VHNpQ2FyZFtdPiB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRFbnRpdHlJbmZvKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHsgY29sMSwgY29sMiwgY29sMywgcGhvdG8sIHN0YXR1cyB9ID0gdGhpcy5nZXRDb2xLZXlzKCk7XHJcbiAgICAgICAgY29uc3QgdmFsaWRLZXlzID0gdGhpcy5sb2NhbGl6ZWRTdGF0dXNMYWJlbHMubWFwKHMgPT4gcy5rZXkpO1xyXG5cclxuICAgICAgICB0aGlzLm9yaWdpbmFsU3RhdHVzID0gc3RhdHVzO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGl0ZW0pLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgIGFjY1trZXkudG9Mb3dlckNhc2UoKV0gPSBrZXk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhd1N0YXR1cyA9IGl0ZW1ba2V5c1tzdGF0dXNdXT8udHJpbSgpO1xyXG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkU3RhdHVzID0gcmF3U3RhdHVzICYmIHZhbGlkS2V5cy5pbmNsdWRlcyhyYXdTdGF0dXMpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5hbFN0YXR1cyA9IGlzVmFsaWRTdGF0dXMgPyByYXdTdGF0dXMgOiAnbmV3JztcclxuXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBpZDogaW5kZXggKyAxICsgdGhpcy5maXJzdCxcclxuICAgICAgICAgICAgICAgIHVpZDogYCR7aXRlbS51aWR9YCxcclxuICAgICAgICAgICAgICAgIGhlYWRlclRpdGxlOiBgJHtpdGVtW2tleXNbY29sMV1dID8/ICcnfWAsXHJcbiAgICAgICAgICAgICAgICBzdWJIZWFkZXJUaXRsZTogYCR7aXRlbVtrZXlzW2NvbDJdXSA/PyAnJ31gLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke2l0ZW1ba2V5c1tjb2wzXV0gPz8gJyd9YCxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogZmluYWxTdGF0dXMsXHJcbiAgICAgICAgICAgICAgICBwaG90bzogaXRlbVtrZXlzW3Bob3RvXV0gfHwgZGVmYXVsdENhcmRIZWFkZXIuaW1hZ2VcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUNhcmRNYXAoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIFRzaUNhcmRbXT4oKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBsYWJlbCBvZiB0aGlzLmxvY2FsaXplZFN0YXR1c0xhYmVscykge1xyXG4gICAgICAgICAgICBtYXAuc2V0KGxhYmVsLmtleSwgW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjYXJkIG9mIHRoaXMuY2FyZHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBtYXAuZ2V0KGNhcmQuc3RhdHVzISk7XHJcbiAgICAgICAgICAgIGlmIChncm91cCkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXAucHVzaChjYXJkKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbm1hcHBlZCBjYXJkIHN0YXR1czogJHtjYXJkLnN0YXR1c31gLCBjYXJkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBjYXJkc10gb2YgbWFwLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBjYXJkcy5zb3J0KChhLCBiKSA9PiAoYS5oZWFkZXJUaXRsZSA/PyAnJykubG9jYWxlQ29tcGFyZShiLmhlYWRlclRpdGxlID8/ICcnKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhcmRNYXBCeVN0YXR1cyA9IG1hcDtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEJ1c2luZXNzQ2xhc3NTdGF0dXMoY2xhc3NOYW1lPzogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9lbnRpdHlTdGF0dXNTZXJ2aWNlLmdldEVudGl0eVN0YXR1cyhjbGFzc05hbWUpKTtcclxuICAgICAgICBjb25zdCBzdGF0dXNlcyA9IHJlc3BvbnNlPy5lbnRpdHlTdGF0dXMgPz8gW107XHJcblxyXG4gICAgICAgIHRoaXMubG9jYWxpemVkU3RhdHVzTGFiZWxzID0gW1xyXG4gICAgICAgICAgICB7IGtleTogJ25ldycsIGxvY2FsaXplZDogdGhpcy5fbG9jYWxpemUudHJhbnNmb3JtKCdnZXNjX3BhcmFtX2FydGljbGVfc3RhdHV0X2VudW1zX25ldycpLnRyaW0oKSB9LFxyXG4gICAgICAgICAgICAuLi5zdGF0dXNlcy5tYXAoKHM6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICAgIGtleTogcy5rZXksXHJcbiAgICAgICAgICAgICAgICBsb2NhbGl6ZWQ6IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybShzLnZhbHVlKS50cmltKClcclxuICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgZWRpdCh1aWQ/OiBzdHJpbmcpIHtcclxuICAgIGlmICh1aWQpIHtcclxuICAgICAgIHRoaXMub3Blbk1vZGFsQ29tcG9uZW50KHVpZCwgJ2VkaXQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICBjb25zdWx0KHVpZD86IHN0cmluZykge1xyXG4gICAgaWYgKHVpZCkge1xyXG4gICAgICB0aGlzLm9wZW5Nb2RhbENvbXBvbmVudCh1aWQsICdjb25zdWx0Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGxvYWQodWlkPzogc3RyaW5nKSB7XHJcbiAgICBpZiAodWlkKSB7XHJcbiAgICAgIHRoaXMub3Blbk1vZGFsQ29tcG9uZW50KHVpZCwgJ3VwbG9hZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5mbyh1aWQ/OiBzdHJpbmcpIHtcclxuICAgIGlmICh1aWQpIHtcclxuICAgICAgdGhpcy5vcGVuTW9kYWxDb21wb25lbnQodWlkLCAnaW5mbycpO1xyXG4gICAgfVxyXG4gIH1cclxuIGRlbGV0ZSh1aWQ/OiBzdHJpbmcpIHtcclxuICAgIGlmICh1aWQpIHtcclxuICAgICAgdGhpcy5vcGVuTW9kYWxDb21wb25lbnQodWlkLCAnZGVsZXRlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAgIHByaXZhdGUgb3Blbk1vZGFsQ29tcG9uZW50KHVpZDogc3RyaW5nLCBtb2RlOiBzdHJpbmcpe1xyXG4gICAgdGhpcy5idXR0b25DbGlja2VkLmVtaXQoeyBmaWVsZDogbW9kZSwga2V5OiB1aWQsIHNlbGVjdEtleU9ubHk6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxufSIsIjxkaXYgY2xhc3M9XCJjYXJkIGZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gIDxwLXBhZ2luYXRvclxyXG4gICAgW2ZpcnN0XT1cImZpcnN0XCJcclxuICAgIFtyb3dzXT1cInJvd3NcIlxyXG4gICAgW3RvdGFsUmVjb3Jkc109XCJ0b3RhbENvdW50XCJcclxuICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwiWzEsIDEwLCAyNSwgNTBdXCJcclxuICAgIChvblBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7eyAnU2hvd2luZycgfCBsb2NhbGl6ZSB9fSB7Zmlyc3R9IHt7J3RvJyB8IGxvY2FsaXplfX0ge2xhc3R9IHt7ICdvZicgfCBsb2NhbGl6ZSB9fSB7dG90YWxSZWNvcmRzfVwiPlxyXG4gIDwvcC1wYWdpbmF0b3I+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImthbmJhbi1ib2FyZCBmbGV4IGdhcC00IG92ZXJmbG93LWF1dG9cIj5cclxuICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGF0dXMgb2YgbG9jYWxpemVkU3RhdHVzTGFiZWxzOyB0cmFja0J5OiB0cmFja0J5U3RhdHVzXCJcclxuICAgICAgIGNsYXNzPVwia2FuYmFuLWNvbHVtbiBmbGV4IGZsZXgtY29sdW1uIGJvcmRlci1yb3VuZCBzdXJmYWNlLTAgc2hhZG93LTJcIlxyXG4gICAgICAgKGRyYWdvdmVyKT1cImFsbG93RHJvcCgkZXZlbnQpXCJcclxuICAgICAgIChkcm9wKT1cImRyb3AoJGV2ZW50LCBzdGF0dXMua2V5KVwiPlxyXG4gICAgICAgXHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLWhlYWRlciBwLTMgYm9yZGVyLWJvdHRvbS0xIHN1cmZhY2UtYm9yZGVyIGZvbnQtc2VtaWJvbGRcIj5cclxuICAgICAge3sgc3RhdHVzLmxvY2FsaXplZCB9fVxyXG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1ub3JtYWwgdGV4dC1ncmF5LTUwMFwiPlxyXG4gICAgICAgICh7eyBjYXJkTWFwQnlTdGF0dXMuZ2V0KHN0YXR1cy5rZXkpPy5sZW5ndGggfHwgMCB9fSlcclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbi1jYXJkcyBmbGV4LTEgb3ZlcmZsb3ctYXV0byBwLTNcIj5cclxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2FyZCBvZiBjYXJkTWFwQnlTdGF0dXMuZ2V0KHN0YXR1cy5rZXkpOyB0cmFja0J5OiB0cmFja0J5Q2FyZFwiXHJcbiAgICAgICAgICAgY2xhc3M9XCJrYW5iYW4tY2FyZCBwLTMgYm9yZGVyLXJvdW5kIGJnLXdoaXRlIG1iLTMgc2hhZG93LTFcIlxyXG4gICAgICAgICAgIFtuZ0NsYXNzXT1cImdldFN0YXR1c0NsYXNzKGNhcmQpXCJcclxuICAgICAgICAgICBkcmFnZ2FibGU9XCJ0cnVlXCJcclxuICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cImRyYWdTdGFydCgkZXZlbnQsIGNhcmQpXCJcclxuICAgICAgICAgICAoZHJhZ2VuZCk9XCJkcmFnRW5kKClcIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBtYi0yXCI+e3sgY2FyZC5oZWFkZXJUaXRsZSB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDAgbWItM1wiPnt7IGNhcmQuc3ViSGVhZGVyVGl0bGUgfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwIG1iLTNcIj57eyBjYXJkLmRlc2NyaXB0aW9uIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gdGV4dC1ncmF5LTYwMCBtYi0zXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtc2VtaWJvbGRcIj57eyAnZ2VzY19kb2N1bWVudF9zdGF0dXQnIHwgbG9jYWxpemUgfX06PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4+e3sgZ2V0TG9jYWxpemVkU3RhdHVzKGNhcmQuc3RhdHVzKSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxUc2ktQnV0dG9uXHJcbiAgICAgICAgICBbc3R5bGVDbGFzc109XCIncC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtMC01J1wiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLWV5ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiY29uc3VsdChjYXJkLnVpZClcIj5cclxuICAgICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgIDxUc2ktQnV0dG9uXHJcbiAgICAgICAgICAgW3N0eWxlQ2xhc3NdPVwiJ3AtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLTAtNSdcIlxyXG4gICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgIGljb249XCJwaSBwaS1wZW5jaWxcIlxyXG4gICAgICAgICAgIChjbGljayk9XCJlZGl0KGNhcmQudWlkKVwiPlxyXG4gICAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgPFRzaS1CdXR0b25cclxuICAgICAgICAgICBbc3R5bGVDbGFzc109XCIncC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBwLTAtNSdcIlxyXG4gICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLXRyYXNoXCJcclxuICAgICAgICAgIChjbGljayk9XCJkZWxldGUoY2FyZC51aWQpXCI+XHJcbiAgICAgICAgICA8L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICA8VHNpLUJ1dHRvbiBcclxuICAgICAgICAgIFtzdHlsZUNsYXNzXT1cIidwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC0wLTUnXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktcGFwZXJjbGlwXCJcclxuICAgICAgICAgIChjbGljayk9XCJ1cGxvYWQoY2FyZC51aWQpXCI+XHJcbiAgICAgICAgICA8L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICA8VHNpLUJ1dHRvbiBcclxuICAgICAgICAgIFtzdHlsZUNsYXNzXT1cIidwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC0wLTUnXCJcclxuICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWluZm9cIlxyXG4gICAgICAgICAgIChjbGljayk9XCJpbmZvKGNhcmQudWlkKVwiPlxyXG4gICAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG4gICAgIFxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJvdmVybGF5XCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICA8ZGl2IGNsYXNzPVwic3Bpbm5lci13cmFwcGVyXCI+XHJcbiAgICA8YXBwLXNwaW5uZXI+PC9hcHAtc3Bpbm5lcj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWthbmJhbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvdHNpLWthbmJhbi90c2kta2FuYmFuLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2kta2FuYmFuL3RzaS1rYW5iYW4uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFtQixjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFRNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdURBQXVELENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBS3pGOzs7R0FHRztBQU1ILE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxnQkFBZ0I7SUFpQnBELElBQWEsSUFBSSxDQUFDLEtBQVU7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxJQUFJLElBQUksS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBa0JqQyxZQUNZLEdBQXNCLEVBQ3RCLGFBQXlDLEVBQ3pDLFNBQXVCLEVBQ3ZCLG9CQUF5QyxFQUN6QyxvQkFBNEM7UUFFcEQsS0FBSyxFQUFFLENBQUM7UUFOQSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixrQkFBYSxHQUFiLGFBQWEsQ0FBNEI7UUFDekMsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUN2Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBd0I7UUExQzlDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFDdEQsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFPdEMsd0JBQW1CLEdBQWUsRUFBRSxDQUFDO1FBQzlDLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQywwQkFBcUIsR0FBaUIsRUFBRSxDQUFDO1FBRWhDLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBQzlCLFFBQUcsR0FBVyxLQUFLLENBQUM7UUFRN0IsVUFBSyxHQUFjLEVBQUUsQ0FBQztRQUN0QixvQkFBZSxHQUEyQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRXBELGdCQUFXLEdBQW1CLElBQUksQ0FBQztRQUNuQyxVQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWxCLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBRzVCLDBCQUFxQixHQUNqQixFQUNDLENBQUM7UUFVRixJQUFJLENBQUMscUJBQXFCLEdBQUc7WUFDekI7Z0JBQ0ksR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxDQUFDLENBQUMsSUFBSSxFQUFFO2FBQ3BGO1NBQ0osQ0FBQTtJQUNMLENBQUM7SUFFUSxLQUFLLENBQUMsUUFBUTtRQUNuQixNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7WUFDOUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDUCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNoQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsU0FBUyxDQUFDLENBQVksRUFBRSxJQUFhO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7SUFDbEQsQ0FBQztJQUVELE9BQU8sS0FBVyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFNUMsU0FBUyxDQUFDLEtBQWdCLElBQVUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU3RCxhQUFhLENBQUMsS0FBYSxFQUFFLE1BQTBDLElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUUvRixXQUFXLENBQUMsS0FBYSxFQUFFLElBQWEsSUFBSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRTlELElBQUksQ0FBQyxLQUFnQixFQUFFLFlBQW9CO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBRTlCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDOUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUUzQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztZQUV2QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUksQ0FBQztZQUVoQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3JDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNYLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUN4QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUNqRSxDQUFDO29CQUVGLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDckIsT0FBTztvQkFDWCxDQUFDO29CQUVELE1BQU0sV0FBVyxHQUFHO3dCQUNoQixHQUFHLElBQUk7d0JBQ1AsQ0FBQyxhQUFhLENBQUMsRUFBRSxZQUFZO3FCQUNoQyxDQUFDO29CQUVGLElBQUksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUM7d0JBQ2pELElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFOzRCQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOzRCQUN0QixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQzs0QkFDaEcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7NEJBQ3hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzs0QkFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7d0JBQzNCLENBQUM7d0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7NEJBQ2IsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMscUNBQXFDLENBQUMsQ0FBQzs0QkFDM0UsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsbUNBQW1DLENBQUMsQ0FBQzs0QkFFdkUsSUFBSSxPQUFPLEdBQUcsR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDOzRCQUUxSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQzs0QkFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7NEJBQ3hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzs0QkFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7d0JBQzNCLENBQUM7cUJBQ0osQ0FBQyxDQUFDO2dCQUNQLENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDO29CQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDM0IsQ0FBQzthQUNKLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFxQjtRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFhO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRSxPQUFPLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsR0FBdUI7UUFDdEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNsRSxPQUFPLEtBQUssRUFBRSxTQUFTLElBQUksR0FBRyxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBUztRQUNwQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUs7WUFBRSxPQUFPO1FBRXpCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYTtRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRU8sVUFBVTtRQUNkLE9BQU87WUFDSCxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO1lBQ2xFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO1lBQzNELElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7WUFDL0QsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtZQUNqRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO1NBQ2pFLENBQUM7SUFDTixDQUFDO0lBRU8sS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFZO1FBQ3RDLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTNCLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7UUFFN0IsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEtBQWEsRUFBRSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMvQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUM3QixPQUFPLEdBQUcsQ0FBQztZQUNmLENBQUMsRUFBRSxFQUE0QixDQUFDLENBQUM7WUFFakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzdDLE1BQU0sYUFBYSxHQUFHLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFFdEQsT0FBTztnQkFDSCxFQUFFLEVBQUUsS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSztnQkFDMUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDbEIsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDeEMsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDM0MsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDeEMsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksaUJBQWlCLENBQUMsS0FBSztnQkFDbkQsVUFBVSxFQUFFLElBQUk7YUFDbkIsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGFBQWE7UUFDakIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7UUFFekMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzVCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU8sQ0FBQyxDQUFDO1lBQ3BDLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlELENBQUM7UUFDTCxDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQWtCO1FBQ25ELE1BQU0sUUFBUSxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM1RixNQUFNLFFBQVEsR0FBRyxRQUFRLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUU5QyxJQUFJLENBQUMscUJBQXFCLEdBQUc7WUFDekIsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2pHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDekIsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHO2dCQUNWLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFO2FBQ3RELENBQUMsQ0FBQztTQUNOLENBQUM7SUFDTixDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQixPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSztZQUNiLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNqQixTQUFTLEVBQUUsR0FBRyxDQUFDLFVBQVU7WUFDekIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQzFCLGNBQWMsRUFBRSxHQUFHLENBQUMsY0FBYztTQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFVLEVBQUUsS0FBWSxFQUFFLEdBQVE7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCx1QkFBdUIsQ0FBQyxJQUFhLEVBQUUsUUFBa0I7UUFDckQsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxJQUFJLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDbkUsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQVMsRUFBRSxLQUFhO1FBRXhDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDdEcsQ0FBQzthQUNJLENBQUM7WUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDNUYsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLENBQUMsR0FBWTtRQUNiLElBQUksR0FBRyxFQUFFLENBQUM7WUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDTCxDQUFDO0lBQ08sa0JBQWtCLENBQUMsR0FBVyxFQUFFLElBQVk7UUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQzsrR0F2U1Esa0JBQWtCO21HQUFsQixrQkFBa0Isa1hDMUIvQiw2dUhBMkVVOzs0RkRqREcsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNJLFlBQVk7aU9BTVosYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVFLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFJRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFFTyxJQUFJO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUGFnaW5hdG9yU3RhdGUgfSBmcm9tICdwcmltZW5nL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uS2V5cyB9IGZyb20gJy4uLy4uL2NvbnN0cy9sb2NhbGl6YXRpb24ta2V5JztcclxuaW1wb3J0IHsgZGVmYXVsdENhcmRIZWFkZXIgfSBmcm9tICcuLi8uLi9jb25zdHMvdHNpLWNvbnN0cyc7XHJcbmltcG9ydCB7IEJ1dHRvbkNsaWNrUmVzdWx0LCBHcmlkQ29sdW1uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IFRzaUNhcmQgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBMb2NhbGl6ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9sb2NhbGl6ZS5waXBlJztcclxuaW1wb3J0IHsgQ3J1ZEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYmFzZS9jcnVkLWJhc2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlndXJhdGlvbi9lbnRpdHktY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlTdGF0dXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3RhdHVzL2VudGl0eVN0YXR1cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBwQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3RzaS1iYXNlL2NvbXBvbmVudHMvYXBwLWJhc2UvYXBwLWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQWN0aW9uUGxhY2VtZW50IH0gZnJvbSAnLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgTWVudSB9IGZyb20gJ3ByaW1lbmcvbWVudSc7XHJcblxyXG4vKipcclxuICogVHNpS2FuYmFuQ29tcG9uZW50XHJcbiAqIERlc2NyaXB0aW9uOiBEaXNwbGF5cyBhIEthbmJhbiBib2FyZCB2aWV3IGZvciBUU0kgZW50aXRpZXMuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnVHNpLWthbmJhbicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdHNpLWthbmJhbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybDogJy4vdHNpLWthbmJhbi5jb21wb25lbnQuc2NzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lLYW5iYW5Db21wb25lbnQgZXh0ZW5kcyBBcHBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQ2xpY2tSZXN1bHQ+KCk7XHJcbiAgICBAT3V0cHV0KCkgY2FsbFNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIEBJbnB1dCgpIGNhcmRCdXNpbmVzc0NsYXNzOiBhbnk7XHJcbiAgICBASW5wdXQoKSBoZWFkZXI6IGFueTtcclxuICAgIEBJbnB1dCgpIGlkOiBhbnk7XHJcbiAgICBASW5wdXQoKSBwYWdlJCE6IEJlaGF2aW9yU3ViamVjdDxhbnk+O1xyXG4gICAgQElucHV0KCkgY3J1ZFNlcnZpY2U/OiBDcnVkQmFzZVNlcnZpY2U8YW55LCBhbnksIGFueSwgYW55PjtcclxuICAgIEBJbnB1dCgpIG92ZXJmbG93QWN0aW9uc01lbnU6IE1lbnVJdGVtW10gPSBbXTtcclxuICAgIGhhc092ZXJmbG93QWN0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgb3ZlcmZsb3dBY3Rpb25Db2x1bW5zOiBHcmlkQ29sdW1uW10gPSBbXTtcclxuICAgIGN1cnJlbnRBY3Rpb25Sb3c6IGFueTtcclxuICAgIEBJbnB1dCgpIHNlbGVjdEtleU9ubHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgQElucHV0KCkga2V5OiBzdHJpbmcgPSAndWlkJztcclxuICAgIHByaXZhdGUgX3BhZ2U6IGFueTtcclxuICAgIEBJbnB1dCgpIHNldCBwYWdlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLl9wYWdlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVQYWdlQ2hhbmdlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIGdldCBwYWdlKCkgeyByZXR1cm4gdGhpcy5fcGFnZTsgfVxyXG5cclxuICAgIGNhcmRzOiBUc2lDYXJkW10gPSBbXTtcclxuICAgIGNhcmRNYXBCeVN0YXR1czogTWFwPHN0cmluZywgVHNpQ2FyZFtdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICBkcmFnZ2VkQ2FyZDogVHNpQ2FyZCB8IG51bGwgPSBudWxsO1xyXG4gICAgZmlyc3QgPSAwO1xyXG4gICAgcm93cyA9IDEwO1xyXG4gICAgdG90YWxDb3VudCA9IDA7XHJcbiAgICBpc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBvcmlnaW5hbFN0YXR1czogc3RyaW5nID0gJyc7XHJcbiAgICBwcmV2aW91c1N0YXR1czogYW55O1xyXG5cclxuICAgIGxvY2FsaXplZFN0YXR1c0xhYmVsczogeyBrZXk6IHN0cmluZzsgbG9jYWxpemVkOiBzdHJpbmcgfVtdID1cclxuICAgICAgICBbXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBfZW50aXR5Q29uZmlnOiBFbnRpdHlDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9sb2NhbGl6ZTogTG9jYWxpemVQaXBlLFxyXG4gICAgICAgIHByaXZhdGUgX2VudGl0eVN0YXR1c1NlcnZpY2U6IEVudGl0eVN0YXR1c1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uU2VydmljZTogVHNpTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5sb2NhbGl6ZWRTdGF0dXNMYWJlbHMgPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGtleTogJ25ldycsXHJcbiAgICAgICAgICAgICAgICBsb2NhbGl6ZWQ6IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybSgnZ2VzY19wYXJhbV9hcnRpY2xlX3N0YXR1dF9lbnVtc19uZXcnKS50cmltKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmdldEJ1c2luZXNzQ2xhc3NTdGF0dXModGhpcy5jYXJkQnVzaW5lc3NDbGFzcyk7XHJcblxyXG4gICAgICAgIHRoaXMucGFnZSQuc3Vic2NyaWJlKGFzeW5jIHBhZ2UgPT4ge1xyXG4gICAgICAgICAgICBpZiAocGFnZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSAhIXBhZ2UubG9hZGluZztcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlUGFnZUNoYW5nZShwYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRyYWdTdGFydChfOiBEcmFnRXZlbnQsIGNhcmQ6IFRzaUNhcmQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRyYWdnZWRDYXJkID0gY2FyZDtcclxuICAgICAgICB0aGlzLnByZXZpb3VzU3RhdHVzID0gdGhpcy5kcmFnZ2VkQ2FyZC5zdGF0dXM7XHJcbiAgICB9XHJcblxyXG4gICAgZHJhZ0VuZCgpOiB2b2lkIHsgdGhpcy5kcmFnZ2VkQ2FyZCA9IG51bGw7IH1cclxuXHJcbiAgICBhbGxvd0Ryb3AoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyB9XHJcblxyXG4gICAgdHJhY2tCeVN0YXR1cyhpbmRleDogbnVtYmVyLCBzdGF0dXM6IHsga2V5OiBzdHJpbmc7IGxvY2FsaXplZDogc3RyaW5nIH0pIHsgcmV0dXJuIHN0YXR1cy5rZXk7IH1cclxuXHJcbiAgICB0cmFja0J5Q2FyZChpbmRleDogbnVtYmVyLCBjYXJkOiBUc2lDYXJkKSB7IHJldHVybiBjYXJkLnVpZDsgfVxyXG5cclxuICAgIGRyb3AoZXZlbnQ6IERyYWdFdmVudCwgbmV3U3RhdHVzS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dlZENhcmQpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgY2FyZCA9IHRoaXMuZHJhZ2dlZENhcmQ7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNTdGF0dXMgPSB0aGlzLnByZXZpb3VzU3RhdHVzO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kcmFnZ2VkQ2FyZC5zdGF0dXMgIT09IG5ld1N0YXR1c0tleSkge1xyXG4gICAgICAgICAgICB0aGlzLmRyYWdnZWRDYXJkLnN0YXR1cyA9IG5ld1N0YXR1c0tleTtcclxuXHJcbiAgICAgICAgICAgIGxldCB1aWQgPSB0aGlzLmRyYWdnZWRDYXJkLnVpZCE7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlPy5nZXRCeUlkKHVpZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhbFN0YXR1c0tleSA9IE9iamVjdC5rZXlzKHJlc3ApLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9PiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5vcmlnaW5hbFN0YXR1cy50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWFsU3RhdHVzS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dlZENhcmQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmRNYXAoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEl0ZW0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc3AsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFsU3RhdHVzS2V5XTogbmV3U3RhdHVzS2V5XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZT8udXBkYXRlKHVwZGF0ZWRJdGVtLCB1aWQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3ModGhpcy5fbG9jYWxpemUudHJhbnNmb3JtKExvY2FsaXphdGlvbktleXMuc2F2ZWRTdWNjZXNzZnVsbHkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dlZENhcmQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJkTWFwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJvbSA9IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybShcImdlc2NfcGFyYW1fZXJyb3Jfc3dpdGNoX3N0YXR1c19mcm9tXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvID0gdGhpcy5fbG9jYWxpemUudHJhbnNmb3JtKFwiZ2VzY19wYXJhbV9lcnJvcl9zd2l0Y2hfc3RhdHVzX3RvXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYCR7ZnJvbX0gJyR7dGhpcy5nZXRMb2NhbGl6ZWRTdGF0dXModGhpcy5wcmV2aW91c1N0YXR1cyl9JyAke3RvfSAnJHt0aGlzLmdldExvY2FsaXplZFN0YXR1cyhjYXJkLnN0YXR1cyl9J2A7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQuc3RhdHVzID0gcHJldmlvdXNTdGF0dXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdnZWRDYXJkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ2FyZE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcmQuc3RhdHVzID0gcHJldmlvdXNTdGF0dXM7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2VkQ2FyZCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJkTWFwKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDYXJkTWFwKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRyYWdnZWRDYXJkID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBvblBhZ2VDaGFuZ2UoZXZlbnQ6IFBhZ2luYXRvclN0YXRlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5maXJzdCA9IGV2ZW50LmZpcnN0ID8/IDA7XHJcbiAgICAgICAgdGhpcy5yb3dzID0gZXZlbnQucm93cyA/PyAxMDtcclxuICAgICAgICB0aGlzLmNhbGxTZWFyY2guZW1pdCh7IHNraXBDb3VudDogdGhpcy5maXJzdCwgbWF4UmVzdWx0Q291bnQ6IHRoaXMucm93cyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGF0dXNDbGFzcyhjYXJkOiBUc2lDYXJkKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubG9jYWxpemVkU3RhdHVzTGFiZWxzLmZpbmRJbmRleChsID0+IGwua2V5ID09PSBjYXJkLnN0YXR1cyk7XHJcbiAgICAgICAgcmV0dXJuIGBzdGF0dXMtJHtpbmRleCA+PSAwID8gaW5kZXggOiAnZGVmYXVsdCd9YDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRMb2NhbGl6ZWRTdGF0dXMoa2V5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICgha2V5KSByZXR1cm4gJyc7XHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmxvY2FsaXplZFN0YXR1c0xhYmVscy5maW5kKHMgPT4gcy5rZXkgPT09IGtleSk7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoPy5sb2NhbGl6ZWQgPz8ga2V5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgaGFuZGxlUGFnZUNoYW5nZShwYWdlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAoIXBhZ2U/Lml0ZW1zKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2FyZHMgPSBhd2FpdCB0aGlzLm1hcEl0ZW1zVG9DYXJkcyhwYWdlLml0ZW1zKTtcclxuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSBwYWdlLnRvdGFsQ291bnQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDYXJkTWFwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRFbnRpdHlJbmZvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRoaXMuZW50aXR5SW5mbyA9IGF3YWl0IHRoaXMuX2VudGl0eUNvbmZpZy5nZXRFbnRpdHlJbmZvRnJvbUNhY2hlKHRoaXMuY2FyZEJ1c2luZXNzQ2xhc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0Q29sS2V5cygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBwaG90bzogdGhpcy5lbnRpdHlJbmZvPy5jYXJkSGVhZGVyUGhvdG9Db2x1bW4/LnRvTG93ZXJDYXNlKCkgPz8gJycsXHJcbiAgICAgICAgICAgIGNvbDE6IHRoaXMuZW50aXR5SW5mbz8uY2FyZFRpdGxlQ29sdW1uPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxyXG4gICAgICAgICAgICBjb2wyOiB0aGlzLmVudGl0eUluZm8/LmNhcmRTdWJIZWFkZXJDb2x1bW4/LnRvTG93ZXJDYXNlKCkgPz8gJycsXHJcbiAgICAgICAgICAgIGNvbDM6IHRoaXMuZW50aXR5SW5mbz8uY2FyZERlc2NyaXB0aW9uQ29sdW1uPy50b0xvd2VyQ2FzZSgpID8/ICcnLFxyXG4gICAgICAgICAgICBzdGF0dXM6IHRoaXMuZW50aXR5SW5mbz8uc3RhdHVzQ29sdW1uTmFtZT8udG9Mb3dlckNhc2UoKSA/PyAnJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBtYXBJdGVtc1RvQ2FyZHMoaXRlbXM6IGFueVtdKTogUHJvbWlzZTxUc2lDYXJkW10+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLmdldEVudGl0eUluZm8oKTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBjb2wxLCBjb2wyLCBjb2wzLCBwaG90bywgc3RhdHVzIH0gPSB0aGlzLmdldENvbEtleXMoKTtcclxuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB0aGlzLmxvY2FsaXplZFN0YXR1c0xhYmVscy5tYXAocyA9PiBzLmtleSk7XHJcblxyXG4gICAgICAgIHRoaXMub3JpZ2luYWxTdGF0dXMgPSBzdGF0dXM7XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaXRlbSkucmVkdWNlKChhY2MsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgYWNjW2tleS50b0xvd2VyQ2FzZSgpXSA9IGtleTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmF3U3RhdHVzID0gaXRlbVtrZXlzW3N0YXR1c11dPy50cmltKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWRTdGF0dXMgPSByYXdTdGF0dXMgJiYgdmFsaWRLZXlzLmluY2x1ZGVzKHJhd1N0YXR1cyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsU3RhdHVzID0gaXNWYWxpZFN0YXR1cyA/IHJhd1N0YXR1cyA6ICduZXcnO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGlkOiBpbmRleCArIDEgKyB0aGlzLmZpcnN0LFxyXG4gICAgICAgICAgICAgICAgdWlkOiBgJHtpdGVtLnVpZH1gLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyVGl0bGU6IGAke2l0ZW1ba2V5c1tjb2wxXV0gPz8gJyd9YCxcclxuICAgICAgICAgICAgICAgIHN1YkhlYWRlclRpdGxlOiBgJHtpdGVtW2tleXNbY29sMl1dID8/ICcnfWAsXHJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7aXRlbVtrZXlzW2NvbDNdXSA/PyAnJ31gLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBmaW5hbFN0YXR1cyxcclxuICAgICAgICAgICAgICAgIHBob3RvOiBpdGVtW2tleXNbcGhvdG9dXSB8fCBkZWZhdWx0Q2FyZEhlYWRlci5pbWFnZSxcclxuICAgICAgICAgICAgICAgIGZ1bGxSZWNvcmQ6IGl0ZW0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVDYXJkTWFwKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBUc2lDYXJkW10+KCk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgbGFiZWwgb2YgdGhpcy5sb2NhbGl6ZWRTdGF0dXNMYWJlbHMpIHtcclxuICAgICAgICAgICAgbWFwLnNldChsYWJlbC5rZXksIFtdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgY2FyZCBvZiB0aGlzLmNhcmRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbWFwLmdldChjYXJkLnN0YXR1cyEpO1xyXG4gICAgICAgICAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwLnB1c2goY2FyZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgVW5tYXBwZWQgY2FyZCBzdGF0dXM6ICR7Y2FyZC5zdGF0dXN9YCwgY2FyZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgY2FyZHNdIG9mIG1hcC5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgY2FyZHMuc29ydCgoYSwgYikgPT4gKGEuaGVhZGVyVGl0bGUgPz8gJycpLmxvY2FsZUNvbXBhcmUoYi5oZWFkZXJUaXRsZSA/PyAnJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jYXJkTWFwQnlTdGF0dXMgPSBtYXA7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCdXNpbmVzc0NsYXNzU3RhdHVzKGNsYXNzTmFtZT86IHN0cmluZykge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fZW50aXR5U3RhdHVzU2VydmljZS5nZXRFbnRpdHlTdGF0dXMoY2xhc3NOYW1lKSk7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzZXMgPSByZXNwb25zZT8uZW50aXR5U3RhdHVzID8/IFtdO1xyXG5cclxuICAgICAgICB0aGlzLmxvY2FsaXplZFN0YXR1c0xhYmVscyA9IFtcclxuICAgICAgICAgICAgeyBrZXk6ICduZXcnLCBsb2NhbGl6ZWQ6IHRoaXMuX2xvY2FsaXplLnRyYW5zZm9ybSgnZ2VzY19wYXJhbV9hcnRpY2xlX3N0YXR1dF9lbnVtc19uZXcnKS50cmltKCkgfSxcclxuICAgICAgICAgICAgLi4uc3RhdHVzZXMubWFwKChzOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgICAgICBrZXk6IHMua2V5LFxyXG4gICAgICAgICAgICAgICAgbG9jYWxpemVkOiB0aGlzLl9sb2NhbGl6ZS50cmFuc2Zvcm0ocy52YWx1ZSkudHJpbSgpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T3ZlcmZsb3dNZW51TW9kZWwoKTogTWVudUl0ZW1bXSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc092ZXJmbG93QWN0aW9ucykge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5vdmVyZmxvd0FjdGlvbkNvbHVtbnMubWFwKGNvbCA9PiAoe1xyXG4gICAgICAgICAgICBpZDogY29sLmZpZWxkLFxyXG4gICAgICAgICAgICBsYWJlbDogY29sLmhlYWRlcixcclxuICAgICAgICAgICAgaWNvbkNsYXNzOiBjb2wuYnV0dG9uSWNvbixcclxuICAgICAgICAgICAgc3R5bGVDbGFzczogY29sLnN0eWxlQ2xhc3MsXHJcbiAgICAgICAgICAgIGljb25TdHlsZUNsYXNzOiBjb2wuaWNvblN0eWxlQ2xhc3MsXHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJmbG93Q29sdW1uQ2xpY2tlZChtZW51OiBNZW51LCBldmVudDogRXZlbnQsIHJvdzogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0aW9uUm93ID0gcm93O1xyXG4gICAgICAgIG1lbnUudG9nZ2xlKGV2ZW50KTtcclxuICAgIH1cclxuICAgIG9uT3ZlcmZsb3dBY3Rpb25DbGlja2VkKGNhcmQ6IFRzaUNhcmQsIG1lbnVJdGVtOiBNZW51SXRlbSkge1xyXG4gICAgICAgIGlmICghY2FyZCB8fCAhbWVudUl0ZW0gfHwgIW1lbnVJdGVtLmlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlQnV0dG9uQ2xpY2tlZChjYXJkPy5mdWxsUmVjb3JkID8/IGNhcmQsIG1lbnVJdGVtLmlkKVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUJ1dHRvbkNsaWNrZWQoaXRlbTogYW55LCBmaWVsZDogc3RyaW5nKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICAgICAgdGhpcy5idXR0b25DbGlja2VkLmVtaXQoeyBmaWVsZDogZmllbGQsIGtleTogaXRlbVt0aGlzLmtleV0sIHNlbGVjdEtleU9ubHk6IHRoaXMuc2VsZWN0S2V5T25seSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uQ2xpY2tlZC5lbWl0KHsgZmllbGQ6IGZpZWxkLCBrZXk6IGl0ZW0sIHNlbGVjdEtleU9ubHk6IHRoaXMuc2VsZWN0S2V5T25seSB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdCh1aWQ/OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodWlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3Blbk1vZGFsQ29tcG9uZW50KHVpZCwgJ2VkaXQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIG9wZW5Nb2RhbENvbXBvbmVudCh1aWQ6IHN0cmluZywgbW9kZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5idXR0b25DbGlja2VkLmVtaXQoeyBmaWVsZDogbW9kZSwga2V5OiB1aWQsIHNlbGVjdEtleU9ubHk6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG59IiwiPGRpdiBjbGFzcz1cImNhcmQgZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgPHAtcGFnaW5hdG9yIFtmaXJzdF09XCJmaXJzdFwiIFtyb3dzXT1cInJvd3NcIiBbdG90YWxSZWNvcmRzXT1cInRvdGFsQ291bnRcIiBbcm93c1BlclBhZ2VPcHRpb25zXT1cIlsxLCAxMCwgMjUsIDUwXVwiXHJcbiAgICAob25QYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCIgW3Nob3dDdXJyZW50UGFnZVJlcG9ydF09XCJ0cnVlXCJcclxuICAgIGN1cnJlbnRQYWdlUmVwb3J0VGVtcGxhdGU9XCJ7eyAnU2hvd2luZycgfCBsb2NhbGl6ZSB9fSB7Zmlyc3R9IHt7J3RvJyB8IGxvY2FsaXplfX0ge2xhc3R9IHt7ICdvZicgfCBsb2NhbGl6ZSB9fSB7dG90YWxSZWNvcmRzfVwiPlxyXG4gIDwvcC1wYWdpbmF0b3I+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImthbmJhbi1ib2FyZCBmbGV4IGdhcC00IG92ZXJmbG93LWF1dG9cIj5cclxuICA8ZGl2ICpuZ0Zvcj1cImxldCBzdGF0dXMgb2YgbG9jYWxpemVkU3RhdHVzTGFiZWxzOyB0cmFja0J5OiB0cmFja0J5U3RhdHVzXCJcclxuICAgIGNsYXNzPVwia2FuYmFuLWNvbHVtbiBmbGV4IGZsZXgtY29sdW1uIGJvcmRlci1yb3VuZCBzdXJmYWNlLTAgc2hhZG93LTJcIiAoZHJhZ292ZXIpPVwiYWxsb3dEcm9wKCRldmVudClcIlxyXG4gICAgKGRyb3ApPVwiZHJvcCgkZXZlbnQsIHN0YXR1cy5rZXkpXCI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbi1oZWFkZXIgcC0zIGJvcmRlci1ib3R0b20tMSBzdXJmYWNlLWJvcmRlciBmb250LXNlbWlib2xkXCI+XHJcbiAgICAgIHt7IHN0YXR1cy5sb2NhbGl6ZWQgfX1cclxuICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbm9ybWFsIHRleHQtZ3JheS01MDBcIj5cclxuICAgICAgICAoe3sgY2FyZE1hcEJ5U3RhdHVzLmdldChzdGF0dXMua2V5KT8ubGVuZ3RoIHx8IDAgfX0pXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tY2FyZHMgZmxleC0xIG92ZXJmbG93LWF1dG8gcC0zXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNhcmQgb2YgY2FyZE1hcEJ5U3RhdHVzLmdldChzdGF0dXMua2V5KTsgdHJhY2tCeTogdHJhY2tCeUNhcmRcIlxyXG4gICAgICAgIGNsYXNzPVwia2FuYmFuLWNhcmQgcC0zIGJvcmRlci1yb3VuZCBiZy13aGl0ZSBtYi0zIHNoYWRvdy0xXCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXRTdGF0dXNDbGFzcyhjYXJkKVwiXHJcbiAgICAgICAgZHJhZ2dhYmxlPVwidHJ1ZVwiXHJcbiAgICAgICAgKGRyYWdzdGFydCk9XCJkcmFnU3RhcnQoJGV2ZW50LCBjYXJkKVwiIFxyXG4gICAgICAgIChkcmFnZW5kKT1cImRyYWdFbmQoKVwiPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkIG1iLTJcIj57eyBjYXJkLmhlYWRlclRpdGxlIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gdGV4dC1ncmF5LTYwMCBtYi0zXCI+e3sgY2FyZC5zdWJIZWFkZXJUaXRsZSB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtZ3JheS02MDAgbWItM1wiPnt7IGNhcmQuZGVzY3JpcHRpb24gfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNjAwIG1iLTNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZFwiPnt7ICdnZXNjX2RvY3VtZW50X3N0YXR1dCcgfCBsb2NhbGl6ZSB9fTo8L3NwYW4+XHJcbiAgICAgICAgICA8c3Bhbj57eyBnZXRMb2NhbGl6ZWRTdGF0dXMoY2FyZC5zdGF0dXMpIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLW1lbnUgYXBwZW5kVG89XCJib2R5XCIgI21lbnVNb3JlQWN0aW9ucyBcclxuICAgICAgICAgICAgIFttb2RlbF09XCJvdmVyZmxvd0FjdGlvbnNNZW51XCIgXHJcbiAgICAgICAgICAgICBbcG9wdXBdPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJvdmVyZmxvdy1tZW51XCJcclxuICAgICAgICAgICAgIFtzdHlsZV09XCJ7ICd3aWR0aCc6ICdhdXRvJywgJ21pbi13aWR0aCc6ICcwcHgnIH1cIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJpdGVtXCIgbGV0LW1lbnVJdGVtPlxyXG4gICAgICAgICAgICA8YSBwUmlwcGxlIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcC1tZW51aXRlbS1saW5rXCIgXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uc3R5bGVDbGFzc1wiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3ZlcmZsb3dBY3Rpb25DbGlja2VkKGNhcmQsIG1lbnVJdGVtKVwiPlxyXG4gICAgICAgICAgICAgIDxpICpuZ0lmPVwibWVudUl0ZW0uaWQgPT09ICdub3RlcydcIiBjbGFzcz1cInt7IG1lbnVJdGVtLmljb25DbGFzcyB9fSBwLW1lbnVpdGVtLWljb24gYmFkZ2UtaWNvbiBoYXMtYmFkZ2VcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uaWNvblN0eWxlQ2xhc3NcIiBwQmFkZ2Ugc2V2ZXJpdHk9XCJkYW5nZXJcIiBcclxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjYXJkLmZ1bGxSZWNvcmQubm90ZXNDb3VudFwiXHJcbiAgICAgICAgICAgICAgICBbYmFkZ2VEaXNhYmxlZF09XCJjYXJkLmZ1bGxSZWNvcmQubm90ZXNDb3VudCA9PSBudWxsXCIgYmFkZ2VQb3NpdGlvbj1cInRvcC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgIDwvaT5cclxuXHJcbiAgICAgICAgICAgICAgPGkgKm5nSWY9XCJtZW51SXRlbS5pZCAhPT0gJ25vdGVzJ1wiIGNsYXNzPVwie3ttZW51SXRlbS5pY29uQ2xhc3N9fSBwLW1lbnVpdGVtLWljb25cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUl0ZW0uaWNvblN0eWxlQ2xhc3NcIj5cclxuICAgICAgICAgICAgICA8L2k+XHJcblxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWVudS1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAge3sgbWVudUl0ZW0ubGFiZWwgfCBsb2NhbGl6ZSB9fVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtbWVudT5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMSBnYXAtMiBwLTBcIj5cclxuICAgICAgICAgIDxUc2ktQnV0dG9uIFtzdHlsZUNsYXNzXT1cIidwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC0wLTUnXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1wZW5jaWxcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZWRpdChjYXJkLnVpZClcIj5cclxuICAgICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgIDxwLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWVsbGlwc2lzLXZcIiBzdHlsZUNsYXNzPVwib3ZlcmZsb3ctYnRuXCJcclxuICAgICAgICAgICAgKG9uQ2xpY2spPVwib3ZlcmZsb3dDb2x1bW5DbGlja2VkKG1lbnVNb3JlQWN0aW9ucywgJGV2ZW50LCBjYXJkKVwiPlxyXG4gICAgICAgICAgPC9wLWJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXlcIiAqbmdJZj1cImlzTG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci13cmFwcGVyXCI+XHJcbiAgICAgICAgPGFwcC1zcGlubmVyPjwvYXBwLXNwaW5uZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+Il19