ng-fusion-ui 0.5.1 → 0.5.2
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.
|
@@ -112,6 +112,10 @@ export class DataGridComponent {
|
|
|
112
112
|
}
|
|
113
113
|
ngOnChanges(changes) {
|
|
114
114
|
if (changes['localStorageKey']) {
|
|
115
|
+
const searchText = window.localStorage.getItem(`fu-grid-${this.localStorageKey}-searchText`);
|
|
116
|
+
if (searchText) {
|
|
117
|
+
this.filterText = searchText;
|
|
118
|
+
}
|
|
115
119
|
this.sortService.getLocalStorageKey(this.localStorageKey);
|
|
116
120
|
this.pageSize = JSON.parse(window.localStorage.getItem(`fu-grid-${this.localStorageKey}-pageSize`) || this.pageSizeOptions[0].toString());
|
|
117
121
|
if (this.firstPageOnInit) {
|
|
@@ -127,7 +131,9 @@ export class DataGridComponent {
|
|
|
127
131
|
}
|
|
128
132
|
if (changes['dataSource']) {
|
|
129
133
|
if (!this.serverPagination()) {
|
|
130
|
-
|
|
134
|
+
if (!this.initLoad) {
|
|
135
|
+
this.sortData(this.sortService.sortKey());
|
|
136
|
+
}
|
|
131
137
|
this.filteredData = [...this.dataSource];
|
|
132
138
|
this.sortedData = [...this.filteredData];
|
|
133
139
|
}
|
|
@@ -155,7 +161,6 @@ export class DataGridComponent {
|
|
|
155
161
|
this.currentPage = 1;
|
|
156
162
|
window.localStorage.setItem(`fu-grid-${this.localStorageKey}-currentPage`, this.currentPage.toString());
|
|
157
163
|
}
|
|
158
|
-
// this.updatePagination();
|
|
159
164
|
this.initLoad = false;
|
|
160
165
|
if (this.filterText !== '') {
|
|
161
166
|
this.filterData();
|
|
@@ -174,11 +179,12 @@ export class DataGridComponent {
|
|
|
174
179
|
element.classList.add(sortDirection === 'asc' ? 'sort-asc' : 'sort-desc');
|
|
175
180
|
}
|
|
176
181
|
}
|
|
177
|
-
filterData() {
|
|
182
|
+
filterData(changes = false) {
|
|
178
183
|
if (this.filterText.trim() === '') {
|
|
179
184
|
this.filteredData = [...this.sortedData];
|
|
180
185
|
}
|
|
181
186
|
else {
|
|
187
|
+
window.localStorage.setItem(`fu-grid-${this.localStorageKey}-searchText`, this.filterText);
|
|
182
188
|
this.filteredData = this.sortedData.filter((item) => Object.values(item).some((value) => {
|
|
183
189
|
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
184
190
|
return;
|
|
@@ -189,10 +195,16 @@ export class DataGridComponent {
|
|
|
189
195
|
.includes(this.filterText.toLowerCase());
|
|
190
196
|
}));
|
|
191
197
|
}
|
|
192
|
-
|
|
193
|
-
|
|
198
|
+
if (changes) {
|
|
199
|
+
this.currentPage = 1;
|
|
200
|
+
window.localStorage.setItem(`fu-grid-${this.localStorageKey}-currentPage`, this.currentPage.toString());
|
|
201
|
+
}
|
|
194
202
|
this.updatePagination(true);
|
|
195
|
-
|
|
203
|
+
}
|
|
204
|
+
resetFilter() {
|
|
205
|
+
this.filterText = '';
|
|
206
|
+
window.localStorage.removeItem(`fu-grid-${this.localStorageKey}-searchText`);
|
|
207
|
+
this.filterData(true);
|
|
196
208
|
}
|
|
197
209
|
serverSidePagination() {
|
|
198
210
|
this.paginatedData = this.dataSource;
|
|
@@ -265,11 +277,11 @@ export class DataGridComponent {
|
|
|
265
277
|
}
|
|
266
278
|
}
|
|
267
279
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: DataGridComponent, deps: [{ token: i1.DataSortingService }, { token: i2.PaginationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
268
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: DataGridComponent, selector: "fu-data-grid", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: false, isRequired: true, transformFunction: null }, localStorageKey: { classPropertyName: "localStorageKey", publicName: "localStorageKey", isSignal: false, isRequired: true, transformFunction: null }, totalCount: { classPropertyName: "totalCount", publicName: "totalCount", isSignal: false, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: false, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: false, isRequired: false, transformFunction: null }, columnSizes: { classPropertyName: "columnSizes", publicName: "columnSizes", isSignal: false, isRequired: false, transformFunction: null }, dataLoading: { classPropertyName: "dataLoading", publicName: "dataLoading", isSignal: false, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: false, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: false, isRequired: false, transformFunction: null }, paginator: { classPropertyName: "paginator", publicName: "paginator", isSignal: false, isRequired: false, transformFunction: null }, hoverable: { classPropertyName: "hoverable", publicName: "hoverable", isSignal: false, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: false, isRequired: false, transformFunction: null }, firstPageOnInit: { classPropertyName: "firstPageOnInit", publicName: "firstPageOnInit", isSignal: false, isRequired: false, transformFunction: null }, renderNewAddRow: { classPropertyName: "renderNewAddRow", publicName: "renderNewAddRow", isSignal: false, isRequired: false, transformFunction: null }, expandIndex: { classPropertyName: "expandIndex", publicName: "expandIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowSelect: "rowSelect", onSort: "onSort", expandIndex: "expandIndexChange" }, providers: [DataSortingService], queries: [{ propertyName: "captionTemplate", first: true, predicate: ["caption"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: GridHeaderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "bodyTemplate", first: true, predicate: GridBodyTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "expandTemplate", first: true, predicate: GridExpandTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "footerTemplate", first: true, predicate: ["footer"], descendants: true }, { propertyName: "noDataTemplate", first: true, predicate: ["noDataRow"], descendants: true }, { propertyName: "addButtonTemplate", first: true, predicate: ["addButton"], descendants: true }, { propertyName: "addNewRowTemplate", first: true, predicate: ["addNewRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"fusion-datagrid\" class=\"fu-data-grid-wrapper\">\r\n @if (filter) {\r\n <input\r\n class=\"fu-data-grid-filter\"\r\n type=\"text\"\r\n [(ngModel)]=\"filterText\"\r\n (input)=\"filterData()\"\r\n placeholder=\"Search keyword...\"\r\n />\r\n }\r\n\r\n <div class=\"fu-data-grid-container\">\r\n <div class=\"fu-data-grid-header\">\r\n <div class=\"fu-head-row\" gridColumns [columnSizes]=\"columnSizes\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerTemplate || defaultHeaderTemplate;\r\n context: { $implicit: dataSource, keys: dataSource[0] | keyMapping }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"fu-data-grid-body\">\r\n <div *ngIf=\"dataLoading\" class=\"fu-data-grid-spinner-overlay\">\r\n <div class=\"fu-spinner\"></div>\r\n </div>\r\n\r\n @for (row of paginatedData; track $index) {\r\n <div\r\n class=\"fu-body-row\"\r\n [ngClass]=\"{ hoverable, striped }\"\r\n [style.cursor]=\"\r\n expandable || rowSelect.observed ? 'pointer' : 'default'\r\n \"\r\n (click)=\"rowClick(row, $index)\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n bodyTemplate || defaultBodyTemplate;\r\n context: { $implicit: row, index: $index, keys: row | keyMapping }\r\n \"\r\n />\r\n\r\n @if (\r\n (expandable && expandedRowIndex === $index) ||\r\n expandIndex() === $index\r\n ) {\r\n <div class=\"fu-expanded-row\" (click)=\"$event.stopPropagation()\">\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n expandTemplate;\r\n context: { $implicit: row, index: $index }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"footerTemplate; context: { $implicit: paginatedData }\"\r\n />\r\n\r\n @if (paginatedData.length <= 0 && !dataLoading) {\r\n <ng-container *ngTemplateOutlet=\"noDataTemplate\" />\r\n }\r\n\r\n @if (renderNewAddRow) {\r\n <ng-container *ngTemplateOutlet=\"addNewRowTemplate\" />\r\n }\r\n\r\n @if (paginator) {\r\n <ng-container\r\n *ngTemplateOutlet=\"defaultPaginator; context: { $implicit: sortData }\"\r\n />\r\n }\r\n</div>\r\n\r\n<ng-template #defaultHeaderTemplate let-data>\r\n @for (header of data[0] | keyvalue: originalOrder; track $index) {\r\n <fu-head-row-cell\r\n [cellDef]=\"$any(header.key)\"\r\n [sortKey]=\"$any(header.key)\"\r\n />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultBodyTemplate let-rows>\r\n @for (row of rows | keyvalue: originalOrder; track $index) {\r\n <fu-body-row-cell [cellValue]=\"$any(row.value)\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultPaginator let-data>\r\n <div class=\"fu-data-grid-paginator\">\r\n <div class=\"fu-grid-add-button\">\r\n <ng-container *ngTemplateOutlet=\"addButtonTemplate\" />\r\n </div>\r\n\r\n <div class=\"fu-paginator-page-select\">\r\n <span>Page size:</span>\r\n <select class=\"fu-page-size-select\" (change)=\"changePageSize($event)\">\r\n <option\r\n *ngFor=\"let size of pageSizeOptions\"\r\n [value]=\"size\"\r\n [selected]=\"size === pageSize\"\r\n >\r\n {{ size }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"fu-paginator-controls\">\r\n <div>\r\n {{ getPageStart() }} - {{ getPageEnd() }} of {{ totalItemCount() }}\r\n </div>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"doubleArrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage - 1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"arrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage + 1)\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"arrowRight\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(totalPages())\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"doubleArrowRight\" />\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["html{--fu-grid-fg-color: #232534;--fu-grid-bg-color: #1e1f2b;--fu-grid-hover-color: #12121240;--fu-grid-striped-color: #22232e;--fu-grid-border-color: #4b444d;--fu-grid-text-color: #ffffff;--fu-grid-cell-color: #bab9b9;--fu-filter-input-color: #ccc;--fu-grid-cell-edit-input: #fff;--fu-grid-shape: 4px}.fu-data-grid-wrapper{border-radius:var(--fu-grid-shape);box-shadow:0 2px 4px #00000080;background-color:var(--fu-grid-bg-color);color:var(--fu-grid-text-color);font-family:Roboto,sans-serif;font-size:14px}.fu-data-grid-container{width:100%}.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:flex;justify-content:space-between;flex-wrap:wrap}.fu-data-grid-container .fu-data-grid-header .fu-head-row>*{flex:1 1 auto}}.fu-data-grid-container .fu-data-grid-body{position:relative}.fu-data-grid-container .fu-data-grid-body .fu-body-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color);align-items:center}.fu-data-grid-container .fu-data-grid-body .fu-body-row.striped:nth-child(2n){background-color:var(--fu-grid-striped-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row.hoverable:hover{background-color:var(--fu-grid-hover-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:repeat(2,1fr)}.fu-data-grid-container .fu-data-grid-body .fu-body-row :nth-child(odd):last-child{grid-column:span 2}.fu-data-grid-container .fu-data-grid-body .fu-body-row [data-actions]{grid-column:1/-1;margin:8px 0}}@media (max-width: 600px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:1fr;border-bottom:1px solid var(--fu-grid-border-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row>:nth-child(odd):last-child{grid-column:span 1}}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row{grid-column:1/-1;border-top:1px solid rgba(128,128,128,.1);padding:12px 16px}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row>div{cursor:default}.fu-data-grid-paginator{display:flex;justify-content:flex-end;padding:16px;position:relative}.fu-data-grid-paginator .fu-page-size-select{background-color:var(--fu-grid-fg-color);color:var(--fu-grid-cell-edit-input);padding:4px;border:1px solid var(--fu-grid-border-color)}@media (max-width: 600px){.fu-data-grid-paginator{gap:12px;flex-direction:column;padding:12px 16px}}.fu-data-grid-paginator .fu-paginator-page-select{display:flex;justify-content:flex-end;align-items:center;margin-right:12px;font-size:14px}@media (max-width: 600px){.fu-data-grid-paginator .fu-paginator-page-select{margin-right:0}}.fu-data-grid-paginator .fu-paginator-page-select span{margin-right:8px}.fu-data-grid-paginator .fu-paginator-controls{display:flex;justify-content:flex-end;align-items:center;gap:8px}.fu-grid-add-button{position:absolute;left:10px;top:10px}.fu-data-grid-filter{box-sizing:border-box;background-color:var(--fu-grid-fg-color);color:var(--fu-filter-input-color);width:calc(100% - 32px);padding:12px 8px;margin:16px;outline:none;border:none}.fu-data-grid-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#78787880;display:flex;justify-content:center;align-items:center;z-index:1000}.fu-data-grid-spinner-overlay .fu-spinner{border:10px solid var(--fu-grid-bg-color);border-top:10px solid #3498db;border-radius:50%;width:30px;height:30px;animation:spin 2s linear infinite;margin:5px auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.IconComponent, selector: "fu-icon", inputs: ["iconName", "size", "strokeWidth", "color"] }, { kind: "directive", type: i6.TextButtonDirective, selector: "[fu-btn-text]", inputs: ["variant", "iconButton", "rounded"] }, { kind: "directive", type: i7.GridColumnsDirective, selector: "[gridColumns]", inputs: ["columnSizes"] }, { kind: "component", type: i8.BodyRowCellComponent, selector: "fu-body-row-cell", inputs: ["cellValue", "editKey", "editCellValue"], outputs: ["editCellValueChange"] }, { kind: "component", type: i9.HeadRowCellComponent, selector: "fu-head-row-cell", inputs: ["cellDef", "sortKey"] }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: i10.KeyMappingPipe, name: "keyMapping" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
280
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: DataGridComponent, selector: "fu-data-grid", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: false, isRequired: true, transformFunction: null }, localStorageKey: { classPropertyName: "localStorageKey", publicName: "localStorageKey", isSignal: false, isRequired: true, transformFunction: null }, totalCount: { classPropertyName: "totalCount", publicName: "totalCount", isSignal: false, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: false, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: false, isRequired: false, transformFunction: null }, columnSizes: { classPropertyName: "columnSizes", publicName: "columnSizes", isSignal: false, isRequired: false, transformFunction: null }, dataLoading: { classPropertyName: "dataLoading", publicName: "dataLoading", isSignal: false, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: false, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: false, isRequired: false, transformFunction: null }, paginator: { classPropertyName: "paginator", publicName: "paginator", isSignal: false, isRequired: false, transformFunction: null }, hoverable: { classPropertyName: "hoverable", publicName: "hoverable", isSignal: false, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: false, isRequired: false, transformFunction: null }, firstPageOnInit: { classPropertyName: "firstPageOnInit", publicName: "firstPageOnInit", isSignal: false, isRequired: false, transformFunction: null }, renderNewAddRow: { classPropertyName: "renderNewAddRow", publicName: "renderNewAddRow", isSignal: false, isRequired: false, transformFunction: null }, expandIndex: { classPropertyName: "expandIndex", publicName: "expandIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowSelect: "rowSelect", onSort: "onSort", expandIndex: "expandIndexChange" }, providers: [DataSortingService], queries: [{ propertyName: "captionTemplate", first: true, predicate: ["caption"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: GridHeaderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "bodyTemplate", first: true, predicate: GridBodyTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "expandTemplate", first: true, predicate: GridExpandTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "footerTemplate", first: true, predicate: ["footer"], descendants: true }, { propertyName: "noDataTemplate", first: true, predicate: ["noDataRow"], descendants: true }, { propertyName: "addButtonTemplate", first: true, predicate: ["addButton"], descendants: true }, { propertyName: "addNewRowTemplate", first: true, predicate: ["addNewRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"fusion-datagrid\" class=\"fu-data-grid-wrapper\">\r\n @if (filter) {\r\n <div class=\"fu-data-grid-filter\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"filterText\"\r\n (input)=\"filterData(true)\"\r\n placeholder=\"Search...\"\r\n />\r\n @if (!!filterText) {\r\n <div (click)=\"resetFilter()\">\r\n <fu-icon size=\"20px\" iconName=\"cancel\" />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"fu-data-grid-container\">\r\n <div class=\"fu-data-grid-header\">\r\n <div class=\"fu-head-row\" gridColumns [columnSizes]=\"columnSizes\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerTemplate || defaultHeaderTemplate;\r\n context: { $implicit: dataSource, keys: dataSource[0] | keyMapping }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"fu-data-grid-body\">\r\n <div *ngIf=\"dataLoading\" class=\"fu-data-grid-spinner-overlay\">\r\n <div class=\"fu-spinner\"></div>\r\n </div>\r\n\r\n @for (row of paginatedData; track $index) {\r\n <div\r\n class=\"fu-body-row\"\r\n [ngClass]=\"{ hoverable, striped }\"\r\n [style.cursor]=\"\r\n expandable || rowSelect.observed ? 'pointer' : 'default'\r\n \"\r\n (click)=\"rowClick(row, $index)\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n bodyTemplate || defaultBodyTemplate;\r\n context: { $implicit: row, index: $index, keys: row | keyMapping }\r\n \"\r\n />\r\n\r\n @if (\r\n (expandable && expandedRowIndex === $index) ||\r\n expandIndex() === $index\r\n ) {\r\n <div class=\"fu-expanded-row\" (click)=\"$event.stopPropagation()\">\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n expandTemplate;\r\n context: { $implicit: row, index: $index }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"footerTemplate; context: { $implicit: paginatedData }\"\r\n />\r\n\r\n @if (paginatedData.length <= 0 && !dataLoading) {\r\n <ng-container *ngTemplateOutlet=\"noDataTemplate\" />\r\n }\r\n\r\n @if (renderNewAddRow) {\r\n <ng-container *ngTemplateOutlet=\"addNewRowTemplate\" />\r\n }\r\n\r\n @if (paginator) {\r\n <ng-container\r\n *ngTemplateOutlet=\"defaultPaginator; context: { $implicit: sortData }\"\r\n />\r\n }\r\n</div>\r\n\r\n<ng-template #defaultHeaderTemplate let-data>\r\n @for (header of data[0] | keyvalue: originalOrder; track $index) {\r\n <fu-head-row-cell\r\n [cellDef]=\"$any(header.key)\"\r\n [sortKey]=\"$any(header.key)\"\r\n />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultBodyTemplate let-rows>\r\n @for (row of rows | keyvalue: originalOrder; track $index) {\r\n <fu-body-row-cell [cellValue]=\"$any(row.value)\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultPaginator let-data>\r\n <div class=\"fu-data-grid-paginator\">\r\n <div class=\"fu-grid-add-button\">\r\n <ng-container *ngTemplateOutlet=\"addButtonTemplate\" />\r\n </div>\r\n\r\n <div class=\"fu-paginator-page-select\">\r\n <span>Page size:</span>\r\n <select class=\"fu-page-size-select\" (change)=\"changePageSize($event)\">\r\n <option\r\n *ngFor=\"let size of pageSizeOptions\"\r\n [value]=\"size\"\r\n [selected]=\"size === pageSize\"\r\n >\r\n {{ size }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"fu-paginator-controls\">\r\n <div>\r\n {{ getPageStart() }} - {{ getPageEnd() }} of {{ totalItemCount() }}\r\n </div>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"doubleArrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage - 1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"arrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage + 1)\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"arrowRight\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(totalPages())\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"doubleArrowRight\" />\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["html{--fu-grid-fg-color: #232534;--fu-grid-bg-color: #1e1f2b;--fu-grid-hover-color: #12121240;--fu-grid-striped-color: #22232e;--fu-grid-border-color: #4b444d;--fu-grid-text-color: #ffffff;--fu-grid-cell-color: #bab9b9;--fu-filter-input-color: #ccc;--fu-grid-cell-edit-input: #fff;--fu-grid-shape: 4px}.fu-data-grid-wrapper{border-radius:var(--fu-grid-shape);box-shadow:0 2px 4px #00000080;background-color:var(--fu-grid-bg-color);color:var(--fu-grid-text-color);font-family:Roboto,sans-serif;font-size:14px}.fu-data-grid-container{width:100%}.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:flex;justify-content:space-between;flex-wrap:wrap}.fu-data-grid-container .fu-data-grid-header .fu-head-row>*{flex:1 1 auto}}.fu-data-grid-container .fu-data-grid-body{position:relative}.fu-data-grid-container .fu-data-grid-body .fu-body-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color);align-items:center}.fu-data-grid-container .fu-data-grid-body .fu-body-row.striped:nth-child(2n){background-color:var(--fu-grid-striped-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row.hoverable:hover{background-color:var(--fu-grid-hover-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:repeat(2,1fr)}.fu-data-grid-container .fu-data-grid-body .fu-body-row :nth-child(odd):last-child{grid-column:span 2}.fu-data-grid-container .fu-data-grid-body .fu-body-row [data-actions]{grid-column:1/-1;margin:8px 0}}@media (max-width: 600px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:1fr;border-bottom:1px solid var(--fu-grid-border-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row>:nth-child(odd):last-child{grid-column:span 1}}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row{grid-column:1/-1;border-top:1px solid rgba(128,128,128,.1);padding:12px 16px}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row>div{cursor:default}.fu-data-grid-paginator{display:flex;justify-content:flex-end;padding:16px;position:relative}.fu-data-grid-paginator .fu-page-size-select{background-color:var(--fu-grid-fg-color);color:var(--fu-grid-cell-edit-input);padding:4px;border:1px solid var(--fu-grid-border-color)}@media (max-width: 600px){.fu-data-grid-paginator{gap:12px;flex-direction:column;padding:12px 16px}}.fu-data-grid-paginator .fu-paginator-page-select{display:flex;justify-content:flex-end;align-items:center;margin-right:12px;font-size:14px}@media (max-width: 600px){.fu-data-grid-paginator .fu-paginator-page-select{margin-right:0}}.fu-data-grid-paginator .fu-paginator-page-select span{margin-right:8px}.fu-data-grid-paginator .fu-paginator-controls{display:flex;justify-content:flex-end;align-items:center;gap:8px}.fu-grid-add-button{position:absolute;left:10px;top:10px}.fu-data-grid-filter{position:relative}.fu-data-grid-filter input{box-sizing:border-box;background-color:var(--fu-grid-fg-color);color:var(--fu-filter-input-color);width:calc(100% - 32px);padding:10px 42px 10px 8px;margin:16px;outline:none;border:none}.fu-data-grid-filter div{position:absolute;display:flex;justify-content:center;align-items:center;width:24px;height:24px;background-color:var(--fu-grid-fg-color);top:22px;right:24px;cursor:pointer;transition:.1s ease-in-out}.fu-data-grid-filter div:hover{background-color:var(--fu-grid-hover-color)}.fu-data-grid-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#78787880;display:flex;justify-content:center;align-items:center;z-index:1000}.fu-data-grid-spinner-overlay .fu-spinner{border:10px solid var(--fu-grid-bg-color);border-top:10px solid #3498db;border-radius:50%;width:30px;height:30px;animation:spin 2s linear infinite;margin:5px auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.IconComponent, selector: "fu-icon", inputs: ["iconName", "size", "strokeWidth", "color"] }, { kind: "directive", type: i6.TextButtonDirective, selector: "[fu-btn-text]", inputs: ["variant", "iconButton", "rounded"] }, { kind: "directive", type: i7.GridColumnsDirective, selector: "[gridColumns]", inputs: ["columnSizes"] }, { kind: "component", type: i8.BodyRowCellComponent, selector: "fu-body-row-cell", inputs: ["cellValue", "editKey", "editCellValue"], outputs: ["editCellValueChange"] }, { kind: "component", type: i9.HeadRowCellComponent, selector: "fu-head-row-cell", inputs: ["cellDef", "sortKey"] }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: i10.KeyMappingPipe, name: "keyMapping" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
269
281
|
}
|
|
270
282
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: DataGridComponent, decorators: [{
|
|
271
283
|
type: Component,
|
|
272
|
-
args: [{ selector: 'fu-data-grid', providers: [DataSortingService], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div id=\"fusion-datagrid\" class=\"fu-data-grid-wrapper\">\r\n @if (filter) {\r\n <
|
|
284
|
+
args: [{ selector: 'fu-data-grid', providers: [DataSortingService], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div id=\"fusion-datagrid\" class=\"fu-data-grid-wrapper\">\r\n @if (filter) {\r\n <div class=\"fu-data-grid-filter\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"filterText\"\r\n (input)=\"filterData(true)\"\r\n placeholder=\"Search...\"\r\n />\r\n @if (!!filterText) {\r\n <div (click)=\"resetFilter()\">\r\n <fu-icon size=\"20px\" iconName=\"cancel\" />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"fu-data-grid-container\">\r\n <div class=\"fu-data-grid-header\">\r\n <div class=\"fu-head-row\" gridColumns [columnSizes]=\"columnSizes\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerTemplate || defaultHeaderTemplate;\r\n context: { $implicit: dataSource, keys: dataSource[0] | keyMapping }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"fu-data-grid-body\">\r\n <div *ngIf=\"dataLoading\" class=\"fu-data-grid-spinner-overlay\">\r\n <div class=\"fu-spinner\"></div>\r\n </div>\r\n\r\n @for (row of paginatedData; track $index) {\r\n <div\r\n class=\"fu-body-row\"\r\n [ngClass]=\"{ hoverable, striped }\"\r\n [style.cursor]=\"\r\n expandable || rowSelect.observed ? 'pointer' : 'default'\r\n \"\r\n (click)=\"rowClick(row, $index)\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n bodyTemplate || defaultBodyTemplate;\r\n context: { $implicit: row, index: $index, keys: row | keyMapping }\r\n \"\r\n />\r\n\r\n @if (\r\n (expandable && expandedRowIndex === $index) ||\r\n expandIndex() === $index\r\n ) {\r\n <div class=\"fu-expanded-row\" (click)=\"$event.stopPropagation()\">\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n expandTemplate;\r\n context: { $implicit: row, index: $index }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"footerTemplate; context: { $implicit: paginatedData }\"\r\n />\r\n\r\n @if (paginatedData.length <= 0 && !dataLoading) {\r\n <ng-container *ngTemplateOutlet=\"noDataTemplate\" />\r\n }\r\n\r\n @if (renderNewAddRow) {\r\n <ng-container *ngTemplateOutlet=\"addNewRowTemplate\" />\r\n }\r\n\r\n @if (paginator) {\r\n <ng-container\r\n *ngTemplateOutlet=\"defaultPaginator; context: { $implicit: sortData }\"\r\n />\r\n }\r\n</div>\r\n\r\n<ng-template #defaultHeaderTemplate let-data>\r\n @for (header of data[0] | keyvalue: originalOrder; track $index) {\r\n <fu-head-row-cell\r\n [cellDef]=\"$any(header.key)\"\r\n [sortKey]=\"$any(header.key)\"\r\n />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultBodyTemplate let-rows>\r\n @for (row of rows | keyvalue: originalOrder; track $index) {\r\n <fu-body-row-cell [cellValue]=\"$any(row.value)\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultPaginator let-data>\r\n <div class=\"fu-data-grid-paginator\">\r\n <div class=\"fu-grid-add-button\">\r\n <ng-container *ngTemplateOutlet=\"addButtonTemplate\" />\r\n </div>\r\n\r\n <div class=\"fu-paginator-page-select\">\r\n <span>Page size:</span>\r\n <select class=\"fu-page-size-select\" (change)=\"changePageSize($event)\">\r\n <option\r\n *ngFor=\"let size of pageSizeOptions\"\r\n [value]=\"size\"\r\n [selected]=\"size === pageSize\"\r\n >\r\n {{ size }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"fu-paginator-controls\">\r\n <div>\r\n {{ getPageStart() }} - {{ getPageEnd() }} of {{ totalItemCount() }}\r\n </div>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"doubleArrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage - 1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"arrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage + 1)\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"arrowRight\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(totalPages())\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"doubleArrowRight\" />\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["html{--fu-grid-fg-color: #232534;--fu-grid-bg-color: #1e1f2b;--fu-grid-hover-color: #12121240;--fu-grid-striped-color: #22232e;--fu-grid-border-color: #4b444d;--fu-grid-text-color: #ffffff;--fu-grid-cell-color: #bab9b9;--fu-filter-input-color: #ccc;--fu-grid-cell-edit-input: #fff;--fu-grid-shape: 4px}.fu-data-grid-wrapper{border-radius:var(--fu-grid-shape);box-shadow:0 2px 4px #00000080;background-color:var(--fu-grid-bg-color);color:var(--fu-grid-text-color);font-family:Roboto,sans-serif;font-size:14px}.fu-data-grid-container{width:100%}.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:flex;justify-content:space-between;flex-wrap:wrap}.fu-data-grid-container .fu-data-grid-header .fu-head-row>*{flex:1 1 auto}}.fu-data-grid-container .fu-data-grid-body{position:relative}.fu-data-grid-container .fu-data-grid-body .fu-body-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color);align-items:center}.fu-data-grid-container .fu-data-grid-body .fu-body-row.striped:nth-child(2n){background-color:var(--fu-grid-striped-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row.hoverable:hover{background-color:var(--fu-grid-hover-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:repeat(2,1fr)}.fu-data-grid-container .fu-data-grid-body .fu-body-row :nth-child(odd):last-child{grid-column:span 2}.fu-data-grid-container .fu-data-grid-body .fu-body-row [data-actions]{grid-column:1/-1;margin:8px 0}}@media (max-width: 600px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:1fr;border-bottom:1px solid var(--fu-grid-border-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row>:nth-child(odd):last-child{grid-column:span 1}}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row{grid-column:1/-1;border-top:1px solid rgba(128,128,128,.1);padding:12px 16px}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row>div{cursor:default}.fu-data-grid-paginator{display:flex;justify-content:flex-end;padding:16px;position:relative}.fu-data-grid-paginator .fu-page-size-select{background-color:var(--fu-grid-fg-color);color:var(--fu-grid-cell-edit-input);padding:4px;border:1px solid var(--fu-grid-border-color)}@media (max-width: 600px){.fu-data-grid-paginator{gap:12px;flex-direction:column;padding:12px 16px}}.fu-data-grid-paginator .fu-paginator-page-select{display:flex;justify-content:flex-end;align-items:center;margin-right:12px;font-size:14px}@media (max-width: 600px){.fu-data-grid-paginator .fu-paginator-page-select{margin-right:0}}.fu-data-grid-paginator .fu-paginator-page-select span{margin-right:8px}.fu-data-grid-paginator .fu-paginator-controls{display:flex;justify-content:flex-end;align-items:center;gap:8px}.fu-grid-add-button{position:absolute;left:10px;top:10px}.fu-data-grid-filter{position:relative}.fu-data-grid-filter input{box-sizing:border-box;background-color:var(--fu-grid-fg-color);color:var(--fu-filter-input-color);width:calc(100% - 32px);padding:10px 42px 10px 8px;margin:16px;outline:none;border:none}.fu-data-grid-filter div{position:absolute;display:flex;justify-content:center;align-items:center;width:24px;height:24px;background-color:var(--fu-grid-fg-color);top:22px;right:24px;cursor:pointer;transition:.1s ease-in-out}.fu-data-grid-filter div:hover{background-color:var(--fu-grid-hover-color)}.fu-data-grid-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#78787880;display:flex;justify-content:center;align-items:center;z-index:1000}.fu-data-grid-spinner-overlay .fu-spinner{border:10px solid var(--fu-grid-bg-color);border-top:10px solid #3498db;border-radius:50%;width:30px;height:30px;animation:spin 2s linear infinite;margin:5px auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
|
|
273
285
|
}], ctorParameters: () => [{ type: i1.DataSortingService }, { type: i2.PaginationService }], propDecorators: { dataSource: [{
|
|
274
286
|
type: Input,
|
|
275
287
|
args: [{ required: true }]
|
|
@@ -329,4 +341,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImpor
|
|
|
329
341
|
}], onSort: [{
|
|
330
342
|
type: Output
|
|
331
343
|
}] } });
|
|
332
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWZ1c2lvbi11aS9zcmMvbGliL2RhdGEtZ3JpZC9kYXRhLWdyaWQvZGF0YS1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWZ1c2lvbi11aS9zcmMvbGliL2RhdGEtZ3JpZC9kYXRhLWdyaWQvZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxrQkFBa0IsR0FFbkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMzRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUczRixPQUFPLEVBQUUsTUFBTSxFQUFnQixNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7O0FBVTVDLE1BQU0sT0FBTyxpQkFBaUI7SUFzRzVCLFlBQ1UsV0FBK0IsRUFDL0IsaUJBQW9DO1FBRHBDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBckc5Qzs7O1dBR0c7UUFDK0IsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQUN2RDs7V0FFRztRQUMrQixvQkFBZSxHQUFXLE1BQU0sQ0FBQztRQU1uRTs7V0FFRztRQUNhLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDckM7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QUlVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBS1UsTUFBTTtzQkFBckIsS0FBSztnQkFJVSxTQUFTO3NCQUF4QixLQUFLO2dCQUlVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBSVUsT0FBTztzQkFBdEIsS0FBSztnQkFJVSxlQUFlO3NCQUE5QixLQUFLO2dCQUlVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBRTBCLGVBQWU7c0JBQTlDLFlBQVk7dUJBQUMsU0FBUztnQkFFaEIsY0FBYztzQkFEcEIsWUFBWTt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBR3pELFlBQVk7c0JBRGxCLFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUd2RCxjQUFjO3NCQURwQixZQUFZO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFFakMsY0FBYztzQkFBNUMsWUFBWTt1QkFBQyxRQUFRO2dCQUNZLGNBQWM7c0JBQS9DLFlBQVk7dUJBQUMsV0FBVztnQkFDUyxpQkFBaUI7c0JBQWxELFlBQVk7dUJBQUMsV0FBVztnQkFDUyxpQkFBaUI7c0JBQWxELFlBQVk7dUJBQUMsV0FBVztnQkFLUixTQUFTO3NCQUF6QixNQUFNO2dCQUNVLE1BQU07c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBlZmZlY3QsXHJcbiAgbW9kZWwsXHJcbiAgc2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIERhdGFTb3J0aW5nU2VydmljZSxcclxuICBPblNvcnRFdmVudCxcclxufSBmcm9tICcuLi9zZXJ2aWNlcy9kYXRhLXNvcnRpbmcuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyaWRIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZ3JpZC1oZWFkZXItdGVtcGxhdGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgR3JpZEJvZHlUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZ3JpZC1ib2R5LXRlbXBsYXRlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEdyaWRFeHBhbmRUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZ3JpZC1leHBhbmQtdGVtcGxhdGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wYWdpbmF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbHVtblNpemVzIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9ncmlkLWNvbHVtbnMuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgZmlsdGVyLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZnUtZGF0YS1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5zY3NzJyxcclxuICBwcm92aWRlcnM6IFtEYXRhU29ydGluZ1NlcnZpY2VdLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhR3JpZENvbXBvbmVudDxUIGV4dGVuZHMgb2JqZWN0PlxyXG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3lcclxue1xyXG4gIC8qKlxyXG4gICAqIFRhYmxlIGRhdGEgLSBhcnJheSBvZiBvYmplY3RzLlxyXG4gICAqIFt0b3RhbENvdW50XSByZXF1aXJlZCB3aXRoIHNlcnZlciBzaWRlIHBhZ2luYXRpb24uXHJcbiAgICovXHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgcHVibGljIGRhdGFTb3VyY2U6IFRbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIFN0cmluZyBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHN0b3JlIHBhZ2VTaXplIGFuZCBjdXJyZW50UGFnZSBpbiBsb2NhbCBzdG9yYWdlIGZvciBlYWNoIHRhYmxlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHB1YmxpYyBsb2NhbFN0b3JhZ2VLZXk6IHN0cmluZyA9ICdkYXRhJztcclxuICAvKipcclxuICAgKiBUb3RhbCBkYXRhIGNvdW50LlxyXG4gICAqIFJlcXVpcmVkIHdpdGggc2VydmVyIHNpZGUgcGFnaW5hdGlvbi5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgdG90YWxDb3VudDogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIEluaXRpYWwgcGFnZSBzaXplIGZvciBwYWdpbmF0b3IuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIHBhZ2VTaXplOiBudW1iZXIgPSA1O1xyXG4gIC8qKlxyXG4gICAqIFBhZ2Ugc2l6ZSBvcHRpb25zZm9yIHBhZ2luYXRvci5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMTVdO1xyXG4gIC8qKlxyXG4gICAqIEFuIGFycmF5IG9mIGNvbHVtbiBzaXplcywgd2hlcmUgZWFjaCBzaXplIGlzIGEgdmFsaWQgQ1NTIHVuaXQgc3RyaW5nLlxyXG4gICAqIFZhbGlkIHVuaXRzIGFyZTogYHB4YCwgYGZyYCwgYHJlbWAsIGAlYC5cclxuICAgKiBFeGFtcGxlOiBbJzIwMHB4JywgJzFmcicsICcxMCUnLCAnNXJlbSddXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGNvbHVtblNpemVzOiBDb2x1bW5TaXplcztcclxuICAvKipcclxuICAgKiBTaG93cyBzcGlubmVyIGFuZCBvdmVybGF5IHdoZW4gbmV3IGRhdGEgaXMgYmVpbmcgbG9hZGVkLlxyXG4gICAqIFVzYWJsZSBvbmx5IHdpdGggc2VydmVyIHBhZ2luYXRpb24gd2hlbiB0b3RhbENvdW50IGlzIHByb3ZpZGVkLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBkYXRhTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIE1ha2VzIHJvdyBleHBhbmRhYmxlIG9uIGNsaWNrLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBleHBhbmRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyBmaWx0ZXIgZm9yIGRhdGFTb3VyY2UuXHJcbiAgICogVXNhYmxlIG9ubHkgaWYgbm90IHNlcnZlciBzaWRlIHBhZ2luYXRpb24uXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIFNob3dzIHBhZ2luYXRvci5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcGFnaW5hdG9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogSGlnaGxpZ2h0cyByb3cgb24gaG92ZXIuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGhvdmVyYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogRGFya2VyIGJhY2tncm91bmQgZm9yIGVhY2ggb2RkIHJvdy5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc3RyaXBlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogU2V0cyBwYWdpbmF0b3IgdG8gZmlyc3QgcGFnZSBvbiBpbml0LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmaXJzdFBhZ2VPbkluaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBSZW5kZXJzIGVtcHR5IGNvbnRhaW5lciBhYm92ZSBwYWdpbmF0b3IuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIHJlbmRlck5ld0FkZFJvdzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAQ29udGVudENoaWxkKCdjYXB0aW9uJykgcHVibGljIGNhcHRpb25UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQENvbnRlbnRDaGlsZChHcmlkSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcclxuICBwdWJsaWMgaGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBDb250ZW50Q2hpbGQoR3JpZEJvZHlUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxyXG4gIHB1YmxpYyBib2R5VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBDb250ZW50Q2hpbGQoR3JpZEV4cGFuZFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXHJcbiAgcHVibGljIGV4cGFuZFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAQ29udGVudENoaWxkKCdmb290ZXInKSBwdWJsaWMgZm9vdGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBDb250ZW50Q2hpbGQoJ25vRGF0YVJvdycpIHB1YmxpYyBub0RhdGFUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQENvbnRlbnRDaGlsZCgnYWRkQnV0dG9uJykgcHVibGljIGFkZEJ1dHRvblRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAQ29udGVudENoaWxkKCdhZGROZXdSb3cnKSBwdWJsaWMgYWRkTmV3Um93VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIC8qKlxyXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgcm93IGlzIGNsaWNrZWQuXHJcbiAgICogRW1pdHMgc2VsZWN0ZWQgcm93IGRhdGEuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIHB1YmxpYyByb3dTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBvblNvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uU29ydEV2ZW50PigpO1xyXG5cclxuICBwdWJsaWMgc29ydGVkRGF0YTogVFtdID0gWy4uLnRoaXMuZGF0YVNvdXJjZV07XHJcbiAgcHVibGljIHNvcnREaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnID0gJ2FzYyc7XHJcbiAgcHVibGljIHNvcnRLZXk6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwdWJsaWMgZmlsdGVyZWREYXRhOiBUW10gPSBbXTtcclxuICBwdWJsaWMgZmlsdGVyVGV4dDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcclxuICBwdWJsaWMgcGFnaW5hdGVkRGF0YTogVFtdID0gW107XHJcblxyXG4gIHB1YmxpYyBleHBhbmRlZFJvd0luZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgc2VydmVyUGFnaW5hdGlvbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIHB1YmxpYyBleHBhbmRJbmRleCA9IG1vZGVsPG51bWJlciB8IG51bGw+KG51bGwpO1xyXG4gIHB1YmxpYyBpbml0TG9hZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzb3J0U2VydmljZTogRGF0YVNvcnRpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2VcclxuICApIHtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5zZXJ2ZXJQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICB0aGlzLnNvcnREYXRhKHRoaXMuc29ydFNlcnZpY2Uuc29ydEtleSgpKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNvcnRTZXJ2aWNlLnNvcnRLZXkoKSkge1xyXG4gICAgICAgIHRoaXMub25Tb3J0LmVtaXQoe1xyXG4gICAgICAgICAgc29ydEtleTogdGhpcy5zb3J0U2VydmljZS5zb3J0S2V5KCksXHJcbiAgICAgICAgICBzb3J0RGlyZWN0aW9uOiB0aGlzLnNvcnRTZXJ2aWNlLnNvcnREaXJlY3Rpb24oKSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmZpcnN0UGFnZSRcclxuICAgICAgLnBpcGUoZmlsdGVyKCgpID0+IHRoaXMuY3VycmVudFBhZ2UgIT09IDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tY3VycmVudFBhZ2VgLFxyXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZS50b1N0cmluZygpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5pbml0UGFnaW5hdGlvbih0aGlzLmN1cnJlbnRQYWdlLCB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2xvY2FsU3RvcmFnZUtleSddKSB7XHJcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UuZ2V0TG9jYWxTdG9yYWdlS2V5KHRoaXMubG9jYWxTdG9yYWdlS2V5KTtcclxuXHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSBKU09OLnBhcnNlKFxyXG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgIGBmdS1ncmlkLSR7dGhpcy5sb2NhbFN0b3JhZ2VLZXl9LXBhZ2VTaXplYFxyXG4gICAgICAgICkgfHwgdGhpcy5wYWdlU2l6ZU9wdGlvbnNbMF0udG9TdHJpbmcoKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZmlyc3RQYWdlT25Jbml0KSB7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5pbml0UGFnaW5hdGlvbigxLCB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gSlNPTi5wYXJzZShcclxuICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcclxuICAgICAgICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tY3VycmVudFBhZ2VgXHJcbiAgICAgICAgICApIHx8ICcxJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5pbml0UGFnaW5hdGlvbih0aGlzLmN1cnJlbnRQYWdlLCB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzWyd0b3RhbENvdW50J10pIHtcclxuICAgICAgdGhpcy5zZXJ2ZXJQYWdpbmF0aW9uLnNldCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlc1snZGF0YVNvdXJjZSddKSB7XHJcbiAgICAgIGlmICghdGhpcy5zZXJ2ZXJQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICB0aGlzLnNvcnREYXRhKHRoaXMuc29ydFNlcnZpY2Uuc29ydEtleSgpKTtcclxuXHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSBbLi4udGhpcy5kYXRhU291cmNlXTtcclxuICAgICAgICB0aGlzLnNvcnRlZERhdGEgPSBbLi4udGhpcy5maWx0ZXJlZERhdGFdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc29ydFNlcnZpY2UuZ2V0Q2VsbEtleXModGhpcy5kYXRhU291cmNlWzBdIHx8IHt9KTtcclxuICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0U2VydmljZS5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9yaWdpbmFsT3JkZXIgPSAoYTogYW55LCBiOiBhbnkpOiBudW1iZXIgPT4ge1xyXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YVNvdXJjZSk7XHJcbiAgICByZXR1cm4ga2V5cy5pbmRleE9mKGEua2V5KSAtIGtleXMuaW5kZXhPZihiLmtleSk7XHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHNvcnREYXRhKGtleTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNvcnRLZXkgPSBrZXk7XHJcbiAgICBjb25zdCBzb3J0RGlyZWN0aW9uID0gdGhpcy5zb3J0U2VydmljZS5zb3J0RGlyZWN0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5zb3J0ZWREYXRhLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChhW2tleV0gPCBiW2tleV0pIHtcclxuICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAtMSA6IDE7XHJcbiAgICAgIH0gZWxzZSBpZiAoYVtrZXldID4gYltrZXldKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5hZGRTb3J0Q2xhc3Moa2V5KTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaW5pdExvYWQpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICBgZnUtZ3JpZC0ke3RoaXMubG9jYWxTdG9yYWdlS2V5fS1jdXJyZW50UGFnZWAsXHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZS50b1N0cmluZygpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7XHJcbiAgICB0aGlzLmluaXRMb2FkID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuZmlsdGVyVGV4dCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5maWx0ZXJEYXRhKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkU29ydENsYXNzKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBzb3J0RGlyZWN0aW9uID0gdGhpcy5zb3J0U2VydmljZS5zb3J0RGlyZWN0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXNvcnRlZD1cIiR7a2V5fVwiXWApO1xyXG5cclxuICAgIGRvY3VtZW50XHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zb3J0ZWRdJylcclxuICAgICAgLmZvckVhY2godGggPT4gdGguY2xhc3NMaXN0LnJlbW92ZSgnc29ydC1hc2MnLCAnc29ydC1kZXNjJykpO1xyXG5cclxuICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/ICdzb3J0LWFzYycgOiAnc29ydC1kZXNjJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyRGF0YSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZpbHRlclRleHQudHJpbSgpID09PSAnJykge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IFsuLi50aGlzLnNvcnRlZERhdGFdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPSB0aGlzLnNvcnRlZERhdGEuZmlsdGVyKChpdGVtOiBhbnkpID0+XHJcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhpdGVtKS5zb21lKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgLmluY2x1ZGVzKHRoaXMuZmlsdGVyVGV4dC50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMuc29ydGVkRGF0YSA9IFsuLi50aGlzLmZpbHRlcmVkRGF0YV07XHJcblxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb24odHJ1ZSk7XHJcblxyXG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICBgZnUtZ3JpZC0ke3RoaXMubG9jYWxTdG9yYWdlS2V5fS1jdXJyZW50UGFnZWAsXHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UudG9TdHJpbmcoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VydmVyU2lkZVBhZ2luYXRpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2luYXRlZERhdGEgPSB0aGlzLmRhdGFTb3VyY2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb24oaXNGaWx0ZXJpbmc6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBhbmRlZFJvd0luZGV4ID0gbnVsbDtcclxuICAgIHRoaXMuZXhwYW5kSW5kZXguc2V0KG51bGwpO1xyXG5cclxuICAgIGlmICh0aGlzLnNlcnZlclBhZ2luYXRpb24oKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJTaWRlUGFnaW5hdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemU7XHJcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMucGFnZVNpemU7XHJcblxyXG4gICAgaWYgKGlzRmlsdGVyaW5nKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGVkRGF0YSA9IFsuLi50aGlzLmZpbHRlcmVkRGF0YV0uc2xpY2Uoc3RhcnQsIGVuZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBhZ2luYXRlZERhdGEgPSB0aGlzLnNvcnRlZERhdGEuc2xpY2Uoc3RhcnQsIGVuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ29Ub1BhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAocGFnZSA8IDEgfHwgcGFnZSA+IHRoaXMudG90YWxQYWdlcygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcclxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tY3VycmVudFBhZ2VgLFxyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnRvU3RyaW5nKClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5zZXRQYWdlKHBhZ2UsIHRoaXMucGFnZVNpemUpO1xyXG4gICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG90YWxQYWdlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsSXRlbUNvdW50KCkgLyB0aGlzLnBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRQYWdlU3RhcnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UGFnZUVuZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplLCB0aGlzLnRvdGFsSXRlbUNvdW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoYW5nZVBhZ2VTaXplKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBOdW1iZXIoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cclxuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2Uuc2V0UGFnZVNpemUodGhpcy5wYWdlU2l6ZSk7XHJcbiAgICAvLyB0aGlzLnVwZGF0ZVBhZ2luYXRpb24oKTtcclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXJUZXh0ICE9PSAnJykge1xyXG4gICAgICB0aGlzLmZpbHRlckRhdGEoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tY3VycmVudFBhZ2VgLFxyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnRvU3RyaW5nKClcclxuICAgICk7XHJcblxyXG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICBgZnUtZ3JpZC0ke3RoaXMubG9jYWxTdG9yYWdlS2V5fS1wYWdlU2l6ZWAsXHJcbiAgICAgIHRoaXMucGFnZVNpemUudG9TdHJpbmcoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b3RhbEl0ZW1Db3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudG90YWxDb3VudCB8fCB0aGlzLmZpbHRlcmVkRGF0YS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm93Q2xpY2socm93OiBULCBpbmRleDogbnVtYmVyID0gMCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZXhwYW5kYWJsZSkge1xyXG4gICAgICBpZiAodGhpcy5leHBhbmRlZFJvd0luZGV4ID09PSBpbmRleCkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dJbmRleCA9IG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZFJvd0luZGV4ID0gaW5kZXg7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm93U2VsZWN0LmVtaXQocm93KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwiZnVzaW9uLWRhdGFncmlkXCIgY2xhc3M9XCJmdS1kYXRhLWdyaWQtd3JhcHBlclwiPlxyXG4gIEBpZiAoZmlsdGVyKSB7XHJcbiAgICA8aW5wdXRcclxuICAgICAgY2xhc3M9XCJmdS1kYXRhLWdyaWQtZmlsdGVyXCJcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclRleHRcIlxyXG4gICAgICAoaW5wdXQpPVwiZmlsdGVyRGF0YSgpXCJcclxuICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2gga2V5d29yZC4uLlwiXHJcbiAgICAvPlxyXG4gIH1cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZ1LWRhdGEtZ3JpZC1jb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmdS1kYXRhLWdyaWQtaGVhZGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmdS1oZWFkLXJvd1wiIGdyaWRDb2x1bW5zIFtjb2x1bW5TaXplc109XCJjb2x1bW5TaXplc1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXHJcbiAgICAgICAgICAgIGhlYWRlclRlbXBsYXRlIHx8IGRlZmF1bHRIZWFkZXJUZW1wbGF0ZTtcclxuICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IGRhdGFTb3VyY2UsIGtleXM6IGRhdGFTb3VyY2VbMF0gfCBrZXlNYXBwaW5nIH1cclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJmdS1kYXRhLWdyaWQtYm9keVwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiZGF0YUxvYWRpbmdcIiBjbGFzcz1cImZ1LWRhdGEtZ3JpZC1zcGlubmVyLW92ZXJsYXlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZnUtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIEBmb3IgKHJvdyBvZiBwYWdpbmF0ZWREYXRhOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZ1LWJvZHktcm93XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgaG92ZXJhYmxlLCBzdHJpcGVkIH1cIlxyXG4gICAgICAgICAgW3N0eWxlLmN1cnNvcl09XCJcclxuICAgICAgICAgICAgZXhwYW5kYWJsZSB8fCByb3dTZWxlY3Qub2JzZXJ2ZWQgPyAncG9pbnRlcicgOiAnZGVmYXVsdCdcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwicm93Q2xpY2socm93LCAkaW5kZXgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXHJcbiAgICAgICAgICAgICAgYm9keVRlbXBsYXRlIHx8IGRlZmF1bHRCb2R5VGVtcGxhdGU7XHJcbiAgICAgICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IHJvdywgaW5kZXg6ICRpbmRleCwga2V5czogcm93IHwga2V5TWFwcGluZyB9XHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgIEBpZiAoXHJcbiAgICAgICAgICAgIChleHBhbmRhYmxlICYmIGV4cGFuZGVkUm93SW5kZXggPT09ICRpbmRleCkgfHxcclxuICAgICAgICAgICAgZXhwYW5kSW5kZXgoKSA9PT0gJGluZGV4XHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ1LWV4cGFuZGVkLXJvd1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZFRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3csIGluZGV4OiAkaW5kZXggfVxyXG4gICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bmctY29udGFpbmVyXHJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlclRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcGFnaW5hdGVkRGF0YSB9XCJcclxuICAvPlxyXG5cclxuICBAaWYgKHBhZ2luYXRlZERhdGEubGVuZ3RoIDw9IDAgJiYgIWRhdGFMb2FkaW5nKSB7XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9EYXRhVGVtcGxhdGVcIiAvPlxyXG4gIH1cclxuXHJcbiAgQGlmIChyZW5kZXJOZXdBZGRSb3cpIHtcclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGROZXdSb3dUZW1wbGF0ZVwiIC8+XHJcbiAgfVxyXG5cclxuICBAaWYgKHBhZ2luYXRvcikge1xyXG4gICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImRlZmF1bHRQYWdpbmF0b3I7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBzb3J0RGF0YSB9XCJcclxuICAgIC8+XHJcbiAgfVxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlYWRlclRlbXBsYXRlIGxldC1kYXRhPlxyXG4gIEBmb3IgKGhlYWRlciBvZiBkYXRhWzBdIHwga2V5dmFsdWU6IG9yaWdpbmFsT3JkZXI7IHRyYWNrICRpbmRleCkge1xyXG4gICAgPGZ1LWhlYWQtcm93LWNlbGxcclxuICAgICAgW2NlbGxEZWZdPVwiJGFueShoZWFkZXIua2V5KVwiXHJcbiAgICAgIFtzb3J0S2V5XT1cIiRhbnkoaGVhZGVyLmtleSlcIlxyXG4gICAgLz5cclxuICB9XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRCb2R5VGVtcGxhdGUgbGV0LXJvd3M+XHJcbiAgQGZvciAocm93IG9mIHJvd3MgfCBrZXl2YWx1ZTogb3JpZ2luYWxPcmRlcjsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICA8ZnUtYm9keS1yb3ctY2VsbCBbY2VsbFZhbHVlXT1cIiRhbnkocm93LnZhbHVlKVwiIC8+XHJcbiAgfVxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0UGFnaW5hdG9yIGxldC1kYXRhPlxyXG4gIDxkaXYgY2xhc3M9XCJmdS1kYXRhLWdyaWQtcGFnaW5hdG9yXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZnUtZ3JpZC1hZGQtYnV0dG9uXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJhZGRCdXR0b25UZW1wbGF0ZVwiIC8+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZnUtcGFnaW5hdG9yLXBhZ2Utc2VsZWN0XCI+XHJcbiAgICAgIDxzcGFuPlBhZ2Ugc2l6ZTo8L3NwYW4+XHJcbiAgICAgIDxzZWxlY3QgY2xhc3M9XCJmdS1wYWdlLXNpemUtc2VsZWN0XCIgKGNoYW5nZSk9XCJjaGFuZ2VQYWdlU2l6ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPG9wdGlvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHNpemUgb2YgcGFnZVNpemVPcHRpb25zXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJzaXplXCJcclxuICAgICAgICAgIFtzZWxlY3RlZF09XCJzaXplID09PSBwYWdlU2l6ZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgc2l6ZSB9fVxyXG4gICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICA8L3NlbGVjdD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZ1LXBhZ2luYXRvci1jb250cm9sc1wiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIHt7IGdldFBhZ2VTdGFydCgpIH19IC0ge3sgZ2V0UGFnZUVuZCgpIH19IG9mIHt7IHRvdGFsSXRlbUNvdW50KCkgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBmdS1idG4tdGV4dFxyXG4gICAgICAgIGljb25CdXR0b25cclxuICAgICAgICAoY2xpY2spPVwiZ29Ub1BhZ2UoMSlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZnUtaWNvbiBpY29uTmFtZT1cImRvdWJsZUFycm93TGVmdFwiIC8+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgZnUtYnRuLXRleHRcclxuICAgICAgICBpY29uQnV0dG9uXHJcbiAgICAgICAgKGNsaWNrKT1cImdvVG9QYWdlKGN1cnJlbnRQYWdlIC0gMSlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZnUtaWNvbiBpY29uTmFtZT1cImFycm93TGVmdFwiIC8+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgZnUtYnRuLXRleHRcclxuICAgICAgICBpY29uQnV0dG9uXHJcbiAgICAgICAgKGNsaWNrKT1cImdvVG9QYWdlKGN1cnJlbnRQYWdlICsgMSlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA+PSB0b3RhbFBhZ2VzKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGZ1LWljb24gaWNvbk5hbWU9XCJhcnJvd1JpZ2h0XCIgLz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBmdS1idG4tdGV4dFxyXG4gICAgICAgIGljb25CdXR0b25cclxuICAgICAgICAoY2xpY2spPVwiZ29Ub1BhZ2UodG90YWxQYWdlcygpKVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRQYWdlID49IHRvdGFsUGFnZXMoKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZnUtaWNvbiBpY29uTmFtZT1cImRvdWJsZUFycm93UmlnaHRcIiAvPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWZ1c2lvbi11aS9zcmMvbGliL2RhdGEtZ3JpZC9kYXRhLWdyaWQvZGF0YS1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWZ1c2lvbi11aS9zcmMvbGliL2RhdGEtZ3JpZC9kYXRhLWdyaWQvZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxrQkFBa0IsR0FFbkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMzRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUczRixPQUFPLEVBQUUsTUFBTSxFQUFnQixNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7O0FBVTVDLE1BQU0sT0FBTyxpQkFBaUI7SUFzRzVCLFlBQ1UsV0FBK0IsRUFDL0IsaUJBQW9DO1FBRHBDLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMvQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBckc5Qzs7O1dBR0c7UUFDK0IsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQUN2RDs7V0FFRztRQUMrQixvQkFBZSxHQUFXLE1BQU0sQ0FBQztRQU1uRTs7V0FFRztRQUNhLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDckM7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akMsY0FBYztzQkFBNUMsWUFBWTt1QkFBQyxRQUFRO2dCQUNZLGNBQWM7c0JBQS9DLFlBQVk7dUJBQUMsV0FBVztnQkFDUyxpQkFBaUI7c0JBQWxELFlBQVk7dUJBQUMsV0FBVztnQkFDUyxpQkFBaUI7c0JBQWxELFlBQVk7dUJBQUMsV0FBVztnQkFLUixTQUFTO3NCQUF6QixNQUFNO2dCQUNVLE1BQU07c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPdXRwdXQsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBlZmZlY3QsXHJcbiAgbW9kZWwsXHJcbiAgc2lnbmFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIERhdGFTb3J0aW5nU2VydmljZSxcclxuICBPblNvcnRFdmVudCxcclxufSBmcm9tICcuLi9zZXJ2aWNlcy9kYXRhLXNvcnRpbmcuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyaWRIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZ3JpZC1oZWFkZXItdGVtcGxhdGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgR3JpZEJvZHlUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZ3JpZC1ib2R5LXRlbXBsYXRlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEdyaWRFeHBhbmRUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvZ3JpZC1leHBhbmQtdGVtcGxhdGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wYWdpbmF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbHVtblNpemVzIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9ncmlkLWNvbHVtbnMuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgZmlsdGVyLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZnUtZGF0YS1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5zY3NzJyxcclxuICBwcm92aWRlcnM6IFtEYXRhU29ydGluZ1NlcnZpY2VdLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhR3JpZENvbXBvbmVudDxUIGV4dGVuZHMgb2JqZWN0PlxyXG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3lcclxue1xyXG4gIC8qKlxyXG4gICAqIFRhYmxlIGRhdGEgLSBhcnJheSBvZiBvYmplY3RzLlxyXG4gICAqIFt0b3RhbENvdW50XSByZXF1aXJlZCB3aXRoIHNlcnZlciBzaWRlIHBhZ2luYXRpb24uXHJcbiAgICovXHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgcHVibGljIGRhdGFTb3VyY2U6IFRbXSA9IFtdO1xyXG4gIC8qKlxyXG4gICAqIFN0cmluZyBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHN0b3JlIHBhZ2VTaXplIGFuZCBjdXJyZW50UGFnZSBpbiBsb2NhbCBzdG9yYWdlIGZvciBlYWNoIHRhYmxlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHB1YmxpYyBsb2NhbFN0b3JhZ2VLZXk6IHN0cmluZyA9ICdkYXRhJztcclxuICAvKipcclxuICAgKiBUb3RhbCBkYXRhIGNvdW50LlxyXG4gICAqIFJlcXVpcmVkIHdpdGggc2VydmVyIHNpZGUgcGFnaW5hdGlvbi5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgdG90YWxDb3VudDogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIEluaXRpYWwgcGFnZSBzaXplIGZvciBwYWdpbmF0b3IuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIHBhZ2VTaXplOiBudW1iZXIgPSA1O1xyXG4gIC8qKlxyXG4gICAqIFBhZ2Ugc2l6ZSBvcHRpb25zZm9yIHBhZ2luYXRvci5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcGFnZVNpemVPcHRpb25zOiBudW1iZXJbXSA9IFs1LCAxMCwgMTVdO1xyXG4gIC8qKlxyXG4gICAqIEFuIGFycmF5IG9mIGNvbHVtbiBzaXplcywgd2hlcmUgZWFjaCBzaXplIGlzIGEgdmFsaWQgQ1NTIHVuaXQgc3RyaW5nLlxyXG4gICAqIFZhbGlkIHVuaXRzIGFyZTogYHB4YCwgYGZyYCwgYHJlbWAsIGAlYC5cclxuICAgKiBFeGFtcGxlOiBbJzIwMHB4JywgJzFmcicsICcxMCUnLCAnNXJlbSddXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGNvbHVtblNpemVzOiBDb2x1bW5TaXplcztcclxuICAvKipcclxuICAgKiBTaG93cyBzcGlubmVyIGFuZCBvdmVybGF5IHdoZW4gbmV3IGRhdGEgaXMgYmVpbmcgbG9hZGVkLlxyXG4gICAqIFVzYWJsZSBvbmx5IHdpdGggc2VydmVyIHBhZ2luYXRpb24gd2hlbiB0b3RhbENvdW50IGlzIHByb3ZpZGVkLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBkYXRhTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIE1ha2VzIHJvdyBleHBhbmRhYmxlIG9uIGNsaWNrLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBleHBhbmRhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyBmaWx0ZXIgZm9yIGRhdGFTb3VyY2UuXHJcbiAgICogVXNhYmxlIG9ubHkgaWYgbm90IHNlcnZlciBzaWRlIHBhZ2luYXRpb24uXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKlxyXG4gICAqIFNob3dzIHBhZ2luYXRvci5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcGFnaW5hdG9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogSGlnaGxpZ2h0cyByb3cgb24gaG92ZXIuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGhvdmVyYWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogRGFya2VyIGJhY2tncm91bmQgZm9yIGVhY2ggb2RkIHJvdy5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc3RyaXBlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgLyoqXHJcbiAgICogU2V0cyBwYWdpbmF0b3IgdG8gZmlyc3QgcGFnZSBvbiBpbml0LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmaXJzdFBhZ2VPbkluaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBSZW5kZXJzIGVtcHR5IGNvbnRhaW5lciBhYm92ZSBwYWdpbmF0b3IuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIHJlbmRlck5ld0FkZFJvdzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAQ29udGVudENoaWxkKCdjYXB0aW9uJykgcHVibGljIGNhcHRpb25UZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQENvbnRlbnRDaGlsZChHcmlkSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcclxuICBwdWJsaWMgaGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBDb250ZW50Q2hpbGQoR3JpZEJvZHlUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxyXG4gIHB1YmxpYyBib2R5VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBDb250ZW50Q2hpbGQoR3JpZEV4cGFuZFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXHJcbiAgcHVibGljIGV4cGFuZFRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAQ29udGVudENoaWxkKCdmb290ZXInKSBwdWJsaWMgZm9vdGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBDb250ZW50Q2hpbGQoJ25vRGF0YVJvdycpIHB1YmxpYyBub0RhdGFUZW1wbGF0ZSE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQENvbnRlbnRDaGlsZCgnYWRkQnV0dG9uJykgcHVibGljIGFkZEJ1dHRvblRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAQ29udGVudENoaWxkKCdhZGROZXdSb3cnKSBwdWJsaWMgYWRkTmV3Um93VGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIC8qKlxyXG4gICAqIENhbGxiYWNrIHRvIGludm9rZSB3aGVuIGEgcm93IGlzIGNsaWNrZWQuXHJcbiAgICogRW1pdHMgc2VsZWN0ZWQgcm93IGRhdGEuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIHB1YmxpYyByb3dTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBvblNvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uU29ydEV2ZW50PigpO1xyXG5cclxuICBwdWJsaWMgc29ydGVkRGF0YTogVFtdID0gWy4uLnRoaXMuZGF0YVNvdXJjZV07XHJcbiAgcHVibGljIHNvcnREaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnID0gJ2FzYyc7XHJcbiAgcHVibGljIHNvcnRLZXk6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwdWJsaWMgZmlsdGVyZWREYXRhOiBUW10gPSBbXTtcclxuICBwdWJsaWMgZmlsdGVyVGV4dDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50UGFnZTogbnVtYmVyID0gMTtcclxuICBwdWJsaWMgcGFnaW5hdGVkRGF0YTogVFtdID0gW107XHJcblxyXG4gIHB1YmxpYyBleHBhbmRlZFJvd0luZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgc2VydmVyUGFnaW5hdGlvbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIHB1YmxpYyBleHBhbmRJbmRleCA9IG1vZGVsPG51bWJlciB8IG51bGw+KG51bGwpO1xyXG4gIHB1YmxpYyBpbml0TG9hZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzb3J0U2VydmljZTogRGF0YVNvcnRpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwYWdpbmF0aW9uU2VydmljZTogUGFnaW5hdGlvblNlcnZpY2VcclxuICApIHtcclxuICAgIGVmZmVjdCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5zZXJ2ZXJQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICB0aGlzLnNvcnREYXRhKHRoaXMuc29ydFNlcnZpY2Uuc29ydEtleSgpKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNvcnRTZXJ2aWNlLnNvcnRLZXkoKSkge1xyXG4gICAgICAgIHRoaXMub25Tb3J0LmVtaXQoe1xyXG4gICAgICAgICAgc29ydEtleTogdGhpcy5zb3J0U2VydmljZS5zb3J0S2V5KCksXHJcbiAgICAgICAgICBzb3J0RGlyZWN0aW9uOiB0aGlzLnNvcnRTZXJ2aWNlLnNvcnREaXJlY3Rpb24oKSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmZpcnN0UGFnZSRcclxuICAgICAgLnBpcGUoZmlsdGVyKCgpID0+IHRoaXMuY3VycmVudFBhZ2UgIT09IDEpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuXHJcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tY3VycmVudFBhZ2VgLFxyXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZS50b1N0cmluZygpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5pbml0UGFnaW5hdGlvbih0aGlzLmN1cnJlbnRQYWdlLCB0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2xvY2FsU3RvcmFnZUtleSddKSB7XHJcbiAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tc2VhcmNoVGV4dGBcclxuICAgICAgKTtcclxuICAgICAgaWYgKHNlYXJjaFRleHQpIHtcclxuICAgICAgICB0aGlzLmZpbHRlclRleHQgPSBzZWFyY2hUZXh0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNvcnRTZXJ2aWNlLmdldExvY2FsU3RvcmFnZUtleSh0aGlzLmxvY2FsU3RvcmFnZUtleSk7XHJcblxyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gSlNPTi5wYXJzZShcclxuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgICBgZnUtZ3JpZC0ke3RoaXMubG9jYWxTdG9yYWdlS2V5fS1wYWdlU2l6ZWBcclxuICAgICAgICApIHx8IHRoaXMucGFnZVNpemVPcHRpb25zWzBdLnRvU3RyaW5nKClcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmZpcnN0UGFnZU9uSW5pdCkge1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuaW5pdFBhZ2luYXRpb24oMSwgdGhpcy5wYWdlU2l6ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IEpTT04ucGFyc2UoXHJcbiAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXHJcbiAgICAgICAgICAgIGBmdS1ncmlkLSR7dGhpcy5sb2NhbFN0b3JhZ2VLZXl9LWN1cnJlbnRQYWdlYFxyXG4gICAgICAgICAgKSB8fCAnMSdcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuaW5pdFBhZ2luYXRpb24odGhpcy5jdXJyZW50UGFnZSwgdGhpcy5wYWdlU2l6ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlc1sndG90YWxDb3VudCddKSB7XHJcbiAgICAgIHRoaXMuc2VydmVyUGFnaW5hdGlvbi5zZXQodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFTb3VyY2UnXSkge1xyXG4gICAgICBpZiAoIXRoaXMuc2VydmVyUGFnaW5hdGlvbigpKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluaXRMb2FkKSB7XHJcbiAgICAgICAgICB0aGlzLnNvcnREYXRhKHRoaXMuc29ydFNlcnZpY2Uuc29ydEtleSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gWy4uLnRoaXMuZGF0YVNvdXJjZV07XHJcbiAgICAgICAgdGhpcy5zb3J0ZWREYXRhID0gWy4uLnRoaXMuZmlsdGVyZWREYXRhXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNvcnRTZXJ2aWNlLmdldENlbGxLZXlzKHRoaXMuZGF0YVNvdXJjZVswXSB8fCB7fSk7XHJcbiAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc29ydFNlcnZpY2UuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcmlnaW5hbE9yZGVyID0gKGE6IGFueSwgYjogYW55KTogbnVtYmVyID0+IHtcclxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmRhdGFTb3VyY2UpO1xyXG4gICAgcmV0dXJuIGtleXMuaW5kZXhPZihhLmtleSkgLSBrZXlzLmluZGV4T2YoYi5rZXkpO1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBzb3J0RGF0YShrZXk6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zb3J0S2V5ID0ga2V5O1xyXG4gICAgY29uc3Qgc29ydERpcmVjdGlvbiA9IHRoaXMuc29ydFNlcnZpY2Uuc29ydERpcmVjdGlvbigpO1xyXG5cclxuICAgIHRoaXMuc29ydGVkRGF0YS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoYVtrZXldIDwgYltrZXldKSB7XHJcbiAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gLTEgOiAxO1xyXG4gICAgICB9IGVsc2UgaWYgKGFba2V5XSA+IGJba2V5XSkge1xyXG4gICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IDEgOiAtMTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkU29ydENsYXNzKGtleSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmluaXRMb2FkKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tY3VycmVudFBhZ2VgLFxyXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UudG9TdHJpbmcoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5pdExvYWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXJUZXh0ICE9PSAnJykge1xyXG4gICAgICB0aGlzLmZpbHRlckRhdGEoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRTb3J0Q2xhc3Moa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnRTZXJ2aWNlLnNvcnREaXJlY3Rpb24oKTtcclxuXHJcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtc29ydGVkPVwiJHtrZXl9XCJdYCk7XHJcblxyXG4gICAgZG9jdW1lbnRcclxuICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNvcnRlZF0nKVxyXG4gICAgICAuZm9yRWFjaCh0aCA9PiB0aC5jbGFzc0xpc3QucmVtb3ZlKCdzb3J0LWFzYycsICdzb3J0LWRlc2MnKSk7XHJcblxyXG4gICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKHNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gJ3NvcnQtYXNjJyA6ICdzb3J0LWRlc2MnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJEYXRhKGNoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyVGV4dC50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWREYXRhID0gWy4uLnRoaXMuc29ydGVkRGF0YV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tc2VhcmNoVGV4dGAsXHJcbiAgICAgICAgdGhpcy5maWx0ZXJUZXh0XHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcmVkRGF0YSA9IHRoaXMuc29ydGVkRGF0YS5maWx0ZXIoKGl0ZW06IGFueSkgPT5cclxuICAgICAgICBPYmplY3QudmFsdWVzKGl0ZW0pLnNvbWUoKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAuaW5jbHVkZXModGhpcy5maWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMpIHtcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICBgZnUtZ3JpZC0ke3RoaXMubG9jYWxTdG9yYWdlS2V5fS1jdXJyZW50UGFnZWAsXHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZS50b1N0cmluZygpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0RmlsdGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWx0ZXJUZXh0ID0gJyc7XHJcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXHJcbiAgICAgIGBmdS1ncmlkLSR7dGhpcy5sb2NhbFN0b3JhZ2VLZXl9LXNlYXJjaFRleHRgXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZmlsdGVyRGF0YSh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VydmVyU2lkZVBhZ2luYXRpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2luYXRlZERhdGEgPSB0aGlzLmRhdGFTb3VyY2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb24oaXNGaWx0ZXJpbmc6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBhbmRlZFJvd0luZGV4ID0gbnVsbDtcclxuICAgIHRoaXMuZXhwYW5kSW5kZXguc2V0KG51bGwpO1xyXG5cclxuICAgIGlmICh0aGlzLnNlcnZlclBhZ2luYXRpb24oKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJTaWRlUGFnaW5hdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemU7XHJcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIHRoaXMucGFnZVNpemU7XHJcblxyXG4gICAgaWYgKGlzRmlsdGVyaW5nKSB7XHJcbiAgICAgIHRoaXMucGFnaW5hdGVkRGF0YSA9IFsuLi50aGlzLmZpbHRlcmVkRGF0YV0uc2xpY2Uoc3RhcnQsIGVuZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBhZ2luYXRlZERhdGEgPSB0aGlzLnNvcnRlZERhdGEuc2xpY2Uoc3RhcnQsIGVuZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ29Ub1BhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAocGFnZSA8IDEgfHwgcGFnZSA+IHRoaXMudG90YWxQYWdlcygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcclxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tY3VycmVudFBhZ2VgLFxyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnRvU3RyaW5nKClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5zZXRQYWdlKHBhZ2UsIHRoaXMucGFnZVNpemUpO1xyXG4gICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG90YWxQYWdlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLnRvdGFsSXRlbUNvdW50KCkgLyB0aGlzLnBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRQYWdlU3RhcnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZSArIDE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0UGFnZUVuZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWluKHRoaXMuY3VycmVudFBhZ2UgKiB0aGlzLnBhZ2VTaXplLCB0aGlzLnRvdGFsSXRlbUNvdW50KCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoYW5nZVBhZ2VTaXplKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGFnZVNpemUgPSBOdW1iZXIoZXZlbnQudGFyZ2V0LnZhbHVlKTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG5cclxuICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2Uuc2V0UGFnZVNpemUodGhpcy5wYWdlU2l6ZSk7XHJcbiAgICAvLyB0aGlzLnVwZGF0ZVBhZ2luYXRpb24oKTtcclxuXHJcbiAgICBpZiAodGhpcy5maWx0ZXJUZXh0ICE9PSAnJykge1xyXG4gICAgICB0aGlzLmZpbHRlckRhdGEoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgYGZ1LWdyaWQtJHt0aGlzLmxvY2FsU3RvcmFnZUtleX0tY3VycmVudFBhZ2VgLFxyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLnRvU3RyaW5nKClcclxuICAgICk7XHJcblxyXG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICBgZnUtZ3JpZC0ke3RoaXMubG9jYWxTdG9yYWdlS2V5fS1wYWdlU2l6ZWAsXHJcbiAgICAgIHRoaXMucGFnZVNpemUudG9TdHJpbmcoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b3RhbEl0ZW1Db3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudG90YWxDb3VudCB8fCB0aGlzLmZpbHRlcmVkRGF0YS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm93Q2xpY2socm93OiBULCBpbmRleDogbnVtYmVyID0gMCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZXhwYW5kYWJsZSkge1xyXG4gICAgICBpZiAodGhpcy5leHBhbmRlZFJvd0luZGV4ID09PSBpbmRleCkge1xyXG4gICAgICAgIHRoaXMuZXhwYW5kZWRSb3dJbmRleCA9IG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZFJvd0luZGV4ID0gaW5kZXg7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucm93U2VsZWN0LmVtaXQocm93KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwiZnVzaW9uLWRhdGFncmlkXCIgY2xhc3M9XCJmdS1kYXRhLWdyaWQtd3JhcHBlclwiPlxyXG4gIEBpZiAoZmlsdGVyKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZnUtZGF0YS1ncmlkLWZpbHRlclwiPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJUZXh0XCJcclxuICAgICAgICAoaW5wdXQpPVwiZmlsdGVyRGF0YSh0cnVlKVwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIlxyXG4gICAgICAvPlxyXG4gICAgICBAaWYgKCEhZmlsdGVyVGV4dCkge1xyXG4gICAgICAgIDxkaXYgKGNsaWNrKT1cInJlc2V0RmlsdGVyKClcIj5cclxuICAgICAgICAgIDxmdS1pY29uIHNpemU9XCIyMHB4XCIgaWNvbk5hbWU9XCJjYW5jZWxcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmdS1kYXRhLWdyaWQtY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZnUtZGF0YS1ncmlkLWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZnUtaGVhZC1yb3dcIiBncmlkQ29sdW1ucyBbY29sdW1uU2l6ZXNdPVwiY29sdW1uU2l6ZXNcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICBoZWFkZXJUZW1wbGF0ZSB8fCBkZWZhdWx0SGVhZGVyVGVtcGxhdGU7XHJcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiBkYXRhU291cmNlLCBrZXlzOiBkYXRhU291cmNlWzBdIHwga2V5TWFwcGluZyB9XHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZnUtZGF0YS1ncmlkLWJvZHlcIj5cclxuICAgICAgPGRpdiAqbmdJZj1cImRhdGFMb2FkaW5nXCIgY2xhc3M9XCJmdS1kYXRhLWdyaWQtc3Bpbm5lci1vdmVybGF5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZ1LXNwaW5uZXJcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICBAZm9yIChyb3cgb2YgcGFnaW5hdGVkRGF0YTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJmdS1ib2R5LXJvd1wiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7IGhvdmVyYWJsZSwgc3RyaXBlZCB9XCJcclxuICAgICAgICAgIFtzdHlsZS5jdXJzb3JdPVwiXHJcbiAgICAgICAgICAgIGV4cGFuZGFibGUgfHwgcm93U2VsZWN0Lm9ic2VydmVkID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInJvd0NsaWNrKHJvdywgJGluZGV4KVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxyXG4gICAgICAgICAgICAgIGJvZHlUZW1wbGF0ZSB8fCBkZWZhdWx0Qm9keVRlbXBsYXRlO1xyXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3csIGluZGV4OiAkaW5kZXgsIGtleXM6IHJvdyB8IGtleU1hcHBpbmcgfVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICBAaWYgKFxyXG4gICAgICAgICAgICAoZXhwYW5kYWJsZSAmJiBleHBhbmRlZFJvd0luZGV4ID09PSAkaW5kZXgpIHx8XHJcbiAgICAgICAgICAgIGV4cGFuZEluZGV4KCkgPT09ICRpbmRleFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdS1leHBhbmRlZC1yb3dcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICBleHBhbmRUZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogcm93LCBpbmRleDogJGluZGV4IH1cclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPG5nLWNvbnRhaW5lclxyXG4gICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJmb290ZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHBhZ2luYXRlZERhdGEgfVwiXHJcbiAgLz5cclxuXHJcbiAgQGlmIChwYWdpbmF0ZWREYXRhLmxlbmd0aCA8PSAwICYmICFkYXRhTG9hZGluZykge1xyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vRGF0YVRlbXBsYXRlXCIgLz5cclxuICB9XHJcblxyXG4gIEBpZiAocmVuZGVyTmV3QWRkUm93KSB7XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkTmV3Um93VGVtcGxhdGVcIiAvPlxyXG4gIH1cclxuXHJcbiAgQGlmIChwYWdpbmF0b3IpIHtcclxuICAgIDxuZy1jb250YWluZXJcclxuICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWZhdWx0UGFnaW5hdG9yOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogc29ydERhdGEgfVwiXHJcbiAgICAvPlxyXG4gIH1cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRIZWFkZXJUZW1wbGF0ZSBsZXQtZGF0YT5cclxuICBAZm9yIChoZWFkZXIgb2YgZGF0YVswXSB8IGtleXZhbHVlOiBvcmlnaW5hbE9yZGVyOyB0cmFjayAkaW5kZXgpIHtcclxuICAgIDxmdS1oZWFkLXJvdy1jZWxsXHJcbiAgICAgIFtjZWxsRGVmXT1cIiRhbnkoaGVhZGVyLmtleSlcIlxyXG4gICAgICBbc29ydEtleV09XCIkYW55KGhlYWRlci5rZXkpXCJcclxuICAgIC8+XHJcbiAgfVxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0Qm9keVRlbXBsYXRlIGxldC1yb3dzPlxyXG4gIEBmb3IgKHJvdyBvZiByb3dzIHwga2V5dmFsdWU6IG9yaWdpbmFsT3JkZXI7IHRyYWNrICRpbmRleCkge1xyXG4gICAgPGZ1LWJvZHktcm93LWNlbGwgW2NlbGxWYWx1ZV09XCIkYW55KHJvdy52YWx1ZSlcIiAvPlxyXG4gIH1cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFBhZ2luYXRvciBsZXQtZGF0YT5cclxuICA8ZGl2IGNsYXNzPVwiZnUtZGF0YS1ncmlkLXBhZ2luYXRvclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZ1LWdyaWQtYWRkLWJ1dHRvblwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWRkQnV0dG9uVGVtcGxhdGVcIiAvPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZ1LXBhZ2luYXRvci1wYWdlLXNlbGVjdFwiPlxyXG4gICAgICA8c3Bhbj5QYWdlIHNpemU6PC9zcGFuPlxyXG4gICAgICA8c2VsZWN0IGNsYXNzPVwiZnUtcGFnZS1zaXplLXNlbGVjdFwiIChjaGFuZ2UpPVwiY2hhbmdlUGFnZVNpemUoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxvcHRpb25cclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBzaXplIG9mIHBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwic2l6ZVwiXHJcbiAgICAgICAgICBbc2VsZWN0ZWRdPVwic2l6ZSA9PT0gcGFnZVNpemVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IHNpemUgfX1cclxuICAgICAgICA8L29wdGlvbj5cclxuICAgICAgPC9zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJmdS1wYWdpbmF0b3ItY29udHJvbHNcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICB7eyBnZXRQYWdlU3RhcnQoKSB9fSAtIHt7IGdldFBhZ2VFbmQoKSB9fSBvZiB7eyB0b3RhbEl0ZW1Db3VudCgpIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgZnUtYnRuLXRleHRcclxuICAgICAgICBpY29uQnV0dG9uXHJcbiAgICAgICAgKGNsaWNrKT1cImdvVG9QYWdlKDEpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudFBhZ2UgPT09IDFcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGZ1LWljb24gaWNvbk5hbWU9XCJkb3VibGVBcnJvd0xlZnRcIiAvPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGZ1LWJ0bi10ZXh0XHJcbiAgICAgICAgaWNvbkJ1dHRvblxyXG4gICAgICAgIChjbGljayk9XCJnb1RvUGFnZShjdXJyZW50UGFnZSAtIDEpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudFBhZ2UgPT09IDFcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGZ1LWljb24gaWNvbk5hbWU9XCJhcnJvd0xlZnRcIiAvPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIGZ1LWJ0bi10ZXh0XHJcbiAgICAgICAgaWNvbkJ1dHRvblxyXG4gICAgICAgIChjbGljayk9XCJnb1RvUGFnZShjdXJyZW50UGFnZSArIDEpXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiY3VycmVudFBhZ2UgPj0gdG90YWxQYWdlcygpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxmdS1pY29uIGljb25OYW1lPVwiYXJyb3dSaWdodFwiIC8+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgZnUtYnRuLXRleHRcclxuICAgICAgICBpY29uQnV0dG9uXHJcbiAgICAgICAgKGNsaWNrKT1cImdvVG9QYWdlKHRvdGFsUGFnZXMoKSlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJjdXJyZW50UGFnZSA+PSB0b3RhbFBhZ2VzKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGZ1LWljb24gaWNvbk5hbWU9XCJkb3VibGVBcnJvd1JpZ2h0XCIgLz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19
|
|
@@ -752,6 +752,10 @@ class DataGridComponent {
|
|
|
752
752
|
}
|
|
753
753
|
ngOnChanges(changes) {
|
|
754
754
|
if (changes['localStorageKey']) {
|
|
755
|
+
const searchText = window.localStorage.getItem(`fu-grid-${this.localStorageKey}-searchText`);
|
|
756
|
+
if (searchText) {
|
|
757
|
+
this.filterText = searchText;
|
|
758
|
+
}
|
|
755
759
|
this.sortService.getLocalStorageKey(this.localStorageKey);
|
|
756
760
|
this.pageSize = JSON.parse(window.localStorage.getItem(`fu-grid-${this.localStorageKey}-pageSize`) || this.pageSizeOptions[0].toString());
|
|
757
761
|
if (this.firstPageOnInit) {
|
|
@@ -767,7 +771,9 @@ class DataGridComponent {
|
|
|
767
771
|
}
|
|
768
772
|
if (changes['dataSource']) {
|
|
769
773
|
if (!this.serverPagination()) {
|
|
770
|
-
|
|
774
|
+
if (!this.initLoad) {
|
|
775
|
+
this.sortData(this.sortService.sortKey());
|
|
776
|
+
}
|
|
771
777
|
this.filteredData = [...this.dataSource];
|
|
772
778
|
this.sortedData = [...this.filteredData];
|
|
773
779
|
}
|
|
@@ -795,7 +801,6 @@ class DataGridComponent {
|
|
|
795
801
|
this.currentPage = 1;
|
|
796
802
|
window.localStorage.setItem(`fu-grid-${this.localStorageKey}-currentPage`, this.currentPage.toString());
|
|
797
803
|
}
|
|
798
|
-
// this.updatePagination();
|
|
799
804
|
this.initLoad = false;
|
|
800
805
|
if (this.filterText !== '') {
|
|
801
806
|
this.filterData();
|
|
@@ -814,11 +819,12 @@ class DataGridComponent {
|
|
|
814
819
|
element.classList.add(sortDirection === 'asc' ? 'sort-asc' : 'sort-desc');
|
|
815
820
|
}
|
|
816
821
|
}
|
|
817
|
-
filterData() {
|
|
822
|
+
filterData(changes = false) {
|
|
818
823
|
if (this.filterText.trim() === '') {
|
|
819
824
|
this.filteredData = [...this.sortedData];
|
|
820
825
|
}
|
|
821
826
|
else {
|
|
827
|
+
window.localStorage.setItem(`fu-grid-${this.localStorageKey}-searchText`, this.filterText);
|
|
822
828
|
this.filteredData = this.sortedData.filter((item) => Object.values(item).some((value) => {
|
|
823
829
|
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
824
830
|
return;
|
|
@@ -829,10 +835,16 @@ class DataGridComponent {
|
|
|
829
835
|
.includes(this.filterText.toLowerCase());
|
|
830
836
|
}));
|
|
831
837
|
}
|
|
832
|
-
|
|
833
|
-
|
|
838
|
+
if (changes) {
|
|
839
|
+
this.currentPage = 1;
|
|
840
|
+
window.localStorage.setItem(`fu-grid-${this.localStorageKey}-currentPage`, this.currentPage.toString());
|
|
841
|
+
}
|
|
834
842
|
this.updatePagination(true);
|
|
835
|
-
|
|
843
|
+
}
|
|
844
|
+
resetFilter() {
|
|
845
|
+
this.filterText = '';
|
|
846
|
+
window.localStorage.removeItem(`fu-grid-${this.localStorageKey}-searchText`);
|
|
847
|
+
this.filterData(true);
|
|
836
848
|
}
|
|
837
849
|
serverSidePagination() {
|
|
838
850
|
this.paginatedData = this.dataSource;
|
|
@@ -905,11 +917,11 @@ class DataGridComponent {
|
|
|
905
917
|
}
|
|
906
918
|
}
|
|
907
919
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: DataGridComponent, deps: [{ token: DataSortingService }, { token: PaginationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
908
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: DataGridComponent, selector: "fu-data-grid", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: false, isRequired: true, transformFunction: null }, localStorageKey: { classPropertyName: "localStorageKey", publicName: "localStorageKey", isSignal: false, isRequired: true, transformFunction: null }, totalCount: { classPropertyName: "totalCount", publicName: "totalCount", isSignal: false, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: false, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: false, isRequired: false, transformFunction: null }, columnSizes: { classPropertyName: "columnSizes", publicName: "columnSizes", isSignal: false, isRequired: false, transformFunction: null }, dataLoading: { classPropertyName: "dataLoading", publicName: "dataLoading", isSignal: false, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: false, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: false, isRequired: false, transformFunction: null }, paginator: { classPropertyName: "paginator", publicName: "paginator", isSignal: false, isRequired: false, transformFunction: null }, hoverable: { classPropertyName: "hoverable", publicName: "hoverable", isSignal: false, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: false, isRequired: false, transformFunction: null }, firstPageOnInit: { classPropertyName: "firstPageOnInit", publicName: "firstPageOnInit", isSignal: false, isRequired: false, transformFunction: null }, renderNewAddRow: { classPropertyName: "renderNewAddRow", publicName: "renderNewAddRow", isSignal: false, isRequired: false, transformFunction: null }, expandIndex: { classPropertyName: "expandIndex", publicName: "expandIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowSelect: "rowSelect", onSort: "onSort", expandIndex: "expandIndexChange" }, providers: [DataSortingService], queries: [{ propertyName: "captionTemplate", first: true, predicate: ["caption"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: GridHeaderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "bodyTemplate", first: true, predicate: GridBodyTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "expandTemplate", first: true, predicate: GridExpandTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "footerTemplate", first: true, predicate: ["footer"], descendants: true }, { propertyName: "noDataTemplate", first: true, predicate: ["noDataRow"], descendants: true }, { propertyName: "addButtonTemplate", first: true, predicate: ["addButton"], descendants: true }, { propertyName: "addNewRowTemplate", first: true, predicate: ["addNewRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"fusion-datagrid\" class=\"fu-data-grid-wrapper\">\r\n @if (filter) {\r\n <input\r\n class=\"fu-data-grid-filter\"\r\n type=\"text\"\r\n [(ngModel)]=\"filterText\"\r\n (input)=\"filterData()\"\r\n placeholder=\"Search keyword...\"\r\n />\r\n }\r\n\r\n <div class=\"fu-data-grid-container\">\r\n <div class=\"fu-data-grid-header\">\r\n <div class=\"fu-head-row\" gridColumns [columnSizes]=\"columnSizes\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerTemplate || defaultHeaderTemplate;\r\n context: { $implicit: dataSource, keys: dataSource[0] | keyMapping }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"fu-data-grid-body\">\r\n <div *ngIf=\"dataLoading\" class=\"fu-data-grid-spinner-overlay\">\r\n <div class=\"fu-spinner\"></div>\r\n </div>\r\n\r\n @for (row of paginatedData; track $index) {\r\n <div\r\n class=\"fu-body-row\"\r\n [ngClass]=\"{ hoverable, striped }\"\r\n [style.cursor]=\"\r\n expandable || rowSelect.observed ? 'pointer' : 'default'\r\n \"\r\n (click)=\"rowClick(row, $index)\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n bodyTemplate || defaultBodyTemplate;\r\n context: { $implicit: row, index: $index, keys: row | keyMapping }\r\n \"\r\n />\r\n\r\n @if (\r\n (expandable && expandedRowIndex === $index) ||\r\n expandIndex() === $index\r\n ) {\r\n <div class=\"fu-expanded-row\" (click)=\"$event.stopPropagation()\">\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n expandTemplate;\r\n context: { $implicit: row, index: $index }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"footerTemplate; context: { $implicit: paginatedData }\"\r\n />\r\n\r\n @if (paginatedData.length <= 0 && !dataLoading) {\r\n <ng-container *ngTemplateOutlet=\"noDataTemplate\" />\r\n }\r\n\r\n @if (renderNewAddRow) {\r\n <ng-container *ngTemplateOutlet=\"addNewRowTemplate\" />\r\n }\r\n\r\n @if (paginator) {\r\n <ng-container\r\n *ngTemplateOutlet=\"defaultPaginator; context: { $implicit: sortData }\"\r\n />\r\n }\r\n</div>\r\n\r\n<ng-template #defaultHeaderTemplate let-data>\r\n @for (header of data[0] | keyvalue: originalOrder; track $index) {\r\n <fu-head-row-cell\r\n [cellDef]=\"$any(header.key)\"\r\n [sortKey]=\"$any(header.key)\"\r\n />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultBodyTemplate let-rows>\r\n @for (row of rows | keyvalue: originalOrder; track $index) {\r\n <fu-body-row-cell [cellValue]=\"$any(row.value)\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultPaginator let-data>\r\n <div class=\"fu-data-grid-paginator\">\r\n <div class=\"fu-grid-add-button\">\r\n <ng-container *ngTemplateOutlet=\"addButtonTemplate\" />\r\n </div>\r\n\r\n <div class=\"fu-paginator-page-select\">\r\n <span>Page size:</span>\r\n <select class=\"fu-page-size-select\" (change)=\"changePageSize($event)\">\r\n <option\r\n *ngFor=\"let size of pageSizeOptions\"\r\n [value]=\"size\"\r\n [selected]=\"size === pageSize\"\r\n >\r\n {{ size }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"fu-paginator-controls\">\r\n <div>\r\n {{ getPageStart() }} - {{ getPageEnd() }} of {{ totalItemCount() }}\r\n </div>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"doubleArrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage - 1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"arrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage + 1)\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"arrowRight\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(totalPages())\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"doubleArrowRight\" />\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["html{--fu-grid-fg-color: #232534;--fu-grid-bg-color: #1e1f2b;--fu-grid-hover-color: #12121240;--fu-grid-striped-color: #22232e;--fu-grid-border-color: #4b444d;--fu-grid-text-color: #ffffff;--fu-grid-cell-color: #bab9b9;--fu-filter-input-color: #ccc;--fu-grid-cell-edit-input: #fff;--fu-grid-shape: 4px}.fu-data-grid-wrapper{border-radius:var(--fu-grid-shape);box-shadow:0 2px 4px #00000080;background-color:var(--fu-grid-bg-color);color:var(--fu-grid-text-color);font-family:Roboto,sans-serif;font-size:14px}.fu-data-grid-container{width:100%}.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:flex;justify-content:space-between;flex-wrap:wrap}.fu-data-grid-container .fu-data-grid-header .fu-head-row>*{flex:1 1 auto}}.fu-data-grid-container .fu-data-grid-body{position:relative}.fu-data-grid-container .fu-data-grid-body .fu-body-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color);align-items:center}.fu-data-grid-container .fu-data-grid-body .fu-body-row.striped:nth-child(2n){background-color:var(--fu-grid-striped-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row.hoverable:hover{background-color:var(--fu-grid-hover-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:repeat(2,1fr)}.fu-data-grid-container .fu-data-grid-body .fu-body-row :nth-child(odd):last-child{grid-column:span 2}.fu-data-grid-container .fu-data-grid-body .fu-body-row [data-actions]{grid-column:1/-1;margin:8px 0}}@media (max-width: 600px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:1fr;border-bottom:1px solid var(--fu-grid-border-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row>:nth-child(odd):last-child{grid-column:span 1}}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row{grid-column:1/-1;border-top:1px solid rgba(128,128,128,.1);padding:12px 16px}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row>div{cursor:default}.fu-data-grid-paginator{display:flex;justify-content:flex-end;padding:16px;position:relative}.fu-data-grid-paginator .fu-page-size-select{background-color:var(--fu-grid-fg-color);color:var(--fu-grid-cell-edit-input);padding:4px;border:1px solid var(--fu-grid-border-color)}@media (max-width: 600px){.fu-data-grid-paginator{gap:12px;flex-direction:column;padding:12px 16px}}.fu-data-grid-paginator .fu-paginator-page-select{display:flex;justify-content:flex-end;align-items:center;margin-right:12px;font-size:14px}@media (max-width: 600px){.fu-data-grid-paginator .fu-paginator-page-select{margin-right:0}}.fu-data-grid-paginator .fu-paginator-page-select span{margin-right:8px}.fu-data-grid-paginator .fu-paginator-controls{display:flex;justify-content:flex-end;align-items:center;gap:8px}.fu-grid-add-button{position:absolute;left:10px;top:10px}.fu-data-grid-filter{box-sizing:border-box;background-color:var(--fu-grid-fg-color);color:var(--fu-filter-input-color);width:calc(100% - 32px);padding:12px 8px;margin:16px;outline:none;border:none}.fu-data-grid-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#78787880;display:flex;justify-content:center;align-items:center;z-index:1000}.fu-data-grid-spinner-overlay .fu-spinner{border:10px solid var(--fu-grid-bg-color);border-top:10px solid #3498db;border-radius:50%;width:30px;height:30px;animation:spin 2s linear infinite;margin:5px auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IconComponent, selector: "fu-icon", inputs: ["iconName", "size", "strokeWidth", "color"] }, { kind: "directive", type: TextButtonDirective, selector: "[fu-btn-text]", inputs: ["variant", "iconButton", "rounded"] }, { kind: "directive", type: GridColumnsDirective, selector: "[gridColumns]", inputs: ["columnSizes"] }, { kind: "component", type: BodyRowCellComponent, selector: "fu-body-row-cell", inputs: ["cellValue", "editKey", "editCellValue"], outputs: ["editCellValueChange"] }, { kind: "component", type: HeadRowCellComponent, selector: "fu-head-row-cell", inputs: ["cellDef", "sortKey"] }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: KeyMappingPipe, name: "keyMapping" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
920
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.6", type: DataGridComponent, selector: "fu-data-grid", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: false, isRequired: true, transformFunction: null }, localStorageKey: { classPropertyName: "localStorageKey", publicName: "localStorageKey", isSignal: false, isRequired: true, transformFunction: null }, totalCount: { classPropertyName: "totalCount", publicName: "totalCount", isSignal: false, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: false, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: false, isRequired: false, transformFunction: null }, columnSizes: { classPropertyName: "columnSizes", publicName: "columnSizes", isSignal: false, isRequired: false, transformFunction: null }, dataLoading: { classPropertyName: "dataLoading", publicName: "dataLoading", isSignal: false, isRequired: false, transformFunction: null }, expandable: { classPropertyName: "expandable", publicName: "expandable", isSignal: false, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: false, isRequired: false, transformFunction: null }, paginator: { classPropertyName: "paginator", publicName: "paginator", isSignal: false, isRequired: false, transformFunction: null }, hoverable: { classPropertyName: "hoverable", publicName: "hoverable", isSignal: false, isRequired: false, transformFunction: null }, striped: { classPropertyName: "striped", publicName: "striped", isSignal: false, isRequired: false, transformFunction: null }, firstPageOnInit: { classPropertyName: "firstPageOnInit", publicName: "firstPageOnInit", isSignal: false, isRequired: false, transformFunction: null }, renderNewAddRow: { classPropertyName: "renderNewAddRow", publicName: "renderNewAddRow", isSignal: false, isRequired: false, transformFunction: null }, expandIndex: { classPropertyName: "expandIndex", publicName: "expandIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowSelect: "rowSelect", onSort: "onSort", expandIndex: "expandIndexChange" }, providers: [DataSortingService], queries: [{ propertyName: "captionTemplate", first: true, predicate: ["caption"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: GridHeaderTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "bodyTemplate", first: true, predicate: GridBodyTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "expandTemplate", first: true, predicate: GridExpandTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "footerTemplate", first: true, predicate: ["footer"], descendants: true }, { propertyName: "noDataTemplate", first: true, predicate: ["noDataRow"], descendants: true }, { propertyName: "addButtonTemplate", first: true, predicate: ["addButton"], descendants: true }, { propertyName: "addNewRowTemplate", first: true, predicate: ["addNewRow"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"fusion-datagrid\" class=\"fu-data-grid-wrapper\">\r\n @if (filter) {\r\n <div class=\"fu-data-grid-filter\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"filterText\"\r\n (input)=\"filterData(true)\"\r\n placeholder=\"Search...\"\r\n />\r\n @if (!!filterText) {\r\n <div (click)=\"resetFilter()\">\r\n <fu-icon size=\"20px\" iconName=\"cancel\" />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"fu-data-grid-container\">\r\n <div class=\"fu-data-grid-header\">\r\n <div class=\"fu-head-row\" gridColumns [columnSizes]=\"columnSizes\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerTemplate || defaultHeaderTemplate;\r\n context: { $implicit: dataSource, keys: dataSource[0] | keyMapping }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"fu-data-grid-body\">\r\n <div *ngIf=\"dataLoading\" class=\"fu-data-grid-spinner-overlay\">\r\n <div class=\"fu-spinner\"></div>\r\n </div>\r\n\r\n @for (row of paginatedData; track $index) {\r\n <div\r\n class=\"fu-body-row\"\r\n [ngClass]=\"{ hoverable, striped }\"\r\n [style.cursor]=\"\r\n expandable || rowSelect.observed ? 'pointer' : 'default'\r\n \"\r\n (click)=\"rowClick(row, $index)\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n bodyTemplate || defaultBodyTemplate;\r\n context: { $implicit: row, index: $index, keys: row | keyMapping }\r\n \"\r\n />\r\n\r\n @if (\r\n (expandable && expandedRowIndex === $index) ||\r\n expandIndex() === $index\r\n ) {\r\n <div class=\"fu-expanded-row\" (click)=\"$event.stopPropagation()\">\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n expandTemplate;\r\n context: { $implicit: row, index: $index }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"footerTemplate; context: { $implicit: paginatedData }\"\r\n />\r\n\r\n @if (paginatedData.length <= 0 && !dataLoading) {\r\n <ng-container *ngTemplateOutlet=\"noDataTemplate\" />\r\n }\r\n\r\n @if (renderNewAddRow) {\r\n <ng-container *ngTemplateOutlet=\"addNewRowTemplate\" />\r\n }\r\n\r\n @if (paginator) {\r\n <ng-container\r\n *ngTemplateOutlet=\"defaultPaginator; context: { $implicit: sortData }\"\r\n />\r\n }\r\n</div>\r\n\r\n<ng-template #defaultHeaderTemplate let-data>\r\n @for (header of data[0] | keyvalue: originalOrder; track $index) {\r\n <fu-head-row-cell\r\n [cellDef]=\"$any(header.key)\"\r\n [sortKey]=\"$any(header.key)\"\r\n />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultBodyTemplate let-rows>\r\n @for (row of rows | keyvalue: originalOrder; track $index) {\r\n <fu-body-row-cell [cellValue]=\"$any(row.value)\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultPaginator let-data>\r\n <div class=\"fu-data-grid-paginator\">\r\n <div class=\"fu-grid-add-button\">\r\n <ng-container *ngTemplateOutlet=\"addButtonTemplate\" />\r\n </div>\r\n\r\n <div class=\"fu-paginator-page-select\">\r\n <span>Page size:</span>\r\n <select class=\"fu-page-size-select\" (change)=\"changePageSize($event)\">\r\n <option\r\n *ngFor=\"let size of pageSizeOptions\"\r\n [value]=\"size\"\r\n [selected]=\"size === pageSize\"\r\n >\r\n {{ size }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"fu-paginator-controls\">\r\n <div>\r\n {{ getPageStart() }} - {{ getPageEnd() }} of {{ totalItemCount() }}\r\n </div>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"doubleArrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage - 1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"arrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage + 1)\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"arrowRight\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(totalPages())\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"doubleArrowRight\" />\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["html{--fu-grid-fg-color: #232534;--fu-grid-bg-color: #1e1f2b;--fu-grid-hover-color: #12121240;--fu-grid-striped-color: #22232e;--fu-grid-border-color: #4b444d;--fu-grid-text-color: #ffffff;--fu-grid-cell-color: #bab9b9;--fu-filter-input-color: #ccc;--fu-grid-cell-edit-input: #fff;--fu-grid-shape: 4px}.fu-data-grid-wrapper{border-radius:var(--fu-grid-shape);box-shadow:0 2px 4px #00000080;background-color:var(--fu-grid-bg-color);color:var(--fu-grid-text-color);font-family:Roboto,sans-serif;font-size:14px}.fu-data-grid-container{width:100%}.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:flex;justify-content:space-between;flex-wrap:wrap}.fu-data-grid-container .fu-data-grid-header .fu-head-row>*{flex:1 1 auto}}.fu-data-grid-container .fu-data-grid-body{position:relative}.fu-data-grid-container .fu-data-grid-body .fu-body-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color);align-items:center}.fu-data-grid-container .fu-data-grid-body .fu-body-row.striped:nth-child(2n){background-color:var(--fu-grid-striped-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row.hoverable:hover{background-color:var(--fu-grid-hover-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:repeat(2,1fr)}.fu-data-grid-container .fu-data-grid-body .fu-body-row :nth-child(odd):last-child{grid-column:span 2}.fu-data-grid-container .fu-data-grid-body .fu-body-row [data-actions]{grid-column:1/-1;margin:8px 0}}@media (max-width: 600px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:1fr;border-bottom:1px solid var(--fu-grid-border-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row>:nth-child(odd):last-child{grid-column:span 1}}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row{grid-column:1/-1;border-top:1px solid rgba(128,128,128,.1);padding:12px 16px}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row>div{cursor:default}.fu-data-grid-paginator{display:flex;justify-content:flex-end;padding:16px;position:relative}.fu-data-grid-paginator .fu-page-size-select{background-color:var(--fu-grid-fg-color);color:var(--fu-grid-cell-edit-input);padding:4px;border:1px solid var(--fu-grid-border-color)}@media (max-width: 600px){.fu-data-grid-paginator{gap:12px;flex-direction:column;padding:12px 16px}}.fu-data-grid-paginator .fu-paginator-page-select{display:flex;justify-content:flex-end;align-items:center;margin-right:12px;font-size:14px}@media (max-width: 600px){.fu-data-grid-paginator .fu-paginator-page-select{margin-right:0}}.fu-data-grid-paginator .fu-paginator-page-select span{margin-right:8px}.fu-data-grid-paginator .fu-paginator-controls{display:flex;justify-content:flex-end;align-items:center;gap:8px}.fu-grid-add-button{position:absolute;left:10px;top:10px}.fu-data-grid-filter{position:relative}.fu-data-grid-filter input{box-sizing:border-box;background-color:var(--fu-grid-fg-color);color:var(--fu-filter-input-color);width:calc(100% - 32px);padding:10px 42px 10px 8px;margin:16px;outline:none;border:none}.fu-data-grid-filter div{position:absolute;display:flex;justify-content:center;align-items:center;width:24px;height:24px;background-color:var(--fu-grid-fg-color);top:22px;right:24px;cursor:pointer;transition:.1s ease-in-out}.fu-data-grid-filter div:hover{background-color:var(--fu-grid-hover-color)}.fu-data-grid-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#78787880;display:flex;justify-content:center;align-items:center;z-index:1000}.fu-data-grid-spinner-overlay .fu-spinner{border:10px solid var(--fu-grid-bg-color);border-top:10px solid #3498db;border-radius:50%;width:30px;height:30px;animation:spin 2s linear infinite;margin:5px auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: IconComponent, selector: "fu-icon", inputs: ["iconName", "size", "strokeWidth", "color"] }, { kind: "directive", type: TextButtonDirective, selector: "[fu-btn-text]", inputs: ["variant", "iconButton", "rounded"] }, { kind: "directive", type: GridColumnsDirective, selector: "[gridColumns]", inputs: ["columnSizes"] }, { kind: "component", type: BodyRowCellComponent, selector: "fu-body-row-cell", inputs: ["cellValue", "editKey", "editCellValue"], outputs: ["editCellValueChange"] }, { kind: "component", type: HeadRowCellComponent, selector: "fu-head-row-cell", inputs: ["cellDef", "sortKey"] }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: KeyMappingPipe, name: "keyMapping" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
909
921
|
}
|
|
910
922
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: DataGridComponent, decorators: [{
|
|
911
923
|
type: Component,
|
|
912
|
-
args: [{ selector: 'fu-data-grid', providers: [DataSortingService], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div id=\"fusion-datagrid\" class=\"fu-data-grid-wrapper\">\r\n @if (filter) {\r\n <
|
|
924
|
+
args: [{ selector: 'fu-data-grid', providers: [DataSortingService], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div id=\"fusion-datagrid\" class=\"fu-data-grid-wrapper\">\r\n @if (filter) {\r\n <div class=\"fu-data-grid-filter\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"filterText\"\r\n (input)=\"filterData(true)\"\r\n placeholder=\"Search...\"\r\n />\r\n @if (!!filterText) {\r\n <div (click)=\"resetFilter()\">\r\n <fu-icon size=\"20px\" iconName=\"cancel\" />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"fu-data-grid-container\">\r\n <div class=\"fu-data-grid-header\">\r\n <div class=\"fu-head-row\" gridColumns [columnSizes]=\"columnSizes\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n headerTemplate || defaultHeaderTemplate;\r\n context: { $implicit: dataSource, keys: dataSource[0] | keyMapping }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"fu-data-grid-body\">\r\n <div *ngIf=\"dataLoading\" class=\"fu-data-grid-spinner-overlay\">\r\n <div class=\"fu-spinner\"></div>\r\n </div>\r\n\r\n @for (row of paginatedData; track $index) {\r\n <div\r\n class=\"fu-body-row\"\r\n [ngClass]=\"{ hoverable, striped }\"\r\n [style.cursor]=\"\r\n expandable || rowSelect.observed ? 'pointer' : 'default'\r\n \"\r\n (click)=\"rowClick(row, $index)\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n bodyTemplate || defaultBodyTemplate;\r\n context: { $implicit: row, index: $index, keys: row | keyMapping }\r\n \"\r\n />\r\n\r\n @if (\r\n (expandable && expandedRowIndex === $index) ||\r\n expandIndex() === $index\r\n ) {\r\n <div class=\"fu-expanded-row\" (click)=\"$event.stopPropagation()\">\r\n <div>\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n expandTemplate;\r\n context: { $implicit: row, index: $index }\r\n \"\r\n />\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n\r\n <ng-container\r\n *ngTemplateOutlet=\"footerTemplate; context: { $implicit: paginatedData }\"\r\n />\r\n\r\n @if (paginatedData.length <= 0 && !dataLoading) {\r\n <ng-container *ngTemplateOutlet=\"noDataTemplate\" />\r\n }\r\n\r\n @if (renderNewAddRow) {\r\n <ng-container *ngTemplateOutlet=\"addNewRowTemplate\" />\r\n }\r\n\r\n @if (paginator) {\r\n <ng-container\r\n *ngTemplateOutlet=\"defaultPaginator; context: { $implicit: sortData }\"\r\n />\r\n }\r\n</div>\r\n\r\n<ng-template #defaultHeaderTemplate let-data>\r\n @for (header of data[0] | keyvalue: originalOrder; track $index) {\r\n <fu-head-row-cell\r\n [cellDef]=\"$any(header.key)\"\r\n [sortKey]=\"$any(header.key)\"\r\n />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultBodyTemplate let-rows>\r\n @for (row of rows | keyvalue: originalOrder; track $index) {\r\n <fu-body-row-cell [cellValue]=\"$any(row.value)\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultPaginator let-data>\r\n <div class=\"fu-data-grid-paginator\">\r\n <div class=\"fu-grid-add-button\">\r\n <ng-container *ngTemplateOutlet=\"addButtonTemplate\" />\r\n </div>\r\n\r\n <div class=\"fu-paginator-page-select\">\r\n <span>Page size:</span>\r\n <select class=\"fu-page-size-select\" (change)=\"changePageSize($event)\">\r\n <option\r\n *ngFor=\"let size of pageSizeOptions\"\r\n [value]=\"size\"\r\n [selected]=\"size === pageSize\"\r\n >\r\n {{ size }}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"fu-paginator-controls\">\r\n <div>\r\n {{ getPageStart() }} - {{ getPageEnd() }} of {{ totalItemCount() }}\r\n </div>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"doubleArrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage - 1)\"\r\n [disabled]=\"currentPage === 1\"\r\n >\r\n <fu-icon iconName=\"arrowLeft\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(currentPage + 1)\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"arrowRight\" />\r\n </button>\r\n <button\r\n fu-btn-text\r\n iconButton\r\n (click)=\"goToPage(totalPages())\"\r\n [disabled]=\"currentPage >= totalPages()\"\r\n >\r\n <fu-icon iconName=\"doubleArrowRight\" />\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["html{--fu-grid-fg-color: #232534;--fu-grid-bg-color: #1e1f2b;--fu-grid-hover-color: #12121240;--fu-grid-striped-color: #22232e;--fu-grid-border-color: #4b444d;--fu-grid-text-color: #ffffff;--fu-grid-cell-color: #bab9b9;--fu-filter-input-color: #ccc;--fu-grid-cell-edit-input: #fff;--fu-grid-shape: 4px}.fu-data-grid-wrapper{border-radius:var(--fu-grid-shape);box-shadow:0 2px 4px #00000080;background-color:var(--fu-grid-bg-color);color:var(--fu-grid-text-color);font-family:Roboto,sans-serif;font-size:14px}.fu-data-grid-container{width:100%}.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-header .fu-head-row{display:flex;justify-content:space-between;flex-wrap:wrap}.fu-data-grid-container .fu-data-grid-header .fu-head-row>*{flex:1 1 auto}}.fu-data-grid-container .fu-data-grid-body{position:relative}.fu-data-grid-container .fu-data-grid-body .fu-body-row{display:grid;grid-template-columns:var(--grid-columns);border-bottom:1px solid var(--fu-grid-border-color);align-items:center}.fu-data-grid-container .fu-data-grid-body .fu-body-row.striped:nth-child(2n){background-color:var(--fu-grid-striped-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row.hoverable:hover{background-color:var(--fu-grid-hover-color)}@media (max-width: 900px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:repeat(2,1fr)}.fu-data-grid-container .fu-data-grid-body .fu-body-row :nth-child(odd):last-child{grid-column:span 2}.fu-data-grid-container .fu-data-grid-body .fu-body-row [data-actions]{grid-column:1/-1;margin:8px 0}}@media (max-width: 600px){.fu-data-grid-container .fu-data-grid-body .fu-body-row{grid-template-columns:1fr;border-bottom:1px solid var(--fu-grid-border-color)}.fu-data-grid-container .fu-data-grid-body .fu-body-row>:nth-child(odd):last-child{grid-column:span 1}}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row{grid-column:1/-1;border-top:1px solid rgba(128,128,128,.1);padding:12px 16px}.fu-data-grid-container .fu-data-grid-body .fu-body-row .fu-expanded-row>div{cursor:default}.fu-data-grid-paginator{display:flex;justify-content:flex-end;padding:16px;position:relative}.fu-data-grid-paginator .fu-page-size-select{background-color:var(--fu-grid-fg-color);color:var(--fu-grid-cell-edit-input);padding:4px;border:1px solid var(--fu-grid-border-color)}@media (max-width: 600px){.fu-data-grid-paginator{gap:12px;flex-direction:column;padding:12px 16px}}.fu-data-grid-paginator .fu-paginator-page-select{display:flex;justify-content:flex-end;align-items:center;margin-right:12px;font-size:14px}@media (max-width: 600px){.fu-data-grid-paginator .fu-paginator-page-select{margin-right:0}}.fu-data-grid-paginator .fu-paginator-page-select span{margin-right:8px}.fu-data-grid-paginator .fu-paginator-controls{display:flex;justify-content:flex-end;align-items:center;gap:8px}.fu-grid-add-button{position:absolute;left:10px;top:10px}.fu-data-grid-filter{position:relative}.fu-data-grid-filter input{box-sizing:border-box;background-color:var(--fu-grid-fg-color);color:var(--fu-filter-input-color);width:calc(100% - 32px);padding:10px 42px 10px 8px;margin:16px;outline:none;border:none}.fu-data-grid-filter div{position:absolute;display:flex;justify-content:center;align-items:center;width:24px;height:24px;background-color:var(--fu-grid-fg-color);top:22px;right:24px;cursor:pointer;transition:.1s ease-in-out}.fu-data-grid-filter div:hover{background-color:var(--fu-grid-hover-color)}.fu-data-grid-spinner-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#78787880;display:flex;justify-content:center;align-items:center;z-index:1000}.fu-data-grid-spinner-overlay .fu-spinner{border:10px solid var(--fu-grid-bg-color);border-top:10px solid #3498db;border-radius:50%;width:30px;height:30px;animation:spin 2s linear infinite;margin:5px auto}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
|
|
913
925
|
}], ctorParameters: () => [{ type: DataSortingService }, { type: PaginationService }], propDecorators: { dataSource: [{
|
|
914
926
|
type: Input,
|
|
915
927
|
args: [{ required: true }]
|