@coolon/angular-ui-powerups 16.1.0-aplpha.81 → 16.1.0-aplpha.83
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.
- package/assets/table.scss +0 -8
- package/esm2022/lib/components/tables/renderer/table-body/table-body.component.mjs +52 -136
- package/esm2022/lib/components/tables/table/table.component.mjs +9 -3
- package/fesm2022/coolon-angular-ui-powerups.mjs +56 -136
- package/fesm2022/coolon-angular-ui-powerups.mjs.map +1 -1
- package/lib/components/tables/renderer/table-body/table-body.component.d.ts +11 -2
- package/lib/components/tables/table/table.component.d.ts +1 -0
- package/package.json +3 -3
package/assets/table.scss
CHANGED
|
@@ -101,12 +101,4 @@
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
aup-table-header-cell {
|
|
105
|
-
min-height: calc(var(--resolved-header-row-height) - 1px); // subtracting the bottom border width.
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
aup-table-cell {
|
|
109
|
-
min-height: var(--resolved-row-height); // same as mat table row height - border bottom.
|
|
110
|
-
}
|
|
111
|
-
|
|
112
104
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling";
|
|
3
|
+
import { Component, Directive, ElementRef, HostBinding, Inject, InjectionToken, Input, Optional, ViewChild } from "@angular/core";
|
|
4
|
+
import { Dsl, ListModel, MutableValueModel, Proxify, proxify, StoreInValueModel, ValueModel } from "@coolon/pectin";
|
|
4
5
|
import { TableVirtualScrollDataSource } from "ng-table-virtual-scroll";
|
|
5
6
|
import { ResizeAwareComponent } from "../../../resize-aware.component";
|
|
6
7
|
import { AbstractTableModel } from "../../abstract-table-model";
|
|
@@ -11,117 +12,6 @@ import * as i3 from "@angular/cdk/scrolling";
|
|
|
11
12
|
import * as i4 from "ng-table-virtual-scroll";
|
|
12
13
|
import * as i5 from "../table-cell/table-cell.component";
|
|
13
14
|
import * as i6 from "../table-header-cell/table-header-cell.component";
|
|
14
|
-
// /**
|
|
15
|
-
// * Virtual Scroll Strategy
|
|
16
|
-
// */
|
|
17
|
-
// export class CustomVirtualScrollStrategy extends FixedSizeVirtualScrollStrategy {
|
|
18
|
-
// protected readonly garbage = new GarbageCollector();
|
|
19
|
-
//
|
|
20
|
-
// constructor(rowHeight$: ValueModel<number>, minBufferPx: number, maxBufferPx: number) {
|
|
21
|
-
// super(rowHeight$.value, minBufferPx, maxBufferPx);
|
|
22
|
-
// const {chain, when} = Dsl.disposeWith(this.garbage);
|
|
23
|
-
// when(rowHeight$).changes(h => {
|
|
24
|
-
// this.updateItemAndBufferSize(h, minBufferPx, maxBufferPx);
|
|
25
|
-
// }, {initialValue: "triggerChangeUnlessNil"})
|
|
26
|
-
// }
|
|
27
|
-
// }
|
|
28
|
-
// export class VirtualScrollDataSource<Row> extends DataSource<Row> implements Disposable, Disposable.Collector {
|
|
29
|
-
//
|
|
30
|
-
// private garbage = new GarbageCollector();
|
|
31
|
-
//
|
|
32
|
-
// readonly virtualScrollRowRange$: ValueModelChain<{ start: number; end: number }>;
|
|
33
|
-
// readonly virtualScrollSpacerSize$: ValueModelChain<number>;
|
|
34
|
-
// readonly totalContentSize$: ValueModelChain<number>;
|
|
35
|
-
// readonly showVirtualScrollOffset: (index: number, rowData: any) => boolean;
|
|
36
|
-
//
|
|
37
|
-
// protected readonly virtualRowsObservable$ = new BehaviorSubject<readonly Row[]>([]);
|
|
38
|
-
// private readonly virtualScrollPixelOffset$ = new MutableValueModel<number>(0);
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
// constructor(readonly viewport: CdkVirtualScrollViewport, data$:ListModel<Row>, readonly rowHeight$:ValueModel<number>, pageSize$: ValueModel<number>) {
|
|
42
|
-
// super();
|
|
43
|
-
// const {chain, when, observe} = Dsl.disposeWith(this);
|
|
44
|
-
//
|
|
45
|
-
// observe.valuesFrom(viewport.elementScrolled()).subscribe((ev: Event) => {
|
|
46
|
-
// this.virtualScrollPixelOffset$.value = (ev.currentTarget as any).scrollTop;
|
|
47
|
-
// });
|
|
48
|
-
//
|
|
49
|
-
// this.virtualScrollRowRange$ = chain(this.virtualScrollPixelOffset$).map(rawPixelOffset => {
|
|
50
|
-
// const startIndex = Math.floor(rawPixelOffset / this.rowHeight$.value);
|
|
51
|
-
// console.log(rawPixelOffset, startIndex)
|
|
52
|
-
// // const prevExtraData = startIndex > 5 ? 5 : 0;
|
|
53
|
-
// const prevExtraData = 0;
|
|
54
|
-
// // return rows.slice(startIndex - prevExtraData, startIndex + (pageSize$.value - prevExtraData));
|
|
55
|
-
// return {
|
|
56
|
-
// start: startIndex - prevExtraData,
|
|
57
|
-
// end: startIndex + (pageSize$.value - prevExtraData)
|
|
58
|
-
// }
|
|
59
|
-
// }, {
|
|
60
|
-
// dependsOn: [this.rowHeight$, pageSize$],
|
|
61
|
-
// postponeWhile: chain.numericValue(pageSize$).isLessThan(1),
|
|
62
|
-
// changed: (is, was) => {
|
|
63
|
-
// return was?.start !== is?.start || was?.end !== is?.end
|
|
64
|
-
// }
|
|
65
|
-
// })
|
|
66
|
-
//
|
|
67
|
-
// this.virtualScrollSpacerSize$ = chain(this.virtualScrollRowRange$).map(range => {
|
|
68
|
-
// const pixelOffset = this.rowHeight$.value * range.start;
|
|
69
|
-
// return pixelOffset;
|
|
70
|
-
// }, { dependsOn: this.rowHeight$})
|
|
71
|
-
//
|
|
72
|
-
// this.totalContentSize$ = chain(data$).count().map(rowCount => {
|
|
73
|
-
// return this.rowHeight$.value * rowCount
|
|
74
|
-
// }, {dependsOn: rowHeight$})
|
|
75
|
-
//
|
|
76
|
-
// chain(this.virtualScrollRowRange$).mapToList(range => {
|
|
77
|
-
// return data$.value.slice(range.start, range.end);
|
|
78
|
-
// }, {
|
|
79
|
-
// dependsOn: data$
|
|
80
|
-
// }).subscribe(visibleRows => {
|
|
81
|
-
// console.log(visibleRows)
|
|
82
|
-
// this.virtualRowsObservable$.next(visibleRows)
|
|
83
|
-
// });
|
|
84
|
-
//
|
|
85
|
-
// when(this.virtualScrollSpacerSize$).changes(scrollTop => {
|
|
86
|
-
// viewport.setRenderedContentOffset(scrollTop, "to-start");
|
|
87
|
-
// }, {initialValue: "triggerChangeUnlessNil"});
|
|
88
|
-
//
|
|
89
|
-
// when(this.totalContentSize$).changes(totalSize => {
|
|
90
|
-
// viewport.setTotalContentSize(totalSize);
|
|
91
|
-
// }, {initialValue: "triggerChangeUnlessNil"});
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
// this.showVirtualScrollOffset = (index: number, rowData: any): boolean => {
|
|
95
|
-
// const haveScrolled = this.virtualScrollSpacerSize$.value > 0;
|
|
96
|
-
// const firstRow = index === 0;
|
|
97
|
-
// return index === 0 && haveScrolled
|
|
98
|
-
// };
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
// }
|
|
103
|
-
//
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
// dispose(): void {
|
|
107
|
-
// this.garbage.dispose();
|
|
108
|
-
// }
|
|
109
|
-
//
|
|
110
|
-
// registerDisposable<T extends Disposable>(disposable: T): T {
|
|
111
|
-
// return this.garbage.registerDisposable(disposable);
|
|
112
|
-
// }
|
|
113
|
-
//
|
|
114
|
-
//
|
|
115
|
-
// connect(collectionViewer: CollectionViewer): Observable<readonly Row[]> {
|
|
116
|
-
// return this.virtualRowsObservable$;
|
|
117
|
-
// }
|
|
118
|
-
//
|
|
119
|
-
// disconnect(collectionViewer: CollectionViewer): void {
|
|
120
|
-
// // noop
|
|
121
|
-
// }
|
|
122
|
-
//
|
|
123
|
-
//
|
|
124
|
-
// }
|
|
125
15
|
export const AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER = new InjectionToken("AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER");
|
|
126
16
|
export class TableRowAttributesDirective {
|
|
127
17
|
elementRef;
|
|
@@ -166,14 +56,17 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
166
56
|
#scrollMode_accessor_storage = "none";
|
|
167
57
|
get scrollMode() { return this.#scrollMode_accessor_storage; }
|
|
168
58
|
set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
|
|
59
|
+
scrollViewport;
|
|
169
60
|
columns$;
|
|
170
61
|
columnIds$;
|
|
171
62
|
columnsById$;
|
|
172
63
|
// TODO: support user defined header and row heights via css vars.
|
|
173
|
-
headerHeight$ = new MutableValueModel(
|
|
174
|
-
rowHeight$ = new MutableValueModel(
|
|
64
|
+
headerHeight$ = new MutableValueModel(48);
|
|
65
|
+
rowHeight$ = new MutableValueModel(44);
|
|
175
66
|
baseCssClass = "aup-table-component";
|
|
176
67
|
virtualScrollDataSource = new TableVirtualScrollDataSource();
|
|
68
|
+
virtualScrollActive$ = new MutableValueModel(false);
|
|
69
|
+
scrollTimeout;
|
|
177
70
|
constructor(bufferMultiplier = 1) {
|
|
178
71
|
super();
|
|
179
72
|
this.bufferMultiplier = bufferMultiplier;
|
|
@@ -181,23 +74,11 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
181
74
|
const actualHeaderHeight$ = chain(this.showHeader$).map(show => {
|
|
182
75
|
return show ? this.headerHeight$.value : 0;
|
|
183
76
|
}, { dependsOn: this.headerHeight$ });
|
|
184
|
-
//
|
|
185
|
-
//
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
// // TODO: this doesn't take into account any css styling adjustments etc. Will investigate if it's an issue.
|
|
190
|
-
// const rawRowCount = (bounds.height - actualHeaderHeight$.value) / this.rowHeight$.value;
|
|
191
|
-
// return rawRowCount < 1 ? 0 : Math.floor(rawRowCount);
|
|
192
|
-
// }, {
|
|
193
|
-
// dependsOn: [actualHeaderHeight$, this.rowHeight$],
|
|
194
|
-
// postponeWhile: chain(this.bounds$).pluckNumeric("height").isLessThan(1)
|
|
195
|
-
// });
|
|
196
|
-
// // const pageSize$ = chain(visibleRowCount$)
|
|
197
|
-
// // .map(count => 2 * count).otherwise(0)
|
|
198
|
-
// const pageSize$ = ValueModel.constant(12)
|
|
199
|
-
when(this.data$).changes(is => {
|
|
200
|
-
this.virtualScrollDataSource.data = is;
|
|
77
|
+
// performance is terrible if the data changes while we're scrolling, so we postpone updates until
|
|
78
|
+
// scrolling stops.
|
|
79
|
+
const delayedDatea$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
|
|
80
|
+
when(delayedDatea$).changes(delatedData => {
|
|
81
|
+
this.virtualScrollDataSource.data = delatedData;
|
|
201
82
|
this.scheduleTableHeightCheck();
|
|
202
83
|
}, { initialValue: "evaluate" });
|
|
203
84
|
this.onInit(() => {
|
|
@@ -205,15 +86,29 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
205
86
|
this.columnIds$ = chain(this.columns$).pluck("columnId");
|
|
206
87
|
this.columnsById$ = chain(this.columns$).indexBy('columnId');
|
|
207
88
|
});
|
|
208
|
-
const txo = new TransactionObserver({
|
|
89
|
+
// const txo = new TransactionObserver({verbose: false}).onEvent(e => console.log(e.name, e.payload));
|
|
209
90
|
// txo.observe('this.virtualScrollRowRange$', this.virtualScrollRowRange$);
|
|
210
91
|
// txo.observe('this.virtualScrollSpacerSize$', this.virtualScrollSpacerSize$);
|
|
211
92
|
// txo.observe('this.virtualRows$', this.virtualRows$);
|
|
212
93
|
// txo.observe('this.tableBodyHeight$', this.tableBodyHeight$);
|
|
94
|
+
// txo.observe('this.virtualScrollActive$', this.virtualScrollActive$);
|
|
95
|
+
}
|
|
96
|
+
ngAfterViewInit() {
|
|
97
|
+
super.ngAfterViewInit();
|
|
98
|
+
if (this.scrollViewport) {
|
|
99
|
+
const { observe } = Dsl.disposeWith(this);
|
|
100
|
+
this.scrollViewport.elementScrolled().subscribe(() => this.notifyScrolled());
|
|
101
|
+
}
|
|
213
102
|
}
|
|
214
103
|
get hideHeader() {
|
|
215
104
|
return !this.showHeader;
|
|
216
105
|
}
|
|
106
|
+
get headerHeightCssVar() {
|
|
107
|
+
return `${this.headerHeight$.value}px`;
|
|
108
|
+
}
|
|
109
|
+
get rowHeightCssVar() {
|
|
110
|
+
return `${this.rowHeight$.value}px`;
|
|
111
|
+
}
|
|
217
112
|
isEditing(row) {
|
|
218
113
|
return !!this.tableModel.getEditSessionFor(row);
|
|
219
114
|
}
|
|
@@ -252,8 +147,20 @@ export class TableBodyComponent extends ResizeAwareComponent {
|
|
|
252
147
|
}
|
|
253
148
|
}, waitMillis);
|
|
254
149
|
}
|
|
150
|
+
notifyScrolled() {
|
|
151
|
+
this.virtualScrollActive$.value = true;
|
|
152
|
+
this.clearScrollTimeout();
|
|
153
|
+
this.scrollTimeout = setTimeout(() => {
|
|
154
|
+
return this.virtualScrollActive$.value = false;
|
|
155
|
+
}, 200);
|
|
156
|
+
}
|
|
157
|
+
clearScrollTimeout() {
|
|
158
|
+
if (this.scrollTimeout) {
|
|
159
|
+
clearTimeout(this.scrollTimeout);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
255
162
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, deps: [{ token: AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
256
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableBodyComponent, selector: "aup-table-body", inputs: { data$: "data$", tableModel: "tableModel", showHeader$: "showHeader$", showHeader: "showHeader", trackBy: "trackBy", scrollMode$: "scrollMode$", scrollMode: "scrollMode" }, host: { properties: { "attr.scrollMode": "this.scrollMode", "class": "this.baseCssClass", "class.hide-header": "this.hideHeader" } }, usesInheritance: true, ngImport: i0, template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"
|
|
163
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableBodyComponent, selector: "aup-table-body", inputs: { data$: "data$", tableModel: "tableModel", showHeader$: "showHeader$", showHeader: "showHeader", trackBy: "trackBy", scrollMode$: "scrollMode$", scrollMode: "scrollMode" }, host: { properties: { "attr.scrollMode": "this.scrollMode", "class": "this.baseCssClass", "class.hide-header": "this.hideHeader", "style.--aup-table-header-height": "this.headerHeightCssVar", "style.--aup-table-row-height": "this.rowHeightCssVar" } }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, ngImport: i0, template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i2.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i4.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "directive", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: ["aupTableRowAttributes"] }, { kind: "component", type: i5.TableCellComponent, selector: "aup-table-cell", inputs: ["row", "column", "editSession", "tableModel"] }, { kind: "component", type: i6.TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: ["column"] }] });
|
|
257
164
|
}
|
|
258
165
|
__decorate([
|
|
259
166
|
Proxify(),
|
|
@@ -281,7 +188,7 @@ __decorate([
|
|
|
281
188
|
], TableBodyComponent.prototype, "scrollMode", null);
|
|
282
189
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, decorators: [{
|
|
283
190
|
type: Component,
|
|
284
|
-
args: [{ selector: "aup-table-body", template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"
|
|
191
|
+
args: [{ selector: "aup-table-body", template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"] }]
|
|
285
192
|
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
286
193
|
type: Inject,
|
|
287
194
|
args: [AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER]
|
|
@@ -304,11 +211,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
|
|
|
304
211
|
}, {
|
|
305
212
|
type: HostBinding,
|
|
306
213
|
args: ["attr.scrollMode"]
|
|
214
|
+
}], scrollViewport: [{
|
|
215
|
+
type: ViewChild,
|
|
216
|
+
args: [CdkVirtualScrollViewport]
|
|
307
217
|
}], baseCssClass: [{
|
|
308
218
|
type: HostBinding,
|
|
309
219
|
args: ["class"]
|
|
310
220
|
}], hideHeader: [{
|
|
311
221
|
type: HostBinding,
|
|
312
222
|
args: ["class.hide-header"]
|
|
223
|
+
}], headerHeightCssVar: [{
|
|
224
|
+
type: HostBinding,
|
|
225
|
+
args: ["style.--aup-table-header-height"]
|
|
226
|
+
}], rowHeightCssVar: [{
|
|
227
|
+
type: HostBinding,
|
|
228
|
+
args: ["style.--aup-table-row-height"]
|
|
313
229
|
}] } });
|
|
314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlcy9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvcmVuZGVyZXIvdGFibGUtYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFNQSxPQUFPLEVBR0wsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQ2hDLFdBQVcsRUFBRSxNQUFNLEVBQ1gsY0FBYyxFQUN0QixLQUFLLEVBQ0csUUFBUSxFQUdqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsR0FBRyxFQUVILFNBQVMsRUFHVCxpQkFBaUIsRUFDakIsT0FBTyxFQUNQLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLFVBQVUsRUFFWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXJFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQUc5RCxNQUFNO0FBQ04sNkJBQTZCO0FBQzdCLE1BQU07QUFDTixvRkFBb0Y7QUFDcEYseURBQXlEO0FBQ3pELEVBQUU7QUFDRiw0RkFBNEY7QUFDNUYseURBQXlEO0FBQ3pELDJEQUEyRDtBQUMzRCxzQ0FBc0M7QUFDdEMsbUVBQW1FO0FBQ25FLG1EQUFtRDtBQUNuRCxNQUFNO0FBQ04sSUFBSTtBQUdKLGtIQUFrSDtBQUNsSCxFQUFFO0FBQ0YsOENBQThDO0FBQzlDLEVBQUU7QUFDRixzRkFBc0Y7QUFDdEYsZ0VBQWdFO0FBQ2hFLHlEQUF5RDtBQUN6RCxnRkFBZ0Y7QUFDaEYsRUFBRTtBQUNGLHlGQUF5RjtBQUN6RixtRkFBbUY7QUFDbkYsRUFBRTtBQUNGLEVBQUU7QUFDRiw0SkFBNEo7QUFDNUosZUFBZTtBQUNmLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLG9GQUFvRjtBQUNwRixVQUFVO0FBQ1YsRUFBRTtBQUNGLGtHQUFrRztBQUNsRywrRUFBK0U7QUFDL0UsZ0RBQWdEO0FBQ2hELHlEQUF5RDtBQUN6RCxpQ0FBaUM7QUFDakMsMEdBQTBHO0FBQzFHLGlCQUFpQjtBQUNqQiw2Q0FBNkM7QUFDN0MsOERBQThEO0FBQzlELFVBQVU7QUFDVixXQUFXO0FBQ1gsaURBQWlEO0FBQ2pELG9FQUFvRTtBQUNwRSxnQ0FBZ0M7QUFDaEMsa0VBQWtFO0FBQ2xFLFVBQVU7QUFDVixTQUFTO0FBQ1QsRUFBRTtBQUNGLHdGQUF3RjtBQUN4RixpRUFBaUU7QUFDakUsNEJBQTRCO0FBQzVCLHdDQUF3QztBQUN4QyxFQUFFO0FBQ0Ysc0VBQXNFO0FBQ3RFLGdEQUFnRDtBQUNoRCxrQ0FBa0M7QUFDbEMsRUFBRTtBQUNGLDhEQUE4RDtBQUM5RCwwREFBMEQ7QUFDMUQsV0FBVztBQUNYLHlCQUF5QjtBQUN6QixvQ0FBb0M7QUFDcEMsaUNBQWlDO0FBQ2pDLHNEQUFzRDtBQUN0RCxVQUFVO0FBQ1YsRUFBRTtBQUNGLGlFQUFpRTtBQUNqRSxrRUFBa0U7QUFDbEUsb0RBQW9EO0FBQ3BELEVBQUU7QUFDRiwwREFBMEQ7QUFDMUQsaURBQWlEO0FBQ2pELG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsRUFBRTtBQUNGLGlGQUFpRjtBQUNqRixzRUFBc0U7QUFDdEUsc0NBQXNDO0FBQ3RDLDJDQUEyQztBQUMzQyxTQUFTO0FBQ1QsRUFBRTtBQUNGLEVBQUU7QUFDRixFQUFFO0FBQ0YsTUFBTTtBQUNOLEVBQUU7QUFDRixFQUFFO0FBQ0YsRUFBRTtBQUNGLHNCQUFzQjtBQUN0Qiw4QkFBOEI7QUFDOUIsTUFBTTtBQUNOLEVBQUU7QUFDRixpRUFBaUU7QUFDakUsMERBQTBEO0FBQzFELE1BQU07QUFDTixFQUFFO0FBQ0YsRUFBRTtBQUNGLDhFQUE4RTtBQUM5RSwwQ0FBMEM7QUFDMUMsTUFBTTtBQUNOLEVBQUU7QUFDRiwyREFBMkQ7QUFDM0QsY0FBYztBQUNkLE1BQU07QUFDTixFQUFFO0FBQ0YsRUFBRTtBQUNGLElBQUk7QUFFSixNQUFNLENBQUMsTUFBTSwwQ0FBMEMsR0FBRyxJQUFJLGNBQWMsQ0FBUyw0Q0FBNEMsQ0FBQyxDQUFBO0FBTWxJLE1BQU0sT0FBTywyQkFBMkI7SUFLUDtJQUYvQixxQkFBcUIsQ0FBd0I7SUFFN0MsWUFBK0IsVUFBbUM7UUFBbkMsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7SUFDbEUsQ0FBQztJQUVELFFBQVE7UUFDTixLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3BGO0lBQ0gsQ0FBQzt1R0FaVSwyQkFBMkI7MkZBQTNCLDJCQUEyQjs7MkZBQTNCLDJCQUEyQjtrQkFIdkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUseUJBQXlCO2lCQUNwQztpR0FJQyxxQkFBcUI7c0JBRHBCLEtBQUs7O0FBd0JSLE1BQU0sT0FBTyxrQkFBd0IsU0FBUSxvQkFBb0I7SUF1Q3VCO0lBcEM3RSwwQkFBUSxPQUFPLENBQUMsQ0FBQSxTQUFjLENBQUEsQ0FBQyxDQUFDO0lBQWhDLElBQUEsS0FBSywyQ0FBMkI7SUFBaEMsSUFBQSxLQUFLLGlEQUEyQjtJQUdoQywrQkFBYSxPQUFPLENBQUMsQ0FBQSxrQkFBdUIsQ0FBQSxDQUFDLENBQUM7SUFBOUMsSUFBQSxVQUFVLGdEQUFvQztJQUE5QyxJQUFBLFVBQVUsc0RBQW9DO0lBRzlDLGdDQUFjLE9BQU8sQ0FBQyxDQUFBLFVBQW1CLENBQUEsQ0FBQyxDQUFDO0lBQTNDLElBQUEsV0FBVyxpREFBZ0M7SUFBM0MsSUFBQSxXQUFXLHVEQUFnQztJQUczQywrQkFBYSxJQUFJLENBQUM7SUFBbEIsSUFBQSxVQUFVLGdEQUFRO0lBQWxCLElBQUEsVUFBVSxzREFBUTtJQUczQixPQUFPLENBQW1DO0lBR2pDLGdDQUF5RCxPQUFPLENBQUMsQ0FBQSxVQUF5QyxDQUFBLENBQUMsQ0FBQztJQUE1RyxJQUFBLFdBQVcsaURBQWlHO0lBQTVHLElBQUEsV0FBVyx1REFBaUc7SUFJNUcsK0JBQTRDLE1BQU0sQ0FBQztJQUFuRCxJQUFBLFVBQVUsZ0RBQXlDO0lBQW5ELElBQUEsVUFBVSxzREFBeUM7SUFFNUQsUUFBUSxDQUFtQztJQUMzQyxVQUFVLENBQXlCO0lBRTNCLFlBQVksQ0FBMEM7SUFHOUQsa0VBQWtFO0lBQy9DLGFBQWEsR0FBRyxJQUFJLGlCQUFpQixDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzNELFVBQVUsR0FBRyxJQUFJLGlCQUFpQixDQUFTLEVBQUUsQ0FBQyxDQUFDO0lBR3pELFlBQVksR0FBRyxxQkFBcUIsQ0FBQztJQUUzQix1QkFBdUIsR0FBRyxJQUFJLDRCQUE0QixFQUFPLENBQUM7SUFFNUUsWUFBc0YsbUJBQTBCLENBQUM7UUFDL0csS0FBSyxFQUFFLENBQUM7UUFENEUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFXO1FBRS9HLE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckQsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBQyxDQUFDLENBQUM7UUFFcEMsOERBQThEO1FBQzlELHVEQUF1RDtRQUN2RCx1Q0FBdUM7UUFDdkMsbUJBQW1CO1FBR25CLCtEQUErRDtRQUMvRCxpSEFBaUg7UUFDakgsNkZBQTZGO1FBQzdGLDBEQUEwRDtRQUMxRCxPQUFPO1FBQ1AsdURBQXVEO1FBQ3ZELDRFQUE0RTtRQUM1RSxNQUFNO1FBRU4sK0NBQStDO1FBQy9DLDZDQUE2QztRQUM3Qyw0Q0FBNEM7UUFHNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEMsQ0FBQyxFQUFFLEVBQUMsWUFBWSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7UUFHOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sR0FBRyxHQUFHLElBQUksbUJBQW1CLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbkcsMkVBQTJFO1FBQzNFLCtFQUErRTtRQUMvRSx1REFBdUQ7UUFDdkQsK0RBQStEO0lBRWpFLENBQUM7SUFFRCxJQUNJLFVBQVU7UUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVE7UUFDaEIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsV0FBNkIsRUFBRSxHQUFRO1FBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxXQUFXO0lBRVgsb0JBQW9CLENBQUMsUUFBZ0I7UUFDbkMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEtBQUssUUFBUSxDQUFDO0lBQ2xGLENBQUM7SUFFRCxXQUFXO0lBRVgsbUJBQW1CLENBQUMsUUFBZ0I7UUFDbEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEtBQUssUUFBUSxDQUFDO0lBQ2pGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUMvQixNQUFNLE9BQU8sR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztTQUN0QztRQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUNyQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsRUFBRTtRQUM5QyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBZ0IsQ0FBQztZQUNsRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtnQkFDL0QsNkNBQTZDO2dCQUM3QyxxSkFBcUo7Z0JBQ3JKLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxVQUFVLEdBQUcsR0FBRyxFQUFFO29CQUNwQixJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2lCQUNoRDthQUNGO1FBQ0gsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ2hCLENBQUM7dUdBeElVLGtCQUFrQixrQkF1Q1QsMENBQTBDOzJGQXZDbkQsa0JBQWtCLHlZQ3hML0IseThIQWdGQSw2akVEOEVhLDJCQUEyQjs7QUE2QjdCO0lBREMsT0FBTyxFQUFFOzsrQ0FDc0I7QUFHaEM7SUFEQyxPQUFPLEVBQUU7O29EQUNvQztBQUc5QztJQURDLE9BQU8sRUFBRTs7cURBQ2lDO0FBRzNDO0lBREMsaUJBQWlCLEVBQUU7O29EQUNGO0FBTWxCO0lBREMsT0FBTyxFQUFFOzhCQUNHLFVBQVU7cURBQXFGO0FBSTVHO0lBRkMsaUJBQWlCLEVBQUU7O29EQUUrQjsyRkF0QmpELGtCQUFrQjtrQkFWOUIsU0FBUzsrQkFDRSxnQkFBZ0I7OzBCQWdEYixNQUFNOzJCQUFDLDBDQUEwQzs7MEJBQUcsUUFBUTs0Q0FwQ2hFLEtBQUs7c0JBRGIsS0FBSztnQkFJRyxVQUFVO3NCQURsQixLQUFLO2dCQUlHLFdBQVc7c0JBRG5CLEtBQUs7Z0JBSUcsVUFBVTtzQkFEbEIsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSUcsV0FBVztzQkFEbkIsS0FBSztnQkFLRyxVQUFVO3NCQUZsQixLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGlCQUFpQjtnQkFjOUIsWUFBWTtzQkFEWCxXQUFXO3VCQUFDLE9BQU87Z0JBc0RoQixVQUFVO3NCQURiLFdBQVc7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb2xsZWN0aW9uVmlld2VyLCBEYXRhU291cmNlfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zXCI7XG5pbXBvcnQge1xuICBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsXG4gIEZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxTdHJhdGVneSxcbiAgVklSVFVBTF9TQ1JPTExfU1RSQVRFR1lcbn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9zY3JvbGxpbmdcIjtcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsIEluamVjdCxcbiAgaW5qZWN0LCBJbmplY3Rpb25Ub2tlbixcbiAgSW5wdXQsXG4gIE9uSW5pdCwgT3B0aW9uYWwsXG4gIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIERpc3Bvc2FibGUsXG4gIERzbCxcbiAgR2FyYmFnZUNvbGxlY3RvcixcbiAgTGlzdE1vZGVsLFxuICBMaXN0TW9kZWxDaGFpbiwgTG9nZ2VyLFxuICBNYXBNb2RlbENoYWluLFxuICBNdXRhYmxlVmFsdWVNb2RlbCxcbiAgUHJveGlmeSxcbiAgcHJveGlmeSxcbiAgU3RvcmVJblZhbHVlTW9kZWwsIFRyYWNlLFxuICBUcmFuc2FjdGlvbk9ic2VydmVyLFxuICBWYWx1ZU1vZGVsLFxuICBWYWx1ZU1vZGVsQ2hhaW5cbn0gZnJvbSBcIkBjb29sb24vcGVjdGluXCI7XG5pbXBvcnQge1RhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2V9IGZyb20gXCJuZy10YWJsZS12aXJ0dWFsLXNjcm9sbFwiO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1Jlc2l6ZUF3YXJlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vcmVzaXplLWF3YXJlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtBYnN0cmFjdFRhYmxlTW9kZWx9IGZyb20gXCIuLi8uLi9hYnN0cmFjdC10YWJsZS1tb2RlbFwiO1xuaW1wb3J0IHtDb2x1bW5Nb2RlbH0gZnJvbSBcIi4uLy4uL2NvbHVtbi9jb2x1bW4tbW9kZWxcIjtcblxuLy8gLyoqXG4vLyAgKiBWaXJ0dWFsIFNjcm9sbCBTdHJhdGVneVxuLy8gICovXG4vLyBleHBvcnQgY2xhc3MgQ3VzdG9tVmlydHVhbFNjcm9sbFN0cmF0ZWd5IGV4dGVuZHMgRml4ZWRTaXplVmlydHVhbFNjcm9sbFN0cmF0ZWd5IHtcbi8vICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdhcmJhZ2UgPSBuZXcgR2FyYmFnZUNvbGxlY3RvcigpO1xuLy9cbi8vICAgY29uc3RydWN0b3Iocm93SGVpZ2h0JDogVmFsdWVNb2RlbDxudW1iZXI+LCBtaW5CdWZmZXJQeDogbnVtYmVyLCBtYXhCdWZmZXJQeDogbnVtYmVyKSB7XG4vLyAgICAgc3VwZXIocm93SGVpZ2h0JC52YWx1ZSwgbWluQnVmZmVyUHgsIG1heEJ1ZmZlclB4KTtcbi8vICAgICBjb25zdCB7Y2hhaW4sIHdoZW59ID0gRHNsLmRpc3Bvc2VXaXRoKHRoaXMuZ2FyYmFnZSk7XG4vLyAgICAgd2hlbihyb3dIZWlnaHQkKS5jaGFuZ2VzKGggPT4ge1xuLy8gICAgICAgdGhpcy51cGRhdGVJdGVtQW5kQnVmZmVyU2l6ZShoLCBtaW5CdWZmZXJQeCwgbWF4QnVmZmVyUHgpO1xuLy8gICAgIH0sIHtpbml0aWFsVmFsdWU6IFwidHJpZ2dlckNoYW5nZVVubGVzc05pbFwifSlcbi8vICAgfVxuLy8gfVxuXG5cbi8vIGV4cG9ydCBjbGFzcyBWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZTxSb3c+IGV4dGVuZHMgRGF0YVNvdXJjZTxSb3c+IGltcGxlbWVudHMgRGlzcG9zYWJsZSwgRGlzcG9zYWJsZS5Db2xsZWN0b3Ige1xuLy9cbi8vICAgcHJpdmF0ZSBnYXJiYWdlID0gbmV3IEdhcmJhZ2VDb2xsZWN0b3IoKTtcbi8vXG4vLyAgIHJlYWRvbmx5IHZpcnR1YWxTY3JvbGxSb3dSYW5nZSQ6IFZhbHVlTW9kZWxDaGFpbjx7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0+O1xuLy8gICByZWFkb25seSB2aXJ0dWFsU2Nyb2xsU3BhY2VyU2l6ZSQ6IFZhbHVlTW9kZWxDaGFpbjxudW1iZXI+O1xuLy8gICByZWFkb25seSB0b3RhbENvbnRlbnRTaXplJDogVmFsdWVNb2RlbENoYWluPG51bWJlcj47XG4vLyAgIHJlYWRvbmx5IHNob3dWaXJ0dWFsU2Nyb2xsT2Zmc2V0OiAoaW5kZXg6IG51bWJlciwgcm93RGF0YTogYW55KSA9PiBib29sZWFuO1xuLy9cbi8vICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZpcnR1YWxSb3dzT2JzZXJ2YWJsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHJlYWRvbmx5IFJvd1tdPihbXSk7XG4vLyAgIHByaXZhdGUgcmVhZG9ubHkgdmlydHVhbFNjcm9sbFBpeGVsT2Zmc2V0JCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxudW1iZXI+KDApO1xuLy9cbi8vXG4vLyAgIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIGRhdGEkOkxpc3RNb2RlbDxSb3c+LCByZWFkb25seSByb3dIZWlnaHQkOlZhbHVlTW9kZWw8bnVtYmVyPiwgcGFnZVNpemUkOiBWYWx1ZU1vZGVsPG51bWJlcj4pIHtcbi8vICAgICBzdXBlcigpO1xuLy8gICAgIGNvbnN0IHtjaGFpbiwgd2hlbiwgb2JzZXJ2ZX0gPSBEc2wuZGlzcG9zZVdpdGgodGhpcyk7XG4vL1xuLy8gICAgIG9ic2VydmUudmFsdWVzRnJvbSh2aWV3cG9ydC5lbGVtZW50U2Nyb2xsZWQoKSkuc3Vic2NyaWJlKChldjogRXZlbnQpID0+IHtcbi8vICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFBpeGVsT2Zmc2V0JC52YWx1ZSA9IChldi5jdXJyZW50VGFyZ2V0IGFzIGFueSkuc2Nyb2xsVG9wO1xuLy8gICAgIH0pO1xuLy9cbi8vICAgICB0aGlzLnZpcnR1YWxTY3JvbGxSb3dSYW5nZSQgPSBjaGFpbih0aGlzLnZpcnR1YWxTY3JvbGxQaXhlbE9mZnNldCQpLm1hcChyYXdQaXhlbE9mZnNldCA9PiB7XG4vLyAgICAgICBjb25zdCBzdGFydEluZGV4ID0gTWF0aC5mbG9vcihyYXdQaXhlbE9mZnNldCAvIHRoaXMucm93SGVpZ2h0JC52YWx1ZSk7XG4vLyAgICAgICBjb25zb2xlLmxvZyhyYXdQaXhlbE9mZnNldCwgc3RhcnRJbmRleClcbi8vICAgICAgIC8vIGNvbnN0IHByZXZFeHRyYURhdGEgPSBzdGFydEluZGV4ID4gNSA/IDUgOiAwO1xuLy8gICAgICAgY29uc3QgcHJldkV4dHJhRGF0YSA9IDA7XG4vLyAgICAgICAvLyByZXR1cm4gcm93cy5zbGljZShzdGFydEluZGV4IC0gcHJldkV4dHJhRGF0YSwgc3RhcnRJbmRleCArIChwYWdlU2l6ZSQudmFsdWUgLSBwcmV2RXh0cmFEYXRhKSk7XG4vLyAgICAgICByZXR1cm4ge1xuLy8gICAgICAgICBzdGFydDogc3RhcnRJbmRleCAtIHByZXZFeHRyYURhdGEsXG4vLyAgICAgICAgIGVuZDogc3RhcnRJbmRleCArIChwYWdlU2l6ZSQudmFsdWUgLSBwcmV2RXh0cmFEYXRhKVxuLy8gICAgICAgfVxuLy8gICAgIH0sIHtcbi8vICAgICAgIGRlcGVuZHNPbjogW3RoaXMucm93SGVpZ2h0JCwgcGFnZVNpemUkXSxcbi8vICAgICAgIHBvc3Rwb25lV2hpbGU6IGNoYWluLm51bWVyaWNWYWx1ZShwYWdlU2l6ZSQpLmlzTGVzc1RoYW4oMSksXG4vLyAgICAgICBjaGFuZ2VkOiAoaXMsIHdhcykgPT4ge1xuLy8gICAgICAgICByZXR1cm4gd2FzPy5zdGFydCAhPT0gaXM/LnN0YXJ0IHx8IHdhcz8uZW5kICE9PSBpcz8uZW5kXG4vLyAgICAgICB9XG4vLyAgICAgfSlcbi8vXG4vLyAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsU3BhY2VyU2l6ZSQgPSBjaGFpbih0aGlzLnZpcnR1YWxTY3JvbGxSb3dSYW5nZSQpLm1hcChyYW5nZSA9PiB7XG4vLyAgICAgICBjb25zdCBwaXhlbE9mZnNldCA9IHRoaXMucm93SGVpZ2h0JC52YWx1ZSAqIHJhbmdlLnN0YXJ0O1xuLy8gICAgICAgcmV0dXJuIHBpeGVsT2Zmc2V0O1xuLy8gICAgIH0sIHsgZGVwZW5kc09uOiB0aGlzLnJvd0hlaWdodCR9KVxuLy9cbi8vICAgICB0aGlzLnRvdGFsQ29udGVudFNpemUkID0gY2hhaW4oZGF0YSQpLmNvdW50KCkubWFwKHJvd0NvdW50ID0+IHtcbi8vICAgICAgIHJldHVybiB0aGlzLnJvd0hlaWdodCQudmFsdWUgKiByb3dDb3VudFxuLy8gICAgIH0sIHtkZXBlbmRzT246IHJvd0hlaWdodCR9KVxuLy9cbi8vICAgICBjaGFpbih0aGlzLnZpcnR1YWxTY3JvbGxSb3dSYW5nZSQpLm1hcFRvTGlzdChyYW5nZSA9PiB7XG4vLyAgICAgICByZXR1cm4gZGF0YSQudmFsdWUuc2xpY2UocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4vLyAgICAgfSwge1xuLy8gICAgICAgZGVwZW5kc09uOiBkYXRhJFxuLy8gICAgIH0pLnN1YnNjcmliZSh2aXNpYmxlUm93cyA9PiB7XG4vLyAgICAgICBjb25zb2xlLmxvZyh2aXNpYmxlUm93cylcbi8vICAgICAgIHRoaXMudmlydHVhbFJvd3NPYnNlcnZhYmxlJC5uZXh0KHZpc2libGVSb3dzKVxuLy8gICAgIH0pO1xuLy9cbi8vICAgICB3aGVuKHRoaXMudmlydHVhbFNjcm9sbFNwYWNlclNpemUkKS5jaGFuZ2VzKHNjcm9sbFRvcCA9PiB7XG4vLyAgICAgICB2aWV3cG9ydC5zZXRSZW5kZXJlZENvbnRlbnRPZmZzZXQoc2Nyb2xsVG9wLCBcInRvLXN0YXJ0XCIpO1xuLy8gICAgIH0sIHtpbml0aWFsVmFsdWU6IFwidHJpZ2dlckNoYW5nZVVubGVzc05pbFwifSk7XG4vL1xuLy8gICAgIHdoZW4odGhpcy50b3RhbENvbnRlbnRTaXplJCkuY2hhbmdlcyh0b3RhbFNpemUgPT4ge1xuLy8gICAgICAgdmlld3BvcnQuc2V0VG90YWxDb250ZW50U2l6ZSh0b3RhbFNpemUpO1xuLy8gICAgIH0sIHtpbml0aWFsVmFsdWU6IFwidHJpZ2dlckNoYW5nZVVubGVzc05pbFwifSk7XG4vL1xuLy9cbi8vICAgICB0aGlzLnNob3dWaXJ0dWFsU2Nyb2xsT2Zmc2V0ID0gKGluZGV4OiBudW1iZXIsIHJvd0RhdGE6IGFueSk6IGJvb2xlYW4gPT4ge1xuLy8gICAgICAgY29uc3QgaGF2ZVNjcm9sbGVkID0gdGhpcy52aXJ0dWFsU2Nyb2xsU3BhY2VyU2l6ZSQudmFsdWUgPiAwO1xuLy8gICAgICAgY29uc3QgZmlyc3RSb3cgPSBpbmRleCA9PT0gMDtcbi8vICAgICAgIHJldHVybiBpbmRleCA9PT0gMCAmJiBoYXZlU2Nyb2xsZWRcbi8vICAgICB9O1xuLy9cbi8vXG4vL1xuLy8gICB9XG4vL1xuLy9cbi8vXG4vLyAgIGRpc3Bvc2UoKTogdm9pZCB7XG4vLyAgICAgdGhpcy5nYXJiYWdlLmRpc3Bvc2UoKTtcbi8vICAgfVxuLy9cbi8vICAgcmVnaXN0ZXJEaXNwb3NhYmxlPFQgZXh0ZW5kcyBEaXNwb3NhYmxlPihkaXNwb3NhYmxlOiBUKTogVCB7XG4vLyAgICAgcmV0dXJuIHRoaXMuZ2FyYmFnZS5yZWdpc3RlckRpc3Bvc2FibGUoZGlzcG9zYWJsZSk7XG4vLyAgIH1cbi8vXG4vL1xuLy8gICBjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXI6IENvbGxlY3Rpb25WaWV3ZXIpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IFJvd1tdPiB7XG4vLyAgICAgcmV0dXJuIHRoaXMudmlydHVhbFJvd3NPYnNlcnZhYmxlJDtcbi8vICAgfVxuLy9cbi8vICAgZGlzY29ubmVjdChjb2xsZWN0aW9uVmlld2VyOiBDb2xsZWN0aW9uVmlld2VyKTogdm9pZCB7XG4vLyAgICAgLy8gbm9vcFxuLy8gICB9XG4vL1xuLy9cbi8vIH1cblxuZXhwb3J0IGNvbnN0IEFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KFwiQVVQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0JVRkZFUl9NVUxUSVBMSUVSXCIpXG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIlthdXBUYWJsZVJvd0F0dHJpYnV0ZXNdXCIsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlUm93QXR0cmlidXRlc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KClcbiAgYXVwVGFibGVSb3dBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gdGhpcy5hdXBUYWJsZVJvd0F0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCB0aGlzLmF1cFRhYmxlUm93QXR0cmlidXRlc1thdHRyXSk7XG4gICAgfVxuICB9XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImF1cC10YWJsZS1ib2R5XCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGFibGUtYm9keS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGFibGUtYm9keS5jb21wb25lbnQuc2Nzc1wiXSxcbiAgLy8gcHJvdmlkZXJzOiBbe1xuICAvLyAgIHByb3ZpZGU6IFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLCB1c2VGYWN0b3J5OiAoKSA9PiB7XG4gIC8vICAgICByZXR1cm4gaW5qZWN0KFRhYmxlQm9keUNvbXBvbmVudCkudmlydHVhbFNjcm9sbFN0cmF0ZWd5XG4gIC8vICAgfVxuICAvLyB9XSxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5Q29tcG9uZW50PFJvdz4gZXh0ZW5kcyBSZXNpemVBd2FyZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciBkYXRhJCA9IHByb3hpZnkoTGlzdE1vZGVsPFJvdz4pO1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3IgdGFibGVNb2RlbCA9IHByb3hpZnkoQWJzdHJhY3RUYWJsZU1vZGVsPFJvdz4pO1xuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3Igc2hvd0hlYWRlciQgPSBwcm94aWZ5KFZhbHVlTW9kZWw8Ym9vbGVhbj4pO1xuXG4gIEBJbnB1dCgpIEBTdG9yZUluVmFsdWVNb2RlbCgpXG4gIGFjY2Vzc29yIHNob3dIZWFkZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHRyYWNrQnk6IChpbmRleDogbnVtYmVyLCBpdGVtOiBSb3cpID0+IGFueVxuXG4gIEBJbnB1dCgpIEBQcm94aWZ5KClcbiAgYWNjZXNzb3Igc2Nyb2xsTW9kZSQ6IFZhbHVlTW9kZWw8VGFibGVCb2R5Q29tcG9uZW50LlNjcm9sbE1vZGU+ID0gcHJveGlmeShWYWx1ZU1vZGVsPFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlPik7XG5cbiAgQElucHV0KCkgQFN0b3JlSW5WYWx1ZU1vZGVsKClcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci5zY3JvbGxNb2RlXCIpXG4gIGFjY2Vzc29yIHNjcm9sbE1vZGU6IFRhYmxlQm9keUNvbXBvbmVudC5TY3JvbGxNb2RlID0gXCJub25lXCI7XG5cbiAgY29sdW1ucyQ6IExpc3RNb2RlbENoYWluPENvbHVtbk1vZGVsPFJvdz4+O1xuICBjb2x1bW5JZHMkOiBMaXN0TW9kZWxDaGFpbjxzdHJpbmc+O1xuXG4gIHByaXZhdGUgY29sdW1uc0J5SWQkOiBNYXBNb2RlbENoYWluPHN0cmluZywgQ29sdW1uTW9kZWw8Um93Pj47XG5cblxuICAvLyBUT0RPOiBzdXBwb3J0IHVzZXIgZGVmaW5lZCBoZWFkZXIgYW5kIHJvdyBoZWlnaHRzIHZpYSBjc3MgdmFycy5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhlYWRlckhlaWdodCQgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWw8bnVtYmVyPigyOSk7XG4gIHByb3RlY3RlZCByb3dIZWlnaHQkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPG51bWJlcj4oNDApO1xuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzXCIpXG4gIGJhc2VDc3NDbGFzcyA9IFwiYXVwLXRhYmxlLWNvbXBvbmVudFwiO1xuXG4gIHByb3RlY3RlZCB2aXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZSA9IG5ldyBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlPFJvdz4oKTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUikgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIGJ1ZmZlck11bHRpcGxpZXI6bnVtYmVyID0gMSkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3Qge2NoYWluLCB3aGVuLCBvYnNlcnZlfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcblxuICAgIGNvbnN0IGFjdHVhbEhlYWRlckhlaWdodCQgPSBjaGFpbih0aGlzLnNob3dIZWFkZXIkKS5tYXAoc2hvdyA9PiB7XG4gICAgICByZXR1cm4gc2hvdyA/IHRoaXMuaGVhZGVySGVpZ2h0JC52YWx1ZSA6IDA7XG4gICAgfSwge2RlcGVuZHNPbjogdGhpcy5oZWFkZXJIZWlnaHQkfSk7XG5cbiAgICAvLyB0aGlzLnRhYmxlQm9keUhlaWdodCQgPSBjaGFpbih0aGlzLmJvdW5kcyQpLm1hcChib3VuZHMgPT4ge1xuICAgIC8vICAgcmV0dXJuIChib3VuZHMuaGVpZ2h0IC0gYWN0dWFsSGVhZGVySGVpZ2h0JC52YWx1ZSlcbiAgICAvLyB9LCB7ZGVwZW5kc09uOiBhY3R1YWxIZWFkZXJIZWlnaHQkfSlcbiAgICAvLyAgIC5vdGhlcndpc2UoMCk7XG5cblxuICAgIC8vIGNvbnN0IHZpc2libGVSb3dDb3VudCQgPSBjaGFpbih0aGlzLmJvdW5kcyQpLm1hcChib3VuZHMgPT4ge1xuICAgIC8vICAgLy8gVE9ETzogdGhpcyBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IGFueSBjc3Mgc3R5bGluZyBhZGp1c3RtZW50cyBldGMuICBXaWxsIGludmVzdGlnYXRlIGlmIGl0J3MgYW4gaXNzdWUuXG4gICAgLy8gICBjb25zdCByYXdSb3dDb3VudCA9IChib3VuZHMuaGVpZ2h0IC0gYWN0dWFsSGVhZGVySGVpZ2h0JC52YWx1ZSkgLyB0aGlzLnJvd0hlaWdodCQudmFsdWU7XG4gICAgLy8gICByZXR1cm4gcmF3Um93Q291bnQgPCAxID8gMCA6IE1hdGguZmxvb3IocmF3Um93Q291bnQpO1xuICAgIC8vIH0sIHtcbiAgICAvLyAgIGRlcGVuZHNPbjogW2FjdHVhbEhlYWRlckhlaWdodCQsIHRoaXMucm93SGVpZ2h0JF0sXG4gICAgLy8gICBwb3N0cG9uZVdoaWxlOiBjaGFpbih0aGlzLmJvdW5kcyQpLnBsdWNrTnVtZXJpYyhcImhlaWdodFwiKS5pc0xlc3NUaGFuKDEpXG4gICAgLy8gfSk7XG5cbiAgICAvLyAvLyBjb25zdCBwYWdlU2l6ZSQgPSBjaGFpbih2aXNpYmxlUm93Q291bnQkKVxuICAgIC8vIC8vICAgLm1hcChjb3VudCA9PiAyICogY291bnQpLm90aGVyd2lzZSgwKVxuICAgIC8vIGNvbnN0IHBhZ2VTaXplJCA9IFZhbHVlTW9kZWwuY29uc3RhbnQoMTIpXG5cblxuICAgIHdoZW4odGhpcy5kYXRhJCkuY2hhbmdlcyhpcyA9PiB7XG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxEYXRhU291cmNlLmRhdGEgPSBpcztcbiAgICAgIHRoaXMuc2NoZWR1bGVUYWJsZUhlaWdodENoZWNrKCk7XG4gICAgfSwge2luaXRpYWxWYWx1ZTogXCJldmFsdWF0ZVwifSlcblxuXG4gICAgdGhpcy5vbkluaXQoKCkgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5zJCA9IGNoYWluKHRoaXMudGFibGVNb2RlbC5jb2x1bW5zKTtcbiAgICAgIHRoaXMuY29sdW1uSWRzJCA9IGNoYWluKHRoaXMuY29sdW1ucyQpLnBsdWNrKFwiY29sdW1uSWRcIik7XG4gICAgICB0aGlzLmNvbHVtbnNCeUlkJCA9IGNoYWluKHRoaXMuY29sdW1ucyQpLmluZGV4QnkoJ2NvbHVtbklkJyk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0eG8gPSBuZXcgVHJhbnNhY3Rpb25PYnNlcnZlcih7dmVyYm9zZTogZmFsc2V9KS5vbkV2ZW50KGUgPT4gY29uc29sZS5sb2coZS5uYW1lLCBlLnBheWxvYWQpKTtcbiAgICAvLyB0eG8ub2JzZXJ2ZSgndGhpcy52aXJ0dWFsU2Nyb2xsUm93UmFuZ2UkJywgdGhpcy52aXJ0dWFsU2Nyb2xsUm93UmFuZ2UkKTtcbiAgICAvLyB0eG8ub2JzZXJ2ZSgndGhpcy52aXJ0dWFsU2Nyb2xsU3BhY2VyU2l6ZSQnLCB0aGlzLnZpcnR1YWxTY3JvbGxTcGFjZXJTaXplJCk7XG4gICAgLy8gdHhvLm9ic2VydmUoJ3RoaXMudmlydHVhbFJvd3MkJywgdGhpcy52aXJ0dWFsUm93cyQpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLnRhYmxlQm9keUhlaWdodCQnLCB0aGlzLnRhYmxlQm9keUhlaWdodCQpO1xuXG4gIH1cblxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5oaWRlLWhlYWRlclwiKVxuICBnZXQgaGlkZUhlYWRlcigpIHtcbiAgICByZXR1cm4gIXRoaXMuc2hvd0hlYWRlcjtcbiAgfVxuXG4gIGlzRWRpdGluZyhyb3c6IFJvdyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMudGFibGVNb2RlbC5nZXRFZGl0U2Vzc2lvbkZvcihyb3cpO1xuICB9XG5cbiAgbm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uTW9kZWw6IENvbHVtbk1vZGVsPFJvdz4sIHJvdzogUm93KSB7XG4gICAgdGhpcy50YWJsZU1vZGVsLl9ub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW5Nb2RlbCwgcm93KTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG5cbiAgaXNGaXJzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwuZmlyc3RWaXNpYmxlQ29sdW1uJC5xdWVyeSgpLnZhbHVlPy5jb2x1bW5JZCA9PT0gY29sdW1uSWQ7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuXG4gIGlzTGFzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwubGFzdFZpc2libGVDb2x1bW4kLnF1ZXJ5KCkudmFsdWU/LmNvbHVtbklkID09PSBjb2x1bW5JZDtcbiAgfVxuXG4gIGdldENvbHVtbkNsYXNzZXMoY29sdW1uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbYGF1cC1jb2wtJHt0aGlzLmNvbHVtbnNCeUlkJC5nZXQoY29sdW1uSWQpLmRhc2hlcmlzZWRDb2x1bW5JZH1gXTtcbiAgICBpZiAodGhpcy5pc0ZpcnN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChcImZpcnN0LXZpc2libGUtY29sdW1uXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xhc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkKSkge1xuICAgICAgY2xhc3Nlcy5wdXNoKFwibGFzdC12aXNpYmxlLWNvbHVtblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVGFibGVIZWlnaHRDaGVjayh3YWl0TWlsbGlzID0gNTApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHRib2R5ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcInRib2R5XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRib2R5Lm9mZnNldEhlaWdodDtcbiAgICAgIGlmICh0aGlzLmRhdGEkLmxlbmd0aCA+IDAgJiYgYm9keUhlaWdodCA8IHRoaXMucm93SGVpZ2h0JC52YWx1ZSkge1xuICAgICAgICAvLyBIYWNrcyB0byBnZXQgb3VyIHZpcnR1YWwgc2Nyb2xsIHRvIHJlcGFpbnRcbiAgICAgICAgLy8gTG9nZ2VyLmdldCh0aGlzKS5sb2coYHJvd0NvdW50PSR7dGhpcy5kYXRhJC5sZW5ndGh9LCBib2R5SGVpZ2h0PSR7Ym9keUhlaWdodH0gLT4gdmlydHVhbCB0YWJsZSBub3QgcmVuZGVyaW5nLCB0cmlnZ2VyaW5nIHJlc2l6ZSB0byBmb3JjZSByZXBhaW50YClcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gICAgICAgIGlmICh3YWl0TWlsbGlzIDwgNTAwKSB7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVRhYmxlSGVpZ2h0Q2hlY2sod2FpdE1pbGxpcyArIDUwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHdhaXRNaWxsaXMpXG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUYWJsZUJvZHlDb21wb25lbnQge1xuICBleHBvcnQgdHlwZSBTY3JvbGxNb2RlID0gXCJub25lXCIgfCBcImNsYXNzaWNcIiB8IFwidmlydHVhbFwiO1xuXG59XG4iLCJcbjxkaXYgY2xhc3M9XCJjbGFzc2ljLXNjcm9sbC1jb250YWluZXJcIiAqbmdJZj1cInNjcm9sbE1vZGUkLnZhbHVlICE9PSAndmlydHVhbCdcIj5cbiAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhJC52YWx1ZVwiIFt0cmFja0J5XT1cInRyYWNrQnlcIiBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJC52YWx1ZTsgaW5kZXggYXMgaW5kZXg7IGZpcnN0IGFzIGZpcnN0OyBsYXN0IGFzIGxhc3RcIlxuICAgICAgICAgICAgICAgICAgbWF0Q29sdW1uRGVmPVwie3tjb2x1bW4uY29sdW1uSWR9fVwiPlxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MuZmxleF09XCJjb2x1bW4uaXNGbGV4KClcIiBbY2xhc3MuaGlkZV09XCIhY29sdW1uLmlzVmlzaWJsZSgpXCI+XG4gICAgICAgIDxhdXAtdGFibGUtaGVhZGVyLWNlbGwgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWlkXT1cImNvbHVtbi5jb2x1bW5JZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoY29sdW1uLmNvbHVtbklkKVwiXG4gICAgICAgID48L2F1cC10YWJsZS1oZWFkZXItY2VsbD5cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgKGNsaWNrKT1cIm5vdGlmeUNlbGxDbGlja2VkKGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgW2NsYXNzLmVuYWJsZS1jdXJzb3JdPVwidGFibGVNb2RlbC5pc0N1cnNvckVuYWJsZWQoY29sdW1uKVwiXG4gICAgICAgICAgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCJcbiAgICAgICAgICBbY2xhc3MuaGlkZV09XCIhY29sdW1uLmlzVmlzaWJsZSgpXCJcbiAgICAgID5cbiAgICAgICAgPGF1cC10YWJsZS1jZWxsIFtjb2x1bW5dPVwiJGFueShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZU1vZGVsXT1cIiRhbnkodGFibGVNb2RlbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2VkaXRTZXNzaW9uXT1cIiRhbnkodGFibGVNb2RlbC5nZXRFZGl0U2Vzc2lvbkZvcihyb3cpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWlkXT1cImNvbHVtbi5jb2x1bW5JZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW4uY29sdW1uSWQpXCJcbiAgICAgICAgPjwvYXVwLXRhYmxlLWNlbGw+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5JZHMkLnZhbHVlOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBjb2x1bW5JZHMkLnZhbHVlOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgW25nQ2xhc3NdPVwidGFibGVNb2RlbC5nZXRSb3dDbGFzc2VzKHJvdylcIlxuICAgICAgICBbY2xhc3MuZW5hYmxlLWhvdmVyXT1cInRhYmxlTW9kZWwuaXNIb3ZlckVuYWJsZWQoKVwiXG4gICAgICAgIFthdXBUYWJsZVJvd0F0dHJpYnV0ZXNdPVwidGFibGVNb2RlbC5nZXRSb3dBdHRyaWJ1dGVzKHJvdylcIlxuICAgICAgICBbYXR0ci5hdXAtcm93LWlkXT1cInRyYWNrQnkoaSwgcm93KVwiXG4gICAgPjwvdHI+XG5cbiAgPC90YWJsZT5cbjwvZGl2PlxuXG48Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICAqbmdJZj1cInNjcm9sbE1vZGUkLnZhbHVlID09PSAndmlydHVhbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R2c0l0ZW1TaXplXT1cInJvd0hlaWdodCQudmFsdWVcIiBbaGVhZGVySGVpZ2h0XT1cImhlYWRlckhlaWdodCQudmFsdWVcIiBbYnVmZmVyTXVsdGlwbGllcl09XCJidWZmZXJNdWx0aXBsaWVyXCI+XG4gIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwidmlydHVhbFNjcm9sbERhdGFTb3VyY2VcIiBbdHJhY2tCeV09XCJ0cmFja0J5XCI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1ucyQudmFsdWU7IGluZGV4IGFzIGluZGV4OyBmaXJzdCBhcyBmaXJzdDsgbGFzdCBhcyBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7Y29sdW1uLmNvbHVtbklkfX1cIj5cbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCIgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiPlxuICAgICAgICA8YXVwLXRhYmxlLWhlYWRlci1jZWxsIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtaGVhZGVyLWNlbGw+XG4gICAgICA8L3RoPlxuICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIChjbGljayk9XCJub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW4sIHJvdylcIlxuICAgICAgICAgIFtjbGFzcy5lbmFibGUtY3Vyc29yXT1cInRhYmxlTW9kZWwuaXNDdXJzb3JFbmFibGVkKGNvbHVtbilcIlxuICAgICAgICAgIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiXG4gICAgICAgICAgW2NsYXNzLmhpZGVdPVwiIWNvbHVtbi5pc1Zpc2libGUoKVwiXG4gICAgICA+XG4gICAgICAgIDxhdXAtdGFibGUtY2VsbCBbY29sdW1uXT1cIiRhbnkoY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm93XT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFibGVNb2RlbF09XCIkYW55KHRhYmxlTW9kZWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0U2Vzc2lvbl09XCIkYW55KHRhYmxlTW9kZWwuZ2V0RWRpdFNlc3Npb25Gb3Iocm93KSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pZF09XCJjb2x1bW4uY29sdW1uSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoY29sdW1uLmNvbHVtbklkKVwiXG4gICAgICAgID48L2F1cC10YWJsZS1jZWxsPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uSWRzJC52YWx1ZTsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uSWRzJC52YWx1ZTsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInRhYmxlTW9kZWwuZ2V0Um93Q2xhc3Nlcyhyb3cpXCJcbiAgICAgICAgW2NsYXNzLmVuYWJsZS1ob3Zlcl09XCJ0YWJsZU1vZGVsLmlzSG92ZXJFbmFibGVkKClcIlxuICAgICAgICBbYXVwVGFibGVSb3dBdHRyaWJ1dGVzXT1cInRhYmxlTW9kZWwuZ2V0Um93QXR0cmlidXRlcyhyb3cpXCJcbiAgICAgICAgW2F0dHIuYXVwLXJvdy1pZF09XCJ0cmFja0J5KGksIHJvdylcIlxuICAgID48L3RyPlxuXG4gIDwvdGFibGU+XG48L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cblxuIl19
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdWktcG93ZXJ1cHMvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlcy9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvcmVuZGVyZXIvdGFibGUtYm9keS90YWJsZS1ib2R5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBRUwsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUVMLFFBQVEsRUFDUixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBR1QsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxPQUFPLEVBQ1AsaUJBQWlCLEVBRWpCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7OztBQUc5RCxNQUFNLENBQUMsTUFBTSwwQ0FBMEMsR0FBRyxJQUFJLGNBQWMsQ0FBUyw0Q0FBNEMsQ0FBQyxDQUFBO0FBTWxJLE1BQU0sT0FBTywyQkFBMkI7SUFLUDtJQUYvQixxQkFBcUIsQ0FBd0I7SUFFN0MsWUFBK0IsVUFBbUM7UUFBbkMs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QUFFOzsrQ0FDc0I7QUFHaEM7SUFEQyxPQUFPLEVBQUU7O29EQUNvQztBQUc5QztJQURDLE9BQU8sRUFBRTs7cURBQ2lDO0FBRzNDO0lBREMsaUJBQWlCLEVBQUU7O29EQUNGO0FBTWxCO0lBREMsT0FBTyxFQUFFOzhCQUNHLFVBQVU7cURBQXFGO0FBSTVHO0lBRkMsaUJBQWlCLEVBQUU7O29EQUUrQjsyRkF0QmpELGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0I7OzBCQWlEYixNQUFNOzJCQUFDLDBDQUEwQzs7MEJBQUcsUUFBUTs0Q0ExQ2hFLEtBQUs7c0JBRGIsS0FBSztnQkFJRyxVQUFVO3NCQURsQixLQUFLO2dCQUlHLFdBQVc7c0JBRG5CLEtBQUs7Z0JBSUcsVUFBVTtzQkFEbEIsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUs7Z0JBSUcsV0FBVztzQkFEbkIsS0FBSztnQkFLRyxVQUFVO3NCQUZsQixLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGlCQUFpQjtnQkFJOUIsY0FBYztzQkFEYixTQUFTO3VCQUFDLHdCQUF3QjtnQkFjbkMsWUFBWTtzQkFEWCxXQUFXO3VCQUFDLE9BQU87Z0JBa0RoQixVQUFVO3NCQURiLFdBQVc7dUJBQUMsbUJBQW1CO2dCQU01QixrQkFBa0I7c0JBRHJCLFdBQVc7dUJBQUMsaUNBQWlDO2dCQU0xQyxlQUFlO3NCQURsQixXQUFXO3VCQUFDLDhCQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBEc2wsXG4gIExpc3RNb2RlbCxcbiAgTGlzdE1vZGVsQ2hhaW4sXG4gIE1hcE1vZGVsQ2hhaW4sXG4gIE11dGFibGVWYWx1ZU1vZGVsLFxuICBQcm94aWZ5LFxuICBwcm94aWZ5LFxuICBTdG9yZUluVmFsdWVNb2RlbCxcbiAgVHJhbnNhY3Rpb25PYnNlcnZlcixcbiAgVmFsdWVNb2RlbFxufSBmcm9tIFwiQGNvb2xvbi9wZWN0aW5cIjtcbmltcG9ydCB7VGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZX0gZnJvbSBcIm5nLXRhYmxlLXZpcnR1YWwtc2Nyb2xsXCI7XG5pbXBvcnQge1Jlc2l6ZUF3YXJlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vcmVzaXplLWF3YXJlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtBYnN0cmFjdFRhYmxlTW9kZWx9IGZyb20gXCIuLi8uLi9hYnN0cmFjdC10YWJsZS1tb2RlbFwiO1xuaW1wb3J0IHtDb2x1bW5Nb2RlbH0gZnJvbSBcIi4uLy4uL2NvbHVtbi9jb2x1bW4tbW9kZWxcIjtcblxuZXhwb3J0IGNvbnN0IEFVUF9UQUJMRV9WSVJUVUFMX1NDUk9MTF9CVUZGRVJfTVVMVElQTElFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxudW1iZXI+KFwiQVVQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0JVRkZFUl9NVUxUSVBMSUVSXCIpXG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIlthdXBUYWJsZVJvd0F0dHJpYnV0ZXNdXCIsXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlUm93QXR0cmlidXRlc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KClcbiAgYXVwVGFibGVSb3dBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gdGhpcy5hdXBUYWJsZVJvd0F0dHJpYnV0ZXMpIHtcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCB0aGlzLmF1cFRhYmxlUm93QXR0cmlidXRlc1thdHRyXSk7XG4gICAgfVxuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhdXAtdGFibGUtYm9keVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL3RhYmxlLWJvZHkuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL3RhYmxlLWJvZHkuY29tcG9uZW50LnNjc3NcIl0sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keUNvbXBvbmVudDxSb3c+IGV4dGVuZHMgUmVzaXplQXdhcmVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblxuICBASW5wdXQoKSBAUHJveGlmeSgpXG4gIGFjY2Vzc29yIGRhdGEkID0gcHJveGlmeShMaXN0TW9kZWw8Um93Pik7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciB0YWJsZU1vZGVsID0gcHJveGlmeShBYnN0cmFjdFRhYmxlTW9kZWw8Um93Pik7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciBzaG93SGVhZGVyJCA9IHByb3hpZnkoVmFsdWVNb2RlbDxib29sZWFuPik7XG5cbiAgQElucHV0KCkgQFN0b3JlSW5WYWx1ZU1vZGVsKClcbiAgYWNjZXNzb3Igc2hvd0hlYWRlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgdHJhY2tCeTogKGluZGV4OiBudW1iZXIsIGl0ZW06IFJvdykgPT4gYW55XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciBzY3JvbGxNb2RlJDogVmFsdWVNb2RlbDxUYWJsZUJvZHlDb21wb25lbnQuU2Nyb2xsTW9kZT4gPSBwcm94aWZ5KFZhbHVlTW9kZWw8VGFibGVCb2R5Q29tcG9uZW50LlNjcm9sbE1vZGU+KTtcblxuICBASW5wdXQoKSBAU3RvcmVJblZhbHVlTW9kZWwoKVxuICBASG9zdEJpbmRpbmcoXCJhdHRyLnNjcm9sbE1vZGVcIilcbiAgYWNjZXNzb3Igc2Nyb2xsTW9kZTogVGFibGVCb2R5Q29tcG9uZW50LlNjcm9sbE1vZGUgPSBcIm5vbmVcIjtcblxuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydClcbiAgc2Nyb2xsVmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydFxuXG4gIGNvbHVtbnMkOiBMaXN0TW9kZWxDaGFpbjxDb2x1bW5Nb2RlbDxSb3c+PjtcbiAgY29sdW1uSWRzJDogTGlzdE1vZGVsQ2hhaW48c3RyaW5nPjtcblxuICBwcml2YXRlIGNvbHVtbnNCeUlkJDogTWFwTW9kZWxDaGFpbjxzdHJpbmcsIENvbHVtbk1vZGVsPFJvdz4+O1xuXG5cbiAgLy8gVE9ETzogc3VwcG9ydCB1c2VyIGRlZmluZWQgaGVhZGVyIGFuZCByb3cgaGVpZ2h0cyB2aWEgY3NzIHZhcnMuXG4gIHByb3RlY3RlZCByZWFkb25seSBoZWFkZXJIZWlnaHQkID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPG51bWJlcj4oNDgpO1xuICBwcm90ZWN0ZWQgcm93SGVpZ2h0JCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxudW1iZXI+KDQ0KTtcblxuICBASG9zdEJpbmRpbmcoXCJjbGFzc1wiKVxuICBiYXNlQ3NzQ2xhc3MgPSBcImF1cC10YWJsZS1jb21wb25lbnRcIjtcblxuICBwcm90ZWN0ZWQgdmlydHVhbFNjcm9sbERhdGFTb3VyY2UgPSBuZXcgVGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZTxSb3c+KCk7XG4gIHByaXZhdGUgdmlydHVhbFNjcm9sbEFjdGl2ZSQgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWwoZmFsc2UpO1xuICBwcml2YXRlIHNjcm9sbFRpbWVvdXQ6IGFueTtcblxuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoQVVQX1RBQkxFX1ZJUlRVQUxfU0NST0xMX0JVRkZFUl9NVUxUSVBMSUVSKSBAT3B0aW9uYWwoKSBwcm90ZWN0ZWQgYnVmZmVyTXVsdGlwbGllcjogbnVtYmVyID0gMSkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3Qge2NoYWluLCB3aGVuLCBvYnNlcnZlfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcblxuICAgIGNvbnN0IGFjdHVhbEhlYWRlckhlaWdodCQgPSBjaGFpbih0aGlzLnNob3dIZWFkZXIkKS5tYXAoc2hvdyA9PiB7XG4gICAgICByZXR1cm4gc2hvdyA/IHRoaXMuaGVhZGVySGVpZ2h0JC52YWx1ZSA6IDA7XG4gICAgfSwge2RlcGVuZHNPbjogdGhpcy5oZWFkZXJIZWlnaHQkfSk7XG5cblxuICAgIC8vIHBlcmZvcm1hbmNlIGlzIHRlcnJpYmxlIGlmIHRoZSBkYXRhIGNoYW5nZXMgd2hpbGUgd2UncmUgc2Nyb2xsaW5nLCBzbyB3ZSBwb3N0cG9uZSB1cGRhdGVzIHVudGlsXG4gICAgLy8gc2Nyb2xsaW5nIHN0b3BzLlxuICAgIGNvbnN0IGRlbGF5ZWREYXRlYSQgPSBjaGFpbih0aGlzLmRhdGEkKS5wb3N0cG9uZVdoaWxlKHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQpXG4gICAgd2hlbihkZWxheWVkRGF0ZWEkKS5jaGFuZ2VzKGRlbGF0ZWREYXRhID0+IHtcbiAgICAgIHRoaXMudmlydHVhbFNjcm9sbERhdGFTb3VyY2UuZGF0YSA9IGRlbGF0ZWREYXRhO1xuICAgICAgdGhpcy5zY2hlZHVsZVRhYmxlSGVpZ2h0Q2hlY2soKTtcbiAgICB9LCB7aW5pdGlhbFZhbHVlOiBcImV2YWx1YXRlXCJ9KVxuXG5cbiAgICB0aGlzLm9uSW5pdCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbHVtbnMkID0gY2hhaW4odGhpcy50YWJsZU1vZGVsLmNvbHVtbnMpO1xuICAgICAgdGhpcy5jb2x1bW5JZHMkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkucGx1Y2soXCJjb2x1bW5JZFwiKTtcbiAgICAgIHRoaXMuY29sdW1uc0J5SWQkID0gY2hhaW4odGhpcy5jb2x1bW5zJCkuaW5kZXhCeSgnY29sdW1uSWQnKTtcbiAgICB9KTtcblxuICAgIC8vIGNvbnN0IHR4byA9IG5ldyBUcmFuc2FjdGlvbk9ic2VydmVyKHt2ZXJib3NlOiBmYWxzZX0pLm9uRXZlbnQoZSA9PiBjb25zb2xlLmxvZyhlLm5hbWUsIGUucGF5bG9hZCkpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLnZpcnR1YWxTY3JvbGxSb3dSYW5nZSQnLCB0aGlzLnZpcnR1YWxTY3JvbGxSb3dSYW5nZSQpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLnZpcnR1YWxTY3JvbGxTcGFjZXJTaXplJCcsIHRoaXMudmlydHVhbFNjcm9sbFNwYWNlclNpemUkKTtcbiAgICAvLyB0eG8ub2JzZXJ2ZSgndGhpcy52aXJ0dWFsUm93cyQnLCB0aGlzLnZpcnR1YWxSb3dzJCk7XG4gICAgLy8gdHhvLm9ic2VydmUoJ3RoaXMudGFibGVCb2R5SGVpZ2h0JCcsIHRoaXMudGFibGVCb2R5SGVpZ2h0JCk7XG4gICAgLy8gdHhvLm9ic2VydmUoJ3RoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQnLCB0aGlzLnZpcnR1YWxTY3JvbGxBY3RpdmUkKTtcblxuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgIGlmICh0aGlzLnNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICBjb25zdCB7b2JzZXJ2ZX0gPSBEc2wuZGlzcG9zZVdpdGgodGhpcyk7XG4gICAgICB0aGlzLnNjcm9sbFZpZXdwb3J0LmVsZW1lbnRTY3JvbGxlZCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLm5vdGlmeVNjcm9sbGVkKCkpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmhpZGUtaGVhZGVyXCIpXG4gIGdldCBoaWRlSGVhZGVyKCkge1xuICAgIHJldHVybiAhdGhpcy5zaG93SGVhZGVyO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUuLS1hdXAtdGFibGUtaGVhZGVyLWhlaWdodFwiKVxuICBnZXQgaGVhZGVySGVpZ2h0Q3NzVmFyKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmhlYWRlckhlaWdodCQudmFsdWV9cHhgXG4gIH1cblxuICBASG9zdEJpbmRpbmcoXCJzdHlsZS4tLWF1cC10YWJsZS1yb3ctaGVpZ2h0XCIpXG4gIGdldCByb3dIZWlnaHRDc3NWYXIoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMucm93SGVpZ2h0JC52YWx1ZX1weGBcbiAgfVxuXG4gIGlzRWRpdGluZyhyb3c6IFJvdyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMudGFibGVNb2RlbC5nZXRFZGl0U2Vzc2lvbkZvcihyb3cpO1xuICB9XG5cbiAgbm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uTW9kZWw6IENvbHVtbk1vZGVsPFJvdz4sIHJvdzogUm93KSB7XG4gICAgdGhpcy50YWJsZU1vZGVsLl9ub3RpZnlDZWxsQ2xpY2tlZChjb2x1bW5Nb2RlbCwgcm93KTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG5cbiAgaXNGaXJzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwuZmlyc3RWaXNpYmxlQ29sdW1uJC5xdWVyeSgpLnZhbHVlPy5jb2x1bW5JZCA9PT0gY29sdW1uSWQ7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuXG4gIGlzTGFzdFZpc2libGVDb2x1bW4oY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhYmxlTW9kZWwubGFzdFZpc2libGVDb2x1bW4kLnF1ZXJ5KCkudmFsdWU/LmNvbHVtbklkID09PSBjb2x1bW5JZDtcbiAgfVxuXG4gIGdldENvbHVtbkNsYXNzZXMoY29sdW1uSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IGNsYXNzZXMgPSBbYGF1cC1jb2wtJHt0aGlzLmNvbHVtbnNCeUlkJC5nZXQoY29sdW1uSWQpLmRhc2hlcmlzZWRDb2x1bW5JZH1gXTtcbiAgICBpZiAodGhpcy5pc0ZpcnN0VmlzaWJsZUNvbHVtbihjb2x1bW5JZCkpIHtcbiAgICAgIGNsYXNzZXMucHVzaChcImZpcnN0LXZpc2libGUtY29sdW1uXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xhc3RWaXNpYmxlQ29sdW1uKGNvbHVtbklkKSkge1xuICAgICAgY2xhc3Nlcy5wdXNoKFwibGFzdC12aXNpYmxlLWNvbHVtblwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVGFibGVIZWlnaHRDaGVjayh3YWl0TWlsbGlzID0gNTApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHRib2R5ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcInRib2R5XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRib2R5Lm9mZnNldEhlaWdodDtcbiAgICAgIGlmICh0aGlzLmRhdGEkLmxlbmd0aCA+IDAgJiYgYm9keUhlaWdodCA8IHRoaXMucm93SGVpZ2h0JC52YWx1ZSkge1xuICAgICAgICAvLyBIYWNrcyB0byBnZXQgb3VyIHZpcnR1YWwgc2Nyb2xsIHRvIHJlcGFpbnRcbiAgICAgICAgLy8gTG9nZ2VyLmdldCh0aGlzKS5sb2coYHJvd0NvdW50PSR7dGhpcy5kYXRhJC5sZW5ndGh9LCBib2R5SGVpZ2h0PSR7Ym9keUhlaWdodH0gLT4gdmlydHVhbCB0YWJsZSBub3QgcmVuZGVyaW5nLCB0cmlnZ2VyaW5nIHJlc2l6ZSB0byBmb3JjZSByZXBhaW50YClcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gICAgICAgIGlmICh3YWl0TWlsbGlzIDwgNTAwKSB7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVRhYmxlSGVpZ2h0Q2hlY2sod2FpdE1pbGxpcyArIDUwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHdhaXRNaWxsaXMpXG4gIH1cblxuICBwcml2YXRlIG5vdGlmeVNjcm9sbGVkKCkge1xuICAgIHRoaXMudmlydHVhbFNjcm9sbEFjdGl2ZSQudmFsdWUgPSB0cnVlO1xuICAgIHRoaXMuY2xlYXJTY3JvbGxUaW1lb3V0KCk7XG4gICAgdGhpcy5zY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52aXJ0dWFsU2Nyb2xsQWN0aXZlJC52YWx1ZSA9IGZhbHNlO1xuICAgIH0sIDIwMCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU2Nyb2xsVGltZW91dCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxUaW1lb3V0KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUYWJsZUJvZHlDb21wb25lbnQge1xuICBleHBvcnQgdHlwZSBTY3JvbGxNb2RlID0gXCJub25lXCIgfCBcImNsYXNzaWNcIiB8IFwidmlydHVhbFwiO1xuXG59XG4iLCJcbjxkaXYgY2xhc3M9XCJjbGFzc2ljLXNjcm9sbC1jb250YWluZXJcIiAqbmdJZj1cInNjcm9sbE1vZGUkLnZhbHVlICE9PSAndmlydHVhbCdcIj5cbiAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhJC52YWx1ZVwiIFt0cmFja0J5XT1cInRyYWNrQnlcIiBbbXVsdGlUZW1wbGF0ZURhdGFSb3dzXT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJC52YWx1ZTsgaW5kZXggYXMgaW5kZXg7IGZpcnN0IGFzIGZpcnN0OyBsYXN0IGFzIGxhc3RcIlxuICAgICAgICAgICAgICAgICAgbWF0Q29sdW1uRGVmPVwie3tjb2x1bW4uY29sdW1uSWR9fVwiPlxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3MuZmxleF09XCJjb2x1bW4uaXNGbGV4KClcIiBbY2xhc3MuaGlkZV09XCIhY29sdW1uLmlzVmlzaWJsZSgpXCI+XG4gICAgICAgIDxhdXAtdGFibGUtaGVhZGVyLWNlbGwgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWlkXT1cImNvbHVtbi5jb2x1bW5JZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldENvbHVtbkNsYXNzZXMoY29sdW1uLmNvbHVtbklkKVwiXG4gICAgICAgID48L2F1cC10YWJsZS1oZWFkZXItY2VsbD5cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgKGNsaWNrKT1cIm5vdGlmeUNlbGxDbGlja2VkKGNvbHVtbiwgcm93KVwiXG4gICAgICAgICAgW2NsYXNzLmVuYWJsZS1jdXJzb3JdPVwidGFibGVNb2RlbC5pc0N1cnNvckVuYWJsZWQoY29sdW1uKVwiXG4gICAgICAgICAgW2NsYXNzLmZsZXhdPVwiY29sdW1uLmlzRmxleCgpXCJcbiAgICAgICAgICBbY2xhc3MuaGlkZV09XCIhY29sdW1uLmlzVmlzaWJsZSgpXCJcbiAgICAgID5cbiAgICAgICAgPGF1cC10YWJsZS1jZWxsIFtjb2x1bW5dPVwiJGFueShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZU1vZGVsXT1cIiRhbnkodGFibGVNb2RlbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2VkaXRTZXNzaW9uXT1cIiRhbnkodGFibGVNb2RlbC5nZXRFZGl0U2Vzc2lvbkZvcihyb3cpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taW5kZXhdPVwiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWlkXT1cImNvbHVtbi5jb2x1bW5JZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW4uY29sdW1uSWQpXCJcbiAgICAgICAgPjwvYXVwLXRhYmxlLWNlbGw+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJjb2x1bW5JZHMkLnZhbHVlOyBzdGlja3k6IHRydWVcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBjb2x1bW5JZHMkLnZhbHVlOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgW25nQ2xhc3NdPVwidGFibGVNb2RlbC5nZXRSb3dDbGFzc2VzKHJvdylcIlxuICAgICAgICBbY2xhc3MuZW5hYmxlLWhvdmVyXT1cInRhYmxlTW9kZWwuaXNIb3ZlckVuYWJsZWQoKVwiXG4gICAgICAgIFthdXBUYWJsZVJvd0F0dHJpYnV0ZXNdPVwidGFibGVNb2RlbC5nZXRSb3dBdHRyaWJ1dGVzKHJvdylcIlxuICAgICAgICBbYXR0ci5hdXAtcm93LWlkXT1cInRyYWNrQnkoaSwgcm93KVwiXG4gICAgPjwvdHI+XG5cbiAgPC90YWJsZT5cbjwvZGl2PlxuXG48Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICAqbmdJZj1cInNjcm9sbE1vZGUkLnZhbHVlID09PSAndmlydHVhbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R2c0l0ZW1TaXplXT1cInJvd0hlaWdodCQudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlYWRlckhlaWdodF09XCJoZWFkZXJIZWlnaHQkLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJNdWx0aXBsaWVyXT1cImJ1ZmZlck11bHRpcGxpZXJcIlxuPlxuICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cInZpcnR1YWxTY3JvbGxEYXRhU291cmNlXCIgW3RyYWNrQnldPVwidHJhY2tCeVwiPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnMkLnZhbHVlOyBpbmRleCBhcyBpbmRleDsgZmlyc3QgYXMgZmlyc3Q7IGxhc3QgYXMgbGFzdFwiXG4gICAgICAgICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJ7e2NvbHVtbi5jb2x1bW5JZH19XCI+XG4gICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5mbGV4XT1cImNvbHVtbi5pc0ZsZXgoKVwiIFtjbGFzcy5oaWRlXT1cIiFjb2x1bW4uaXNWaXNpYmxlKClcIj5cbiAgICAgICAgPGF1cC10YWJsZS1oZWFkZXItY2VsbCBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuY29sdW1uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0Q29sdW1uQ2xhc3Nlcyhjb2x1bW4uY29sdW1uSWQpXCJcbiAgICAgICAgPjwvYXVwLXRhYmxlLWhlYWRlci1jZWxsPlxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiAoY2xpY2spPVwibm90aWZ5Q2VsbENsaWNrZWQoY29sdW1uLCByb3cpXCJcbiAgICAgICAgICBbY2xhc3MuZW5hYmxlLWN1cnNvcl09XCJ0YWJsZU1vZGVsLmlzQ3Vyc29yRW5hYmxlZChjb2x1bW4pXCJcbiAgICAgICAgICBbY2xhc3MuZmxleF09XCJjb2x1bW4uaXNGbGV4KClcIlxuICAgICAgICAgIFtjbGFzcy5oaWRlXT1cIiFjb2x1bW4uaXNWaXNpYmxlKClcIlxuICAgICAgPlxuICAgICAgICA8YXVwLXRhYmxlLWNlbGwgW2NvbHVtbl09XCIkYW55KGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmxlTW9kZWxdPVwiJGFueSh0YWJsZU1vZGVsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZWRpdFNlc3Npb25dPVwiJGFueSh0YWJsZU1vZGVsLmdldEVkaXRTZXNzaW9uRm9yKHJvdykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHVtbi1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jb2x1bW4taWRdPVwiY29sdW1uLmNvbHVtbklkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRDb2x1bW5DbGFzc2VzKGNvbHVtbi5jb2x1bW5JZClcIlxuICAgICAgICA+PC9hdXAtdGFibGUtY2VsbD5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtbklkcyQudmFsdWU7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtbklkcyQudmFsdWU7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICBbbmdDbGFzc109XCJ0YWJsZU1vZGVsLmdldFJvd0NsYXNzZXMocm93KVwiXG4gICAgICAgIFtjbGFzcy5lbmFibGUtaG92ZXJdPVwidGFibGVNb2RlbC5pc0hvdmVyRW5hYmxlZCgpXCJcbiAgICAgICAgW2F1cFRhYmxlUm93QXR0cmlidXRlc109XCJ0YWJsZU1vZGVsLmdldFJvd0F0dHJpYnV0ZXMocm93KVwiXG4gICAgICAgIFthdHRyLmF1cC1yb3ctaWRdPVwidHJhY2tCeShpLCByb3cpXCJcbiAgICA+PC90cj5cblxuICA8L3RhYmxlPlxuPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbiJdfQ==
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { Component, Injector, Input } from "@angular/core";
|
|
2
|
+
import { Component, Injector, Input, ViewChild } from "@angular/core";
|
|
3
3
|
import { CanProxy, DelegatingListModel, Dsl, Proxify, proxify } from "@coolon/pectin";
|
|
4
4
|
import { AbstractTableComponent } from '../abstract-table.component';
|
|
5
5
|
import { TableFilterModel } from "../filter/table-filter-model";
|
|
6
|
+
import { TableBodyComponent } from "../renderer/table-body/table-body.component";
|
|
6
7
|
import { TableModel } from "./table-model";
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
import * as i1 from "../../../directives/highlight-text-model.directive";
|
|
@@ -74,6 +75,7 @@ export class TableComponent extends AbstractTableComponent {
|
|
|
74
75
|
#filterModel_accessor_storage = proxify((TableFilterModel));
|
|
75
76
|
get filterModel() { return this.#filterModel_accessor_storage; }
|
|
76
77
|
set filterModel(value) { this.#filterModel_accessor_storage = value; }
|
|
78
|
+
tableBody;
|
|
77
79
|
_footerContentAdded = false;
|
|
78
80
|
_filteredRows$ = this.registerDisposable(new DelegatingListModel());
|
|
79
81
|
scrollMode$;
|
|
@@ -93,6 +95,7 @@ export class TableComponent extends AbstractTableComponent {
|
|
|
93
95
|
this._filteredRows$.setDelegate(this._dataSource$);
|
|
94
96
|
}
|
|
95
97
|
this._visibleRows$.setDelegate(this._filteredRows$);
|
|
98
|
+
// let users of the model know what the current visible and filtered rows are for selection models and what not
|
|
96
99
|
this.tableModel.bindToTable(this._filteredRows$, this._visibleRows$);
|
|
97
100
|
}
|
|
98
101
|
getModel() {
|
|
@@ -105,7 +108,7 @@ export class TableComponent extends AbstractTableComponent {
|
|
|
105
108
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
|
|
106
109
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableComponent, selector: "aup-table", inputs: { tableModel: "tableModel", filterModel: "filterModel" }, providers: [
|
|
107
110
|
{ provide: AbstractTableComponent, useExisting: TableComponent }
|
|
108
|
-
], usesInheritance: true, ngImport: i0, template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"tableModel\"\n [showHeader$]=\"showHeader$\"\n [scrollMode$]=\"scrollMode$\"\n [trackBy]=\"trackBy\"\n [aupHighlightTextModel]=\"highlightText$\"\n></aup-table-body>\n<section class=\"table-footer\">\n <div class=\"footer-content\"><ng-content select=\"[footer]\"></ng-content></div>\n</section>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}aup-table-body{flex:1}.table-footer{display:flex;flex-direction:row;align-items:center}.table-footer .footer-content{flex:1}\n"], dependencies: [{ kind: "directive", type: i1.HighlightTextModelDirective, selector: "[aupHighlightTextModel]", inputs: ["aupHighlightTextModel"] }, { kind: "component", type: i2.TableBodyComponent, selector: "aup-table-body", inputs: ["data$", "tableModel", "showHeader$", "showHeader", "trackBy", "scrollMode$", "scrollMode"] }] });
|
|
111
|
+
], viewQueries: [{ propertyName: "tableBody", first: true, predicate: TableBodyComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"tableModel\"\n [showHeader$]=\"showHeader$\"\n [scrollMode$]=\"scrollMode$\"\n [trackBy]=\"trackBy\"\n [aupHighlightTextModel]=\"highlightText$\"\n></aup-table-body>\n<section class=\"table-footer\">\n <div class=\"footer-content\"><ng-content select=\"[footer]\"></ng-content></div>\n</section>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}aup-table-body{flex:1}.table-footer{display:flex;flex-direction:row;align-items:center}.table-footer .footer-content{flex:1}\n"], dependencies: [{ kind: "directive", type: i1.HighlightTextModelDirective, selector: "[aupHighlightTextModel]", inputs: ["aupHighlightTextModel"] }, { kind: "component", type: i2.TableBodyComponent, selector: "aup-table-body", inputs: ["data$", "tableModel", "showHeader$", "showHeader", "trackBy", "scrollMode$", "scrollMode"] }] });
|
|
109
112
|
}
|
|
110
113
|
__decorate([
|
|
111
114
|
Proxify(),
|
|
@@ -124,5 +127,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
|
|
|
124
127
|
type: Input
|
|
125
128
|
}], filterModel: [{
|
|
126
129
|
type: Input
|
|
130
|
+
}], tableBody: [{
|
|
131
|
+
type: ViewChild,
|
|
132
|
+
args: [TableBodyComponent]
|
|
127
133
|
}] } });
|
|
128
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXVpLXBvd2VydXBzL3NyYy9saWIvY29tcG9uZW50cy90YWJsZXMvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFDLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBa0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQUMvRSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7O0FBRXpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJERztBQVNILE1BQU0sT0FBTyxjQUFvQixTQUFRLHNCQUEyQjtJQUd6RCwrQkFBOEIsT0FBTyxDQUFDLENBQUEsVUFBZSxDQUFBLENBQUMsQ0FBQztJQUF2RCxJQUFBLFVBQVUsZ0RBQTZDO0lBQXZELElBQUEsVUFBVSxzREFBNkM7SUFHdkQsZ0NBQWMsT0FBTyxDQUFDLENBQUEsZ0JBQXFCLENBQUEsQ0FBQyxDQUFBO0lBQTVDLElBQUEsV0FBVyxpREFBaUM7SUFBNUMsSUFBQSxXQUFXLHVEQUFpQztJQUdyRCxTQUFTLENBQXlCO0lBRTFCLG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUVuQixjQUFjLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksbUJBQW1CLEVBQU8sQ0FBQyxDQUFBO0lBQ3RFLFdBQVcsQ0FBaUQ7SUFFL0UsWUFBWSxRQUFrQjtRQUM1QixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEIsTUFBTSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBMEMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDL0gsQ0FBQztJQUVRLFFBQVE7UUFDZixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1lBQy9HLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtTQUNoRTthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELCtHQUErRztRQUMvRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0lBRWtCLFFBQVE7UUFDekIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxNQUFXO1FBQzlCLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBQ2xDLENBQUM7dUdBM0NVLGNBQWM7MkZBQWQsY0FBYyxzR0FKZDtZQUNULEVBQUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUM7U0FDL0QscUVBVVUsa0JBQWtCLHVFQ3BGL0IsaWJBVUE7O0FEcUVXO0lBREMsT0FBTyxFQUFFOzhCQUNFLFVBQVU7Z0RBQWlDO0FBR3ZEO0lBREMsT0FBTyxFQUFFOztpREFDa0M7MkZBTjFDLGNBQWM7a0JBUjFCLFNBQVM7K0JBQ0UsV0FBVyxhQUdWO3dCQUNULEVBQUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFdBQVcsZ0JBQWdCLEVBQUM7cUJBQy9EOytGQUtRLFVBQVU7c0JBRGxCLEtBQUs7Z0JBSUcsV0FBVztzQkFEbkIsS0FBSztnQkFJTixTQUFTO3NCQURSLFNBQVM7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge0NhblByb3h5LCBEZWxlZ2F0aW5nTGlzdE1vZGVsLCBEc2wsIFByb3hpZnksIHByb3hpZnksIFZhbHVlTW9kZWxDaGFpbn0gZnJvbSBcIkBjb29sb24vcGVjdGluXCI7XG5pbXBvcnQge0Fic3RyYWN0VGFibGVNb2RlbH0gZnJvbSAnLi4vYWJzdHJhY3QtdGFibGUtbW9kZWwnO1xuaW1wb3J0IHtBYnN0cmFjdFRhYmxlQ29tcG9uZW50fSBmcm9tICcuLi9hYnN0cmFjdC10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHtUYWJsZUZpbHRlck1vZGVsfSBmcm9tIFwiLi4vZmlsdGVyL3RhYmxlLWZpbHRlci1tb2RlbFwiO1xuaW1wb3J0IHtUYWJsZUJvZHlDb21wb25lbnR9IGZyb20gXCIuLi9yZW5kZXJlci90YWJsZS1ib2R5L3RhYmxlLWJvZHkuY29tcG9uZW50XCI7XG5pbXBvcnQge1RhYmxlTW9kZWx9IGZyb20gXCIuL3RhYmxlLW1vZGVsXCI7XG5cbi8qKlxuICogQ3JlYXRlIHlvdXIgbW9kZWw6XG4gKiBAZXhhbXBsZVxuICogdGhpcy5oZXJvVGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKGhlcm9MaXN0LCB0YWJsZSA9PiB7XG4gKiAgIHRhYmxlLnBsdWNrKFwiZmlyc3ROYW1lXCIpO1xuICogICB0YWJsZS5wbHVjayhcImxhc3ROYW1lXCIpO1xuICogICB0YWJsZS5hZGRDdXN0b21Db2x1bW4oXCJmdWxsTmFtZVwiLCBoZXJvID0+IGAke2hlcm8uZmlyc3ROYW1lfSAke2hlcm8ubGFzdE5hbWV9YCk7XG4gKiB9KTtcbiAqXG4gKiBDcmVhdGUgeW91ciB0YWJsZVxuICogQGV4YW1wbGVcbiAqIDxhdXAtdGFibGUgW3RhYmxlTW9kZWxdPVwiaGVyb1RhYmxlTW9kZWxcIj48L2F1cC10YWJsZT5cbiAqXG4gKiBDb2x1bW4gdGVtcGxhdGVzXG4gKiBAZXhhbXBsZVxuICogdGhpcy5oZXJvVGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKGhlcm9MaXN0LCB0YWJsZSA9PiB7XG4gKiAgIHRhYmxlLnBsdWNrKFwiZmlyc3ROYW1lXCIpO1xuICogICB0YWJsZS5wbHVjayhcImxhc3ROYW1lXCIpO1xuICogICB0YWJsZS5hZGRUZW1wbGF0ZUNvbHVtbihcInNwZWNpYWxDb2x1bW5cIik7XG4gKiB9KTtcbiAqIDxhdXAtdGFibGUgW3RhYmxlTW9kZWxdPVwiaGVyb1RhYmxlTW9kZWxcIj5cbiAqICAgPGRpdiAqYXVwQ29sdW1uVGVtcGxhdGU9XCJsZXQgaGVybzsgY29sdW1uSWQ6ICdzcGVjaWFsQ29sdW1uJzsgZmlsbENlbGw6IHRydWU7IHBhZENoaWxkOmZhbHNlXCI+XG4gKiAgICAge3toZXJvLm5hbWV9fVxuICogICA8L2Rpdj5cbiAqIDwvYXVwLXRhYmxlPlxuICpcbiAqIFN0eWxpbmdcbiAqIEBleGFtcGxlXG4gKiAgLy8gZ2xvYmFsIHNldHRpbmdzXG4gKiA6cm9vdCB7XG4gKiAgIC0tYXVwLXRhYmxlLWNvbHVtbi1nYXA6IDEwcHg7IC8vIGRlZmF1bHRzIHRvIDI0cHhcbiAqICAgLS1hdXAtdGFibGUtcm93LWhvdmVyLWJhY2tncm91bmQtY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wNSlcbiAqICAgLS1hdXAtdGFibGUtcm93LXNlbGVjdGVkLWJhY2tncm91bmQtY29sb3I6IHJlYmVjY2FwdXJwbGU7IC8vIGRlZmF1bHRzIHRvIHRyYW5zcGFyZW50XG4gKiAgIC0tYXVwLXRhYmxlLWZpcnN0LWNvbHVtbi1wYWRkaW5nLWxlZnQ6IDE4cHggLy8gZGVmYXVsdHMgdG8gLS1jb2x1bW4tZ2FwXG4gKiAgIC0tYXVwLXRhYmxlLWxhc3QtY29sdW1uLXBhZGRpbmctcmlnaHQ6IDE4cHggLy8gZGVmYXVsdHMgdG8gLS1jb2x1bW4tZ2FwXG4gKiB9XG4gKlxuICogLy8gcGVyIHRhYmxlIHNldHRpbmdzLlxuICogYXVwLXRhYmxlIHtcbiAqICAgLS1jb2x1bW4tZ2FwOiAxMHB4OyAvLyBkZWZhdWx0cyB0byAyNHB4XG4gKiAgIC0tcm93LWhvdmVyLWJhY2tncm91bmQtY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wNSlcbiAqICAgLS1yb3ctc2VsZWN0ZWQtYmFja2dyb3VuZC1jb2xvcjogcmViZWNjYXB1cnBsZTsgLy8gZGVmYXVsdHMgdG8gdHJhbnNwYXJlbnRcbiAqICAgLS1maXJzdC1jb2x1bW4tcGFkZGluZy1sZWZ0OiAxOHB4IC8vIGRlZmF1bHRzIHRvIC0tY29sdW1uLWdhcFxuICogICAtLWxhc3QtY29sdW1uLXBhZGRpbmctcmlnaHQ6IDE4cHggLy8gZGVmYXVsdHMgdG8gLS1jb2x1bW4tZ2FwXG4gKiAgIDo6bmctZGVlcCB7XG4gKiAgICAgIGF1cC10YWJsZS1oZWFkZXItY2VsbC1yZW5kZXJlcixcbiAqICAgICAgYXVwLXRhYmxlLWNlbGwtcmVuZGVyZXIge1xuICogICAgICAgICYuYXVwLWNvbC1teS1kYXNoZXJpc2VkLWNvbHVtbi1pZCB7XG4gKiAgICAgICAgICAvLyBkbyBzdHVmZlxuICogICAgICAgIH1cbiAqICAgICAgICAmLmZpcnN0LXZpc2libGUtY29sdW1uIHtcbiAqICAgICAgICAgIC8vIGRvIHN0dWZmXG4gKiAgICAgICAgfVxuICogICAgICAgICYubGFzdC12aXNpYmxlLWNvbHVtbiB7XG4gKiAgICAgICAgICAvLyBkbyBzdHVmZlxuICogICAgICAgIH1cbiAqICAgICAgfVxuICogICB9XG4gKiB9XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F1cC10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtwcm92aWRlOiBBYnN0cmFjdFRhYmxlQ29tcG9uZW50LCB1c2VFeGlzdGluZzogVGFibGVDb21wb25lbnR9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8Um93PiBleHRlbmRzIEFic3RyYWN0VGFibGVDb21wb25lbnQ8Um93PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciB0YWJsZU1vZGVsOiBUYWJsZU1vZGVsPFJvdz4gPSBwcm94aWZ5KFRhYmxlTW9kZWw8Um93Pik7XG5cbiAgQElucHV0KCkgQFByb3hpZnkoKVxuICBhY2Nlc3NvciBmaWx0ZXJNb2RlbCA9IHByb3hpZnkoVGFibGVGaWx0ZXJNb2RlbDxSb3c+KVxuXG4gIEBWaWV3Q2hpbGQoVGFibGVCb2R5Q29tcG9uZW50KVxuICB0YWJsZUJvZHk6IFRhYmxlQm9keUNvbXBvbmVudDxSb3c+XG5cbiAgcHJpdmF0ZSBfZm9vdGVyQ29udGVudEFkZGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyZWRSb3dzJCA9IHRoaXMucmVnaXN0ZXJEaXNwb3NhYmxlKG5ldyBEZWxlZ2F0aW5nTGlzdE1vZGVsPFJvdz4oKSlcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNjcm9sbE1vZGUkOiBWYWx1ZU1vZGVsQ2hhaW48VGFibGVCb2R5Q29tcG9uZW50LlNjcm9sbE1vZGU+O1xuXG4gIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICBjb25zdCB7Y2hhaW4sIHdoZW59ID0gRHNsLmRpc3Bvc2VXaXRoKHRoaXMpO1xuICAgIHRoaXMuc2Nyb2xsTW9kZSQgPSBjaGFpbih0aGlzLmVuYWJsZVNjcm9sbGluZyQpLm1hcChlbmFibGVkID0+IGVuYWJsZWQgPyBcInZpcnR1YWxcIiBhcyBUYWJsZUJvZHlDb21wb25lbnQuU2Nyb2xsTW9kZSA6IFwibm9uZVwiKVxuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICBpZiAoQ2FuUHJveHkuaGFzVGFyZ2V0KHRoaXMuZmlsdGVyTW9kZWwpKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRGlzcG9zYWJsZSh0aGlzLmZpbHRlck1vZGVsLmJpbmRUb1RhYmxlKHRoaXMuX2RhdGFTb3VyY2UkLCB0aGlzLmdldE1vZGVsKCkudGV4dFNlYXJjaFByZWRpY2F0ZSQpKTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0VGV4dCQuc2V0RGVsZWdhdGUodGhpcy5maWx0ZXJNb2RlbC5oaWdobGlnaHRUZXh0JCk7XG4gICAgICB0aGlzLl9maWx0ZXJlZFJvd3MkLnNldERlbGVnYXRlKHRoaXMuZmlsdGVyTW9kZWwuZmlsdGVyZWRSb3dzJClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZmlsdGVyZWRSb3dzJC5zZXREZWxlZ2F0ZSh0aGlzLl9kYXRhU291cmNlJCk7XG4gICAgfVxuICAgIHRoaXMuX3Zpc2libGVSb3dzJC5zZXREZWxlZ2F0ZSh0aGlzLl9maWx0ZXJlZFJvd3MkKTtcbiAgICAvLyBsZXQgdXNlcnMgb2YgdGhlIG1vZGVsIGtub3cgd2hhdCB0aGUgY3VycmVudCB2aXNpYmxlIGFuZCBmaWx0ZXJlZCByb3dzIGFyZSBmb3Igc2VsZWN0aW9uIG1vZGVscyBhbmQgd2hhdCBub3RcbiAgICB0aGlzLnRhYmxlTW9kZWwuYmluZFRvVGFibGUodGhpcy5fZmlsdGVyZWRSb3dzJCwgdGhpcy5fdmlzaWJsZVJvd3MkKVxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldE1vZGVsKCk6IEFic3RyYWN0VGFibGVNb2RlbDxSb3c+IHtcbiAgICByZXR1cm4gdGhpcy50YWJsZU1vZGVsO1xuICB9XG5cbiAgZm9vdGVyQ29udGVudENoYW5nZWQoJGV2ZW50OiBhbnkpIHtcbiAgICAvLyBjb25zb2xlLmxvZygkZXZlbnQpO1xuICAgIHRoaXMuX2Zvb3RlckNvbnRlbnRBZGRlZCA9IHRydWU7XG4gIH1cbn1cbiIsIjxhdXAtdGFibGUtYm9keSBbZGF0YSRdPVwidmlzaWJsZVJvd3MkXCJcbiAgICAgICAgICAgICAgICBbdGFibGVNb2RlbF09XCJ0YWJsZU1vZGVsXCJcbiAgICAgICAgICAgICAgICBbc2hvd0hlYWRlciRdPVwic2hvd0hlYWRlciRcIlxuICAgICAgICAgICAgICAgIFtzY3JvbGxNb2RlJF09XCJzY3JvbGxNb2RlJFwiXG4gICAgICAgICAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeVwiXG4gICAgICAgICAgICAgICAgW2F1cEhpZ2hsaWdodFRleHRNb2RlbF09XCJoaWdobGlnaHRUZXh0JFwiXG4+PC9hdXAtdGFibGUtYm9keT5cbjxzZWN0aW9uIGNsYXNzPVwidGFibGUtZm9vdGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJmb290ZXItY29udGVudFwiPjxuZy1jb250ZW50IHNlbGVjdD1cIltmb290ZXJdXCI+PC9uZy1jb250ZW50PjwvZGl2PlxuPC9zZWN0aW9uPlxuIl19
|